def create_servers_group(servers): """Create an action group for the specified servers.""" servers_group = QActionGroup(self) current_server = self._plugin.network.server for server in servers: is_connected = (current_server is not None and server["host"] == current_server["host"] and server["port"] == current_server["port"]) server_text = "%s:%d" % (server["host"], server["port"]) server_action = QAction(server_text, menu) server_action._server = server server_action.setCheckable(True) server_action.setChecked(is_connected) servers_group.addAction(server_action) def server_action_triggered(server_action): """ Called when a action is clicked. Connects to the new server or disconnects from the old server. """ server = server_action._server was_connected = self._plugin.network.server == server self._plugin.network.stop_server() self._plugin.network.disconnect() if not was_connected: self._plugin.network.connect(server) servers_group.triggered.connect(server_action_triggered) return servers_group
def create_context_menu(self) -> QMenu: menu = super().create_context_menu() if self.selection_is_empty: return menu menu.addSeparator() self._add_insert_column_menu(menu) menu.addSeparator() selected_encoding = self.selected_message.decoder if not all( self.model().protocol.messages[i].decoder is selected_encoding for i in self.selected_rows): selected_encoding = None encoding_group = QActionGroup(self) encoding_menu = menu.addMenu("Enforce encoding") for decoding in self.model().project_manager.decodings: ea = encoding_menu.addAction(decoding.name) ea.setCheckable(True) ea.setActionGroup(encoding_group) if selected_encoding == decoding: ea.setChecked(True) ea.setData(decoding) ea.triggered.connect(self.on_encoding_action_triggered) if constants.SETTINGS.value("multiple_modulations", False, bool): selected_modulation = self.model().protocol.messages[ self.selected_rows[0]].modulator_index if not all(self.model().protocol.messages[i].modulator_index == selected_modulation for i in self.selected_rows): selected_modulation = -1 modulation_group = QActionGroup(self) modulation_menu = menu.addMenu("Modulation") for i, modulator in enumerate( self.model().project_manager.modulators): ma = modulation_menu.addAction(modulator.name) ma.setCheckable(True) ma.setActionGroup(modulation_group) if selected_modulation == i: ma.setChecked(True) ma.setData(i) ma.triggered.connect(self.on_modulation_action_triggered) open_modulator_dialog_action = modulation_menu.addAction( self.tr("...")) open_modulator_dialog_action.triggered.connect( self.on_open_modulator_dialog_action_triggered) return menu
def init_settings(self): self.sizes = QActionGroup(self) self.small = QAction('Small', self, checkable=True) self.small.setChecked(True) self.small.triggered.connect(lambda: self.set_size('small')) self.sizes.addAction(self.small) self.settings.addAction(self.small) self.size2handler['small'] = self.small self.middle1 = QAction('Middle 1', self, checkable=True) self.middle1.triggered.connect(lambda: self.set_size('middle1')) self.sizes.addAction(self.middle1) self.settings.addAction(self.middle1) self.size2handler['middle1'] = self.middle1 self.middle2 = QAction('Middle 2', self, checkable=True) self.middle2.triggered.connect(lambda: self.set_size('middle2')) self.sizes.addAction(self.middle2) self.settings.addAction(self.middle2) self.size2handler['middle2'] = self.middle2 self.big = QAction('Big', self, checkable=True) self.big.triggered.connect(lambda: self.set_size('big')) self.sizes.addAction(self.big) self.settings.addAction(self.big) self.size2handler['big'] = self.big self.small.setStatusTip('A small field. Has 10x10 size and 4 colors') self.middle1.setStatusTip('A middle field. ' 'Has 14x14 size and 5 colors') self.middle2.setStatusTip('A middle field. ' 'Has 14x14 size and 6 colors') self.big.setStatusTip('A big field. Has 25x25 size and 7 colors')
def createActions(self): self.addImagesAct = QAction("&Add Images...", self, shortcut="Ctrl+A", triggered=self.addImage) self.removeAllImagesAct = QAction("&Remove All Images", self, shortcut="Ctrl+R", triggered=self.removeAllImages) self.exitAct = QAction("&Quit", self, shortcut="Ctrl+Q", triggered=self.close) self.styleActionGroup = QActionGroup(self) for styleName in QStyleFactory.keys(): action = QAction(self.styleActionGroup, text="%s Style" % styleName, checkable=True, triggered=self.changeStyle) action.setData(styleName) self.guessModeStateAct = QAction("&Guess Image Mode/State", self, checkable=True, checked=True) self.aboutAct = QAction("&About", self, triggered=self.about) self.aboutQtAct = QAction("About &Qt", self, triggered=QApplication.instance().aboutQt)
def setup_menu(): u""" Add a submenu to a view menu. Add a submenu that lists the available extra classes to the view menu, creating that menu when neccessary """ if extra_classes_list: try: mw.addon_view_menu except AttributeError: mw.addon_view_menu = QMenu(_(u"&View"), mw) mw.form.menubar.insertMenu( mw.form.menuTools.menuAction(), mw.addon_view_menu) mw.extra_class_submenu = QMenu(u"Mode (e&xtra class)", mw) mw.addon_view_menu.addMenu(mw.extra_class_submenu) action_group = QActionGroup(mw, exclusive=True) no_class_action = action_group.addAction( QAction('(none/standard)', mw, checkable=True)) no_class_action.setChecked(True) mw.extra_class_submenu.addAction(no_class_action) mw.connect(no_class_action, SIGNAL("triggered()"), lambda: set_extra_class(None)) for ecd in extra_classes_list: nn_class_action = action_group.addAction( QAction(ecd['display'], mw, checkable=True)) mw.extra_class_submenu.addAction(nn_class_action) mw.connect(nn_class_action, SIGNAL("triggered()"), lambda ec=ecd['class']: set_extra_class(ec))
def setupMenuBar(self): self.fileMenu = self.menuBar().addMenu("&File") self.dateFormatMenu = self.fileMenu.addMenu("&Date format") self.dateFormatGroup = QActionGroup(self) for f in self.dateFormats: action = QAction(f, self, checkable=True, triggered=self.changeDateFormat) self.dateFormatGroup.addAction(action) self.dateFormatMenu.addAction(action) if f == self.currentDateFormat: action.setChecked(True) self.fileMenu.addAction(self.printAction) self.fileMenu.addAction(self.exitAction) self.cellMenu = self.menuBar().addMenu("&Cell") self.cellMenu.addAction(self.cell_addAction) self.cellMenu.addAction(self.cell_subAction) self.cellMenu.addAction(self.cell_mulAction) self.cellMenu.addAction(self.cell_divAction) self.cellMenu.addAction(self.cell_sumAction) self.cellMenu.addAction(self.cell_leapAction) self.cellMenu.addSeparator() self.cellMenu.addAction(self.colorAction) self.cellMenu.addAction(self.fontAction) self.menuBar().addSeparator() self.aboutMenu = self.menuBar().addMenu("&Help") self.aboutMenu.addAction(self.aboutSpreadSheet)
def addShowActions(self): """Adds a submenu giving access to the (other) opened viewer documents""" mds = self._actionCollection.viewer_document_select docs = mds.viewdocs() document_actions = {} multi_docs = len(docs) > 1 if self._panel.widget().currentViewdoc(): current_doc_filename = self._panel.widget().currentViewdoc().filename() m = self._menu sm = QMenu(m) sm.setTitle(_("Show...")) sm.setEnabled(multi_docs) ag = QActionGroup(m) ag.triggered.connect(self._panel.slotShowViewdoc) for d in docs: action = QAction(sm) action.setText(d.name()) action._document_filename = d.filename() # TODO: Tooltips aren't shown by Qt (it seems) action.setToolTip(d.filename()) action.setCheckable(True) action.setChecked(d.filename() == current_doc_filename) ag.addAction(action) sm.addAction(action) m.addSeparator() m.addMenu(sm)
def menuContextualDatosFiltrados(self, posicion): indices = self.tableWidgetVerDatosFiltrados.selectedIndexes() if indices: menu = QMenu() # To make all the actions belong to a group itemsGrupo = QActionGroup(self) itemsGrupo.setExclusive(True) """ Acciones: imsis, ver horario (Hits), ver channel, Operadores """ actionImsis = QAction("Ver IMSIS asociados", itemsGrupo) actionImsis.setData(VentanaFiltros.ACTION_IMSIS) menu.addAction(actionImsis) actionFechas = QAction("Ver fechas y hits asociados", itemsGrupo) actionFechas.setData(VentanaFiltros.ACTION_FECHAS) menu.addAction(actionFechas) actionCanales = QAction("Ver canales asociados asociados", itemsGrupo) actionCanales.setData(VentanaFiltros.ACTION_CANALES) menu.addAction(actionCanales) actionOps = QAction("Ver operadores asociados", itemsGrupo) actionOps.setData(VentanaFiltros.ACTION_OPERADORES) menu.addAction(actionOps) itemsGrupo.triggered.connect(self.fnProcesaMenuContextual) menu.exec(self.tableWidgetVerDatosFiltrados.viewport().mapToGlobal(posicion))
def criar_menu_placas(self): """ Cria o menu das placas :return: None """ self.menus_personalizados = list() titulos_menus_personalizados = list() for pacote_alvo in self.pacotes.values(): for plataforma_alvo in pacote_alvo.get_lista_plataformas(): print plataforma_alvo.get_menus() titulos_menus_personalizados += plataforma_alvo.get_menus().values() for titulo_menu_personalizado in titulos_menus_personalizados: menu = QMenu(titulo_menu_personalizado) self.menus_personalizados.append(menu) placas = QActionGroup(self.parent) placas.setExclusive(True) for pacote_alvo in self.pacotes.values(): for plataforma_alvo in pacote_alvo.get_lista_plataformas(): nome = plataforma_alvo.get_preferencias().get("name") self.parent.menu_placas.addAction(QAction(nome, self)) for placa in plataforma_alvo.get_placas().values(): if not placa.get_preferencias().get('hide'): self.parent.menu_placas.addAction(placa.criar_acao(self))
def __init__(self, parent=None): super(Camera, self).__init__(parent) self.ui = Ui_Camera() self.pre_id = 0 self.cur_id = 0 self.count = 0 self.checked = 0 self.audio_settime = 0 self.allow_flag = 1 self.check_list = [] self.camera = None self.imageCapture = None self.isCapturingImage = False self.applicationExiting = False self.ui.setupUi(self) cameraDevice = QByteArray() videoDevicesGroup = QActionGroup(self) videoDevicesGroup.setExclusive(True) for deviceName in QCamera.availableDevices(): description = QCamera.deviceDescription(deviceName) videoDeviceAction = QAction(description, videoDevicesGroup) videoDeviceAction.setCheckable(True) videoDeviceAction.setData(deviceName) if cameraDevice.isEmpty(): cameraDevice = deviceName videoDeviceAction.setChecked(True) self.ui.menuDevices.addAction(videoDeviceAction) videoDevicesGroup.triggered.connect(self.updateCameraDevice) self.setCamera(cameraDevice) # Create and load model path_pretrained = "apis/models/facenet/20180402-114759.pb" path_SVM = "apis/models/SVM/SVM.pkl" self.recognizer = Recognizer() self.recognizer.create_graph(path_pretrained, path_SVM)
def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self.splitter.setStretchFactor(0, 5) self.splitter.setStretchFactor(1, 70) self.listDelegate = listCompleterDelegate(self) self.list.setItemDelegate(self.listDelegate) self.list.itemClicked.connect(self.showDiff) self.list.setContextMenuPolicy(Qt.CustomContextMenu) self.list.customContextMenuRequested.connect(self.popupMenu) self.btnDelete.setEnabled(False) self.btnDelete.clicked.connect(self.delete) self.btnRestore.clicked.connect(self.restore) self.btnRestore.setEnabled(False) # self.list.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.updateTimer = QTimer() self.updateTimer.setSingleShot(True) self.updateTimer.setInterval(500) self.updateTimer.timeout.connect(self.update) self.updateTimer.stop() self.menu = QMenu(self) self.actGroup = QActionGroup(self) self.actShowDiff = QAction(self.tr("Show modifications"), self.menu) self.actShowDiff.setCheckable(True) self.actShowDiff.setChecked(True) self.actShowDiff.triggered.connect(self.showDiff) self.menu.addAction(self.actShowDiff) self.actGroup.addAction(self.actShowDiff) self.actShowVersion = QAction(self.tr("Show ancient version"), self.menu) self.actShowVersion.setCheckable(True) self.actShowVersion.setChecked(False) self.actShowVersion.triggered.connect(self.showDiff) self.menu.addAction(self.actShowVersion) self.actGroup.addAction(self.actShowVersion) self.menu.addSeparator() self.actShowSpaces = QAction(self.tr("Show spaces"), self.menu) self.actShowSpaces.setCheckable(True) self.actShowSpaces.setChecked(False) self.actShowSpaces.triggered.connect(self.showDiff) self.menu.addAction(self.actShowSpaces) self.actDiffOnly = QAction(self.tr("Show modifications only"), self.menu) self.actDiffOnly.setCheckable(True) self.actDiffOnly.setChecked(True) self.actDiffOnly.triggered.connect(self.showDiff) self.menu.addAction(self.actDiffOnly) self.btnOptions.setMenu(self.menu) self._model = None self._index = None
def showOptions(self, event): event.accept() menu = QMenu() menu.addAction( self.tr("Note: restart carla to apply globally")).setEnabled(False) menu.addAction(self.tr("Color")).setSeparator(True) groupColor = QActionGroup(menu) groupLayout = QActionGroup(menu) actColors = [] actLayouts = [] menu.addAction(self.tr("Highlight color")).setSeparator(True) for color in kValidColors: act = menu.addAction(color) act.setActionGroup(groupColor) act.setCheckable(True) if self.fHighlightColor == color: act.setChecked(True) actColors.append(act) menu.addAction(self.tr("PC Keyboard layout")).setSeparator(True) for pcKeyLayout in kPcKeysLayouts.keys(): act = menu.addAction(pcKeyLayout) act.setActionGroup(groupLayout) act.setCheckable(True) if self.fkPcKeyLayout == pcKeyLayout: act.setChecked(True) actLayouts.append(act) menu.addAction( self.tr("PC Keyboard base octave (%i)" % self.fPcKeybOffset)).setSeparator(True) actOctaveUp = menu.addAction(self.tr("Octave up")) actOctaveDown = menu.addAction(self.tr("Octave down")) if self.fPcKeybOffset == 0: actOctaveDown.setEnabled(False) actSelected = menu.exec_(event.screenPos().toPoint()) if not actSelected: return if actSelected in actColors: return self.setColor(actSelected.text()) if actSelected in actLayouts: return self.setPcKeyboardLayout(actSelected.text()) if actSelected == actOctaveUp: return self.setPcKeyboardOffset(self.fPcKeybOffset + 1) if actSelected == actOctaveDown: return self.setPcKeyboardOffset(self.fPcKeybOffset - 1)
def __init__(self, mainwindow): QActionGroup.__init__(self, mainwindow) self._acts = {} self._accels = {} self.setExclusive(True) for branch in vcs.app_repo.branches(): self.addBranch(branch) self.triggered.connect(self.slotTriggered)
def __init__(self, mainwindow): QActionGroup.__init__(self, mainwindow) self._acts = {} self._accels = {} self.setExclusive(True) for branch in vcs.app_repo.branches(): self.addBranch(branch) self.triggered.connect(self.slotTriggered)
def __init__(self, parent=None, standalone=False): super(Camera, self).__init__(parent) # This prevents doing unneeded initialization # when QtDesginer loads the plugin. if parent is None and not standalone: return if not multimedia_available: return self.ui = uic.loadUi(os.path.join(WIDGET_PATH, "camera.ui"), self) self.camera = None self.imageCapture = None self.mediaRecorder = None self.isCapturingImage = False self.applicationExiting = False self.imageSettings = QImageEncoderSettings() self.audioSettings = QAudioEncoderSettings() self.videoSettings = QVideoEncoderSettings() self.videoContainerFormat = '' camera_device = QByteArray() videoDevicesGroup = QActionGroup(self) videoDevicesGroup.setExclusive(True) if not QCamera.availableDevices(): self.ui.devicesCombo.addItem("No Device") else: for deviceName in QCamera.availableDevices(): description = QCamera.deviceDescription(deviceName) self.ui.devicesCombo.addItem(description) videoDeviceAction = QAction(description, videoDevicesGroup) videoDeviceAction.setCheckable(True) videoDeviceAction.setData(deviceName) if camera_device.isEmpty(): cameraDevice = deviceName videoDeviceAction.setChecked(True) self.ui.devicesCombo.addAction(videoDeviceAction) videoDevicesGroup.triggered.connect(self.updateCameraDevice) self.ui.captureWidget.currentChanged.connect(self.updateCaptureMode) self.ui.devicesCombo.currentIndexChanged.connect( self.get_device_action) self.ui.lockButton.hide() # Start camera 2s after the UI has loaded QTimer.singleShot(2000, lambda: self.setCamera(camera_device))
def generateViewMenu(self): values = [ (self.tr("Nothing"), "Nothing"), (self.tr("POV"), "POV"), (self.tr("Label"), "Label"), (self.tr("Progress"), "Progress"), (self.tr("Compile"), "Compile"), ] menus = [ (self.tr("Tree"), "Tree"), (self.tr("Index cards"), "Cork"), (self.tr("Outline"), "Outline") ] submenus = { "Tree": [ (self.tr("Icon color"), "Icon"), (self.tr("Text color"), "Text"), (self.tr("Background color"), "Background"), ], "Cork": [ (self.tr("Icon"), "Icon"), (self.tr("Text"), "Text"), (self.tr("Background"), "Background"), (self.tr("Border"), "Border"), (self.tr("Corner"), "Corner"), ], "Outline": [ (self.tr("Icon color"), "Icon"), (self.tr("Text color"), "Text"), (self.tr("Background color"), "Background"), ], } self.menuView.clear() self.menuView.addMenu(self.menuMode) self.menuView.addSeparator() # print("Generating menus with", settings.viewSettings) for mnu, mnud in menus: m = QMenu(mnu, self.menuView) for s, sd in submenus[mnud]: m2 = QMenu(s, m) agp = QActionGroup(m2) for v, vd in values: a = QAction(v, m) a.setCheckable(True) a.setData("{},{},{}".format(mnud, sd, vd)) if settings.viewSettings[mnud][sd] == vd: a.setChecked(True) a.triggered.connect(self.setViewSettingsAction, AUC) agp.addAction(a) m2.addAction(a) m.addMenu(m2) self.menuView.addMenu(m)
def generateViewMenu(self): values = [ (self.tr("Nothing"), "Nothing"), (self.tr("POV"), "POV"), (self.tr("Label"), "Label"), (self.tr("Progress"), "Progress"), (self.tr("Compile"), "Compile"), ] menus = [ (self.tr("Tree"), "Tree"), (self.tr("Index cards"), "Cork"), (self.tr("Outline"), "Outline") ] submenus = { "Tree": [ (self.tr("Icon color"), "Icon"), (self.tr("Text color"), "Text"), (self.tr("Background color"), "Background"), ], "Cork": [ (self.tr("Icon"), "Icon"), (self.tr("Text"), "Text"), (self.tr("Background"), "Background"), (self.tr("Border"), "Border"), (self.tr("Corner"), "Corner"), ], "Outline": [ (self.tr("Icon color"), "Icon"), (self.tr("Text color"), "Text"), (self.tr("Background color"), "Background"), ], } self.menuView.clear() self.menuView.addMenu(self.menuMode) self.menuView.addSeparator() # print("Generating menus with", settings.viewSettings) for mnu, mnud in menus: m = QMenu(mnu, self.menuView) for s, sd in submenus[mnud]: m2 = QMenu(s, m) agp = QActionGroup(m2) for v, vd in values: a = QAction(v, m) a.setCheckable(True) a.setData("{},{},{}".format(mnud, sd, vd)) if settings.viewSettings[mnud][sd] == vd: a.setChecked(True) a.triggered.connect(self.setViewSettingsAction, AUC) agp.addAction(a) m2.addAction(a) m.addMenu(m2) self.menuView.addMenu(m)
def __init__(self, main_win, zoom_ctrl_mngr, listplayer, media_player): super().__init__(parent=main_win) self.main_win = main_win self.zoom_ctrl_mngr = zoom_ctrl_mngr self.listplayer = listplayer self.mp = media_player self.setTitle("Zoom") self.setIcon(icons.get("zoom_menu_button")) self.quarter = QAction("1:4 Quarter", self) self.quarter.triggered.connect( lambda: self.zoom_ctrl_mngr.set_scale(0.25)) self.quarter.setCheckable(True) self.half = QAction("1:2 Half", self) self.half.triggered.connect(lambda: self.zoom_ctrl_mngr.set_scale(0.5)) self.half.setCheckable(True) self.original = QAction("1:1 Original", self) self.original.triggered.connect( lambda: self.zoom_ctrl_mngr.set_scale(1)) self.original.setCheckable(True) self.double = QAction("1:2 Double", self) self.double.triggered.connect(lambda: self.zoom_ctrl_mngr.set_scale(2)) self.double.setCheckable(True) self.explicit_zooms = QActionGroup(self) self.explicit_zooms.addAction(self.quarter) self.explicit_zooms.addAction(self.half) self.explicit_zooms.addAction(self.original) self.explicit_zooms.addAction(self.double) self.addActions(self.explicit_zooms.actions()) self.option_action_map = { 0.25: self.quarter, 0.5: self.half, 1: self.original, 2: self.double, } self.zoom_in = ZoomInAction(self, zoom_ctrl_mngr=self.zoom_ctrl_mngr) self.zoom_in.setIcon(icons.get("zoom_in_menu_item")) self.addAction(self.zoom_in) self.zoom_out = ZoomOutAction(self, zoom_ctrl_mngr=self.zoom_ctrl_mngr) self.zoom_out.setIcon(icons.get("zoom_out_menu_item")) self.addAction(self.zoom_out) self.addSeparator() self.addAction(AutoResizeAction(self)) self.conform_to_media() self.zoom_ctrl_mngr.zoomchanged.connect(self.on_zoomchanged) self.listplayer.mediachanged.connect(self.on_mediachanged)
def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self.pull_menuButton.setIcon(QIcon(IconFile.pixmap_strip)) self.deleteStrip_button.setIcon(QIcon(IconFile.button_bin)) self.rack_filter_model = RackedStripsFilterModel(self) self.stripRacks_view.setModel(self.rack_filter_model) self.current_view_mode = StripRacksPane.DIVIDE self.updateViewFromMode() # PULL menu self.pullFplDetails_action = QAction('Pull FPL details', self) self.pullXpdrDetails_action = QAction('Pull XPDR details', self) pull_menu = QMenu() pull_menu.addAction(self.pullFplDetails_action) pull_menu.addAction(self.pullXpdrDetails_action) self.pullFplDetails_action.triggered.connect( lambda: pull_FPL_details(self)) self.pullXpdrDetails_action.triggered.connect( lambda: pull_XPDR_details(self)) self.pull_menuButton.setMenu(pull_menu) # VIEW menu createNewRack_action = QAction('New rack...', self) createNewRack_action.setIcon(QIcon(IconFile.action_newRack)) createNewRack_action.triggered.connect(self.createNewRack) moveRacks_action = QAction('Bring racks to this view...', self) moveRacks_action.triggered.connect(self.moveRacksToView) self.view_mode_action_group = QActionGroup(self) for mode, txt in zip( StripRacksPane.view_modes, ['Divided width', 'Horizontal scroll', 'Tabbed racks']): view_action = QAction(txt, self) view_action.setCheckable(True) view_action.triggered.connect( lambda toggle, m=mode: self.selectViewMode(m)) self.view_mode_action_group.addAction(view_action) if mode == self.current_view_mode: view_action.setChecked(True) view_menu = QMenu() view_menu.addAction(createNewRack_action) view_menu.addAction(moveRacks_action) view_menu.addSeparator() view_menu.addActions(self.view_mode_action_group.actions()) self.view_menuButton.setMenu(view_menu) # Other buttons and signals self.updateButtonsAndActions() self.deleteStrip_button.clicked.connect( lambda: discard_strip(self, selection.strip, False)) self.shelf_button.stripDropped.connect( lambda strip: discard_strip(self, strip, True)) self.shelf_button.clicked.connect(signals.openShelfRequest.emit) # External signals below. CAUTION: these must all be disconnected on widget deletion env.strips.columnsRemoved.connect(self.updateAfterRackDeletion) signals.rackEdited.connect(self.updateAfterRackEdit) signals.rackVisibilityTaken.connect(self.hideRacks) signals.selectionChanged.connect(self.updateSelections) signals.selectionChanged.connect(self.updateButtonsAndActions) signals.mainWindowClosing.connect(self.close)
def __init__(self, parent=None): """ Constructor @param parent reference to the parent widget @type QWidget """ super(MCS, self).__init__(parent) self.setupUi(self) # 添加 matplotlib 画布组件用于绘图 self.canvas1 = Canvas(self.frame, xlabel="Time(s)", title="Sampled waveform") self.canvas1.get_default_filename = lambda: 'Sampled waveform.png' self.horizontalLayout_15.addWidget(self.canvas1) self.canvas2 = Canvas(self.frame, xlabel="Frequency(Hz)", title="FFT of Sampled waveform") self.canvas2.get_default_filename = lambda: ('FFT of Sampled ' 'waveform.png') self.horizontalLayout_14.addWidget(self.canvas2) # 添加 matplotlib 导航工具栏用于操作图像。 self.toolbar1 = NavigationToolbar(self.canvas1, self) self.toolbar1.hide() self.toolbar2 = NavigationToolbar(self.canvas2, self) self.toolbar2.hide() # 为文本框添加 validator regex = QRegExp(r'^400(\.0)?$|^[1-3]?[0-9]{1,2}(\.[0-9])?$') self.lineEdit_4.setValidator(QRegExpValidator(regex, self)) self.lineEdit_5.setValidator( QRegExpValidator(QRegExp(r'^([1-9][0-9]{0,1}|100)$'), self)) # 采样时间限制 # 一些初始化变量值 self.scrollbar_value = 1 self.signal_wave = None self.amplitude = 2.5, 2.5 self.data = None self.external_flag = False self.sample_freq_value = 0.1 self.axes_color = "w" self.figure_color = None self.line_color = "C0" self.sample_time = 5 # 将菜单栏中的 signal 选项改为单选。 self.menuGroupSingal = QActionGroup(self.menuSignal) self.menuGroupSingal.addAction(self.actionSquare) self.menuGroupSingal.addAction(self.actionTriangle) self.menuGroupSingal.addAction(self.actionSin) self.menuGroupSingal.setExclusive(True)
def init_ui(self): self.ui = Ui_MainWindow() self.ui.setupUi(self) widget = QWidget() layout = QHBoxLayout() self.stackWidget = SubWindowStack(self) self.side_bar = SideBar(self) # self.side_bar.detach_signal.connect(self.detach_window) layout.addWidget(self.side_bar) layout.addWidget(self.stackWidget) # layout.addWidget(self.sub_window) widget.setLayout(layout) self.setCentralWidget(widget) # window system : self.window_system_parent_widget = self.stackWidget self.side_bar.window_system_controller = self # sub_windows : self._sub_window_action_group = QActionGroup(self) # write window self.write_sub_window = WritePanel( parent=self, parent_window_system_controller=self) self.attach_sub_window(self.write_sub_window) self.ui.actionWrite.setProperty( "sub_window_object_name", "write_sub_window") self.add_action_to_window_system(self.ui.actionWrite) self._sub_window_action_group.addAction(self.ui.actionWrite) # binder window self.binder_sub_window = BinderPanel( parent=self, parent_window_system_controller=self) self.attach_sub_window(self.binder_sub_window) self.ui.actionBinder.setProperty( "sub_window_object_name", "binder_sub_window") self.add_action_to_window_system(self.ui.actionBinder) self._sub_window_action_group.addAction(self.ui.actionBinder) self.ui.actionWrite.trigger() # menu bar actions self.ui.actionOpen_test_project.triggered.connect( self.launch_open_test_project) self.ui.actionPreferences.triggered.connect(self.launch_preferences) self.ui.actionStart_window.triggered.connect(self.launch_start_window) self.ui.actionSave.triggered.connect(cfg.core.project.save) self.ui.actionSave_as.triggered.connect(self.launch_save_as_dialog) self.ui.actionOpen.triggered.connect(self.launch_open_dialog) self.ui.actionClose_project.triggered.connect(self.launch_close_dialog) self.ui.actionExit.triggered.connect(self.launch_exit_dialog) self._enable_actions(False)
def __init__(self): super().__init__() self.sm = serial_manager.SerialManager() self.serial_thread = QThread() self.sm.moveToThread(self.serial_thread) self.serial_thread.start() self.test_version_signal.connect(self.sm.check_version) self.read_cables_signal.connect(self.sm.read_cables) self.sm.version_check_signal.connect(self.version_check) self.sm.port_unavailable_signal.connect(self.port_unavailable) self.sm.serial_error_signal.connect(self.serial_error) self.sm.cable_values_signal.connect(self.display_cables) self.sm.no_sensors_signal.connect(self.no_sensors) self.port_name = None self.system_font = QApplication.font().family() self.label_font = QFont(self.system_font, 14) self.sensor_font = QFont(self.system_font, 12) self.quit = QAction("Quit/退出;結束", self) self.quit.setShortcut("Ctrl+Q") self.quit.setStatusTip("Exit Program/退出;結束") self.quit.triggered.connect(self.close) self.about_tu = QAction("About Test Utility", self) self.about_tu.setShortcut("Ctrl+U") self.about_tu.setStatusTip("About Program") self.about_tu.triggered.connect(self.about_program) self.aboutqt = QAction("About Qt", self) self.aboutqt.setShortcut("Ctrl+I") self.aboutqt.setStatusTip("About Qt") self.aboutqt.triggered.connect(self.about_qt) # Create menubar self.menubar = self.menuBar() self.file_menu = self.menubar.addMenu("&File/文件") self.file_menu.addAction(self.quit) self.serial_menu = self.menubar.addMenu("&Serial/串行端口") self.serial_menu.installEventFilter(self) self.ports_menu = QMenu("&Ports/串行端口", self) self.serial_menu.addMenu(self.ports_menu) self.ports_menu.aboutToShow.connect(self.populate_ports) self.ports_group = QActionGroup(self) self.ports_group.triggered.connect(self.connect_port) self.help_menu = self.menubar.addMenu("&Help/帮助") self.help_menu.addAction(self.about_tu) self.help_menu.addAction(self.aboutqt) self.center() self.initUI()
def initUI(self): logging.debug('__init__() calledt topMenuBar') self.fileMenu = self.addMenu(QC.translate('', 'File')) self.langMenu = self.addMenu(QC.translate('', 'Language')) self.helpMenu = self.addMenu(QC.translate('', 'Help')) self.info_action = QAction(QC.translate('', 'Info'), self.helpMenu) self.helpMenu.addAction(self.info_action) self.new_action = QAction(QC.translate('', 'New'), self.fileMenu) self.open_action = QAction(QC.translate('', 'Open'), self.fileMenu) self.save_action = QAction(QC.translate('', 'Save'), self.fileMenu) self.save_as_action = QAction(QC.translate('', 'Save as ...'), self.fileMenu) self.settings_action = QAction(QC.translate('', 'Settings'), self.fileMenu) self.close_action = QAction(QC.translate('', 'Close'), self.fileMenu) self.fileMenu.addAction(self.new_action) self.fileMenu.addAction(self.open_action) self.fileMenu.addAction(self.save_action) self.fileMenu.addAction(self.save_as_action) self.fileMenu.addAction(self.settings_action) self.fileMenu.addAction(self.close_action) self.langMenu.triggered.connect(self.switchLanguage) self.close_action.triggered.connect(self.closeEvent) self.langGroup = QActionGroup(self.langMenu) self.actionList = [] mod_path = os.path.dirname(Pythonic.__file__) mod_path = os.path.join(mod_path, 'translations') for file in os.listdir(mod_path): if file.endswith('.qm'): logging.debug('file found: {}'.format(file)) logging.debug('with locale {}'.format(file[-5:-3])) icon_string = os.path.join(mod_path, file[-5:-3] + '.png') logging.debug('Translation Language: {}'.format( QC.translate('', 'Save'))) logging.debug('current Language: {}'.format(icon_string)) lang_icon = QIcon(icon_string) lang_action = QAction(lang_icon, QC.translate('', file[-5:-3]), self.langGroup) lang_action.setData(file) lang_action.setCheckable(True) self.langGroup.addAction(lang_action) self.langMenu.addAction(lang_action) self.actionList.append(lang_action) currentLang = QLocale.system().name() logging.debug('current Language: {}'.format(currentLang[:2]))
def __init__(self, parent = None): super().__init__(parent) self.mActionGroup = QActionGroup(self) self.mSelectedTool = None self.mPreviouslyDisabledTool = None self.mMapDocument = None self.mActionGroup.setExclusive(True) self.mActionGroup.triggered.connect(self.actionTriggered) self.selectEnabledToolSignal.connect(self.selectEnabledTool)
def create_context_menu(self) -> QMenu: assert self.context_menu_pos is not None menu = QMenu() create_label_action = menu.addAction(self.tr("Add protocol label")) create_label_action.setIcon(QIcon.fromTheme("list-add")) create_label_action.setEnabled(not self.selection_is_empty) create_label_action.triggered.connect(self.on_create_label_action_triggered) if not self.selection_is_empty: selected_encoding = self.model().protocol.messages[self.selected_rows[0]].decoder if not all(self.model().protocol.messages[i].decoder is selected_encoding for i in self.selected_rows): selected_encoding = None encoding_group = QActionGroup(self) encoding_menu = menu.addMenu("Enforce encoding") for decoding in self.model().project_manager.decodings: ea = encoding_menu.addAction(decoding.name) ea.setCheckable(True) ea.setActionGroup(encoding_group) if selected_encoding == decoding: ea.setChecked(True) ea.setData(decoding) ea.triggered.connect(self.on_encoding_action_triggered) selected_modulation = self.model().protocol.messages[self.selected_rows[0]].modulator_index if not all(self.model().protocol.messages[i].modulator_index == selected_modulation for i in self.selected_rows): selected_modulation = -1 modulation_group = QActionGroup(self) modulation_menu = menu.addMenu("Modulation") for i, modulator in enumerate(self.model().project_manager.modulators): ma = modulation_menu.addAction(modulator.name) ma.setCheckable(True) ma.setActionGroup(modulation_group) if selected_modulation == i: ma.setChecked(True) ma.setData(i) ma.triggered.connect(self.on_modulation_action_triggered) open_modulator_dialog_action = modulation_menu.addAction(self.tr("...")) open_modulator_dialog_action.triggered.connect(self.on_open_modulator_dialog_action_triggered) return menu
def __init__(self, fileName: str, maxSize: int, menu: Any, callbackMethod: Any): ItemHistory.__init__(self, fileName, maxSize) self.menu = menu self.callbackMethod = callbackMethod items = self.tree.getElementsByTagName("item") self.actionGroup = QActionGroup(None) for node in items: text = self._getText(node) # type: str a = self.menu.addAction(text) # type: Any self.actionGroup.addAction(a) self.actionGroup.triggered.connect(self.actionTriggered)
def create_size_actions(self): """Creates window size actions.""" group = QActionGroup(self) group.setExclusive(True) for num, size in enumerate(sorted(self.sizes.keys()), 1): width, height = size action = self.sizes[size] action.setActionGroup(group) w, h = width, height + self.widgets_height action.setText("%dX" % num) action.setToolTip("%sx%s" % (width, height)) action.triggered.connect(lambda t, wi=w, he=h: self.resize(wi, he))
def createMenuBar(self): """ Cria o menu superior, adicionando os devidos submenus e suas respectivas ações. """ self.menubar = self.menuBar() menu = self.menubar.addMenu('Algoritmos') # Submenu referente aos algoritmos relacionados # a construção de retas. submenu = menu.addMenu('Retas') group = QActionGroup(submenu) action = Action(lambda: self.lines.setFn(bresenham.line), group, 'Bresenham', True) action.setChecked(True) submenu.addAction(action) action = Action(lambda: self.lines.setFn(dda.line), group, 'DDA', True) submenu.addAction(action) # Submenu referente aos algoritmos relacionados # a janela de recorte 2D. submenu = menu.addMenu('Recorte') group = QActionGroup(submenu) action = Action( lambda: Painter.setClippingFn(cohen_sutherland.clipping), group, 'Cohen-Sutherland', True) action.setChecked(True) submenu.addAction(action) action = Action(lambda: Painter.setClippingFn(liang_barsky.clipping), group, 'Liang-Barsky', True) submenu.addAction(action) # Submenu referente aos algoritmos relacionados # a preenchimento de área. submenu = menu.addMenu('Preenchimento') group = QActionGroup(submenu) action = Action(lambda: self.setFillFn(flood_fill.flood4), group, 'Flood-Fill', True) action.setChecked(True) submenu.addAction(action) action = Action(lambda: self.setFillFn(boundary_fill.boundary4), group, 'Boundary-Fill', True) submenu.addAction(action)
def loadLanguages(self): self.languages = dict.fromkeys([ f for f in listdir(self.LANG_PATH) if isfile(join(self.LANG_PATH, f)) ]) for lang in self.languages: self.languages[lang] = QAction(lang.split(".")[0].capitalize()) languageGroup = QActionGroup(self) for lang in self.languages.keys(): i = self.languages[lang] i.setCheckable(True) languageGroup.addAction(i) self.languageMenu.addAction(i)
def newCommModeMenu(self): # CONSIDER: Radio button options are displayed as ✓ instead of • when using .setStyleSheet() on parent this = QMenu("Communication mode", self) actionGroup = QActionGroup(self) for mode in CommMode.__members__.keys(): action = actionGroup.addAction(QAction(f'{mode} mode', self)) action.setCheckable(True) action.mode = CommMode[mode] this.addAction(action) actionGroup.triggered.connect(self.changeCommMode) this.group = actionGroup return this
def _create_actions(self): group = QActionGroup(self) self.grid_action = QAction( '&Grid', self, shortcut='ctrl+G', triggered=self.show_grid, checkable=True, icon=load_icon(':/icons/show_grid.png') ) self.grid_action.setChecked(True) group.addAction(self.grid_action) self.expanded_action = QAction( '&Expanded', self, shortcut='ctrl+E', triggered=self.show_expanded, checkable=True, icon=load_icon(':/icons/show_expanded.png') ) group.addAction(self.expanded_action)
def make_action_group(parent, action_names, always_usable=False): """Helper for cleanly grouping actions by name If always_usable is True, also add them to C{parent} in case their toolbar is hidden. """ group = QActionGroup(parent) for action_name in action_names: action = parent.findChild(QAction, action_name) group.addAction(action) if always_usable: parent.addAction(action) return group
def create_size_actions(self): """Creates window size actions.""" group = QActionGroup(self) group.setExclusive(True) for num, size in enumerate( sorted(self.sizes.keys()), 1): width, height = size action = self.sizes[size] action.setActionGroup(group) w, h = width, height+self.widgets_height action.setText("%dX" % num) action.setToolTip("%sx%s" % (width, height)) action.triggered.connect(lambda t, wi=w, he=h: self.resize(wi, he))
def setup_menu_window_title(menu: QMenu, callback: Callable): s = settings.Setting_Custom_Appearance_General_WINDOW_TITLE def set_window_title(idx_): s.value = idx_ callback() group = QActionGroup(menu) for idx, action in enumerate(menu.actions()): action.setChecked(idx == s.value) action.triggered.connect(lambda x, a=idx, f=set_window_title: f(a)) group.addAction(action)
def _context_menu(self, point): """ Called when the widget is right-clicked to display the context menu. :param point: the location where the click happened """ logger.debug("Opening widget context menu") menu = QMenu(self) # Add the network settings settings = QAction('Network Settings', menu) iconPath = self._plugin.resource('settings.png') settings.setIcon(QIcon(iconPath)) # Add a handler on the action def settingsActionTriggered(): dialog = NetworkSettingsDialog(self._plugin) dialog.exec_() settings.triggered.connect(settingsActionTriggered) menu.addAction(settings) # Add each of the servers if self._plugin.core.servers: menu.addSeparator() serverGroup = QActionGroup(self) def serverActionTriggered(serverAction): if not self._plugin.network.connected and \ serverAction.isChecked(): self._plugin.network.connect(serverAction._server.host, serverAction._server.port) else: self._plugin.network.disconnect() for server in self._plugin.core.servers: isConnected = self._plugin.network.connected \ and server.host == self._plugin.network.host \ and server.port == self._plugin.network.port serverAction = QAction('%s:%d' % (server.host, server.port), menu, checkable=True) serverAction._server = server serverAction.setChecked(isConnected) serverGroup.addAction(serverAction) menu.addActions(serverGroup.actions()) serverGroup.triggered.connect(serverActionTriggered) # Show the context menu menu.exec_(self.mapToGlobal(point))
def createActionGroup(parent, name=None, exclusive=False): """ Module function to create an action group. @param parent parent object of the action group (QObject) @param name name of the action group object (string) @param exclusive flag indicating an exclusive action group (boolean) @return reference to the created action group (QActionGroup) """ actGrp = QActionGroup(parent) if name: actGrp.setObjectName(name) actGrp.setExclusive(exclusive) return actGrp
def create_state_slots(self): """Creates state slot actions.""" group = QActionGroup(self) group.setExclusive(True) for slot in range(10): self.slots[slot] = QAction(self) self.slots[slot].setCheckable(True) self.slots[slot].setText("Slot %d" % slot) self.slots[slot].setShortcut(QKeySequence(str(slot))) self.slots[slot].setActionGroup(group) self.menuStateSlot.addAction(self.slots[slot]) self.slots[0].setChecked(True) for slot, action in self.slots.items(): action.triggered.connect(lambda t, s=slot: self.worker.state_set_slot(s))
class FullscreenMenu(QMenu): def __init__(self, main_win, fullscreen_mngr): super().__init__(parent=main_win) self.fullscreen_mngr = fullscreen_mngr self.main_win = main_win self.setTitle("Fullscreen") self.setIcon(icons.get("fullscreen_menu_bttn")) self.qguiapp = QApplication.instance() self.action_group = QActionGroup(self) self.stop_fs_action = StopFullscreenAction( parent=self, fullscreen_mngr=self.fullscreen_mngr ) self.qscreens = None self.refresh_items() self.fullscreen_mngr.fullscreenstarted.connect(self.on_fullscreenstarted) self.fullscreen_mngr.fullscreenstopped.connect(self.on_fullscreenstopped) def refresh_items(self): # Clear action group for action in self.action_group.actions(): self.action_group.removeAction(action) del action # Add qscreen actions to group this_qscreen = get_qscreen_at(self.main_win) primary_qscreen = self.qguiapp.primaryScreen() sorted_qscreens = sorted(self.qguiapp.screens(), key=lambda s: s.name()) for qscreen in sorted_qscreens: is_primary = qscreen == primary_qscreen is_this_screen = qscreen == this_qscreen action = StartFullscreenAction( qscreen=qscreen, fullscreen_mngr=self.fullscreen_mngr, is_primary=is_primary, is_this_screen=is_this_screen, main_win=self.main_win, ) action.setCheckable(True) action.setIcon(icons.get("display_screen")) self.action_group.addAction(action) self.action_group.addAction(self.stop_fs_action) self.addActions(self.action_group.actions()) def on_menu_aboutToShow(self): self.setChecked(self.fullscreen_mngr.is_fullscreen()) @pyqtSlot(QAction) def on_fullscreenstarted(self, action): self.stop_fs_action.setEnabled(True) @pyqtSlot() def on_fullscreenstopped(self): self.stop_fs_action.setEnabled(False) def on_aboutToShow(self): self.refresh_items()
def __init__(self, mainwindow): QActionGroup.__init__(self, mainwindow) self._acts = {} self._accels = {} self.setExclusive(True) for d in app.documents: self.addDocument(d) app.documentCreated.connect(self.addDocument) app.documentClosed.connect(self.removeDocument) app.documentUrlChanged.connect(self.setDocumentStatus) app.documentModificationChanged.connect(self.setDocumentStatus) app.jobStarted.connect(self.setDocumentStatus) app.jobFinished.connect(self.setDocumentStatus) mainwindow.currentDocumentChanged.connect(self.setCurrentDocument) engrave.engraver(mainwindow).stickyChanged.connect(self.setDocumentStatus) self.triggered.connect(self.slotTriggered)
def __init__(self): QLabel.__init__(self) self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint) self.setAttribute(Qt.WA_NoSystemBackground) self.setMouseTracking(True) self.dragPosition = QPoint(0, 0) self.mousePosition = QCursor.pos() self.actionFaces = QActionGroup(self) allFaceActions = [] for name in sorted(self.faces): action = QAction(name, self.actionFaces) action.setCheckable(True) allFaceActions.append(action) self.actionFaces.triggered.connect(self.actionUpdateFace) startAction = random.choice(allFaceActions) startAction.setChecked(True) self.actionUpdateFace(startAction) self.actionQuit = QAction("Quit", self) self.actionQuit.triggered.connect(QApplication.instance().quit) self.timer = QTimer() self.timer.timeout.connect(self.updateFromMousePosition) self.timer.start(self.update_interval) self.painter = None
def __init__(self, **kwargs): super(SearchOptionsButton, self).__init__(**kwargs) self.setText(self.tr('Options')) menu = QMenu() self.actionCi = menu.addAction(self.tr('Case insensitive')) menu.addSeparator() self.actionFormat = QActionGroup(self) self.actionPlain = menu.addAction(self.tr('Plain text')) self.actionPlain.setEnabled(False) self.actionRe = menu.addAction(self.tr('Regular expression')) self.actionGlob = menu.addAction(self.tr('Glob pattern')) self.actionGlob.setEnabled(False) self.actionFormat.addAction(self.actionPlain) self.actionFormat.addAction(self.actionRe) self.actionFormat.addAction(self.actionGlob) self.actionRoot = menu.addAction(self.tr('Search in best root dir')) for act in [self.actionCi, self.actionRe, self.actionPlain, self.actionGlob, self.actionRoot]: act.setCheckable(True) self.actionRe.setChecked(True) self.setMenu(menu)
def setupMenuBar(self): self.fileMenu = self.menuBar().addMenu("&File") self.dateFormatMenu = self.fileMenu.addMenu("&Date format") self.dateFormatGroup = QActionGroup(self) for f in self.dateFormats: action = QAction(f, self, checkable=True, triggered=self.changeDateFormat) self.dateFormatGroup.addAction(action) self.dateFormatMenu.addAction(action) if f == self.currentDateFormat: action.setChecked(True) self.fileMenu.addAction(self.printAction) self.fileMenu.addAction(self.exitAction) self.cellMenu = self.menuBar().addMenu("&Cell") self.cellMenu.addAction(self.cell_addAction) self.cellMenu.addAction(self.cell_subAction) self.cellMenu.addAction(self.cell_mulAction) self.cellMenu.addAction(self.cell_divAction) self.cellMenu.addAction(self.cell_sumAction) self.cellMenu.addSeparator() self.cellMenu.addAction(self.colorAction) self.cellMenu.addAction(self.fontAction) self.menuBar().addSeparator() self.aboutMenu = self.menuBar().addMenu("&Help") self.aboutMenu.addAction(self.aboutSpreadSheet)
def cb_backends(self): self.cb_backends = QComboBox() self.cb_backends.addItem('Auto') menuLyricSource = QMenu(self.ui.menuEdit) menuLyricSource.setTitle('Lyric source') self.lyricGroup = QActionGroup(self) def addAction(name, checked=False): action = QAction(name, self) action.setText(name) action.setCheckable(True) action.setChecked(checked) action.setActionGroup(self.lyricGroup) return action menuLyricSource.addAction(addAction('Auto', True)) menuLyricSource.addSeparator() menuLyricSource.triggered.connect(self._menu_backend_change) for backend in Pyrics.get_backends(): menuLyricSource.addAction(addAction(backend.__name__)) self.cb_backends.addItem(backend.__name__) self.ui.menuEdit.addMenu(menuLyricSource) self.ui.toolBar.addWidget(self.cb_backends) self.cb_backends.currentIndexChanged.connect(self._cb_backend_change)
def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self.splitter.setStretchFactor(0, 5) self.splitter.setStretchFactor(1, 70) self.listDelegate = listCompleterDelegate(self) self.list.setItemDelegate(self.listDelegate) self.list.itemClicked.connect(self.showDiff) self.list.setContextMenuPolicy(Qt.CustomContextMenu) self.list.customContextMenuRequested.connect(self.popupMenu) self.btnDelete.setEnabled(False) self.btnDelete.clicked.connect(self.delete) self.btnRestore.clicked.connect(self.restore) self.btnRestore.setEnabled(False) # self.list.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.updateTimer = QTimer() self.updateTimer.setSingleShot(True) self.updateTimer.setInterval(500) self.updateTimer.timeout.connect(self.update) self.updateTimer.stop() self.menu = QMenu(self) self.actGroup = QActionGroup(self) self.actShowDiff = QAction(self.tr("Show modifications"), self.menu) self.actShowDiff.setCheckable(True) self.actShowDiff.setChecked(True) self.actShowDiff.triggered.connect(self.showDiff) self.menu.addAction(self.actShowDiff) self.actGroup.addAction(self.actShowDiff) self.actShowVersion = QAction(self.tr("Show ancient version"), self.menu) self.actShowVersion.setCheckable(True) self.actShowVersion.setChecked(False) self.actShowVersion.triggered.connect(self.showDiff) self.menu.addAction(self.actShowVersion) self.actGroup.addAction(self.actShowVersion) self.menu.addSeparator() self.actShowSpaces = QAction(self.tr("Show spaces"), self.menu) self.actShowSpaces.setCheckable(True) self.actShowSpaces.setChecked(False) self.actShowSpaces.triggered.connect(self.showDiff) self.menu.addAction(self.actShowSpaces) self.actDiffOnly = QAction(self.tr("Show modifications only"), self.menu) self.actDiffOnly.setCheckable(True) self.actDiffOnly.setChecked(True) self.actDiffOnly.triggered.connect(self.showDiff) self.menu.addAction(self.actDiffOnly) self.btnOptions.setMenu(self.menu) self._model = None self._index = None
def on_main_window_start(main_window): main_window.theme_menu = main_window.menuBar().addMenu( main_window.tr('Themes')) themes_directory = QFileInfo('themes') if themes_directory.exists(): active_theme = ThemeManager.get_active_theme() path = themes_directory.absoluteFilePath() group_action = QActionGroup(main_window) group_action.setExclusive(True) for theme in os.listdir(path): action = QAction(theme, main_window) action.setData(theme) action.setCheckable(True) if theme == active_theme: action.setChecked(True) action.changed.connect(ThemeManager.wrapper(main_window)) group_action.addAction(action) group_action.addAction(action) main_window.theme_menu.addAction(action)
def __init__(self, parent=None): super(Camera, self).__init__(parent) self.ui = Ui_Camera() self.camera = None self.imageCapture = None self.mediaRecorder = None self.isCapturingImage = False self.applicationExiting = False self.imageSettings = QImageEncoderSettings() self.audioSettings = QAudioEncoderSettings() self.videoSettings = QVideoEncoderSettings() self.videoContainerFormat = '' self.ui.setupUi(self) cameraDevice = QByteArray() videoDevicesGroup = QActionGroup(self) videoDevicesGroup.setExclusive(True) #for multiple cameras ata for deviceName in QCamera.availableDevices(): description = QCamera.deviceDescription(deviceName) videoDeviceAction = QAction(description, videoDevicesGroup) videoDeviceAction.setCheckable(True) videoDeviceAction.setData(deviceName) if cameraDevice.isEmpty(): cameraDevice = deviceName videoDeviceAction.setChecked(True) self.ui.menuDevices.addAction(videoDeviceAction) videoDevicesGroup.triggered.connect(self.updateCameraDevice) self.ui.captureWidget.currentChanged.connect(self.updateCaptureMode) self.ui.lockButton.hide() self.setCamera(cameraDevice)
def __init__(self, win): super(PathToolManager, self).__init__() self.window = win self._active_tool = None self._active_part = None self.select_tool = SelectTool(self) self.pencil_tool = PencilTool(self) self.break_tool = BreakTool(self) self.erase_tool = EraseTool(self) self.insertion_tool = InsertionTool(self) self.skip_tool = SkipTool(self) self.paint_tool = PaintTool(self) # (self, win.path_graphics_view.toolbar) self.add_seq_tool = AddSeqTool(self) self.mods_tool = ModsTool(self) def installTool(tool_name, window): l_tool_name = tool_name.lower() tool_widget = getattr(window, 'action_path_' + l_tool_name) tool = getattr(self, l_tool_name + '_tool') tool.action_name = 'action_path_' + tool_name def clickHandler(self): tool_widget.setChecked(True) self.setActiveTool(tool) if hasattr(tool, 'widgetClicked'): tool.widgetClicked() # end def select_tool_method_name = 'choose' + tool_name + 'Tool' setattr(self.__class__, select_tool_method_name, clickHandler) handler = getattr(self, select_tool_method_name) tool_widget.triggered.connect(handler) return tool_widget # end def tools = ('Select', 'Pencil', 'Break', 'Erase', 'Insertion', 'Skip', 'Paint', 'Add_Seq', 'Mods') ag = QActionGroup(win) # Call installTool on every tool list(map((lambda tool_name: ag.addAction(installTool(tool_name, win))), tools)) ag.setExclusive(True) # Select the preferred Startup tool startup_tool_name = app().prefs.getStartupToolName() getattr(self, 'choose' + startup_tool_name + 'Tool')()
def _create_actions(self): group = QActionGroup(self) self.grid_action = QAction( "&Grid", self, shortcut="ctrl+G", triggered=self.show_grid, checkable=True, icon=load_icon(":/icons/show_grid.png"), ) self.grid_action.setChecked(True) group.addAction(self.grid_action) self.expanded_action = QAction( "&Expanded", self, shortcut="ctrl+E", triggered=self.show_expanded, checkable=True, icon=load_icon(":/icons/show_expanded.png"), ) group.addAction(self.expanded_action)
def menuInit(self): self.actionOpenVideo.triggered.connect(self.openVideoFile) self.actionOpenFilterSetting.triggered.connect(self.openFilterFile) self.actionSaveCSVFile.triggered.connect(self.saveCSVFile) self.actionRunObjectTracking.triggered.connect(self.runObjectTracking) self.actionTrackingPathColor.triggered.connect(self.openTrackingPathColorSelectorDialog) self.menuAlgorithmsActionGroup = QActionGroup(self.menuAlgorithms) path_list = [[tracking_system_path, currentDirPath], ] if os.path.exists(user_defined_lib_path): path_list.append([user_defined_tracking_system_path, user_defined_lib_path]) for system_path in path_list: for module_path in get_modules(system_path[0], system_path[1]): module_str = '.'.join(module_path) try: module = importlib.import_module(module_str) if not hasattr(module, 'Widget'): continue class_def = getattr(module, "Widget") if not issubclass(class_def, QtWidgets.QWidget): continue widget = class_def(self.stackedWidget) widget.reset.connect(self.resetDataframe) widget.restart.connect(self.restartDataframe) self.stackedWidget.addWidget(widget) action = self.menuAlgorithms.addAction(widget.get_name()) action.triggered.connect(self.generateAlgorithmsMenuClicked(widget)) action.setCheckable(True) action.setActionGroup(self.menuAlgorithmsActionGroup) if len(self.menuAlgorithmsActionGroup.actions()) == 1: action.setChecked(True) self.algorithmSettingsGroupBox.setTitle(widget.get_name()) except Exception as e: if system_path[1] is user_defined_lib_path: msg = 'Tracking Lib. Load Fail: {0}\n{1}'.format(module_str, e) self.generateCriticalMessage(msg) continue
def __init__(self, parent): super(NoteEditor, self).__init__(parent) self.highlighter = Highlighter( self.document() ) # the language dictionary to be used self.dictionary = None self.highlighter.setDictionary(self.dictionary) # create dictionary selector menu self.dictionarySelector = QMenu("&Dictionary") self.dictionaryActions = QActionGroup(self) self.noDicitionaryAction = self.dictionaryActions.addAction("None") self.noDicitionaryAction.setCheckable(True) self.dictionarySelector.addAction(self.noDicitionaryAction) self.defaultDicitionaryAction = self.dictionaryActions.addAction("Default") self.defaultDicitionaryAction.setCheckable(True) self.dictionarySelector.addAction(self.defaultDicitionaryAction) self.dictionarySelector.addSeparator() for lang in enchant.list_languages(): langAction = self.dictionaryActions.addAction(lang) langAction.setCheckable(True) self.dictionarySelector.addAction(langAction) # connect signal to change language dictionary and set the default language self.dictionaryActions.triggered.connect(self.changeDictionary) self.defaultDicitionaryAction.trigger() # configure the custom context menu for spelling suggestions self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.showContextMenu) # settings self.noteFilePath = "" #stores path to the file being edited self.setFont(QFont("Monospace")) tabWidth = QFontMetrics( self.currentCharFormat().font() ).width(" ")#get the width of four spaces self.setTabStopWidth(tabWidth) #set the default tab width to be that of four spaces
def __populateMenu(self): """ Private slot to populate the menu. """ self.aboutToShow.disconnect(self.__populateMenu) self.__actionGroup = QActionGroup(self) # add default action self.__defaultUserAgent = QAction(self) self.__defaultUserAgent.setText(self.tr("Default")) self.__defaultUserAgent.setCheckable(True) self.__defaultUserAgent.triggered.connect( self.__switchToDefaultUserAgent) if self.__url: self.__defaultUserAgent.setChecked( self.__manager.userAgentForUrl(self.__url) == "") else: from Helpviewer.HelpBrowserWV import HelpWebPage self.__defaultUserAgent.setChecked(HelpWebPage().userAgent() == "") self.addAction(self.__defaultUserAgent) self.__actionGroup.addAction(self.__defaultUserAgent) isChecked = self.__defaultUserAgent.isChecked() # add default extra user agents isChecked = self.__addDefaultActions() or isChecked # add other action self.addSeparator() self.__otherUserAgent = QAction(self) self.__otherUserAgent.setText(self.tr("Other...")) self.__otherUserAgent.setCheckable(True) self.__otherUserAgent.triggered.connect( self.__switchToOtherUserAgent) self.addAction(self.__otherUserAgent) self.__actionGroup.addAction(self.__otherUserAgent) self.__otherUserAgent.setChecked(not isChecked)
def createActions(self): self.addImagesAct = QAction("&Add Images...", self, shortcut="Ctrl+A", triggered=self.addImage) self.removeAllImagesAct = QAction("&Remove All Images", self, shortcut="Ctrl+R", triggered=self.removeAllImages) self.exitAct = QAction("&Quit", self, shortcut="Ctrl+Q", triggered=self.close) self.styleActionGroup = QActionGroup(self) for styleName in QStyleFactory.keys(): action = QAction(self.styleActionGroup, text="%s Style" % styleName, checkable=True, triggered=self.changeStyle) action.setData(styleName) self.guessModeStateAct = QAction("&Guess Image Mode/State", self, checkable=True, checked=True) self.aboutAct = QAction("&About", self, triggered=self.about) self.aboutQtAct = QAction("About &Qt", self, triggered=QApplication.instance().aboutQt)
class SearchOptionsButton(QPushButton): def __init__(self, **kwargs): super(SearchOptionsButton, self).__init__(**kwargs) self.setText(self.tr('Options')) menu = QMenu() self.actionCi = menu.addAction(self.tr('Case insensitive')) menu.addSeparator() self.actionFormat = QActionGroup(self) self.actionPlain = menu.addAction(self.tr('Plain text')) self.actionPlain.setEnabled(False) self.actionRe = menu.addAction(self.tr('Regular expression')) self.actionGlob = menu.addAction(self.tr('Glob pattern')) self.actionGlob.setEnabled(False) self.actionFormat.addAction(self.actionPlain) self.actionFormat.addAction(self.actionRe) self.actionFormat.addAction(self.actionGlob) self.actionRoot = menu.addAction(self.tr('Search in best root dir')) for act in [self.actionCi, self.actionRe, self.actionPlain, self.actionGlob, self.actionRoot]: act.setCheckable(True) self.actionRe.setChecked(True) self.setMenu(menu) def shouldFindRoot(self): return self.actionRoot.isChecked() def caseSensitive(self): return not self.actionCi.isChecked() def reFormat(self): if self.actionPlain.isChecked(): return QRegExp.FixedString elif self.actionRe.isChecked(): return QRegExp.RegExp elif self.actionGlob.isChecked(): return QRegExp.WildcardUnix
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() widget = QWidget() self.setCentralWidget(widget) topFiller = QWidget() topFiller.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.infoLabel = QLabel( "<i>Choose a menu option, or right-click to invoke a context menu</i>", alignment=Qt.AlignCenter) self.infoLabel.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) bottomFiller = QWidget() bottomFiller.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) vbox = QVBoxLayout() vbox.setContentsMargins(5, 5, 5, 5) vbox.addWidget(topFiller) vbox.addWidget(self.infoLabel) vbox.addWidget(bottomFiller) widget.setLayout(vbox) self.createActions() self.createMenus() message = "A context menu is available by right-clicking" self.statusBar().showMessage(message) self.setWindowTitle("Menus") self.setMinimumSize(160,160) self.resize(480,320) def contextMenuEvent(self, event): menu = QMenu(self) menu.addAction(self.cutAct) menu.addAction(self.copyAct) menu.addAction(self.pasteAct) menu.exec_(event.globalPos()) def newFile(self): self.infoLabel.setText("Invoked <b>File|New</b>") def open(self): self.infoLabel.setText("Invoked <b>File|Open</b>") def save(self): self.infoLabel.setText("Invoked <b>File|Save</b>") def print_(self): self.infoLabel.setText("Invoked <b>File|Print</b>") def undo(self): self.infoLabel.setText("Invoked <b>Edit|Undo</b>") def redo(self): self.infoLabel.setText("Invoked <b>Edit|Redo</b>") def cut(self): self.infoLabel.setText("Invoked <b>Edit|Cut</b>") def copy(self): self.infoLabel.setText("Invoked <b>Edit|Copy</b>") def paste(self): self.infoLabel.setText("Invoked <b>Edit|Paste</b>") def bold(self): self.infoLabel.setText("Invoked <b>Edit|Format|Bold</b>") def italic(self): self.infoLabel.setText("Invoked <b>Edit|Format|Italic</b>") def leftAlign(self): self.infoLabel.setText("Invoked <b>Edit|Format|Left Align</b>") def rightAlign(self): self.infoLabel.setText("Invoked <b>Edit|Format|Right Align</b>") def justify(self): self.infoLabel.setText("Invoked <b>Edit|Format|Justify</b>") def center(self): self.infoLabel.setText("Invoked <b>Edit|Format|Center</b>") def setLineSpacing(self): self.infoLabel.setText("Invoked <b>Edit|Format|Set Line Spacing</b>") def setParagraphSpacing(self): self.infoLabel.setText("Invoked <b>Edit|Format|Set Paragraph Spacing</b>") def about(self): self.infoLabel.setText("Invoked <b>Help|About</b>") QMessageBox.about(self, "About Menu", "The <b>Menu</b> example shows how to create menu-bar menus " "and context menus.") def aboutQt(self): self.infoLabel.setText("Invoked <b>Help|About Qt</b>") def createActions(self): self.newAct = QAction("&New", self, shortcut=QKeySequence.New, statusTip="Create a new file", triggered=self.newFile) self.openAct = QAction("&Open...", self, shortcut=QKeySequence.Open, statusTip="Open an existing file", triggered=self.open) self.saveAct = QAction("&Save", self, shortcut=QKeySequence.Save, statusTip="Save the document to disk", triggered=self.save) self.printAct = QAction("&Print...", self, shortcut=QKeySequence.Print, statusTip="Print the document", triggered=self.print_) self.exitAct = QAction("E&xit", self, shortcut="Ctrl+Q", statusTip="Exit the application", triggered=self.close) self.undoAct = QAction("&Undo", self, shortcut=QKeySequence.Undo, statusTip="Undo the last operation", triggered=self.undo) self.redoAct = QAction("&Redo", self, shortcut=QKeySequence.Redo, statusTip="Redo the last operation", triggered=self.redo) self.cutAct = QAction("Cu&t", self, shortcut=QKeySequence.Cut, statusTip="Cut the current selection's contents to the clipboard", triggered=self.cut) self.copyAct = QAction("&Copy", self, shortcut=QKeySequence.Copy, statusTip="Copy the current selection's contents to the clipboard", triggered=self.copy) self.pasteAct = QAction("&Paste", self, shortcut=QKeySequence.Paste, statusTip="Paste the clipboard's contents into the current selection", triggered=self.paste) self.boldAct = QAction("&Bold", self, checkable=True, shortcut="Ctrl+B", statusTip="Make the text bold", triggered=self.bold) boldFont = self.boldAct.font() boldFont.setBold(True) self.boldAct.setFont(boldFont) self.italicAct = QAction("&Italic", self, checkable=True, shortcut="Ctrl+I", statusTip="Make the text italic", triggered=self.italic) italicFont = self.italicAct.font() italicFont.setItalic(True) self.italicAct.setFont(italicFont) self.setLineSpacingAct = QAction("Set &Line Spacing...", self, statusTip="Change the gap between the lines of a paragraph", triggered=self.setLineSpacing) self.setParagraphSpacingAct = QAction("Set &Paragraph Spacing...", self, statusTip="Change the gap between paragraphs", triggered=self.setParagraphSpacing) self.aboutAct = QAction("&About", self, statusTip="Show the application's About box", triggered=self.about) self.aboutQtAct = QAction("About &Qt", self, statusTip="Show the Qt library's About box", triggered=self.aboutQt) self.aboutQtAct.triggered.connect(QApplication.instance().aboutQt) self.leftAlignAct = QAction("&Left Align", self, checkable=True, shortcut="Ctrl+L", statusTip="Left align the selected text", triggered=self.leftAlign) self.rightAlignAct = QAction("&Right Align", self, checkable=True, shortcut="Ctrl+R", statusTip="Right align the selected text", triggered=self.rightAlign) self.justifyAct = QAction("&Justify", self, checkable=True, shortcut="Ctrl+J", statusTip="Justify the selected text", triggered=self.justify) self.centerAct = QAction("&Center", self, checkable=True, shortcut="Ctrl+C", statusTip="Center the selected text", triggered=self.center) self.alignmentGroup = QActionGroup(self) self.alignmentGroup.addAction(self.leftAlignAct) self.alignmentGroup.addAction(self.rightAlignAct) self.alignmentGroup.addAction(self.justifyAct) self.alignmentGroup.addAction(self.centerAct) self.leftAlignAct.setChecked(True) def createMenus(self): self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.addAction(self.newAct) self.fileMenu.addAction(self.openAct) self.fileMenu.addAction(self.saveAct) self.fileMenu.addAction(self.printAct) self.fileMenu.addSeparator() self.fileMenu.addAction(self.exitAct) self.editMenu = self.menuBar().addMenu("&Edit") self.editMenu.addAction(self.undoAct) self.editMenu.addAction(self.redoAct) self.editMenu.addSeparator() self.editMenu.addAction(self.cutAct) self.editMenu.addAction(self.copyAct) self.editMenu.addAction(self.pasteAct) self.editMenu.addSeparator() self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) self.formatMenu = self.editMenu.addMenu("&Format") self.formatMenu.addAction(self.boldAct) self.formatMenu.addAction(self.italicAct) self.formatMenu.addSeparator().setText("Alignment") self.formatMenu.addAction(self.leftAlignAct) self.formatMenu.addAction(self.rightAlignAct) self.formatMenu.addAction(self.justifyAct) self.formatMenu.addAction(self.centerAct) self.formatMenu.addSeparator() self.formatMenu.addAction(self.setLineSpacingAct) self.formatMenu.addAction(self.setParagraphSpacingAct)
def createActions(self): self.newAct = QAction("&New", self, shortcut=QKeySequence.New, statusTip="Create a new file", triggered=self.newFile) self.openAct = QAction("&Open...", self, shortcut=QKeySequence.Open, statusTip="Open an existing file", triggered=self.open) self.saveAct = QAction("&Save", self, shortcut=QKeySequence.Save, statusTip="Save the document to disk", triggered=self.save) self.printAct = QAction("&Print...", self, shortcut=QKeySequence.Print, statusTip="Print the document", triggered=self.print_) self.exitAct = QAction("E&xit", self, shortcut="Ctrl+Q", statusTip="Exit the application", triggered=self.close) self.undoAct = QAction("&Undo", self, shortcut=QKeySequence.Undo, statusTip="Undo the last operation", triggered=self.undo) self.redoAct = QAction("&Redo", self, shortcut=QKeySequence.Redo, statusTip="Redo the last operation", triggered=self.redo) self.cutAct = QAction("Cu&t", self, shortcut=QKeySequence.Cut, statusTip="Cut the current selection's contents to the clipboard", triggered=self.cut) self.copyAct = QAction("&Copy", self, shortcut=QKeySequence.Copy, statusTip="Copy the current selection's contents to the clipboard", triggered=self.copy) self.pasteAct = QAction("&Paste", self, shortcut=QKeySequence.Paste, statusTip="Paste the clipboard's contents into the current selection", triggered=self.paste) self.boldAct = QAction("&Bold", self, checkable=True, shortcut="Ctrl+B", statusTip="Make the text bold", triggered=self.bold) boldFont = self.boldAct.font() boldFont.setBold(True) self.boldAct.setFont(boldFont) self.italicAct = QAction("&Italic", self, checkable=True, shortcut="Ctrl+I", statusTip="Make the text italic", triggered=self.italic) italicFont = self.italicAct.font() italicFont.setItalic(True) self.italicAct.setFont(italicFont) self.setLineSpacingAct = QAction("Set &Line Spacing...", self, statusTip="Change the gap between the lines of a paragraph", triggered=self.setLineSpacing) self.setParagraphSpacingAct = QAction("Set &Paragraph Spacing...", self, statusTip="Change the gap between paragraphs", triggered=self.setParagraphSpacing) self.aboutAct = QAction("&About", self, statusTip="Show the application's About box", triggered=self.about) self.aboutQtAct = QAction("About &Qt", self, statusTip="Show the Qt library's About box", triggered=self.aboutQt) self.aboutQtAct.triggered.connect(QApplication.instance().aboutQt) self.leftAlignAct = QAction("&Left Align", self, checkable=True, shortcut="Ctrl+L", statusTip="Left align the selected text", triggered=self.leftAlign) self.rightAlignAct = QAction("&Right Align", self, checkable=True, shortcut="Ctrl+R", statusTip="Right align the selected text", triggered=self.rightAlign) self.justifyAct = QAction("&Justify", self, checkable=True, shortcut="Ctrl+J", statusTip="Justify the selected text", triggered=self.justify) self.centerAct = QAction("&Center", self, checkable=True, shortcut="Ctrl+C", statusTip="Center the selected text", triggered=self.center) self.alignmentGroup = QActionGroup(self) self.alignmentGroup.addAction(self.leftAlignAct) self.alignmentGroup.addAction(self.rightAlignAct) self.alignmentGroup.addAction(self.justifyAct) self.alignmentGroup.addAction(self.centerAct) self.leftAlignAct.setChecked(True)
def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.resize(950, 700) screenRect = QDesktopWidget().screenGeometry() if globalSettings.windowGeometry: self.restoreGeometry(globalSettings.windowGeometry) else: self.move((screenRect.width()-self.width())/2, (screenRect.height()-self.height())/2) if not screenRect.contains(self.geometry()): self.showMaximized() if globalSettings.iconTheme: QIcon.setThemeName(globalSettings.iconTheme) if QIcon.themeName() in ('hicolor', ''): if not QFile.exists(icon_path + 'document-new.png'): QIcon.setThemeName(get_icon_theme()) if QFile.exists(icon_path+'retext.png'): self.setWindowIcon(QIcon(icon_path+'retext.png')) elif QFile.exists('/usr/share/pixmaps/retext.png'): self.setWindowIcon(QIcon('/usr/share/pixmaps/retext.png')) else: self.setWindowIcon(QIcon.fromTheme('retext', QIcon.fromTheme('accessories-text-editor'))) self.tabWidget = QTabWidget(self) self.initTabWidget() self.setCentralWidget(self.tabWidget) self.tabWidget.currentChanged.connect(self.changeIndex) self.tabWidget.tabCloseRequested.connect(self.closeTab) toolBar = QToolBar(self.tr('File toolbar'), self) self.addToolBar(Qt.TopToolBarArea, toolBar) self.editBar = QToolBar(self.tr('Edit toolbar'), self) self.addToolBar(Qt.TopToolBarArea, self.editBar) self.searchBar = QToolBar(self.tr('Search toolbar'), self) self.addToolBar(Qt.BottomToolBarArea, self.searchBar) toolBar.setVisible(not globalSettings.hideToolBar) self.editBar.setVisible(not globalSettings.hideToolBar) self.actionNew = self.act(self.tr('New'), 'document-new', self.createNew, shct=QKeySequence.New) self.actionNew.setPriority(QAction.LowPriority) self.actionOpen = self.act(self.tr('Open'), 'document-open', self.openFile, shct=QKeySequence.Open) self.actionOpen.setPriority(QAction.LowPriority) self.actionSetEncoding = self.act(self.tr('Set encoding'), trig=self.showEncodingDialog) self.actionSetEncoding.setEnabled(False) self.actionReload = self.act(self.tr('Reload'), 'view-refresh', lambda: self.currentTab.readTextFromFile()) self.actionReload.setEnabled(False) self.actionSave = self.act(self.tr('Save'), 'document-save', self.saveFile, shct=QKeySequence.Save) self.actionSave.setEnabled(False) self.actionSave.setPriority(QAction.LowPriority) self.actionSaveAs = self.act(self.tr('Save as'), 'document-save-as', self.saveFileAs, shct=QKeySequence.SaveAs) self.actionNextTab = self.act(self.tr('Next tab'), 'go-next', lambda: self.switchTab(1), shct=Qt.CTRL+Qt.Key_PageDown) self.actionPrevTab = self.act(self.tr('Previous tab'), 'go-previous', lambda: self.switchTab(-1), shct=Qt.CTRL+Qt.Key_PageUp) self.actionPrint = self.act(self.tr('Print'), 'document-print', self.printFile, shct=QKeySequence.Print) self.actionPrint.setPriority(QAction.LowPriority) self.actionPrintPreview = self.act(self.tr('Print preview'), 'document-print-preview', self.printPreview) self.actionViewHtml = self.act(self.tr('View HTML code'), 'text-html', self.viewHtml) self.actionChangeEditorFont = self.act(self.tr('Change editor font'), trig=self.changeEditorFont) self.actionChangePreviewFont = self.act(self.tr('Change preview font'), trig=self.changePreviewFont) self.actionSearch = self.act(self.tr('Find text'), 'edit-find', shct=QKeySequence.Find) self.actionSearch.setCheckable(True) self.actionSearch.triggered[bool].connect(self.searchBar.setVisible) self.searchBar.visibilityChanged.connect(self.searchBarVisibilityChanged) self.actionPreview = self.act(self.tr('Preview'), shct=Qt.CTRL+Qt.Key_E, trigbool=self.preview) if QIcon.hasThemeIcon('document-preview'): self.actionPreview.setIcon(QIcon.fromTheme('document-preview')) elif QIcon.hasThemeIcon('preview-file'): self.actionPreview.setIcon(QIcon.fromTheme('preview-file')) elif QIcon.hasThemeIcon('x-office-document'): self.actionPreview.setIcon(QIcon.fromTheme('x-office-document')) else: self.actionPreview.setIcon(QIcon(icon_path+'document-preview.png')) self.actionLivePreview = self.act(self.tr('Live preview'), shct=Qt.CTRL+Qt.Key_L, trigbool=self.enableLivePreview) menuPreview = QMenu() menuPreview.addAction(self.actionLivePreview) self.actionPreview.setMenu(menuPreview) self.actionTableMode = self.act(self.tr('Table mode'), shct=Qt.CTRL+Qt.Key_T, trigbool=lambda x: self.currentTab.editBox.enableTableMode(x)) if ReTextFakeVimHandler: self.actionFakeVimMode = self.act(self.tr('FakeVim mode'), shct=Qt.CTRL+Qt.ALT+Qt.Key_V, trigbool=self.enableFakeVimMode) if globalSettings.useFakeVim: self.actionFakeVimMode.setChecked(True) self.enableFakeVimMode(True) self.actionFullScreen = self.act(self.tr('Fullscreen mode'), 'view-fullscreen', shct=Qt.Key_F11, trigbool=self.enableFullScreen) self.actionFullScreen.setPriority(QAction.LowPriority) self.actionConfig = self.act(self.tr('Preferences'), icon='preferences-system', trig=self.openConfigDialog) self.actionConfig.setMenuRole(QAction.PreferencesRole) self.actionSaveHtml = self.act('HTML', 'text-html', self.saveFileHtml) self.actionPdf = self.act('PDF', 'application-pdf', self.savePdf) self.actionOdf = self.act('ODT', 'x-office-document', self.saveOdf) self.getExportExtensionsList() self.actionQuit = self.act(self.tr('Quit'), 'application-exit', shct=QKeySequence.Quit) self.actionQuit.setMenuRole(QAction.QuitRole) self.actionQuit.triggered.connect(self.close) self.actionUndo = self.act(self.tr('Undo'), 'edit-undo', lambda: self.currentTab.editBox.undo(), shct=QKeySequence.Undo) self.actionRedo = self.act(self.tr('Redo'), 'edit-redo', lambda: self.currentTab.editBox.redo(), shct=QKeySequence.Redo) self.actionCopy = self.act(self.tr('Copy'), 'edit-copy', lambda: self.currentTab.editBox.copy(), shct=QKeySequence.Copy) self.actionCut = self.act(self.tr('Cut'), 'edit-cut', lambda: self.currentTab.editBox.cut(), shct=QKeySequence.Cut) self.actionPaste = self.act(self.tr('Paste'), 'edit-paste', lambda: self.currentTab.editBox.paste(), shct=QKeySequence.Paste) self.actionUndo.setEnabled(False) self.actionRedo.setEnabled(False) self.actionCopy.setEnabled(False) self.actionCut.setEnabled(False) qApp = QApplication.instance() qApp.clipboard().dataChanged.connect(self.clipboardDataChanged) self.clipboardDataChanged() if enchant_available: self.actionEnableSC = self.act(self.tr('Enable'), trigbool=self.enableSpellCheck) self.actionSetLocale = self.act(self.tr('Set locale'), trig=self.changeLocale) self.actionWebKit = self.act(self.tr('Use WebKit renderer'), trigbool=self.enableWebKit) self.actionWebKit.setChecked(globalSettings.useWebKit) self.actionShow = self.act(self.tr('Show directory'), 'system-file-manager', self.showInDir) self.actionFind = self.act(self.tr('Next'), 'go-next', self.find, shct=QKeySequence.FindNext) self.actionFindPrev = self.act(self.tr('Previous'), 'go-previous', lambda: self.find(back=True), shct=QKeySequence.FindPrevious) self.actionCloseSearch = self.act(self.tr('Close'), 'window-close', lambda: self.searchBar.setVisible(False)) self.actionCloseSearch.setPriority(QAction.LowPriority) self.actionHelp = self.act(self.tr('Get help online'), 'help-contents', self.openHelp) self.aboutWindowTitle = self.tr('About ReText') self.actionAbout = self.act(self.aboutWindowTitle, 'help-about', self.aboutDialog) self.actionAbout.setMenuRole(QAction.AboutRole) self.actionAboutQt = self.act(self.tr('About Qt')) self.actionAboutQt.setMenuRole(QAction.AboutQtRole) self.actionAboutQt.triggered.connect(qApp.aboutQt) availableMarkups = markups.get_available_markups() if not availableMarkups: print('Warning: no markups are available!') self.defaultMarkup = availableMarkups[0] if availableMarkups else None if globalSettings.defaultMarkup: mc = markups.find_markup_class_by_name(globalSettings.defaultMarkup) if mc and mc.available(): self.defaultMarkup = mc if len(availableMarkups) > 1: self.chooseGroup = QActionGroup(self) markupActions = [] for markup in availableMarkups: markupAction = self.act(markup.name, trigbool=self.markupFunction(markup)) if markup == self.defaultMarkup: markupAction.setChecked(True) self.chooseGroup.addAction(markupAction) markupActions.append(markupAction) self.actionBold = self.act(self.tr('Bold'), shct=QKeySequence.Bold, trig=lambda: self.insertFormatting('bold')) self.actionItalic = self.act(self.tr('Italic'), shct=QKeySequence.Italic, trig=lambda: self.insertFormatting('italic')) self.actionUnderline = self.act(self.tr('Underline'), shct=QKeySequence.Underline, trig=lambda: self.insertFormatting('underline')) self.usefulTags = ('header', 'italic', 'bold', 'underline', 'numbering', 'bullets', 'image', 'link', 'inline code', 'code block', 'blockquote') self.usefulChars = ('deg', 'divide', 'dollar', 'hellip', 'laquo', 'larr', 'lsquo', 'mdash', 'middot', 'minus', 'nbsp', 'ndash', 'raquo', 'rarr', 'rsquo', 'times') self.formattingBox = QComboBox(self.editBar) self.formattingBox.addItem(self.tr('Formatting')) self.formattingBox.addItems(self.usefulTags) self.formattingBox.activated[str].connect(self.insertFormatting) self.symbolBox = QComboBox(self.editBar) self.symbolBox.addItem(self.tr('Symbols')) self.symbolBox.addItems(self.usefulChars) self.symbolBox.activated.connect(self.insertSymbol) self.updateStyleSheet() menubar = self.menuBar() menuFile = menubar.addMenu(self.tr('File')) menuEdit = menubar.addMenu(self.tr('Edit')) menuHelp = menubar.addMenu(self.tr('Help')) menuFile.addAction(self.actionNew) menuFile.addAction(self.actionOpen) self.menuRecentFiles = menuFile.addMenu(self.tr('Open recent')) self.menuRecentFiles.aboutToShow.connect(self.updateRecentFiles) menuFile.addAction(self.actionShow) menuFile.addAction(self.actionSetEncoding) menuFile.addAction(self.actionReload) menuFile.addSeparator() menuFile.addAction(self.actionSave) menuFile.addAction(self.actionSaveAs) menuFile.addSeparator() menuFile.addAction(self.actionNextTab) menuFile.addAction(self.actionPrevTab) menuFile.addSeparator() menuExport = menuFile.addMenu(self.tr('Export')) menuExport.addAction(self.actionSaveHtml) menuExport.addAction(self.actionOdf) menuExport.addAction(self.actionPdf) if self.extensionActions: menuExport.addSeparator() for action, mimetype in self.extensionActions: menuExport.addAction(action) menuExport.aboutToShow.connect(self.updateExtensionsVisibility) menuFile.addAction(self.actionPrint) menuFile.addAction(self.actionPrintPreview) menuFile.addSeparator() menuFile.addAction(self.actionQuit) menuEdit.addAction(self.actionUndo) menuEdit.addAction(self.actionRedo) menuEdit.addSeparator() menuEdit.addAction(self.actionCut) menuEdit.addAction(self.actionCopy) menuEdit.addAction(self.actionPaste) menuEdit.addSeparator() if enchant_available: menuSC = menuEdit.addMenu(self.tr('Spell check')) menuSC.addAction(self.actionEnableSC) menuSC.addAction(self.actionSetLocale) menuEdit.addAction(self.actionSearch) menuEdit.addAction(self.actionChangeEditorFont) menuEdit.addAction(self.actionChangePreviewFont) menuEdit.addSeparator() if len(availableMarkups) > 1: self.menuMode = menuEdit.addMenu(self.tr('Default markup')) for markupAction in markupActions: self.menuMode.addAction(markupAction) menuFormat = menuEdit.addMenu(self.tr('Formatting')) menuFormat.addAction(self.actionBold) menuFormat.addAction(self.actionItalic) menuFormat.addAction(self.actionUnderline) menuEdit.addAction(self.actionWebKit) menuEdit.addSeparator() menuEdit.addAction(self.actionViewHtml) menuEdit.addAction(self.actionPreview) menuEdit.addAction(self.actionTableMode) if ReTextFakeVimHandler: menuEdit.addAction(self.actionFakeVimMode) menuEdit.addSeparator() menuEdit.addAction(self.actionFullScreen) menuEdit.addAction(self.actionConfig) menuHelp.addAction(self.actionHelp) menuHelp.addSeparator() menuHelp.addAction(self.actionAbout) menuHelp.addAction(self.actionAboutQt) toolBar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) toolBar.addAction(self.actionNew) toolBar.addSeparator() toolBar.addAction(self.actionOpen) toolBar.addAction(self.actionSave) toolBar.addAction(self.actionPrint) toolBar.addSeparator() toolBar.addAction(self.actionPreview) toolBar.addAction(self.actionFullScreen) self.editBar.addAction(self.actionUndo) self.editBar.addAction(self.actionRedo) self.editBar.addSeparator() self.editBar.addAction(self.actionCut) self.editBar.addAction(self.actionCopy) self.editBar.addAction(self.actionPaste) self.editBar.addSeparator() self.editBar.addWidget(self.formattingBox) self.editBar.addWidget(self.symbolBox) self.searchEdit = QLineEdit(self.searchBar) self.searchEdit.setPlaceholderText(self.tr('Search')) self.searchEdit.returnPressed.connect(self.find) self.csBox = QCheckBox(self.tr('Case sensitively'), self.searchBar) self.searchBar.addWidget(self.searchEdit) self.searchBar.addSeparator() self.searchBar.addWidget(self.csBox) self.searchBar.addAction(self.actionFindPrev) self.searchBar.addAction(self.actionFind) self.searchBar.addAction(self.actionCloseSearch) self.searchBar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) self.searchBar.setVisible(False) self.autoSaveEnabled = globalSettings.autoSave if self.autoSaveEnabled: timer = QTimer(self) timer.start(60000) timer.timeout.connect(self.saveAll) self.ind = None if enchant_available: self.sl = globalSettings.spellCheckLocale if self.sl: try: enchant.Dict(self.sl) except Exception as e: print(e, file=sys.stderr) self.sl = None if globalSettings.spellCheck: self.actionEnableSC.setChecked(True) self.fileSystemWatcher = QFileSystemWatcher() self.fileSystemWatcher.fileChanged.connect(self.fileChanged)
class ReTextWindow(QMainWindow): def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.resize(950, 700) screenRect = QDesktopWidget().screenGeometry() if globalSettings.windowGeometry: self.restoreGeometry(globalSettings.windowGeometry) else: self.move((screenRect.width()-self.width())/2, (screenRect.height()-self.height())/2) if not screenRect.contains(self.geometry()): self.showMaximized() if globalSettings.iconTheme: QIcon.setThemeName(globalSettings.iconTheme) if QIcon.themeName() in ('hicolor', ''): if not QFile.exists(icon_path + 'document-new.png'): QIcon.setThemeName(get_icon_theme()) if QFile.exists(icon_path+'retext.png'): self.setWindowIcon(QIcon(icon_path+'retext.png')) elif QFile.exists('/usr/share/pixmaps/retext.png'): self.setWindowIcon(QIcon('/usr/share/pixmaps/retext.png')) else: self.setWindowIcon(QIcon.fromTheme('retext', QIcon.fromTheme('accessories-text-editor'))) self.tabWidget = QTabWidget(self) self.initTabWidget() self.setCentralWidget(self.tabWidget) self.tabWidget.currentChanged.connect(self.changeIndex) self.tabWidget.tabCloseRequested.connect(self.closeTab) toolBar = QToolBar(self.tr('File toolbar'), self) self.addToolBar(Qt.TopToolBarArea, toolBar) self.editBar = QToolBar(self.tr('Edit toolbar'), self) self.addToolBar(Qt.TopToolBarArea, self.editBar) self.searchBar = QToolBar(self.tr('Search toolbar'), self) self.addToolBar(Qt.BottomToolBarArea, self.searchBar) toolBar.setVisible(not globalSettings.hideToolBar) self.editBar.setVisible(not globalSettings.hideToolBar) self.actionNew = self.act(self.tr('New'), 'document-new', self.createNew, shct=QKeySequence.New) self.actionNew.setPriority(QAction.LowPriority) self.actionOpen = self.act(self.tr('Open'), 'document-open', self.openFile, shct=QKeySequence.Open) self.actionOpen.setPriority(QAction.LowPriority) self.actionSetEncoding = self.act(self.tr('Set encoding'), trig=self.showEncodingDialog) self.actionSetEncoding.setEnabled(False) self.actionReload = self.act(self.tr('Reload'), 'view-refresh', lambda: self.currentTab.readTextFromFile()) self.actionReload.setEnabled(False) self.actionSave = self.act(self.tr('Save'), 'document-save', self.saveFile, shct=QKeySequence.Save) self.actionSave.setEnabled(False) self.actionSave.setPriority(QAction.LowPriority) self.actionSaveAs = self.act(self.tr('Save as'), 'document-save-as', self.saveFileAs, shct=QKeySequence.SaveAs) self.actionNextTab = self.act(self.tr('Next tab'), 'go-next', lambda: self.switchTab(1), shct=Qt.CTRL+Qt.Key_PageDown) self.actionPrevTab = self.act(self.tr('Previous tab'), 'go-previous', lambda: self.switchTab(-1), shct=Qt.CTRL+Qt.Key_PageUp) self.actionPrint = self.act(self.tr('Print'), 'document-print', self.printFile, shct=QKeySequence.Print) self.actionPrint.setPriority(QAction.LowPriority) self.actionPrintPreview = self.act(self.tr('Print preview'), 'document-print-preview', self.printPreview) self.actionViewHtml = self.act(self.tr('View HTML code'), 'text-html', self.viewHtml) self.actionChangeEditorFont = self.act(self.tr('Change editor font'), trig=self.changeEditorFont) self.actionChangePreviewFont = self.act(self.tr('Change preview font'), trig=self.changePreviewFont) self.actionSearch = self.act(self.tr('Find text'), 'edit-find', shct=QKeySequence.Find) self.actionSearch.setCheckable(True) self.actionSearch.triggered[bool].connect(self.searchBar.setVisible) self.searchBar.visibilityChanged.connect(self.searchBarVisibilityChanged) self.actionPreview = self.act(self.tr('Preview'), shct=Qt.CTRL+Qt.Key_E, trigbool=self.preview) if QIcon.hasThemeIcon('document-preview'): self.actionPreview.setIcon(QIcon.fromTheme('document-preview')) elif QIcon.hasThemeIcon('preview-file'): self.actionPreview.setIcon(QIcon.fromTheme('preview-file')) elif QIcon.hasThemeIcon('x-office-document'): self.actionPreview.setIcon(QIcon.fromTheme('x-office-document')) else: self.actionPreview.setIcon(QIcon(icon_path+'document-preview.png')) self.actionLivePreview = self.act(self.tr('Live preview'), shct=Qt.CTRL+Qt.Key_L, trigbool=self.enableLivePreview) menuPreview = QMenu() menuPreview.addAction(self.actionLivePreview) self.actionPreview.setMenu(menuPreview) self.actionTableMode = self.act(self.tr('Table mode'), shct=Qt.CTRL+Qt.Key_T, trigbool=lambda x: self.currentTab.editBox.enableTableMode(x)) if ReTextFakeVimHandler: self.actionFakeVimMode = self.act(self.tr('FakeVim mode'), shct=Qt.CTRL+Qt.ALT+Qt.Key_V, trigbool=self.enableFakeVimMode) if globalSettings.useFakeVim: self.actionFakeVimMode.setChecked(True) self.enableFakeVimMode(True) self.actionFullScreen = self.act(self.tr('Fullscreen mode'), 'view-fullscreen', shct=Qt.Key_F11, trigbool=self.enableFullScreen) self.actionFullScreen.setPriority(QAction.LowPriority) self.actionConfig = self.act(self.tr('Preferences'), icon='preferences-system', trig=self.openConfigDialog) self.actionConfig.setMenuRole(QAction.PreferencesRole) self.actionSaveHtml = self.act('HTML', 'text-html', self.saveFileHtml) self.actionPdf = self.act('PDF', 'application-pdf', self.savePdf) self.actionOdf = self.act('ODT', 'x-office-document', self.saveOdf) self.getExportExtensionsList() self.actionQuit = self.act(self.tr('Quit'), 'application-exit', shct=QKeySequence.Quit) self.actionQuit.setMenuRole(QAction.QuitRole) self.actionQuit.triggered.connect(self.close) self.actionUndo = self.act(self.tr('Undo'), 'edit-undo', lambda: self.currentTab.editBox.undo(), shct=QKeySequence.Undo) self.actionRedo = self.act(self.tr('Redo'), 'edit-redo', lambda: self.currentTab.editBox.redo(), shct=QKeySequence.Redo) self.actionCopy = self.act(self.tr('Copy'), 'edit-copy', lambda: self.currentTab.editBox.copy(), shct=QKeySequence.Copy) self.actionCut = self.act(self.tr('Cut'), 'edit-cut', lambda: self.currentTab.editBox.cut(), shct=QKeySequence.Cut) self.actionPaste = self.act(self.tr('Paste'), 'edit-paste', lambda: self.currentTab.editBox.paste(), shct=QKeySequence.Paste) self.actionUndo.setEnabled(False) self.actionRedo.setEnabled(False) self.actionCopy.setEnabled(False) self.actionCut.setEnabled(False) qApp = QApplication.instance() qApp.clipboard().dataChanged.connect(self.clipboardDataChanged) self.clipboardDataChanged() if enchant_available: self.actionEnableSC = self.act(self.tr('Enable'), trigbool=self.enableSpellCheck) self.actionSetLocale = self.act(self.tr('Set locale'), trig=self.changeLocale) self.actionWebKit = self.act(self.tr('Use WebKit renderer'), trigbool=self.enableWebKit) self.actionWebKit.setChecked(globalSettings.useWebKit) self.actionShow = self.act(self.tr('Show directory'), 'system-file-manager', self.showInDir) self.actionFind = self.act(self.tr('Next'), 'go-next', self.find, shct=QKeySequence.FindNext) self.actionFindPrev = self.act(self.tr('Previous'), 'go-previous', lambda: self.find(back=True), shct=QKeySequence.FindPrevious) self.actionCloseSearch = self.act(self.tr('Close'), 'window-close', lambda: self.searchBar.setVisible(False)) self.actionCloseSearch.setPriority(QAction.LowPriority) self.actionHelp = self.act(self.tr('Get help online'), 'help-contents', self.openHelp) self.aboutWindowTitle = self.tr('About ReText') self.actionAbout = self.act(self.aboutWindowTitle, 'help-about', self.aboutDialog) self.actionAbout.setMenuRole(QAction.AboutRole) self.actionAboutQt = self.act(self.tr('About Qt')) self.actionAboutQt.setMenuRole(QAction.AboutQtRole) self.actionAboutQt.triggered.connect(qApp.aboutQt) availableMarkups = markups.get_available_markups() if not availableMarkups: print('Warning: no markups are available!') self.defaultMarkup = availableMarkups[0] if availableMarkups else None if globalSettings.defaultMarkup: mc = markups.find_markup_class_by_name(globalSettings.defaultMarkup) if mc and mc.available(): self.defaultMarkup = mc if len(availableMarkups) > 1: self.chooseGroup = QActionGroup(self) markupActions = [] for markup in availableMarkups: markupAction = self.act(markup.name, trigbool=self.markupFunction(markup)) if markup == self.defaultMarkup: markupAction.setChecked(True) self.chooseGroup.addAction(markupAction) markupActions.append(markupAction) self.actionBold = self.act(self.tr('Bold'), shct=QKeySequence.Bold, trig=lambda: self.insertFormatting('bold')) self.actionItalic = self.act(self.tr('Italic'), shct=QKeySequence.Italic, trig=lambda: self.insertFormatting('italic')) self.actionUnderline = self.act(self.tr('Underline'), shct=QKeySequence.Underline, trig=lambda: self.insertFormatting('underline')) self.usefulTags = ('header', 'italic', 'bold', 'underline', 'numbering', 'bullets', 'image', 'link', 'inline code', 'code block', 'blockquote') self.usefulChars = ('deg', 'divide', 'dollar', 'hellip', 'laquo', 'larr', 'lsquo', 'mdash', 'middot', 'minus', 'nbsp', 'ndash', 'raquo', 'rarr', 'rsquo', 'times') self.formattingBox = QComboBox(self.editBar) self.formattingBox.addItem(self.tr('Formatting')) self.formattingBox.addItems(self.usefulTags) self.formattingBox.activated[str].connect(self.insertFormatting) self.symbolBox = QComboBox(self.editBar) self.symbolBox.addItem(self.tr('Symbols')) self.symbolBox.addItems(self.usefulChars) self.symbolBox.activated.connect(self.insertSymbol) self.updateStyleSheet() menubar = self.menuBar() menuFile = menubar.addMenu(self.tr('File')) menuEdit = menubar.addMenu(self.tr('Edit')) menuHelp = menubar.addMenu(self.tr('Help')) menuFile.addAction(self.actionNew) menuFile.addAction(self.actionOpen) self.menuRecentFiles = menuFile.addMenu(self.tr('Open recent')) self.menuRecentFiles.aboutToShow.connect(self.updateRecentFiles) menuFile.addAction(self.actionShow) menuFile.addAction(self.actionSetEncoding) menuFile.addAction(self.actionReload) menuFile.addSeparator() menuFile.addAction(self.actionSave) menuFile.addAction(self.actionSaveAs) menuFile.addSeparator() menuFile.addAction(self.actionNextTab) menuFile.addAction(self.actionPrevTab) menuFile.addSeparator() menuExport = menuFile.addMenu(self.tr('Export')) menuExport.addAction(self.actionSaveHtml) menuExport.addAction(self.actionOdf) menuExport.addAction(self.actionPdf) if self.extensionActions: menuExport.addSeparator() for action, mimetype in self.extensionActions: menuExport.addAction(action) menuExport.aboutToShow.connect(self.updateExtensionsVisibility) menuFile.addAction(self.actionPrint) menuFile.addAction(self.actionPrintPreview) menuFile.addSeparator() menuFile.addAction(self.actionQuit) menuEdit.addAction(self.actionUndo) menuEdit.addAction(self.actionRedo) menuEdit.addSeparator() menuEdit.addAction(self.actionCut) menuEdit.addAction(self.actionCopy) menuEdit.addAction(self.actionPaste) menuEdit.addSeparator() if enchant_available: menuSC = menuEdit.addMenu(self.tr('Spell check')) menuSC.addAction(self.actionEnableSC) menuSC.addAction(self.actionSetLocale) menuEdit.addAction(self.actionSearch) menuEdit.addAction(self.actionChangeEditorFont) menuEdit.addAction(self.actionChangePreviewFont) menuEdit.addSeparator() if len(availableMarkups) > 1: self.menuMode = menuEdit.addMenu(self.tr('Default markup')) for markupAction in markupActions: self.menuMode.addAction(markupAction) menuFormat = menuEdit.addMenu(self.tr('Formatting')) menuFormat.addAction(self.actionBold) menuFormat.addAction(self.actionItalic) menuFormat.addAction(self.actionUnderline) menuEdit.addAction(self.actionWebKit) menuEdit.addSeparator() menuEdit.addAction(self.actionViewHtml) menuEdit.addAction(self.actionPreview) menuEdit.addAction(self.actionTableMode) if ReTextFakeVimHandler: menuEdit.addAction(self.actionFakeVimMode) menuEdit.addSeparator() menuEdit.addAction(self.actionFullScreen) menuEdit.addAction(self.actionConfig) menuHelp.addAction(self.actionHelp) menuHelp.addSeparator() menuHelp.addAction(self.actionAbout) menuHelp.addAction(self.actionAboutQt) toolBar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) toolBar.addAction(self.actionNew) toolBar.addSeparator() toolBar.addAction(self.actionOpen) toolBar.addAction(self.actionSave) toolBar.addAction(self.actionPrint) toolBar.addSeparator() toolBar.addAction(self.actionPreview) toolBar.addAction(self.actionFullScreen) self.editBar.addAction(self.actionUndo) self.editBar.addAction(self.actionRedo) self.editBar.addSeparator() self.editBar.addAction(self.actionCut) self.editBar.addAction(self.actionCopy) self.editBar.addAction(self.actionPaste) self.editBar.addSeparator() self.editBar.addWidget(self.formattingBox) self.editBar.addWidget(self.symbolBox) self.searchEdit = QLineEdit(self.searchBar) self.searchEdit.setPlaceholderText(self.tr('Search')) self.searchEdit.returnPressed.connect(self.find) self.csBox = QCheckBox(self.tr('Case sensitively'), self.searchBar) self.searchBar.addWidget(self.searchEdit) self.searchBar.addSeparator() self.searchBar.addWidget(self.csBox) self.searchBar.addAction(self.actionFindPrev) self.searchBar.addAction(self.actionFind) self.searchBar.addAction(self.actionCloseSearch) self.searchBar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) self.searchBar.setVisible(False) self.autoSaveEnabled = globalSettings.autoSave if self.autoSaveEnabled: timer = QTimer(self) timer.start(60000) timer.timeout.connect(self.saveAll) self.ind = None if enchant_available: self.sl = globalSettings.spellCheckLocale if self.sl: try: enchant.Dict(self.sl) except Exception as e: print(e, file=sys.stderr) self.sl = None if globalSettings.spellCheck: self.actionEnableSC.setChecked(True) self.fileSystemWatcher = QFileSystemWatcher() self.fileSystemWatcher.fileChanged.connect(self.fileChanged) def iterateTabs(self): for i in range(self.tabWidget.count()): yield self.tabWidget.widget(i).tab def updateStyleSheet(self): if globalSettings.styleSheet: sheetfile = QFile(globalSettings.styleSheet) sheetfile.open(QIODevice.ReadOnly) self.ss = QTextStream(sheetfile).readAll() sheetfile.close() else: palette = QApplication.palette() self.ss = 'html { color: %s; }\n' % palette.color(QPalette.WindowText).name() self.ss += 'td, th { border: 1px solid #c3c3c3; padding: 0 3px 0 3px; }\n' self.ss += 'table { border-collapse: collapse; }\n' def initTabWidget(self): def dragEnterEvent(e): e.acceptProposedAction() def dropEvent(e): fn = bytes(e.mimeData().data('text/plain')).decode().rstrip() if fn.startswith('file:'): fn = QUrl(fn).toLocalFile() self.openFileWrapper(fn) self.tabWidget.setTabsClosable(True) self.tabWidget.setAcceptDrops(True) self.tabWidget.setMovable(True) self.tabWidget.dragEnterEvent = dragEnterEvent self.tabWidget.dropEvent = dropEvent def act(self, name, icon=None, trig=None, trigbool=None, shct=None): if not isinstance(shct, QKeySequence): shct = QKeySequence(shct) if icon: action = QAction(self.actIcon(icon), name, self) else: action = QAction(name, self) if trig: action.triggered.connect(trig) elif trigbool: action.setCheckable(True) action.triggered[bool].connect(trigbool) if shct: action.setShortcut(shct) return action def actIcon(self, name): return QIcon.fromTheme(name, QIcon(icon_path+name+'.png')) def printError(self): import traceback print('Exception occured while parsing document:', file=sys.stderr) traceback.print_exc() def createTab(self, fileName): self.currentTab = ReTextTab(self, fileName, previewState=int(globalSettings.livePreviewByDefault)) self.tabWidget.addTab(self.currentTab.getSplitter(), self.tr("New document")) def closeTab(self, ind): if self.maybeSave(ind): if self.tabWidget.count() == 1: self.createTab("") currentWidget = self.tabWidget.widget(ind) if currentWidget.tab.fileName: self.fileSystemWatcher.removePath(currentWidget.tab.fileName) del currentWidget.tab self.tabWidget.removeTab(ind) def docTypeChanged(self): markupClass = self.currentTab.getMarkupClass() if type(self.currentTab.markup) != markupClass: self.currentTab.setMarkupClass(markupClass) self.currentTab.updatePreviewBox() dtMarkdown = (markupClass == markups.MarkdownMarkup) dtMkdOrReST = dtMarkdown or (markupClass == markups.ReStructuredTextMarkup) self.formattingBox.setEnabled(dtMarkdown) self.symbolBox.setEnabled(dtMarkdown) self.actionUnderline.setEnabled(dtMarkdown) self.actionBold.setEnabled(dtMkdOrReST) self.actionItalic.setEnabled(dtMkdOrReST) canReload = bool(self.currentTab.fileName) and not self.autoSaveActive() self.actionSetEncoding.setEnabled(canReload) self.actionReload.setEnabled(canReload) def changeIndex(self, ind): self.currentTab = self.tabWidget.currentWidget().tab editBox = self.currentTab.editBox previewState = self.currentTab.previewState self.actionUndo.setEnabled(editBox.document().isUndoAvailable()) self.actionRedo.setEnabled(editBox.document().isRedoAvailable()) self.actionCopy.setEnabled(editBox.textCursor().hasSelection()) self.actionCut.setEnabled(editBox.textCursor().hasSelection()) self.actionPreview.setChecked(previewState >= PreviewLive) self.actionLivePreview.setChecked(previewState == PreviewLive) self.actionTableMode.setChecked(editBox.tableModeEnabled) self.editBar.setEnabled(previewState < PreviewNormal) self.ind = ind if self.currentTab.fileName: self.setCurrentFile() else: self.setWindowTitle(self.tr('New document') + '[*]') self.docTypeChanged() self.modificationChanged(editBox.document().isModified()) editBox.setFocus(Qt.OtherFocusReason) def changeEditorFont(self): font, ok = QFontDialog.getFont(globalSettings.editorFont, self) if ok: globalSettings.editorFont = font for tab in self.iterateTabs(): tab.editBox.updateFont() def changePreviewFont(self): font, ok = QFontDialog.getFont(globalSettings.font, self) if ok: globalSettings.font = font for tab in self.iterateTabs(): tab.updatePreviewBox() def preview(self, viewmode): self.currentTab.previewState = viewmode * 2 self.actionLivePreview.setChecked(False) self.editBar.setDisabled(viewmode) self.currentTab.updateBoxesVisibility() if viewmode: self.currentTab.updatePreviewBox() def enableLivePreview(self, livemode): self.currentTab.previewState = int(livemode) self.actionPreview.setChecked(livemode) self.editBar.setEnabled(True) self.currentTab.updateBoxesVisibility() if livemode: self.currentTab.updatePreviewBox() def enableWebKit(self, enable): globalSettings.useWebKit = enable for i in range(self.tabWidget.count()): splitter = self.tabWidget.widget(i) tab = splitter.tab tab.previewBox.disconnectExternalSignals() tab.previewBox.setParent(None) tab.previewBox.deleteLater() tab.previewBox = tab.createPreviewBox(tab.editBox) tab.previewBox.setMinimumWidth(125) splitter.addWidget(tab.previewBox) splitter.setSizes((50, 50)) tab.updatePreviewBox() tab.updateBoxesVisibility() def enableCopy(self, copymode): self.actionCopy.setEnabled(copymode) self.actionCut.setEnabled(copymode) def enableFullScreen(self, yes): if yes: self.showFullScreen() else: self.showNormal() def openConfigDialog(self): dlg = ConfigDialog(self) dlg.setWindowTitle(self.tr('Preferences')) dlg.show() def enableFakeVimMode(self, yes): globalSettings.useFakeVim = yes if yes: FakeVimMode.init(self) for tab in self.iterateTabs(): tab.installFakeVimHandler() else: FakeVimMode.exit(self) def enableSpellCheck(self, yes): if yes: self.setAllDictionaries(enchant.Dict(self.sl or None)) else: self.setAllDictionaries(None) globalSettings.spellCheck = yes def setAllDictionaries(self, dictionary): for tab in self.iterateTabs(): hl = tab.highlighter hl.dictionary = dictionary hl.rehighlight() def changeLocale(self): if self.sl: localedlg = LocaleDialog(self, defaultText=self.sl) else: localedlg = LocaleDialog(self) if localedlg.exec() != QDialog.Accepted: return sl = localedlg.localeEdit.text() setdefault = localedlg.checkBox.isChecked() if sl: try: sl = str(sl) enchant.Dict(sl) except Exception as e: QMessageBox.warning(self, '', str(e)) else: self.sl = sl self.enableSpellCheck(self.actionEnableSC.isChecked()) else: self.sl = None self.enableSpellCheck(self.actionEnableSC.isChecked()) if setdefault: globalSettings.spellCheckLocale = sl def searchBarVisibilityChanged(self, visible): self.actionSearch.setChecked(visible) if visible: self.searchEdit.setFocus(Qt.ShortcutFocusReason) def find(self, back=False): flags = QTextDocument.FindFlags() if back: flags |= QTextDocument.FindBackward if self.csBox.isChecked(): flags |= QTextDocument.FindCaseSensitively text = self.searchEdit.text() editBox = self.currentTab.editBox cursor = editBox.textCursor() newCursor = editBox.document().find(text, cursor, flags) if not newCursor.isNull(): editBox.setTextCursor(newCursor) return self.setSearchEditColor(True) cursor.movePosition(QTextCursor.End if back else QTextCursor.Start) newCursor = editBox.document().find(text, cursor, flags) if not newCursor.isNull(): editBox.setTextCursor(newCursor) return self.setSearchEditColor(True) self.setSearchEditColor(False) def setSearchEditColor(self, found): palette = self.searchEdit.palette() palette.setColor(QPalette.Active, QPalette.Base, Qt.white if found else QColor(255, 102, 102)) self.searchEdit.setPalette(palette) def showInDir(self): if self.currentTab.fileName: path = QFileInfo(self.currentTab.fileName).path() QDesktopServices.openUrl(QUrl.fromLocalFile(path)) else: QMessageBox.warning(self, '', self.tr("Please, save the file somewhere.")) def setCurrentFile(self): self.setWindowTitle("") self.tabWidget.setTabText(self.ind, self.currentTab.getDocumentTitle(baseName=True)) self.tabWidget.setTabToolTip(self.ind, self.currentTab.fileName or '') self.setWindowFilePath(self.currentTab.fileName) files = readListFromSettings("recentFileList") while self.currentTab.fileName in files: files.remove(self.currentTab.fileName) files.insert(0, self.currentTab.fileName) if len(files) > 10: del files[10:] writeListToSettings("recentFileList", files) QDir.setCurrent(QFileInfo(self.currentTab.fileName).dir().path()) self.docTypeChanged() def createNew(self, text=None): self.createTab("") self.ind = self.tabWidget.count()-1 self.tabWidget.setCurrentIndex(self.ind) if text: self.currentTab.editBox.textCursor().insertText(text) def switchTab(self, shift=1): self.tabWidget.setCurrentIndex((self.ind + shift) % self.tabWidget.count()) def updateRecentFiles(self): self.menuRecentFiles.clear() self.recentFilesActions = [] filesOld = readListFromSettings("recentFileList") files = [] for f in filesOld: if QFile.exists(f): files.append(f) self.recentFilesActions.append(self.act(f, trig=self.openFunction(f))) writeListToSettings("recentFileList", files) for action in self.recentFilesActions: self.menuRecentFiles.addAction(action) def markupFunction(self, markup): return lambda: self.setDefaultMarkup(markup) def openFunction(self, fileName): return lambda: self.openFileWrapper(fileName) def extensionFunction(self, data): return lambda: \ self.runExtensionCommand(data['Exec'], data['FileFilter'], data['DefaultExtension']) def getExportExtensionsList(self): extensions = [] for extsprefix in datadirs: extsdir = QDir(extsprefix+'/export-extensions/') if extsdir.exists(): for fileInfo in extsdir.entryInfoList(['*.desktop', '*.ini'], QDir.Files | QDir.Readable): extensions.append(self.readExtension(fileInfo.filePath())) locale = QLocale.system().name() self.extensionActions = [] for extension in extensions: try: if ('Name[%s]' % locale) in extension: name = extension['Name[%s]' % locale] elif ('Name[%s]' % locale.split('_')[0]) in extension: name = extension['Name[%s]' % locale.split('_')[0]] else: name = extension['Name'] data = {} for prop in ('FileFilter', 'DefaultExtension', 'Exec'): if 'X-ReText-'+prop in extension: data[prop] = extension['X-ReText-'+prop] elif prop in extension: data[prop] = extension[prop] else: data[prop] = '' action = self.act(name, trig=self.extensionFunction(data)) if 'Icon' in extension: action.setIcon(self.actIcon(extension['Icon'])) mimetype = extension['MimeType'] if 'MimeType' in extension else None except KeyError: print('Failed to parse extension: Name is required', file=sys.stderr) else: self.extensionActions.append((action, mimetype)) def updateExtensionsVisibility(self): markupClass = self.currentTab.getMarkupClass() for action in self.extensionActions: if markupClass is None: action[0].setEnabled(False) continue mimetype = action[1] if mimetype == None: enabled = True elif markupClass == markups.MarkdownMarkup: enabled = (mimetype in ("text/x-retext-markdown", "text/x-markdown")) elif markupClass == markups.ReStructuredTextMarkup: enabled = (mimetype in ("text/x-retext-rst", "text/x-rst")) else: enabled = False action[0].setEnabled(enabled) def readExtension(self, fileName): extFile = QFile(fileName) extFile.open(QIODevice.ReadOnly) extension = {} stream = QTextStream(extFile) while not stream.atEnd(): line = stream.readLine() if '=' in line: index = line.index('=') extension[line[:index].rstrip()] = line[index+1:].lstrip() extFile.close() return extension def openFile(self): supportedExtensions = ['.txt'] for markup in markups.get_all_markups(): supportedExtensions += markup.file_extensions fileFilter = ' (' + str.join(' ', ['*'+ext for ext in supportedExtensions]) + ');;' fileNames = QFileDialog.getOpenFileNames(self, self.tr("Select one or several files to open"), "", self.tr("Supported files") + fileFilter + self.tr("All files (*)")) for fileName in fileNames[0]: self.openFileWrapper(fileName) def openFileWrapper(self, fileName): if not fileName: return fileName = QFileInfo(fileName).canonicalFilePath() exists = False for i, tab in enumerate(self.iterateTabs()): if tab.fileName == fileName: exists = True ex = i if exists: self.tabWidget.setCurrentIndex(ex) elif QFile.exists(fileName): noEmptyTab = ( (self.ind is None) or self.currentTab.fileName or self.currentTab.editBox.toPlainText() or self.currentTab.editBox.document().isModified() ) if noEmptyTab: self.createTab(fileName) self.ind = self.tabWidget.count()-1 self.tabWidget.setCurrentIndex(self.ind) if fileName: self.fileSystemWatcher.addPath(fileName) self.currentTab.fileName = fileName self.currentTab.readTextFromFile() editBox = self.currentTab.editBox self.setCurrentFile() self.setWindowModified(editBox.document().isModified()) def showEncodingDialog(self): if not self.maybeSave(self.ind): return encoding, ok = QInputDialog.getItem(self, '', self.tr('Select file encoding from the list:'), [bytes(b).decode() for b in QTextCodec.availableCodecs()], 0, False) if ok: self.currentTab.readTextFromFile(encoding) def saveFile(self): self.saveFileMain(dlg=False) def saveFileAs(self): self.saveFileMain(dlg=True) def saveAll(self): for tab in self.iterateTabs(): if tab.fileName and QFileInfo(tab.fileName).isWritable(): tab.saveTextToFile() tab.editBox.document().setModified(False) def saveFileMain(self, dlg): if (not self.currentTab.fileName) or dlg: markupClass = self.currentTab.getMarkupClass() if (markupClass is None) or not hasattr(markupClass, 'default_extension'): defaultExt = self.tr("Plain text (*.txt)") ext = ".txt" else: defaultExt = self.tr('%s files', 'Example of final string: Markdown files') \ % markupClass.name + ' (' + str.join(' ', ('*'+extension for extension in markupClass.file_extensions)) + ')' if markupClass == markups.MarkdownMarkup: ext = globalSettings.markdownDefaultFileExtension elif markupClass == markups.ReStructuredTextMarkup: ext = globalSettings.restDefaultFileExtension else: ext = markupClass.default_extension newFileName = QFileDialog.getSaveFileName(self, self.tr("Save file"), "", defaultExt)[0] if newFileName: if not QFileInfo(newFileName).suffix(): newFileName += ext if self.currentTab.fileName: self.fileSystemWatcher.removePath(self.currentTab.fileName) self.currentTab.fileName = newFileName self.actionSetEncoding.setDisabled(self.autoSaveActive()) if self.currentTab.fileName: if self.currentTab.saveTextToFile(): self.setCurrentFile() self.currentTab.editBox.document().setModified(False) self.setWindowModified(False) return True else: QMessageBox.warning(self, '', self.tr("Cannot save to file because it is read-only!")) return False def saveHtml(self, fileName): if not QFileInfo(fileName).suffix(): fileName += ".html" try: htmltext = self.currentTab.getHtml(includeStyleSheet=False, webenv=True) except Exception: return self.printError() htmlFile = QFile(fileName) htmlFile.open(QIODevice.WriteOnly) html = QTextStream(htmlFile) if globalSettings.defaultCodec: html.setCodec(globalSettings.defaultCodec) html << htmltext htmlFile.close() def textDocument(self): td = QTextDocument() td.setMetaInformation(QTextDocument.DocumentTitle, self.currentTab.getDocumentTitle()) if self.ss: td.setDefaultStyleSheet(self.ss) td.setHtml(self.currentTab.getHtml()) td.setDefaultFont(globalSettings.font) return td def saveOdf(self): try: document = self.textDocument() except Exception: return self.printError() fileName = QFileDialog.getSaveFileName(self, self.tr("Export document to ODT"), "", self.tr("OpenDocument text files (*.odt)"))[0] if not QFileInfo(fileName).suffix(): fileName += ".odt" writer = QTextDocumentWriter(fileName) writer.setFormat(b"odf") writer.write(document) def saveFileHtml(self): fileName = QFileDialog.getSaveFileName(self, self.tr("Save file"), "", self.tr("HTML files (*.html *.htm)"))[0] if fileName: self.saveHtml(fileName) def getDocumentForPrint(self): if globalSettings.useWebKit: return self.currentTab.previewBox try: return self.textDocument() except Exception: self.printError() def standardPrinter(self): printer = QPrinter(QPrinter.HighResolution) printer.setDocName(self.currentTab.getDocumentTitle()) printer.setCreator('ReText %s' % app_version) return printer def savePdf(self): self.currentTab.updatePreviewBox() fileName = QFileDialog.getSaveFileName(self, self.tr("Export document to PDF"), "", self.tr("PDF files (*.pdf)"))[0] if fileName: if not QFileInfo(fileName).suffix(): fileName += ".pdf" printer = self.standardPrinter() printer.setOutputFormat(QPrinter.PdfFormat) printer.setOutputFileName(fileName) document = self.getDocumentForPrint() if document != None: document.print(printer) def printFile(self): self.currentTab.updatePreviewBox() printer = self.standardPrinter() dlg = QPrintDialog(printer, self) dlg.setWindowTitle(self.tr("Print document")) if (dlg.exec() == QDialog.Accepted): document = self.getDocumentForPrint() if document != None: document.print(printer) def printPreview(self): document = self.getDocumentForPrint() if document == None: return printer = self.standardPrinter() preview = QPrintPreviewDialog(printer, self) preview.paintRequested.connect(document.print) preview.exec() def runExtensionCommand(self, command, filefilter, defaultext): of = ('%of' in command) html = ('%html' in command) if of: if defaultext and not filefilter: filefilter = '*'+defaultext fileName = QFileDialog.getSaveFileName(self, self.tr('Export document'), '', filefilter)[0] if not fileName: return if defaultext and not QFileInfo(fileName).suffix(): fileName += defaultext basename = '.%s.retext-temp' % self.currentTab.getDocumentTitle(baseName=True) if html: tmpname = basename+'.html' self.saveHtml(tmpname) else: tmpname = basename + self.currentTab.getMarkupClass().default_extension self.currentTab.saveTextToFile(fileName=tmpname, addToWatcher=False) command = command.replace('%of', '"out'+defaultext+'"') command = command.replace('%html' if html else '%if', '"'+tmpname+'"') try: Popen(str(command), shell=True).wait() except Exception as error: errorstr = str(error) QMessageBox.warning(self, '', self.tr('Failed to execute the command:') + '\n' + errorstr) QFile(tmpname).remove() if of: QFile('out'+defaultext).rename(fileName) def autoSaveActive(self, ind=None): tab = self.currentTab if ind is None else self.tabWidget.widget(ind).tab return (self.autoSaveEnabled and tab.fileName and QFileInfo(tab.fileName).isWritable()) def modificationChanged(self, changed): if self.autoSaveActive(): changed = False self.actionSave.setEnabled(changed) self.setWindowModified(changed) def clipboardDataChanged(self): mimeData = QApplication.instance().clipboard().mimeData() if mimeData is not None: self.actionPaste.setEnabled(mimeData.hasText()) def insertFormatting(self, formatting): cursor = self.currentTab.editBox.textCursor() text = cursor.selectedText() moveCursorTo = None def c(cursor): nonlocal moveCursorTo moveCursorTo = cursor.position() def ensurenl(cursor): if not cursor.atBlockStart(): cursor.insertText('\n\n') toinsert = { 'header': (ensurenl, '# ', text), 'italic': ('*', text, c, '*'), 'bold': ('**', text, c, '**'), 'underline': ('<u>', text, c, '</u>'), 'numbering': (ensurenl, ' 1. ', text), 'bullets': (ensurenl, ' * ', text), 'image': ('![', text or self.tr('Alt text'), c, '](', self.tr('URL'), ')'), 'link': ('[', text or self.tr('Link text'), c, '](', self.tr('URL'), ')'), 'inline code': ('`', text, c, '`'), 'code block': (ensurenl, ' ', text), 'blockquote': (ensurenl, '> ', text), } if formatting not in toinsert: return cursor.beginEditBlock() for token in toinsert[formatting]: if callable(token): token(cursor) else: cursor.insertText(token) cursor.endEditBlock() self.formattingBox.setCurrentIndex(0) # Bring back the focus on the editor self.currentTab.editBox.setFocus(Qt.OtherFocusReason) if moveCursorTo: cursor.setPosition(moveCursorTo) self.currentTab.editBox.setTextCursor(cursor) def insertSymbol(self, num): if num: self.currentTab.editBox.insertPlainText('&'+self.usefulChars[num-1]+';') self.symbolBox.setCurrentIndex(0) def fileChanged(self, fileName): ind = None for testind, tab in enumerate(self.iterateTabs()): if tab.fileName == fileName: ind = testind if ind is None: self.fileSystemWatcher.removePath(fileName) self.tabWidget.setCurrentIndex(ind) if not QFile.exists(fileName): self.currentTab.editBox.document().setModified(True) QMessageBox.warning(self, '', self.tr( 'This file has been deleted by other application.\n' 'Please make sure you save the file before exit.')) elif not self.currentTab.editBox.document().isModified(): # File was not modified in ReText, reload silently self.currentTab.readTextFromFile() self.currentTab.updatePreviewBox() else: text = self.tr( 'This document has been modified by other application.\n' 'Do you want to reload the file (this will discard all ' 'your changes)?\n') if self.autoSaveEnabled: text += self.tr( 'If you choose to not reload the file, auto save mode will ' 'be disabled for this session to prevent data loss.') messageBox = QMessageBox(QMessageBox.Warning, '', text) reloadButton = messageBox.addButton(self.tr('Reload'), QMessageBox.YesRole) messageBox.addButton(QMessageBox.Cancel) messageBox.exec() if messageBox.clickedButton() is reloadButton: self.currentTab.readTextFromFile() self.currentTab.updatePreviewBox() else: self.autoSaveEnabled = False self.currentTab.editBox.document().setModified(True) if fileName not in self.fileSystemWatcher.files(): # https://github.com/retext-project/retext/issues/137 self.fileSystemWatcher.addPath(fileName) def maybeSave(self, ind): tab = self.tabWidget.widget(ind).tab if self.autoSaveActive(ind): tab.saveTextToFile() return True if not tab.editBox.document().isModified(): return True self.tabWidget.setCurrentIndex(ind) ret = QMessageBox.warning(self, '', self.tr("The document has been modified.\nDo you want to save your changes?"), QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel) if ret == QMessageBox.Save: return self.saveFileMain(False) elif ret == QMessageBox.Cancel: return False return True def closeEvent(self, closeevent): for ind in range(self.tabWidget.count()): if not self.maybeSave(ind): return closeevent.ignore() if globalSettings.saveWindowGeometry and not self.isMaximized(): globalSettings.windowGeometry = self.saveGeometry() closeevent.accept() def viewHtml(self): htmlDlg = HtmlDialog(self) try: htmltext = self.currentTab.getHtml(includeStyleSheet=False) except Exception: return self.printError() winTitle = self.currentTab.getDocumentTitle(baseName=True) htmlDlg.setWindowTitle(winTitle+" ("+self.tr("HTML code")+")") htmlDlg.textEdit.setPlainText(htmltext.rstrip()) htmlDlg.hl.rehighlight() htmlDlg.show() htmlDlg.raise_() htmlDlg.activateWindow() def openHelp(self): QDesktopServices.openUrl(QUrl('https://github.com/retext-project/retext/wiki')) def aboutDialog(self): QMessageBox.about(self, self.aboutWindowTitle, '<p><b>' + (self.tr('ReText %s (using PyMarkups %s)') % (app_version, markups.__version__)) +'</b></p>' + self.tr('Simple but powerful editor' ' for Markdown and reStructuredText') +'</p><p>'+self.tr('Author: Dmitry Shachnev, 2011').replace('2011', '2011–2016') +'<br><a href="https://github.com/retext-project/retext">'+self.tr('Website') +'</a> | <a href="http://daringfireball.net/projects/markdown/syntax">' +self.tr('Markdown syntax') +'</a> | <a href="http://docutils.sourceforge.net/docs/user/rst/quickref.html">' +self.tr('reStructuredText syntax')+'</a></p>') def setDefaultMarkup(self, markupClass): self.defaultMarkup = markupClass defaultName = markups.get_available_markups()[0].name writeToSettings('defaultMarkup', markupClass.name, defaultName) for tab in self.iterateTabs(): if not tab.fileName: tab.setMarkupClass(markupClass) tab.updatePreviewBox() self.docTypeChanged()
class SpreadSheet(QMainWindow): dateFormats = ["dd/M/yyyy", "yyyy/M/dd", "dd.MM.yyyy"] currentDateFormat = dateFormats[0] def __init__(self, rows, cols, parent = None): super(SpreadSheet, self).__init__(parent) self.toolBar = QToolBar() self.addToolBar(self.toolBar) self.formulaInput = QLineEdit() self.cellLabel = QLabel(self.toolBar) self.cellLabel.setMinimumSize(80, 0) self.toolBar.addWidget(self.cellLabel) self.toolBar.addWidget(self.formulaInput) self.table = QTableWidget(rows, cols, self) for c in range(cols): character = chr(ord('A') + c) self.table.setHorizontalHeaderItem(c, QTableWidgetItem(character)) self.table.setItemPrototype(self.table.item(rows - 1, cols - 1)) self.table.setItemDelegate(SpreadSheetDelegate(self)) self.createActions() self.updateColor(0) self.setupMenuBar() self.setupContents() self.setupContextMenu() self.setCentralWidget(self.table) self.statusBar() self.table.currentItemChanged.connect(self.updateStatus) self.table.currentItemChanged.connect(self.updateColor) self.table.currentItemChanged.connect(self.updateLineEdit) self.table.itemChanged.connect(self.updateStatus) self.formulaInput.returnPressed.connect(self.returnPressed) self.table.itemChanged.connect(self.updateLineEdit) self.setWindowTitle("Spreadsheet") def createActions(self): self.cell_sumAction = QAction("Sum", self) self.cell_sumAction.triggered.connect(self.actionSum) self.cell_addAction = QAction("&Add", self) self.cell_addAction.setShortcut(Qt.CTRL | Qt.Key_Plus) self.cell_addAction.triggered.connect(self.actionAdd) self.cell_subAction = QAction("&Subtract", self) self.cell_subAction.setShortcut(Qt.CTRL | Qt.Key_Minus) self.cell_subAction.triggered.connect(self.actionSubtract) self.cell_mulAction = QAction("&Multiply", self) self.cell_mulAction.setShortcut(Qt.CTRL | Qt.Key_multiply) self.cell_mulAction.triggered.connect(self.actionMultiply) self.cell_divAction = QAction("&Divide", self) self.cell_divAction.setShortcut(Qt.CTRL | Qt.Key_division) self.cell_divAction.triggered.connect(self.actionDivide) self.fontAction = QAction("Font...", self) self.fontAction.setShortcut(Qt.CTRL | Qt.Key_F) self.fontAction.triggered.connect(self.selectFont) self.colorAction = QAction(QIcon(QPixmap(16, 16)), "Background &Color...", self) self.colorAction.triggered.connect(self.selectColor) self.clearAction = QAction("Clear", self) self.clearAction.setShortcut(Qt.Key_Delete) self.clearAction.triggered.connect(self.clear) self.aboutSpreadSheet = QAction("About Spreadsheet", self) self.aboutSpreadSheet.triggered.connect(self.showAbout) self.exitAction = QAction("E&xit", self) self.exitAction.setShortcut(QKeySequence.Quit) self.exitAction.triggered.connect(QApplication.instance().quit) self.printAction = QAction("&Print", self) self.printAction.setShortcut(QKeySequence.Print) self.printAction.triggered.connect(self.print_) self.firstSeparator = QAction(self) self.firstSeparator.setSeparator(True) self.secondSeparator = QAction(self) self.secondSeparator.setSeparator(True) def setupMenuBar(self): self.fileMenu = self.menuBar().addMenu("&File") self.dateFormatMenu = self.fileMenu.addMenu("&Date format") self.dateFormatGroup = QActionGroup(self) for f in self.dateFormats: action = QAction(f, self, checkable=True, triggered=self.changeDateFormat) self.dateFormatGroup.addAction(action) self.dateFormatMenu.addAction(action) if f == self.currentDateFormat: action.setChecked(True) self.fileMenu.addAction(self.printAction) self.fileMenu.addAction(self.exitAction) self.cellMenu = self.menuBar().addMenu("&Cell") self.cellMenu.addAction(self.cell_addAction) self.cellMenu.addAction(self.cell_subAction) self.cellMenu.addAction(self.cell_mulAction) self.cellMenu.addAction(self.cell_divAction) self.cellMenu.addAction(self.cell_sumAction) self.cellMenu.addSeparator() self.cellMenu.addAction(self.colorAction) self.cellMenu.addAction(self.fontAction) self.menuBar().addSeparator() self.aboutMenu = self.menuBar().addMenu("&Help") self.aboutMenu.addAction(self.aboutSpreadSheet) def changeDateFormat(self): action = self.sender() oldFormat = self.currentDateFormat newFormat = self.currentDateFormat = action.text() for row in range(self.table.rowCount()): item = self.table.item(row, 1) date = QDate.fromString(item.text(), oldFormat) item.setText(date.toString(newFormat)) def updateStatus(self, item): if item and item == self.table.currentItem(): self.statusBar().showMessage(item.data(Qt.StatusTipRole), 1000) self.cellLabel.setText("Cell: (%s)" % encode_pos(self.table.row(item), self.table.column(item))) def updateColor(self, item): pixmap = QPixmap(16, 16) color = QColor() if item: color = item.backgroundColor() if not color.isValid(): color = self.palette().base().color() painter = QPainter(pixmap) painter.fillRect(0, 0, 16, 16, color) lighter = color.lighter() painter.setPen(lighter) # light frame painter.drawPolyline(QPoint(0, 15), QPoint(0, 0), QPoint(15, 0)) painter.setPen(color.darker()) # dark frame painter.drawPolyline(QPoint(1, 15), QPoint(15, 15), QPoint(15, 1)) painter.end() self.colorAction.setIcon(QIcon(pixmap)) def updateLineEdit(self, item): if item != self.table.currentItem(): return if item: self.formulaInput.setText(item.data(Qt.EditRole)) else: self.formulaInput.clear() def returnPressed(self): text = self.formulaInput.text() row = self.table.currentRow() col = self.table.currentColumn() item = self.table.item(row, col) if not item: self.table.setItem(row, col, SpreadSheetItem(text)) else: item.setData(Qt.EditRole, text) self.table.viewport().update() def selectColor(self): item = self.table.currentItem() color = item and QColor(item.background()) or self.table.palette().base().color() color = QColorDialog.getColor(color, self) if not color.isValid(): return selected = self.table.selectedItems() if not selected: return for i in selected: i and i.setBackground(color) self.updateColor(self.table.currentItem()) def selectFont(self): selected = self.table.selectedItems() if not selected: return font, ok = QFontDialog.getFont(self.font(), self) if not ok: return for i in selected: i and i.setFont(font) def runInputDialog(self, title, c1Text, c2Text, opText, outText, cell1, cell2, outCell): rows = [] cols = [] for r in range(self.table.rowCount()): rows.append(str(r + 1)) for c in range(self.table.columnCount()): cols.append(chr(ord('A') + c)) addDialog = QDialog(self) addDialog.setWindowTitle(title) group = QGroupBox(title, addDialog) group.setMinimumSize(250, 100) cell1Label = QLabel(c1Text, group) cell1RowInput = QComboBox(group) c1Row, c1Col = decode_pos(cell1) cell1RowInput.addItems(rows) cell1RowInput.setCurrentIndex(c1Row) cell1ColInput = QComboBox(group) cell1ColInput.addItems(cols) cell1ColInput.setCurrentIndex(c1Col) operatorLabel = QLabel(opText, group) operatorLabel.setAlignment(Qt.AlignHCenter) cell2Label = QLabel(c2Text, group) cell2RowInput = QComboBox(group) c2Row, c2Col = decode_pos(cell2) cell2RowInput.addItems(rows) cell2RowInput.setCurrentIndex(c2Row) cell2ColInput = QComboBox(group) cell2ColInput.addItems(cols) cell2ColInput.setCurrentIndex(c2Col) equalsLabel = QLabel("=", group) equalsLabel.setAlignment(Qt.AlignHCenter) outLabel = QLabel(outText, group) outRowInput = QComboBox(group) outRow, outCol = decode_pos(outCell) outRowInput.addItems(rows) outRowInput.setCurrentIndex(outRow) outColInput = QComboBox(group) outColInput.addItems(cols) outColInput.setCurrentIndex(outCol) cancelButton = QPushButton("Cancel", addDialog) cancelButton.clicked.connect(addDialog.reject) okButton = QPushButton("OK", addDialog) okButton.setDefault(True) okButton.clicked.connect(addDialog.accept) buttonsLayout = QHBoxLayout() buttonsLayout.addStretch(1) buttonsLayout.addWidget(okButton) buttonsLayout.addSpacing(10) buttonsLayout.addWidget(cancelButton) dialogLayout = QVBoxLayout(addDialog) dialogLayout.addWidget(group) dialogLayout.addStretch(1) dialogLayout.addItem(buttonsLayout) cell1Layout = QHBoxLayout() cell1Layout.addWidget(cell1Label) cell1Layout.addSpacing(10) cell1Layout.addWidget(cell1ColInput) cell1Layout.addSpacing(10) cell1Layout.addWidget(cell1RowInput) cell2Layout = QHBoxLayout() cell2Layout.addWidget(cell2Label) cell2Layout.addSpacing(10) cell2Layout.addWidget(cell2ColInput) cell2Layout.addSpacing(10) cell2Layout.addWidget(cell2RowInput) outLayout = QHBoxLayout() outLayout.addWidget(outLabel) outLayout.addSpacing(10) outLayout.addWidget(outColInput) outLayout.addSpacing(10) outLayout.addWidget(outRowInput) vLayout = QVBoxLayout(group) vLayout.addItem(cell1Layout) vLayout.addWidget(operatorLabel) vLayout.addItem(cell2Layout) vLayout.addWidget(equalsLabel) vLayout.addStretch(1) vLayout.addItem(outLayout) if addDialog.exec_(): cell1 = cell1ColInput.currentText() + cell1RowInput.currentText() cell2 = cell2ColInput.currentText() + cell2RowInput.currentText() outCell = outColInput.currentText() + outRowInput.currentText() return True, cell1, cell2, outCell return False, None, None, None def actionSum(self): row_first = 0 row_last = 0 row_cur = 0 col_first = 0 col_last = 0 col_cur = 0 selected = self.table.selectedItems() if selected: first = selected[0] last = selected[-1] row_first = self.table.row(first) row_last = self.table.row(last) col_first = self.table.column(first) col_last = self.table.column(last) current = self.table.currentItem() if current: row_cur = self.table.row(current) col_cur = self.table.column(current) cell1 = encode_pos(row_first, col_first) cell2 = encode_pos(row_last, col_last) out = encode_pos(row_cur, col_cur) ok, cell1, cell2, out = self.runInputDialog("Sum cells", "First cell:", "Last cell:", u"\N{GREEK CAPITAL LETTER SIGMA}", "Output to:", cell1, cell2, out) if ok: row, col = decode_pos(out) self.table.item(row, col).setText("sum %s %s" % (cell1, cell2)) def actionMath_helper(self, title, op): cell1 = "C1" cell2 = "C2" out = "C3" current = self.table.currentItem() if current: out = encode_pos(self.table.currentRow(), self.table.currentColumn()) ok, cell1, cell2, out = self.runInputDialog(title, "Cell 1", "Cell 2", op, "Output to:", cell1, cell2, out) if ok: row, col = decode_pos(out) self.table.item(row, col).setText("%s %s %s" % (op, cell1, cell2)) def actionAdd(self): self.actionMath_helper("Addition", "+") def actionSubtract(self): self.actionMath_helper("Subtraction", "-") def actionMultiply(self): self.actionMath_helper("Multiplication", "*") def actionDivide(self): self.actionMath_helper("Division", "/") def clear(self): for i in self.table.selectedItems(): i.setText("") def setupContextMenu(self): self.addAction(self.cell_addAction) self.addAction(self.cell_subAction) self.addAction(self.cell_mulAction) self.addAction(self.cell_divAction) self.addAction(self.cell_sumAction) self.addAction(self.firstSeparator) self.addAction(self.colorAction) self.addAction(self.fontAction) self.addAction(self.secondSeparator) self.addAction(self.clearAction) self.setContextMenuPolicy(Qt.ActionsContextMenu) def setupContents(self): titleBackground = QColor(Qt.lightGray) titleFont = self.table.font() titleFont.setBold(True) # column 0 self.table.setItem(0, 0, SpreadSheetItem("Item")) self.table.item(0, 0).setBackground(titleBackground) self.table.item(0, 0).setToolTip("This column shows the purchased item/service") self.table.item(0, 0).setFont(titleFont) self.table.setItem(1, 0, SpreadSheetItem("AirportBus")) self.table.setItem(2, 0, SpreadSheetItem("Flight (Munich)")) self.table.setItem(3, 0, SpreadSheetItem("Lunch")) self.table.setItem(4, 0, SpreadSheetItem("Flight (LA)")) self.table.setItem(5, 0, SpreadSheetItem("Taxi")) self.table.setItem(6, 0, SpreadSheetItem("Dinner")) self.table.setItem(7, 0, SpreadSheetItem("Hotel")) self.table.setItem(8, 0, SpreadSheetItem("Flight (Oslo)")) self.table.setItem(9, 0, SpreadSheetItem("Total:")) self.table.item(9, 0).setFont(titleFont) self.table.item(9, 0).setBackground(Qt.lightGray) # column 1 self.table.setItem(0, 1, SpreadSheetItem("Date")) self.table.item(0, 1).setBackground(titleBackground) self.table.item(0, 1).setToolTip("This column shows the purchase date, double click to change") self.table.item(0, 1).setFont(titleFont) self.table.setItem(1, 1, SpreadSheetItem("15/6/2006")) self.table.setItem(2, 1, SpreadSheetItem("15/6/2006")) self.table.setItem(3, 1, SpreadSheetItem("15/6/2006")) self.table.setItem(4, 1, SpreadSheetItem("21/5/2006")) self.table.setItem(5, 1, SpreadSheetItem("16/6/2006")) self.table.setItem(6, 1, SpreadSheetItem("16/6/2006")) self.table.setItem(7, 1, SpreadSheetItem("16/6/2006")) self.table.setItem(8, 1, SpreadSheetItem("18/6/2006")) self.table.setItem(9, 1, SpreadSheetItem()) self.table.item(9, 1).setBackground(Qt.lightGray) # column 2 self.table.setItem(0, 2, SpreadSheetItem("Price")) self.table.item(0, 2).setBackground(titleBackground) self.table.item(0, 2).setToolTip("This column shows the price of the purchase") self.table.item(0, 2).setFont(titleFont) self.table.setItem(1, 2, SpreadSheetItem("150")) self.table.setItem(2, 2, SpreadSheetItem("2350")) self.table.setItem(3, 2, SpreadSheetItem("-14")) self.table.setItem(4, 2, SpreadSheetItem("980")) self.table.setItem(5, 2, SpreadSheetItem("5")) self.table.setItem(6, 2, SpreadSheetItem("120")) self.table.setItem(7, 2, SpreadSheetItem("300")) self.table.setItem(8, 2, SpreadSheetItem("1240")) self.table.setItem(9, 2, SpreadSheetItem()) self.table.item(9, 2).setBackground(Qt.lightGray) # column 3 self.table.setItem(0, 3, SpreadSheetItem("Currency")) self.table.item(0, 3).setBackgroundColor(titleBackground) self.table.item(0, 3).setToolTip("This column shows the currency") self.table.item(0, 3).setFont(titleFont) self.table.setItem(1, 3, SpreadSheetItem("NOK")) self.table.setItem(2, 3, SpreadSheetItem("NOK")) self.table.setItem(3, 3, SpreadSheetItem("EUR")) self.table.setItem(4, 3, SpreadSheetItem("EUR")) self.table.setItem(5, 3, SpreadSheetItem("USD")) self.table.setItem(6, 3, SpreadSheetItem("USD")) self.table.setItem(7, 3, SpreadSheetItem("USD")) self.table.setItem(8, 3, SpreadSheetItem("USD")) self.table.setItem(9, 3, SpreadSheetItem()) self.table.item(9,3).setBackground(Qt.lightGray) # column 4 self.table.setItem(0, 4, SpreadSheetItem("Ex. Rate")) self.table.item(0, 4).setBackground(titleBackground) self.table.item(0, 4).setToolTip("This column shows the exchange rate to NOK") self.table.item(0, 4).setFont(titleFont) self.table.setItem(1, 4, SpreadSheetItem("1")) self.table.setItem(2, 4, SpreadSheetItem("1")) self.table.setItem(3, 4, SpreadSheetItem("8")) self.table.setItem(4, 4, SpreadSheetItem("8")) self.table.setItem(5, 4, SpreadSheetItem("7")) self.table.setItem(6, 4, SpreadSheetItem("7")) self.table.setItem(7, 4, SpreadSheetItem("7")) self.table.setItem(8, 4, SpreadSheetItem("7")) self.table.setItem(9, 4, SpreadSheetItem()) self.table.item(9,4).setBackground(Qt.lightGray) # column 5 self.table.setItem(0, 5, SpreadSheetItem("NOK")) self.table.item(0, 5).setBackground(titleBackground) self.table.item(0, 5).setToolTip("This column shows the expenses in NOK") self.table.item(0, 5).setFont(titleFont) self.table.setItem(1, 5, SpreadSheetItem("* C2 E2")) self.table.setItem(2, 5, SpreadSheetItem("* C3 E3")) self.table.setItem(3, 5, SpreadSheetItem("* C4 E4")) self.table.setItem(4, 5, SpreadSheetItem("* C5 E5")) self.table.setItem(5, 5, SpreadSheetItem("* C6 E6")) self.table.setItem(6, 5, SpreadSheetItem("* C7 E7")) self.table.setItem(7, 5, SpreadSheetItem("* C8 E8")) self.table.setItem(8, 5, SpreadSheetItem("* C9 E9")) self.table.setItem(9, 5, SpreadSheetItem("sum F2 F9")) self.table.item(9,5).setBackground(Qt.lightGray) def showAbout(self): QMessageBox.about(self, "About Spreadsheet", """ <HTML> <p><b>This demo shows use of <c>QTableWidget</c> with custom handling for individual cells.</b></p> <p>Using a customized table item we make it possible to have dynamic output in different cells. The content that is implemented for this particular demo is: <ul> <li>Adding two cells.</li> <li>Subtracting one cell from another.</li> <li>Multiplying two cells.</li> <li>Dividing one cell with another.</li> <li>Summing the contents of an arbitrary number of cells.</li> </HTML> """) def print_(self): printer = QPrinter(QPrinter.ScreenResolution) dlg = QPrintPreviewDialog(printer) view = PrintView() view.setModel(self.table.model()) dlg.paintRequested.connect(view.print_) dlg.exec_()
def __init__(self): super(MainWindow, self).__init__() self.currentPath = '' self.view = SvgView() fileMenu = QMenu("&File", self) openAction = fileMenu.addAction("&Open...") openAction.setShortcut("Ctrl+O") quitAction = fileMenu.addAction("E&xit") quitAction.setShortcut("Ctrl+Q") self.menuBar().addMenu(fileMenu) viewMenu = QMenu("&View", self) self.backgroundAction = viewMenu.addAction("&Background") self.backgroundAction.setEnabled(False) self.backgroundAction.setCheckable(True) self.backgroundAction.setChecked(False) self.backgroundAction.toggled.connect(self.view.setViewBackground) self.outlineAction = viewMenu.addAction("&Outline") self.outlineAction.setEnabled(False) self.outlineAction.setCheckable(True) self.outlineAction.setChecked(True) self.outlineAction.toggled.connect(self.view.setViewOutline) self.menuBar().addMenu(viewMenu) rendererMenu = QMenu("&Renderer", self) self.nativeAction = rendererMenu.addAction("&Native") self.nativeAction.setCheckable(True) self.nativeAction.setChecked(True) if QGLFormat.hasOpenGL(): self.glAction = rendererMenu.addAction("&OpenGL") self.glAction.setCheckable(True) self.imageAction = rendererMenu.addAction("&Image") self.imageAction.setCheckable(True) if QGLFormat.hasOpenGL(): rendererMenu.addSeparator() self.highQualityAntialiasingAction = rendererMenu.addAction("&High Quality Antialiasing") self.highQualityAntialiasingAction.setEnabled(False) self.highQualityAntialiasingAction.setCheckable(True) self.highQualityAntialiasingAction.setChecked(False) self.highQualityAntialiasingAction.toggled.connect(self.view.setHighQualityAntialiasing) rendererGroup = QActionGroup(self) rendererGroup.addAction(self.nativeAction) if QGLFormat.hasOpenGL(): rendererGroup.addAction(self.glAction) rendererGroup.addAction(self.imageAction) self.menuBar().addMenu(rendererMenu) openAction.triggered.connect(self.openFile) quitAction.triggered.connect(QApplication.instance().quit) rendererGroup.triggered.connect(self.setRenderer) self.setCentralWidget(self.view) self.setWindowTitle("SVG Viewer")