def _create_context_menu(self): self._context_menu = QMenu() move_up_icon = resources.icon('sort_up') move_down_icon = resources.icon('sort_down') rename_icon = resources.icon('rename') remove_icon = resources.icon('delete') copy_icon = resources.icon('copy') move_up_action = QAction(move_up_icon, 'Move Up', self._context_menu) self._context_menu.addAction(move_up_action) move_down_action = QAction(move_down_icon, 'Move Down', self._context_menu) self._context_menu.addAction(move_down_action) self._context_menu.addSeparator() copy_action = QAction(copy_icon, 'Copy', self._context_menu) self._context_menu.addAction(copy_action) rename_action = QAction(rename_icon, 'Rename', self._context_menu) self._context_menu.addAction(rename_action) remove_action = QAction(remove_icon, 'Remove', self._context_menu) self._context_menu.addAction(remove_action) move_up_action.triggered.connect(self.move_up) move_down_action.triggered.connect(self.move_down) rename_action.triggered.connect(self.rename) remove_action.triggered.connect(self.remove)
def show_context_menu(self): """ Creates and shows the context menu for the search widget :return: QAction """ menu = QMenu(self) standard_menu = self.createStandardContextMenu() standard_menu.setTitle('Edit') menu.addMenu(standard_menu) sub_menu = QMenu(menu) sub_menu.setTitle('Space Operator') menu.addMenu(sub_menu) or_action = QAction('OR', menu) or_action.setCheckable(True) or_callback = partial(self.set_space_operator, 'or') or_action.triggered.connect(or_callback) if self.space_operator() == 'or': or_action.setChecked(True) sub_menu.addAction(or_action) and_action = QAction('AND', menu) and_action.setCheckable(True) and_callback = partial(self.set_space_operator, 'and') and_action.triggered.connect(and_callback) if self.space_operator() == 'and': and_action.setChecked(True) sub_menu.addAction(and_action) action = menu.exec_(QCursor.pos()) return action
def reload(self): """ Reloads current menu data """ self.clear() if self._enable_select_content: select_content_action = QAction(resources.icon('cursor'), 'Select content', self) select_content_action.triggered.connect(self.item().select_content) self.addAction(select_content_action) self.addSeparator() selection_sets = self.selection_sets() if not selection_sets: action = QAction('No selection sets found!', self) action.setEnabled(False) self.addAction(action) return for selection_set in selection_sets: dirname = os.path.basename(os.path.dirname(selection_set.path())) basename = os.path.basename(selection_set.path()).replace( selection_set.EXTENSION, '') nice_name = '{}: {}'.format(dirname, basename) selection_set_action = QAction(nice_name, self) selection_set_action_callback = partial( selection_set.load, namespaces=self.namespaces()) selection_set_action.triggered.connect( selection_set_action_callback) self.addAction(selection_set_action)
def __init__(self, parent: QWidget = None): super().__init__(parent) self.map = LightMaps() self.setCentralWidget(self.map) self.map.setFocus() osloAction = QAction(self.tr("&Oslo"), self) berlinAction = QAction(self.tr("&Berlin"), self) jakartaAction = QAction(self.tr("&Jakarta"), self) nightModeAction = QAction(self.tr("Night Mode"), self) nightModeAction.setCheckable(True) nightModeAction.setChecked(False) osmAction = QAction(self.tr("About OpenStreetMap"), self) osloAction.triggered.connect(self.chooseOslo) berlinAction.triggered.connect(self.chooseBerlin) jakartaAction.triggered.connect(self.chooseJakarta) nightModeAction.triggered.connect(self.map.toggleNightMode) osmAction.triggered.connect(self.aboutOsm) menu = self.menuBar().addMenu(self.tr("&Options")) menu.addAction(osloAction) menu.addAction(berlinAction) menu.addAction(jakartaAction) menu.addSeparator() menu.addAction(nightModeAction) menu.addAction(osmAction) self.setWindowTitle(self.tr("Light Maps"))
def __init__(self, url): super().__init__() self.setAttribute(Qt.WA_DeleteOnClose, True) self.progress = 0 f = QFile() f.setFileName(":/jquery.min.js") f.open(QIODevice.ReadOnly) self.jQuery = f.readAll().data().decode() self.jQuery += "\nvar qt = { 'jQuery': jQuery.noConflict(true) };" f.close() self.view = QWebEngineView(self) self.view.load(url) self.view.loadFinished.connect(self.adjustLocation) self.view.titleChanged.connect(self.adjustTitle) self.view.loadProgress.connect(self.setProgress) self.view.loadFinished.connect(self.finishLoading) self.locationEdit = QLineEdit(self) self.locationEdit.setSizePolicy( QSizePolicy.Expanding, self.locationEdit.sizePolicy().verticalPolicy()) self.locationEdit.returnPressed.connect(self.changeLocation) toolBar = self.addToolBar(self.tr("Navigation")) toolBar.addAction(self.view.pageAction(QWebEnginePage.Back)) toolBar.addAction(self.view.pageAction(QWebEnginePage.Forward)) toolBar.addAction(self.view.pageAction(QWebEnginePage.Reload)) toolBar.addAction(self.view.pageAction(QWebEnginePage.Stop)) toolBar.addWidget(self.locationEdit) viewMenu = self.menuBar().addMenu(self.tr("&View")) viewSourceAction = QAction(self.tr("Page Source"), self) viewSourceAction.triggered.connect(self.viewSource) viewMenu.addAction(viewSourceAction) effectMenu = self.menuBar().addMenu(self.tr("&Effect")) effectMenu.addAction(self.tr("Highlight all links"), self.highlightAllLinks) self.rotateAction = QAction(self) self.rotateAction.setIcon(self.style().standardIcon( QStyle.SP_FileDialogDetailedView)) self.rotateAction.setCheckable(True) self.rotateAction.setText(self.tr("Turn images upside down")) self.rotateAction.toggled.connect(self.rotateImages) effectMenu.addAction(self.rotateAction) toolsMenu = self.menuBar().addMenu(self.tr("&Tools")) toolsMenu.addAction(self.tr("Remove GIF images"), self.removeGifImages) toolsMenu.addAction(self.tr("Remove all inline frames"), self.removeInlineFrames) toolsMenu.addAction(self.tr("Remove all object elements"), self.removeObjectElements) toolsMenu.addAction(self.tr("Remove all embedded elements"), self.removeEmbeddedElements) self.setCentralWidget(self.view)
def contextMenuEvent(self, event): menu = QMenu(self) remove_icon = resources.icon(name='delete') remove_action = QAction(remove_icon, 'Remove', menu) remove_tooltip = 'Delete selected project' remove_action.setStatusTip(remove_tooltip) remove_action.setToolTip(remove_tooltip) remove_action.triggered.connect(self._on_remove_project) folder_icon = resources.icon(name='open_folder', extension='png') folder_action = QAction(folder_icon, 'Open in Browser', menu) open_project_in_explorer_tooltip = 'Open project folder in explorer' folder_action.setStatusTip(open_project_in_explorer_tooltip) folder_action.setToolTip(open_project_in_explorer_tooltip) folder_action.triggered.connect(self._on_open_in_browser) image_icon = resources.icon(name='picture', extension='png') set_image_action = QAction(image_icon, 'Set Project Image', menu) set_project_image_tooltip = 'Set the image used by the project' set_image_action.setToolTip(set_project_image_tooltip) set_image_action.setStatusTip(set_project_image_tooltip) set_image_action.triggered.connect(self._on_set_project_image) for action in [remove_action, None, folder_action, None, set_image_action]: if action is None: menu.addSeparator() else: menu.addAction(action) menu.exec_(self.mapToGlobal(event.pos()))
def contextMenuEvent(self, event): menu = QMenu(self) remove_icon = resources.icon(name='delete') remove_action = QAction(remove_icon, 'Remove', menu) remove_action.setStatusTip(consts.DELETE_PROJECT_TOOLTIP) remove_action.setToolTip(consts.DELETE_PROJECT_TOOLTIP) remove_action.triggered.connect(self._on_remove_project) folder_icon = resources.icon(name='open_folder', extension='png') folder_action = QAction(folder_icon, 'Open in Browser', menu) folder_action.setStatusTip(consts.OPEN_PROJECT_IN_EXPLORER_TOOLTIP) folder_action.setToolTip(consts.OPEN_PROJECT_IN_EXPLORER_TOOLTIP) folder_action.triggered.connect(self._on_open_in_browser) image_icon = resources.icon(name='picture', extension='png') set_image_action = QAction(image_icon, 'Set Project Image', menu) set_image_action.setToolTip(consts.SET_PROJECT_IMAGE_TOOLTIP) set_image_action.setStatusTip(consts.SET_PROJECT_IMAGE_TOOLTIP) set_image_action.triggered.connect(self._on_set_project_image) for action in [ remove_action, None, folder_action, None, set_image_action ]: if action is None: menu.addSeparator() else: menu.addAction(action) menu.exec_(self.mapToGlobal(event.pos()))
def __init__(self, page, parent=None): super(HelpForm, self).__init__(parent) self.setAttribute(Qt.WA_DeleteOnClose) self.setAttribute(Qt.WA_GroupLeader) backAction = QAction(QIcon(":/back.png"), "&Back", self) backAction.setShortcut(QKeySequence.Back) homeAction = QAction(QIcon(":/home.png"), "&Home", self) homeAction.setShortcut("Home") self.pageLabel = QLabel() toolBar = QToolBar() toolBar.addAction(backAction) toolBar.addAction(homeAction) toolBar.addWidget(self.pageLabel) self.textBrowser = QTextBrowser() layout = QVBoxLayout() layout.addWidget(toolBar) layout.addWidget(self.textBrowser, 1) self.setLayout(layout) backAction.triggered.connect(self.tbackward) homeAction.triggered.connect(self.thome) self.textBrowser.sourceChanged.connect(self.updatePageTitle) self.textBrowser.setSearchPaths([":/help"]) self.textBrowser.setSource(QUrl(page)) self.resize(400, 600) self.setWindowTitle("{0} Help".format(QApplication.applicationName()))
def contextMenuEvent(self, event): data = self.page().contextMenuData() assert data.isValid() if not data.isContentEditable(): super().contextMenuEvent(event) return profile = self.page().profile() languages = profile.spellCheckLanguages() menu = self.page().createStandardContextMenu() menu.setParent(self) menu.addSeparator() spellcheckAction = QAction(self.tr("Check Spelling"), None) spellcheckAction.setCheckable(True) spellcheckAction.setChecked(profile.isSpellCheckEnabled()) spellcheckAction.toggled.connect(profile.setSpellCheckEnabled) menu.addAction(spellcheckAction) if profile.isSpellCheckEnabled(): subMenu = menu.addMenu(self.tr("Select Language")) for key, lang in self.m_spellCheckLanguages.items(): action = subMenu.addAction(key) action.setCheckable(True) action.setChecked(lang in languages) action.triggered.connect(partial(self.on_triggered, lang)) menu.aboutToHide.connect(menu.deleteLater) menu.popup(event.globalPos())
def _toolbar_example(self): def _collapse(): tool_bar.collapse() def _set_icon_color(): tool_bar.set_icon_color(QColor(255, 255, 0)) toolbar_widget = QWidget(parent=self) toolbar_layout = layouts.VerticalLayout() toolbar_widget.setLayout(toolbar_layout) tool_bar = toolbar.ToolBar(parent=self) tool_bar.set_children_height(50) toolbar_layout.addWidget(tool_bar) line_edit = lineedit.BaseLineEdit(parent=self) line_edit.setObjectName('hello') collapse_action = tool_bar.addAction('Collapse') tool_bar.addWidget(line_edit) tool_bar.addAction(resources.icon('add'), 'Plus') color_action = QAction('Yellow', None) tool_bar.insertAction('Plus', color_action) collapse_action.triggered.connect(_collapse) color_action.triggered.connect(_set_icon_color) self.main_layout.addWidget(buttons.BaseButton('Hello')) self.main_layout.addStretch() return toolbar_widget
def _create_group_context_menu(self, group, menu): self._create_context_menu(menu=menu, parent=group) group.copy_action.setVisible(False) string_icon = resources.icon('rename') remove_icon = resources.icon('trash') rename_action = QAction(string_icon, 'Rename', menu) menu.addAction(rename_action) remove_action = QAction(remove_icon, 'Remove', menu) menu.addAction(remove_action) rename_action.triggered.connect(group.rename) remove_action.triggered.connect(group.remove) return menu
def showContextMenu(self, pos): self.row = self.propertiesTableView.indexAt(pos).row() self.menu = QMenu(self) deleteRowAction = QAction('Delete', self) deleteRowAction.triggered.connect(self.deleteRow) self.menu.addAction(deleteRowAction) # add other required actions self.menu.popup(QCursor.pos())
def _on_open_menu(self): """ Internal function that is called when the user opens the context menu of the tab menu bar :param pos: QPos """ menu = QMenu(self) menu.addAction( QAction('Rename Current Tab', self, triggered=self._on_rename_tab)) menu.exec_(QCursor.pos())
def __init__(self, mainwindow): self.main = mainwindow self.main.sourceDescription.stateChanged.connect(self.updateDisplay) self.groupIcon = QIcon() self.groupIcon.addPixmap( mainwindow.style().standardPixmap(QStyle.SP_DirClosedIcon), QIcon.Normal, QIcon.Off, ) self.groupIcon.addPixmap( mainwindow.style().standardPixmap(QStyle.SP_DirOpenIcon), QIcon.Normal, QIcon.On, ) self.keyIcon = QIcon() self.keyIcon.addPixmap(mainwindow.style().standardPixmap( QStyle.SP_FileIcon)) self.main.treeView.itemSelectionChanged.connect(self.updateDisplay) self.main.tracePattern.textChanged.connect(self.updateDisplay) self.main.availableSignals.stateChanged.connect(self.updateDisplay) self.main.treeView.setContextMenuPolicy( Qt.CustomContextMenu) # Enable popup menus # Context menu self.main.treeView.customContextMenuRequested.connect( self.handlePopupMenu) # Context menu actions self.actionAdd = QAction("Add", self.main, statusTip="Add a new source") self.actionDelete = QAction("Delete", self.main, statusTip="Remove source from tree") self.actionDelete.triggered.connect(self.deleteSource) self.actionConfig = QAction("Configure", self.main, statusTip="Configure source") self.actionConfig.triggered.connect(self.configureSource)
def context_menu(self, menu, items=None): """ Returns the context menu for the item :return: QMenu """ self._select_content_action = QAction(resources.icon('cursor'), 'Select content', menu) self._select_content_action.triggered.connect(self.select_content) menu.addAction(self._select_content_action) menu.addSeparator()
def create_overwrite_menu(self, menu): """ Creates a menu or action to trigger the overwrite functionality :param menu: QMenu """ if self.is_read_only(): return menu.addSeparator() overwrite_action = QAction(resources.icon('replace'), 'Overwrite', menu) overwrite_action.triggered.connect(self._on_overwrite) menu.addAction(overwrite_action)
def _create_context_menu(self, menu, parent=None): create_menu = super(RigOptionList, self)._create_context_menu(menu=menu, parent=parent) if self._menu_added: return create_menu control_icon = resources.icon('rigcontrol') bone_icon = resources.icon('bone') link_icon = resources.icon('link') create_menu.addSeparator() add_rig_control_action = QAction(control_icon, 'Add Rig Control', create_menu) create_menu.addAction(add_rig_control_action) add_bone_action = QAction(bone_icon, 'Add Rig Joint', create_menu) create_menu.addAction(add_bone_action) add_bone_list_action = QAction(bone_icon, 'Add Rig Joint List', create_menu) create_menu.addAction(add_bone_list_action) add_control_bone_link_action = QAction(link_icon, 'Add Control/Joint Link', create_menu) create_menu.addAction(add_control_bone_link_action) add_rig_control_action.triggered.connect( partial(parent._add_option, 'rigcontrol')) add_bone_action.triggered.connect(partial(parent._add_option, 'bone')) add_bone_list_action.triggered.connect( partial(parent._add_option, 'boneList')) add_control_bone_link_action.triggered.connect( partial(parent._add_option, 'boneControlLink')) self._menu_added = True return create_menu
def init(import_libs=True): """ Initializes tpRigToolkit module :param import_libs: bool, Whether to import deps libraries by default or not """ logger = create_logger() if import_libs: dcc_loader.init() dcc_loader_module = core_dcc.get_dcc_loader_module('tpRigToolkit.dccs') if dcc_loader_module: dcc_loader_module.init() register_resources() # Register configuration files dev = strings.to_boolean(os.getenv('TPRIGTOOLKIT_DEV', 'False')) configs.register_package_configs(PACKAGE, os.path.dirname(tpRigToolkit.config.__file__)) core_config = configs.get_config('tpRigToolkit-core', environment='development' if dev else 'production') if not core_config: logger.warning( 'tpRigToolkit-core configuration file not found! ' 'Make sure that you have tpRigToolkit-config package installed!') return None libs_to_load = core_config.get('libs', list()) tools_to_load = core_config.get('tools', list()) with contexts.Timer('Libraries loaded', logger=logger): libs.LibsManager().register_package_libs(PACKAGE, libs_to_register=libs_to_load) with contexts.Timer('Tools loaded', logger=logger): tools.ToolsManager().register_package_tools(PACKAGE, tools_to_register=tools_to_load) tools_paths = tools.ToolsManager().paths(PACKAGE) with contexts.Timer('Toolsets loaded', logger=logger): qt_toolsets.ToolsetsManager().register_package_toolsets( PACKAGE, os.path.dirname(os.path.abspath(tpRigToolkit.toolsets.__file__)), tools_paths) with contexts.Timer('Menu created', logger=logger): main_menu = menus.create_main_menu( package_name=PACKAGE, force_creation=True, icon=resources.icon('tpRigToolkit')) if main_menu: hub_action = QAction(resources.icon('tpRigToolkit'), 'Hub', main_menu) main_menu.addAction(hub_action) hub_action.triggered.connect(run_hub) menus.create_menus(package_name=PACKAGE, dev=dev, force_main_menu_creation=False)
def refresh_presets(self): """cleans and repopulates the "presets" dropdown on the tool's ribbon""" self.presets_menu.clear() for program in self.presets: program_submenu = self.presets_menu.addMenu(program) for preset in self.presets[program]: preset_action = QAction(preset, self) preset_action.triggered.connect( lambda *args, program=program, name=preset: self. apply_preset(program, name)) program_submenu.addAction(preset_action) self.settings.gaussian_presets = dumps(self.presets['Gaussian']) self.settings.orca_presets = dumps(self.presets['ORCA']) self.settings.psi4_presets = dumps(self.presets['Psi4'])
def create_settings_menu(self): """ Creates and returns the settings menu for this widget :return: QMenu """ menu = QMenu('Item View', self) menu.setIcon(resources.icon('eye')) menu.addSeparator() # copy_text_menu = self.tree_widget().create_copy_text_menu() # menu.addMenu(copy_text_menu) # menu.addSeparator() size_action = action.SliderAction('Size', menu) size_action.slider().setMinimum(10) size_action.slider().setMaximum(200) size_action.slider().setValue(self.zoom_amount()) size_action.slider().valueChanged.connect(self.set_zoom_amount) menu.addAction(size_action) border_action = action.SliderAction('Border', menu) border_action.slider().setMinimum(0) border_action.slider().setMaximum(20) border_action.slider().setValue(self.padding()) border_action.slider().valueChanged.connect(self.set_padding) menu.addAction(border_action) spacing_action = action.SliderAction('Spacing', menu) spacing_action.slider().setMinimum(self.DEFAULT_MIN_SPACING) spacing_action.slider().setMaximum(self.DEFAULT_MAX_SPACING) spacing_action.slider().setValue(self.spacing()) spacing_action.slider().valueChanged.connect(self.set_spacing) menu.addAction(spacing_action) menu.addAction(action.SeparatorAction('Label Options', menu)) for option in item.LabelDisplayOption.values(): option_action = QAction(option.title(), menu) option_action.setCheckable(True) option_action.setChecked(option == self.label_display_option()) option_callback = partial(self.set_label_display_option, option) option_action.triggered.connect(option_callback) menu.addAction(option_action) return menu
def create_items_menu(self, items=None): """ Creates the item menu for the given items :param items: list(LibraryItem) :return: QMenu """ item = items or self.selected_item() menu = QMenu(self) if item: try: item.context_menu(menu) except Exception as e: LOGGER.exception(e) else: item_action = QAction(menu) item_action.setText('No Item selected') item_action.setDisabled(True) menu.addAction(item_action) return menu
def init_ui(self): self.text_edit = QTextEdit(self) self.setCentralWidget(self.text_edit) font = QFont("Menlo", 12) # TODO: Create a layout and change the line spacing #spacing = QFontMetrics(font).lineSpacing() self.text_edit.setFont(font) self.highlighter = Highlighter(self.text_edit.document(), DEFAULT_RULES, DEFAULT_STYLE) #print("Highlighter doc: {}".format(self.text_edit.document())) menu_bar = self.menuBar() m_file = menu_bar.addMenu("File") i_open = QAction("Open", self) i_open.setShortcut('Ctrl+O') i_open.triggered.connect(self.on_open) m_file.addAction(i_open) self.setGeometry(300, 300, 350, 300) self.setWindowTitle("tea")
def context_menu(self, menu, items=None): """ Returns the context menu for the item :return: QMenu """ super(MayaDataItemView, self).context_menu(menu, items=items) clean_student_license_function = self.item.functionality().get( 'clean_student_license') if clean_student_license_function: clean_student_license_action = QAction(resources.icon('student'), 'Clean Student License', menu) menu.addAction(clean_student_license_action) clean_student_license_action.triggered.connect( lambda: clean_student_license_function()) menu.addSeparator() create_selection_sets_menu = self._create_selection_sets_menu( menu, enable_select_content=False) menu.insertMenu(self._select_content_action, create_selection_sets_menu)
def context_edit_menu(self, menu, items=None): """ This function is called when the user opens context menu The given menu is shown as a submenu of the main context menu This function can be override to create custom context menus in LibraryItems :param menu: QMenu :param items: list(LibraryItem) """ rename_action = QAction(resources.icon('rename'), 'Rename', menu) rename_action.triggered.connect(self._on_show_rename_dialog) menu.addAction(rename_action) move_to_action = QAction(resources.icon('move'), 'Move to', menu) move_to_action.triggered.connect(self._on_move_dialog) menu.addAction(move_to_action) copy_path_action = QAction(resources.icon('copy'), 'Copy Path', menu) copy_path_action.triggered.connect(self._on_copy_path) menu.addAction(copy_path_action) if self.library_window(): select_folder_action = QAction(resources.icon('select'), 'Select Folder', menu) select_folder_action.triggered.connect(self._on_select_folder) menu.addAction(select_folder_action) show_in_folder_action = QAction(resources.icon('folder'), 'Show in Folder', menu) show_in_folder_action.triggered.connect(self._on_show_in_folder) menu.addAction(show_in_folder_action) if self.is_deletable(): delete_action = QAction(resources.icon('delete'), 'Delete', menu) delete_action.triggered.connect(self._on_show_delete_dialog) delete_with_dependencies_action = QAction(resources.icon('delete'), 'Delete with Dependencies', menu) delete_with_dependencies_action.triggered.connect(self._on_show_delete_with_dependencies_dialog) menu.addSeparator() menu.addAction(delete_action) menu.addAction(delete_with_dependencies_action) self.create_overwrite_menu(menu)
def addAction(self, path, text, tip, callback): """ Overrides base QToolButton addAction function Adds aan action to the toolbar :param path: str :param text: str :param tip: str :param callback: fn :return: QAction """ action_icon = icon.Icon.state_icon( path, color='rgb(250,250,250,160)', color_active='rgb(250,250,250,250)', color_disabled='rgb(0,0,0,20)' ) action = QAction(action_icon, text, self._toolbar) action.setToolTip(tip) self._toolbar.insertAction(self._first_spacer, action) action.triggered.connect(callback) return action
def __init__(self): super(LoggerTool, self).__init__() self.logView = QTextBrowser() self.logView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) self.logView.setOpenLinks(False) self.logView.setReadOnly(True) self.logView.setStyleSheet( "background-color: %s; Font: 10pt 'Consolas'" % "rgba%s" % str(editableStyleSheet().LoggerBgColor.getRgb())) self.clearAction = QAction("Clear", None) self.clearAction.triggered.connect(self.clearView) self.logView.addAction(self.clearAction) self.logView.anchorClicked.connect(self.anchorClickedMethod) self.logView.setTextColor(QtGui.QColor('white')) self.setWidget(self.logView) ##################################################### # Sys Output Redirection ##################################################### self.handler = None if REDIRECT: self.handler = QtHandler(self) else: self.handler = logging.StreamHandler(sys.stdout) self.handler.setFormatter(LoggerTool.formater) logger.addHandler(self.handler) logger.setLevel(logging.DEBUG) sys.excepthook = LoggerTool.exceptHook if self.handler and REDIRECT: self.handler.messageHolder.messageWritten.connect( lambda value: self.logPython(value, 0)) self.handler.messageHolder.warningWritten.connect( lambda value: self.logPython(value, 1)) self.handler.messageHolder.errorWritten.connect( lambda value: self.logPython(value, 2)) self.handler.messageHolder.flushSig.connect(self.flushPython)
def _generate_context_menu(self, pos): """ Internal function that generates context menu of the console :param pos: QPos :return: QMneu """ menu = self.createStandardContextMenu() clear_action = QAction('Clear', menu) clear_action.triggered.connect(self.clear) menu.addSeparator() menu.addAction(clear_action) # menu.addSeparator() # undo_action = QAction('Undo', menu) # undo_action.setShortcut('Ctrl+Z') # menu.addAction(undo_action) # redo_action = QAction('Redo', menu) # redo_action.setShortcut('Ctrl+Y') # menu.addAction(redo_action) # undo_action.setEnabled(self.isUndoRedoEnabled()) # redo_action.setEnabled(self.isUndoRedoEnabled()) # undo_action.triggered.connect(self._on_undo) # redo_action.triggered.connect(self._on_redo) menu.popup(self.mapToGlobal(pos))
def _build_ui(self): layout = QFormLayout() self.cone_option = QComboBox() self.cone_option.addItems(["Tolman (Unsymmetrical)", "Exact"]) ndx = self.cone_option.findText(self.settings.cone_option, Qt.MatchExactly) self.cone_option.setCurrentIndex(ndx) layout.addRow("method:", self.cone_option) self.radii_option = QComboBox() self.radii_option.addItems(["Bondi", "UMN"]) ndx = self.radii_option.findText(self.settings.radii, Qt.MatchExactly) self.radii_option.setCurrentIndex(ndx) layout.addRow("radii:", self.radii_option) self.display_cone = QCheckBox() self.display_cone.setChecked(self.settings.display_cone) layout.addRow("show cone:", self.display_cone) self.display_radii = QCheckBox() self.display_radii.setChecked(self.settings.display_radii) layout.addRow("show radii:", self.display_radii) set_ligand_button = QPushButton("set ligand to current selection") set_ligand_button.clicked.connect(self.set_ligand) layout.addRow(set_ligand_button) self.set_ligand_button = set_ligand_button calc_cone_button = QPushButton( "calculate cone angle for ligand on selected center") calc_cone_button.clicked.connect(self.calc_cone) layout.addRow(calc_cone_button) self.calc_cone_button = calc_cone_button remove_cone_button = QPushButton("remove cone visualizations") remove_cone_button.clicked.connect(self.del_cone) layout.addRow(remove_cone_button) self.remove_cone_button = remove_cone_button self.table = QTableWidget() self.table.setColumnCount(3) self.table.setHorizontalHeaderLabels([ 'model', 'center', 'cone angle (°)', ]) self.table.setSelectionBehavior(QTableWidget.SelectRows) self.table.setEditTriggers(QTableWidget.NoEditTriggers) self.table.resizeColumnToContents(0) self.table.resizeColumnToContents(1) self.table.resizeColumnToContents(2) self.table.horizontalHeader().setSectionResizeMode( 2, QHeaderView.Stretch) layout.addRow(self.table) menu = QMenuBar() export = menu.addMenu("&Export") clear = QAction("Clear data table", self.tool_window.ui_area) clear.triggered.connect(self.clear_table) export.addAction(clear) copy = QAction("&Copy CSV to clipboard", self.tool_window.ui_area) copy.triggered.connect(self.copy_csv) shortcut = QKeySequence(Qt.CTRL + Qt.Key_C) copy.setShortcut(shortcut) export.addAction(copy) save = QAction("&Save CSV...", self.tool_window.ui_area) save.triggered.connect(self.save_csv) #this shortcut interferes with main window's save shortcut #I've tried different shortcut contexts to no avail #thanks Qt... #shortcut = QKeySequence(Qt.CTRL + Qt.Key_S) #save.setShortcut(shortcut) #save.setShortcutContext(Qt.WidgetShortcut) export.addAction(save) delimiter = export.addMenu("Delimiter") comma = QAction("comma", self.tool_window.ui_area, checkable=True) comma.setChecked(self.settings.delimiter == "comma") comma.triggered.connect(lambda *args, delim="comma": self.settings. __setattr__("delimiter", delim)) delimiter.addAction(comma) tab = QAction("tab", self.tool_window.ui_area, checkable=True) tab.setChecked(self.settings.delimiter == "tab") tab.triggered.connect(lambda *args, delim="tab": self.settings. __setattr__("delimiter", delim)) delimiter.addAction(tab) space = QAction("space", self.tool_window.ui_area, checkable=True) space.setChecked(self.settings.delimiter == "space") space.triggered.connect(lambda *args, delim="space": self.settings. __setattr__("delimiter", delim)) delimiter.addAction(space) semicolon = QAction("semicolon", self.tool_window.ui_area, checkable=True) semicolon.setChecked(self.settings.delimiter == "semicolon") semicolon.triggered.connect(lambda *args, delim="semicolon": self. settings.__setattr__("delimiter", delim)) delimiter.addAction(semicolon) add_header = QAction("&Include CSV header", self.tool_window.ui_area, checkable=True) add_header.setChecked(self.settings.include_header) add_header.triggered.connect(self.header_check) export.addAction(add_header) comma.triggered.connect( lambda *args, action=tab: action.setChecked(False)) comma.triggered.connect( lambda *args, action=space: action.setChecked(False)) comma.triggered.connect( lambda *args, action=semicolon: action.setChecked(False)) tab.triggered.connect( lambda *args, action=comma: action.setChecked(False)) tab.triggered.connect( lambda *args, action=space: action.setChecked(False)) tab.triggered.connect( lambda *args, action=semicolon: action.setChecked(False)) space.triggered.connect( lambda *args, action=comma: action.setChecked(False)) space.triggered.connect( lambda *args, action=tab: action.setChecked(False)) space.triggered.connect( lambda *args, action=semicolon: action.setChecked(False)) semicolon.triggered.connect( lambda *args, action=comma: action.setChecked(False)) semicolon.triggered.connect( lambda *args, action=tab: action.setChecked(False)) semicolon.triggered.connect( lambda *args, action=space: action.setChecked(False)) menu.setNativeMenuBar(False) self._menu = menu layout.setMenuBar(menu) menu.setVisible(True) self.tool_window.ui_area.setLayout(layout) self.tool_window.manage(None)
def __init__(self, window, system=None): self.system = system self.window = window # Build Actions blendToTargetACT = QAction("Blend To Target", self.window) generateShapeIncrementalsACT = QAction("Generate Shape Incrementals", self.window) #generateTimeIncrementalsACT = QAction("Generate Time Incrementals", self.window) relaxToSelectionACT = QAction("Relax To Selection", self.window) snapShapeToNeutralACT = QAction("Snap Shape To Neutral", self.window) softSelectToClusterACT = QAction("Soft Select To Cluster", self.window) extractDeltasACT = QAction("Extract Deltas", self.window) applyDeltasACT = QAction("Apply Deltas", self.window) extractExternalACT = QAction("Extract External", self.window) tweakMixACT = QAction("Tweak Mix", self.window) extractProgressivesACT = QAction("Extract Progressive", self.window) reloadDefinitionACT = QAction("Reload Definition", self.window) updateRestShapeACT = QAction("Update Rest Shape", self.window) extractCleanComboACT = QAction("Extract Clean Combo", self.window) importObjFolderACT = QAction("Import Obj Folder", self.window) # Build the menu menu = self.window.menuBar.addMenu('Tools') menu.addAction(blendToTargetACT) menu.addAction(generateShapeIncrementalsACT) #menu.addAction(generateTimeIncrementalsACT) menu.addAction(relaxToSelectionACT) menu.addAction(snapShapeToNeutralACT) menu.addAction(softSelectToClusterACT) menu.addSeparator() menu.addAction(extractDeltasACT) menu.addAction(applyDeltasACT) menu.addAction(extractExternalACT) menu.addAction(tweakMixACT) menu.addAction(extractProgressivesACT) menu.addAction(reloadDefinitionACT) menu.addAction(updateRestShapeACT) menu.addAction(extractCleanComboACT) menu.addAction(importObjFolderACT) # Set up the connections blendToTargetACT.triggered.connect(self.blendToTarget) generateShapeIncrementalsACT.triggered.connect( self.generateShapeIncrementals) #generateTimeIncrementalsACT.triggered.connect(self.generateTimeIncrementals) relaxToSelectionACT.triggered.connect(self.relaxToSelection) snapShapeToNeutralACT.triggered.connect(self.snapShapeToNeutral) softSelectToClusterACT.triggered.connect(self.softSelectToCluster) extractDeltasACT.triggered.connect(self.extractDeltas) applyDeltasACT.triggered.connect(self.applyDeltas) extractExternalACT.triggered.connect(self.extractExternal) tweakMixACT.triggered.connect(self.tweakMix) extractProgressivesACT.triggered.connect(self.extractProgressives) reloadDefinitionACT.triggered.connect(self.reloadDefinition) updateRestShapeACT.triggered.connect(self.updateRestShape) extractCleanComboACT.triggered.connect(self.extractCleanCombo) importObjFolderACT.triggered.connect(self.loadObjFolder)
def _build_ui(self): #each group has an empty widget at the bottom so they resize the way I want while also having the #labels where I want them layout = QGridLayout() self.tab_widget = QTabWidget() layout.addWidget(self.tab_widget) #layout for absolute thermo stuff absolute_widget = QWidget() absolute_layout = QGridLayout(absolute_widget) #box for sp sp_area_widget = QGroupBox("Single-point") sp_layout = QFormLayout(sp_area_widget) self.sp_selector = FilereaderComboBox(self.session, otherItems=['energy']) self.sp_selector.currentIndexChanged.connect(self.set_sp) sp_layout.addRow(self.sp_selector) self.sp_table = QTableWidget() self.sp_table.setColumnCount(3) self.sp_table.setShowGrid(False) self.sp_table.horizontalHeader().hide() self.sp_table.verticalHeader().hide() self.sp_table.setFrameShape(QTableWidget.NoFrame) self.sp_table.setSelectionMode(QTableWidget.NoSelection) self.sp_table.insertRow(0) sp_layout.addRow(self.sp_table) #box for thermo therm_area_widget = QGroupBox("Thermal corrections") thermo_layout = QFormLayout(therm_area_widget) self.thermo_selector = FilereaderComboBox(self.session, otherItems=['frequency']) self.thermo_selector.currentIndexChanged.connect(self.set_thermo_mdl) thermo_layout.addRow(self.thermo_selector) self.temperature_line = QDoubleSpinBox() self.temperature_line.setMaximum(2**31 - 1) self.temperature_line.setValue(298.15) self.temperature_line.setSingleStep(10) self.temperature_line.setSuffix(" K") self.temperature_line.setMinimum(0) self.temperature_line.valueChanged.connect(self.set_thermo) thermo_layout.addRow("T =", self.temperature_line) self.v0_edit = QDoubleSpinBox() self.v0_edit.setMaximum(4000) self.v0_edit.setValue(self.settings.w0) self.v0_edit.setSingleStep(25) self.v0_edit.setSuffix(" cm\u207b\u00b9") self.v0_edit.valueChanged.connect(self.set_thermo) self.v0_edit.setMinimum(0) self.v0_edit.setToolTip( "frequency parameter for quasi treatments of entropy") thermo_layout.addRow("𝜔<sub>0</sub> =", self.v0_edit) self.thermo_table = QTableWidget() self.thermo_table.setColumnCount(3) self.thermo_table.setShowGrid(False) self.thermo_table.horizontalHeader().hide() self.thermo_table.verticalHeader().hide() self.thermo_table.setFrameShape(QTableWidget.NoFrame) self.thermo_table.setSelectionMode(QTableWidget.NoSelection) thermo_layout.addRow(self.thermo_table) # for for total sum_area_widget = QGroupBox("Thermochemistry") sum_layout = QFormLayout(sum_area_widget) self.sum_table = QTableWidget() self.sum_table.setColumnCount(3) self.sum_table.setShowGrid(False) self.sum_table.horizontalHeader().hide() self.sum_table.verticalHeader().hide() self.sum_table.setFrameShape(QTableWidget.NoFrame) self.sum_table.setSelectionMode(QTableWidget.NoSelection) sum_layout.addRow(self.sum_table) splitter = QSplitter(Qt.Horizontal) splitter.setChildrenCollapsible(False) splitter.addWidget(sp_area_widget) splitter.addWidget(therm_area_widget) splitter.addWidget(sum_area_widget) absolute_layout.addWidget(splitter) self.status = QStatusBar() self.status.setSizeGripEnabled(False) self.status.setStyleSheet("color: red") absolute_layout.addWidget(self.status, 1, 0, 1, 1, Qt.AlignTop) self.tab_widget.addTab(absolute_widget, "absolute") relative_widget = QWidget() relative_layout = QGridLayout(relative_widget) size = [self.settings.ref_col_1, self.settings.ref_col_2] self.ref_group = ThermoGroup("reference group", self.session, self.nrg_fr, self.thermo_co, size) self.ref_group.changes.connect(self.calc_relative_thermo) relative_layout.addWidget(self.ref_group, 0, 0, 1, 3, Qt.AlignTop) size = [self.settings.other_col_1, self.settings.other_col_2] self.other_group = ThermoGroup("other group", self.session, self.nrg_fr, self.thermo_co, size) self.other_group.changes.connect(self.calc_relative_thermo) relative_layout.addWidget(self.other_group, 0, 3, 1, 3, Qt.AlignTop) self.relative_temperature = QDoubleSpinBox() self.relative_temperature.setMaximum(2**31 - 1) self.relative_temperature.setValue(self.settings.rel_temp) self.relative_temperature.setSingleStep(10) self.relative_temperature.setSuffix(" K") self.relative_temperature.setMinimum(0) self.relative_temperature.valueChanged.connect( self.calc_relative_thermo) relative_layout.addWidget(QLabel("T ="), 1, 0, 1, 1, Qt.AlignRight | Qt.AlignVCenter) relative_layout.addWidget(self.relative_temperature, 1, 1, 1, 5, Qt.AlignLeft | Qt.AlignVCenter) self.relative_v0 = QDoubleSpinBox() self.relative_v0.setMaximum(2**31 - 1) self.relative_v0.setValue(self.settings.w0) self.relative_v0.setSingleStep(25) self.relative_v0.setSuffix(" cm\u207b\u00b9") self.relative_v0.setMinimum(0) self.relative_v0.setToolTip( "frequency parameter for quasi treatments of entropy") self.relative_v0.valueChanged.connect(self.calc_relative_thermo) relative_layout.addWidget(QLabel("𝜔<sub>0</sub> ="), 2, 0, 1, 1, Qt.AlignRight | Qt.AlignVCenter) relative_layout.addWidget(self.relative_v0, 2, 1, 1, 5, Qt.AlignLeft | Qt.AlignVCenter) relative_layout.addWidget( QLabel("Boltzmann-weighted relative energies in kcal/mol:"), 3, 0, 1, 6, Qt.AlignVCenter | Qt.AlignLeft) self.relative_table = QTextBrowser() self.relative_table.setMaximumHeight( 4 * self.relative_table.fontMetrics().boundingRect("Q").height()) relative_layout.addWidget(self.relative_table, 4, 0, 1, 6, Qt.AlignTop) relative_layout.setRowStretch(0, 1) relative_layout.setRowStretch(1, 0) relative_layout.setRowStretch(2, 0) relative_layout.setRowStretch(3, 0) relative_layout.setRowStretch(4, 0) self.tab_widget.addTab(relative_widget, "relative") #menu stuff menu = QMenuBar() export = menu.addMenu("&Export") copy = QAction("&Copy CSV to clipboard", self.tool_window.ui_area) copy.triggered.connect(self.copy_csv) shortcut = QKeySequence(Qt.CTRL + Qt.Key_C) copy.setShortcut(shortcut) export.addAction(copy) self.copy = copy save = QAction("&Save CSV...", self.tool_window.ui_area) save.triggered.connect(self.save_csv) #this shortcut interferes with main window's save shortcut #I've tried different shortcut contexts to no avail #thanks Qt... #shortcut = QKeySequence(Qt.CTRL + Qt.Key_S) #save.setShortcut(shortcut) #save.setShortcutContext(Qt.WidgetShortcut) export.addAction(save) delimiter = export.addMenu("Delimiter") comma = QAction("comma", self.tool_window.ui_area, checkable=True) comma.setChecked(self.settings.delimiter == "comma") comma.triggered.connect(lambda *args, delim="comma": self.settings. __setattr__("delimiter", delim)) delimiter.addAction(comma) tab = QAction("tab", self.tool_window.ui_area, checkable=True) tab.setChecked(self.settings.delimiter == "tab") tab.triggered.connect(lambda *args, delim="tab": self.settings. __setattr__("delimiter", delim)) delimiter.addAction(tab) space = QAction("space", self.tool_window.ui_area, checkable=True) space.setChecked(self.settings.delimiter == "space") space.triggered.connect(lambda *args, delim="space": self.settings. __setattr__("delimiter", delim)) delimiter.addAction(space) semicolon = QAction("semicolon", self.tool_window.ui_area, checkable=True) semicolon.setChecked(self.settings.delimiter == "semicolon") semicolon.triggered.connect(lambda *args, delim="semicolon": self. settings.__setattr__("delimiter", delim)) delimiter.addAction(semicolon) add_header = QAction("&Include CSV header", self.tool_window.ui_area, checkable=True) add_header.setChecked(self.settings.include_header) add_header.triggered.connect(self.header_check) export.addAction(add_header) comma.triggered.connect( lambda *args, action=tab: action.setChecked(False)) comma.triggered.connect( lambda *args, action=space: action.setChecked(False)) comma.triggered.connect( lambda *args, action=semicolon: action.setChecked(False)) tab.triggered.connect( lambda *args, action=comma: action.setChecked(False)) tab.triggered.connect( lambda *args, action=space: action.setChecked(False)) tab.triggered.connect( lambda *args, action=semicolon: action.setChecked(False)) space.triggered.connect( lambda *args, action=comma: action.setChecked(False)) space.triggered.connect( lambda *args, action=tab: action.setChecked(False)) space.triggered.connect( lambda *args, action=semicolon: action.setChecked(False)) semicolon.triggered.connect( lambda *args, action=comma: action.setChecked(False)) semicolon.triggered.connect( lambda *args, action=tab: action.setChecked(False)) semicolon.triggered.connect( lambda *args, action=space: action.setChecked(False)) menu.setNativeMenuBar(False) self._menu = menu layout.setMenuBar(menu) menu.setVisible(True) self.tool_window.ui_area.setLayout(layout) self.tool_window.manage(None)