def initUI(self): self.setWindowTitle(self.title) vertical_layout = QtWidgets.QVBoxLayout() self.thread_progressbar = QtWidgets.QProgressBar(self) if self.progress: self.thread_progressbar.setMinimum(0) self.thread_progressbar.setMaximum(0) progressbar_label = "Computing..." # "Wait for the protocol to complete." self.thread_progressbar.setFormat(progressbar_label) self.thread_progressbar.setValue(0) vertical_layout.addWidget(self.thread_progressbar) self.thread_progress_label = QtWidgets.QLabel(self.label_text, self) self.thread_progress_label.setWordWrap(True) vertical_layout.addWidget(self.thread_progress_label) # Button for canceling the execution of the thread. horizontal_layout = QtWidgets.QHBoxLayout() self.cancel_button = QtWidgets.QPushButton('Cancel', self) self.cancel_button.clicked.connect(self.on_cancel_button_click) self.cancel_button.setEnabled(not self.lock) horizontal_layout.addWidget(self.cancel_button) vertical_layout.addLayout(horizontal_layout) self.setLayout(vertical_layout)
def __init__(self, parent, cmd): QtWidgets.QWidget.__init__(self, parent, Qt.Window) self.setMinimumSize(400, 500) self.cmd = cmd self.model = QtGui.QStandardItemModel(self) self.proxy_model = QtCoreModels.QSortFilterProxyModel(self) self.proxy_model.setSourceModel(self.model) self.setWindowTitle('PyMOL Advanced Settings') layout = QtWidgets.QVBoxLayout(self) self.setLayout(layout) self.filter_le = QtWidgets.QLineEdit(self) layout.addWidget(self.filter_le) self.filter_le.setPlaceholderText("Filter") self.filter_le.textChanged.connect(self.proxy_model.setFilterRegExp) self.populateData() self.table = QtWidgets.QTableView(self) self.table.setModel(self.proxy_model) layout.addWidget(self.table) self.formatTable() self.model.itemChanged.connect(self.itemChanged)
def initUI(self): self.setWindowTitle('PyMod Directory Selection') self.vertical_layout = QtWidgets.QVBoxLayout() # Main label. self.label = QtWidgets.QLabel( "Select a folder inside which to build the 'PyMod Directory'", self) self.vertical_layout.addWidget(self.label) # Entry and "Browse" button. self.horizontal_layout = QtWidgets.QHBoxLayout() self.main_entry = QtWidgets.QLineEdit(self.pymod.home_directory, self) self.main_entry.setStyleSheet("background-color: white; color: black") self.horizontal_layout.addWidget(self.main_entry) self.browse_button = QtWidgets.QPushButton("BROWSE", self) self.browse_button.clicked.connect(self.pymod_directory_browse_state) self.horizontal_layout.addWidget(self.browse_button) self.vertical_layout.addLayout(self.horizontal_layout) # "Submit" button. self.submit_button = QtWidgets.QPushButton("SUBMIT", self) self.submit_button.setFixedWidth(self.submit_button.sizeHint().width()) self.submit_button.clicked.connect(self.on_submit_button_press) self.vertical_layout.addWidget(self.submit_button) self.vertical_layout.setAlignment(self.submit_button, QtCore.Qt.AlignCenter) # Set the layouts. self.setLayout(self.vertical_layout)
def __init__(self, label_text="Input", buttons=[]): PyMod_form_item.__init__(self) # Label. self.label = QtWidgets.QLabel(label_text) # Buttons. self.input = QtWidgets.QVBoxLayout() if not buttons: raise ValueError("Please provide a list of button names") if len(buttons) != len(set(buttons)): raise ValueError("Please provide a non redundant list of buttons") self.button_group = QtWidgets.QButtonGroup() self.buttons_names = [] self.buttons_dict = {} for button_name in buttons: button = QtWidgets.QPushButton(button_name) button.setCheckable(True) self.input.addWidget(button) self.buttons_names.append(button_name) self.buttons_dict[button_name] = button self.button_group.addButton(button)
def build_alignment_mode_frame(self): """ Builds a frame with some options to choose the alignment mode. """ # Vbox which will store all the widgets for the alignment mode options. self.alignment_mode_vbox = QtWidgets.QVBoxLayout() self.alignment_mode_label = QtWidgets.QLabel("Alignment Mode") self.alignment_mode_vbox.addWidget(self.alignment_mode_label) self.alignment_mode_button_group = QtWidgets.QButtonGroup() self.build_strategy_specific_modes_frames() # Defined in child classes. self.middle_formlayout.addRow(self.alignment_mode_vbox)
def create_dialog(): dialog = QtWidgets.QDialog() dialog.setWindowTitle('AlignIt Pymol plugin') layout = QtWidgets.QVBoxLayout(dialog) alignit = AlignItPlugin() actions = { 'Read pharmacophore...': lambda: alignit.readAlignIt(dialog), } for name, action in actions.items(): btn = QtWidgets.QPushButton(name, dialog) btn.pressed.connect(action) layout.addWidget(btn) return dialog
def _build_table_elements(self, parent): ''' Create the various elements in the table and add them to the proper layout. ''' self.setWindowTitle('Scene Panel') layout = QtWidgets.QVBoxLayout(self) self.setLayout(layout) top_layout = QtWidgets.QGridLayout() layout.addLayout(top_layout) mid_layout = QtWidgets.QGridLayout() layout.addLayout(mid_layout) low_layout = QtWidgets.QGridLayout() layout.addLayout(low_layout) # Top Elements self.instructionLabel = QtWidgets.QLabel(self) self.instructionLabel.setText( 'Double click selected thumbnail to \nload into Workspace.') top_layout.addWidget(self.instructionLabel, 0, 0) self.addSceneButton = QtWidgets.QPushButton(self) self.addSceneButton.setText('Add Scene') top_layout.addWidget(self.addSceneButton, 0, 1) # Mid Elements self.sceneTableWidget = QtWidgets.QTableWidget(self) mid_layout.addWidget(self.sceneTableWidget, 0, 0) self.sceneTableWidget.viewport().installEventFilter(self) self.sceneTableWidget.itemChanged.connect(self._item_changed) self.sceneTableWidget.selectionModel().selectionChanged.connect( self._selection_changed) self.sceneTableWidget.setSelectionBehavior( QtWidgets.QAbstractItemView.SelectRows) self.sceneTableWidget.verticalHeader().setSectionsMovable(True) # Lower Buttom Elements self.deleteButton = QtWidgets.QPushButton(self) self.deleteButton.setText("Delete Scene") low_layout.addWidget(self.deleteButton, 0, 1) self.deleteButton.setEnabled(False) self.updateButton = QtWidgets.QPushButton(self) self.updateButton.setText("Update Scene") low_layout.addWidget(self.updateButton, 0, 0) self.updateButton.setEnabled(False)
def initUI(self): self.setWindowTitle('Import PDB Options') vertical_layout = QtWidgets.QVBoxLayout() # Installation options label. info_text = "Please select the 3D structure import mode:" self.fetch_info_label = QtWidgets.QLabel(info_text, self) # self.fetch_info_label.setStyleSheet(label_style_1) vertical_layout.addWidget(self.fetch_info_label) vertical_layout.addStretch(1) # Import options radiobuttons. horizontal_layout = QtWidgets.QHBoxLayout() self.import_all_radiobutton = QtWidgets.QRadioButton( "Import in PyMod the structure of every chain of the PDB files.") # self.import_all_radiobutton.setChecked(True) # self.import_all_radiobutton.setStyleSheet(label_font_1) vertical_layout.addWidget(self.import_all_radiobutton) self.import_fragment_radiobutton = QtWidgets.QRadioButton( "Import in PyMod only the structure of the hit sequences fragments." ) # label_font_1 self.import_fragment_radiobutton.setStyleSheet("margin-bottom: 10px") vertical_layout.addWidget(self.import_fragment_radiobutton) # Import fragments button. self.import_button = QtWidgets.QPushButton("Import 3D Structures", self) # self.import_button.setStyleSheet(label_style_2) self.import_button.clicked.connect(self.on_import_button_click) horizontal_layout.addWidget(self.import_button) horizontal_layout.addStretch(1) # Cancel button. self.cancel_button = QtWidgets.QPushButton('Cancel', self) # self.cancel_button.setStyleSheet(label_style_2) self.cancel_button.clicked.connect(self.on_cancel_button_click) horizontal_layout.addWidget(self.cancel_button) vertical_layout.addLayout(horizontal_layout) self.setLayout(vertical_layout)
def show_plugin_info_dialog(self, info): dialog = QtWidgets.QDialog(None) dialog.setWindowTitle('Plugin Information') layout = QtWidgets.QVBoxLayout() table = QtWidgets.QTableWidget(0, 2) table.verticalHeader().hide() table.horizontalHeader().hide() table.horizontalHeader().setStretchLastSection(True) layout.addWidget(table) dialog.setLayout(layout) def add_line(label, text): row = table.rowCount() table.insertRow(table.rowCount()) table_item = QtWidgets.QTableWidgetItem(label) table_item.setFlags(table_item.flags() & ~(Qt.ItemIsEditable)) table.setItem(row, 0, table_item) table_item = QtWidgets.QTableWidgetItem(text) table_item.setFlags(table_item.flags() & ~(Qt.ItemIsEditable)) table.setItem(row, 1, table_item) add_line('Name', info.name) if not info.is_temporary: add_line('Python Module Name', info.mod_name) add_line('Filename', info.filename) metadata = info.get_metadata() for label, value in metadata.items(): add_line(label, value) if not info.is_temporary: if info.loaded: add_line('commands', ', '.join(info.commands)) docstring = info.get_docstring() or 'No documentation available.' browser = QtWidgets.QTextBrowser() browser.setPlainText(docstring) layout.addWidget(browser) table.resizeColumnsToContents() dialog.resize(600, dialog.height()) dialog.exec_()
def __init__(self, widget, window=None, name='', _self=None): if window: window.setWindowTitle(name + ' - Volume Color Map Editor') cmd = _self layout = QtWidgets.QVBoxLayout() widget.setLayout(layout) widget.editor = VolumeEditorWidget(widget, name, _self) layout.addWidget(widget.editor) layout.setContentsMargins(5, 5, 5, 5) get_colors_btn = QtWidgets.QPushButton("Get colors as script") get_colors_btn.setAutoDefault(False) get_colors_btn.clicked.connect(widget.editor.displayScript) help_btn = QtWidgets.QPushButton("Help") help_btn.setAutoDefault(False) help_btn.clicked.connect(widget.editor.displayHelp) reset_btn = QtWidgets.QPushButton("Reset Data Range") reset_btn.setAutoDefault(False) reset_btn.clicked.connect(widget.editor.reset) widget.editor.update_cb = QtWidgets.QCheckBox( "Update volume colors in real-time") widget.editor.update_cb.setObjectName("volume_checkbox") widget.editor.update_cb.setChecked(True) widget.editor.update_cb.setMinimumWidth(30) widget.editor.update_cb.toggled.connect( widget.editor.toggleRealTimeUpdates) button_layout = QtWidgets.QHBoxLayout() button_layout.addWidget(get_colors_btn) button_layout.addWidget(reset_btn) button_layout.addWidget(help_btn) button_layout.addStretch() button_layout.addWidget(widget.editor.update_cb) layout.addLayout(button_layout) histogram = cmd.get_volume_histogram(name) widget.editor.setHistogram(histogram) colors = cmd.volume_color(name) widget.editor.setColors(colors)
def displayTextDialog(self, text): """ Opens a generic text dialog and displays provided text. """ if not self.text_dialog: self.text_dialog = QtWidgets.QDialog() layout = QtWidgets.QVBoxLayout() self.text_dialog.setLayout(layout) self.text_dialog.text_display = QtWidgets.QPlainTextEdit() self.text_dialog.text_display.setReadOnly(True) self.text_dialog.text_display.setStyleSheet( "font-family: monospace, courier") size = self.text_dialog.size() size.setWidth(DEFAULT_TEXT_DIALOG_WIDTH) self.text_dialog.resize(size) layout.addWidget(self.text_dialog.text_display) self.text_dialog.text_display.setPlainText(text) self.text_dialog.show() self.text_dialog.raise_()
def __init__(self, parent=None): super(SurfStampFrame, self).__init__(parent) self.layout = QtWidgets.QVBoxLayout() self.setLayout(self.layout) glayout1 = QtWidgets.QGridLayout() self.label_message = QtWidgets.QLabel(self) self.label_message.setText("SurfStamp PyMOL plugin") self.layout.addWidget(self.label_message) self.combo_model = QtWidgets.QComboBox() self.combo_model.addItems([]) self.layout.addWidget(self.combo_model) self.label_reso = QtWidgets.QLabel(self) self.label_reso.setText("Surface Resolution") glayout1.addWidget(self.label_reso, 1, 0) self.spin_reso = QtWidgets.QDoubleSpinBox(self) self.spin_reso.setRange(0.1, 1.0) self.spin_reso.setSingleStep(0.05) self.spin_reso.setValue(0.7) glayout1.addWidget(self.spin_reso, 1, 1) self.label_imagesize = QtWidgets.QLabel(self) self.label_imagesize.setText("Image Size") glayout1.addWidget(self.label_imagesize, 2, 0) self.spin_imagesize = QtWidgets.QSpinBox(self) self.spin_imagesize.setRange(1000, 10000) #PILLOW?は 13000 くらいが Max っぽい self.spin_imagesize.setSingleStep(100) self.spin_imagesize.setValue(4000) glayout1.addWidget(self.spin_imagesize, 2, 1) self.label_fontsize = QtWidgets.QLabel(self) self.label_fontsize.setText("Font Size") glayout1.addWidget(self.label_fontsize, 3, 0) self.spin_fontsize = QtWidgets.QSpinBox(self) self.spin_fontsize.setRange(3, 100) self.spin_fontsize.setSingleStep(1) self.spin_fontsize.setValue(20) glayout1.addWidget(self.spin_fontsize, 3, 1) glayout2 = QtWidgets.QGridLayout() self.check_outline = QtWidgets.QCheckBox('Outline') self.check_outline.setChecked(True) glayout2.addWidget(self.check_outline, 0, 0) self.check_nowater = QtWidgets.QCheckBox('Remove Waters') self.check_nowater.setChecked(True) glayout2.addWidget(self.check_nowater, 0, 1) self.check_colorall = QtWidgets.QCheckBox('Color All') self.check_colorall.setChecked(False) glayout2.addWidget(self.check_colorall, 1, 0) self.check_tile = QtWidgets.QCheckBox('Repeating Tile') self.check_tile.clicked.connect(self.checkTileOn) self.check_tile.setChecked(False) glayout2.addWidget(self.check_tile, 1, 1) self.check_oneletter = QtWidgets.QCheckBox('One Letter') glayout2.addWidget(self.check_oneletter, 2, 0) self.check_nochainname = QtWidgets.QCheckBox('No Chain Name') glayout2.addWidget(self.check_nochainname, 2, 1) self.check_ignore_occupancy = QtWidgets.QCheckBox('Ignore Occupancy') glayout2.addWidget(self.check_ignore_occupancy, 3, 0) self.check_cartoon = QtWidgets.QCheckBox('Cartoon') self.check_cartoon.clicked.connect(self.checkCartoonOn) glayout2.addWidget(self.check_cartoon, 3, 1) self.check_mmcif = QtWidgets.QCheckBox('Use MMCIF') glayout2.addWidget(self.check_mmcif, 4, 0) self.check_builtin = QtWidgets.QCheckBox('Built-in Surface Generator') glayout2.addWidget(self.check_builtin, 4, 1) self.check_builtin.clicked.connect(self.checkBuiltinOn) #MMCIF は AUTH が不完全だ! #self.check_label = QtWidgets.QCheckBox('ID Label'); #self.layout.addWidget(self.check_label); # Text field for output file glayout4 = QtWidgets.QVBoxLayout() self.label_outprefix = QtWidgets.QLabel( 'Output Prefix (Prefix+<something> will be overwritten.)') glayout4.addWidget(self.label_outprefix) glayout4b = QtWidgets.QGridLayout() self.text_outprefix = QtWidgets.QLineEdit(self) self.text_outprefix.setReadOnly(True) glayout4b.addWidget(self.text_outprefix, 0, 0) self.button_outprefix = QtWidgets.QPushButton(self) self.button_outprefix.setText("Save As") self.button_outprefix.clicked.connect(self.getFile) self.text_outprefix.setStyleSheet("background-color: lightgray;") glayout4b.addWidget(self.button_outprefix, 0, 1) glayout4.addLayout(glayout4b) glayout3 = QtWidgets.QGridLayout() self.button_ok = QtWidgets.QPushButton('Create') self.button_ok.clicked.connect(self.runSurfStamp) glayout3.addWidget(self.button_ok, 0, 0) self.button_close = QtWidgets.QPushButton('Close') self.button_close.clicked.connect(self.hide) glayout3.addWidget(self.button_close, 0, 1) self.layout.addLayout(glayout1) self.layout.addLayout(glayout2) self.layout.addLayout(glayout4) self.layout.addLayout(glayout3) screengeom = QtWidgets.qApp.desktop().screenGeometry() wwidth = 300 hheight = 200 self.setGeometry(screengeom.width() / 2 - wwidth / 2, screengeom.height() / 2 - hheight / 2, wwidth, hheight) self.setWindowTitle('SurfStamp') self.checkTileOn() self.checkBuiltinOn() self.checkCartoonOn() self.show()
def __init__(self): # noqa QtWidgets.QMainWindow.__init__(self) self.setDockOptions(QtWidgets.QMainWindow.AllowTabbedDocks | QtWidgets.QMainWindow.AllowNestedDocks) # resize Window before it is shown options = pymol.invocation.options self.resize(options.win_x + (220 if options.internal_gui else 0), options.win_y + (246 if options.external_gui else 18)) # for thread-safe viewport command self.viewportsignal.connect(self.pymolviewport) # reusable dialogs self.dialog_png = None self.advanced_settings_dialog = None self.props_dialog = None self.builder = None # setting index -> callable self.setting_callbacks = defaultdict(list) # "session_file" setting in window title self.setting_callbacks[440].append(lambda v: self.setWindowTitle( "PyMOL (" + os.path.basename(v) + ")")) # "External" Command Line and Loggin Widget self._setup_history() self.lineedit = CommandLineEdit() self.lineedit.setObjectName("command_line") self.browser = QtWidgets.QPlainTextEdit() self.browser.setObjectName("feedback_browser") self.browser.setReadOnly(True) # convenience: clicking into feedback browser gives focus to command # line. Drawback: Copying with CTRL+C doesn't work in feedback # browser -> clear focus proxy while text selected self.browser.setFocusProxy(self.lineedit) @self.browser.copyAvailable.connect def _(yes): self.browser.setFocusProxy(None if yes else self.lineedit) self.browser.setFocus() # Font self.browser.setFont(getMonospaceFont()) connectFontContextMenu(self.browser) lineeditlayout = QtWidgets.QHBoxLayout() command_label = QtWidgets.QLabel("PyMOL>") command_label.setObjectName("command_label") lineeditlayout.addWidget(command_label) lineeditlayout.addWidget(self.lineedit) self.lineedit.setToolTip('''Command Input Area Get the list of commands by hitting <TAB> Get the list of arguments for one command with a question mark: PyMOL> color ? Read the online help for a command with "help": PyMOL> help color Get autocompletion for many arguments by hitting <TAB> PyMOL> color ye<TAB> (will autocomplete "yellow") ''') layout = QtWidgets.QVBoxLayout() layout.addWidget(self.browser) layout.addLayout(lineeditlayout) quickbuttonslayout = QtWidgets.QVBoxLayout() quickbuttonslayout.setSpacing(2) extguilayout = QtWidgets.QBoxLayout(QtWidgets.QBoxLayout.LeftToRight) extguilayout.setContentsMargins(2, 2, 2, 2) extguilayout.addLayout(layout) extguilayout.addLayout(quickbuttonslayout) class ExtGuiFrame(QtWidgets.QFrame): def mouseDoubleClickEvent(_, event): self.toggle_ext_window_dockable(True) _size_hint = QtCore.QSize(options.win_x, options.ext_y) def sizeHint(self): return self._size_hint dockWidgetContents = ExtGuiFrame(self) dockWidgetContents.setLayout(extguilayout) dockWidgetContents.setObjectName("extgui") self.ext_window = \ dockWidget = QtWidgets.QDockWidget(self) dockWidget.setWindowTitle("External GUI") dockWidget.setWidget(dockWidgetContents) if options.external_gui: dockWidget.setTitleBarWidget(QtWidgets.QWidget()) else: dockWidget.hide() self.addDockWidget(Qt.TopDockWidgetArea, dockWidget) # rearrange vertically if docking left or right @dockWidget.dockLocationChanged.connect def _(area): if area == Qt.LeftDockWidgetArea or area == Qt.RightDockWidgetArea: extguilayout.setDirection(QtWidgets.QBoxLayout.BottomToTop) quickbuttonslayout.takeAt(quickbuttons_stretch_index) else: extguilayout.setDirection(QtWidgets.QBoxLayout.LeftToRight) if quickbuttons_stretch_index >= quickbuttonslayout.count(): quickbuttonslayout.addStretch() # OpenGL Widget self.pymolwidget = PyMOLGLWidget(self) self.setCentralWidget(self.pymolwidget) cmd = self.cmd = self.pymolwidget.cmd ''' # command completion completer = QtWidgets.QCompleter(cmd.kwhash.keywords, self) self.lineedit.setCompleter(completer) ''' # overload <Tab> action self.lineedit.installEventFilter(self) self.pymolwidget.installEventFilter(self) # Quick Buttons for row in [ [ ('Reset', cmd.reset), ('Zoom', lambda: cmd.zoom(animate=1.0)), ('Orient', lambda: cmd.orient(animate=1.0)), # render dialog will be constructed when the menu is shown # for the first time. This way it's populated with the current # viewport and settings. Also defers parsing of the ui file. ('Draw/Ray', WidgetMenu(self).setSetupUi(self.render_dialog)), ], [ ('Unpick', cmd.unpick), ('Deselect', cmd.deselect), ('Rock', cmd.rock), ('Get View', self.get_view), ], [ ('|<', cmd.rewind), ('<', cmd.backward), ('Stop', cmd.mstop), ('Play', cmd.mplay), ('>', cmd.forward), ('>|', cmd.ending), ('MClear', cmd.mclear), ], [ ('Builder', self.open_builder_panel), ('Properties', self.open_props_dialog), ('Rebuild', cmd.rebuild), ], ]: hbox = QtWidgets.QHBoxLayout() hbox.setSpacing(2) for name, callback in row: btn = QtWidgets.QPushButton(name) btn.setProperty("quickbutton", True) btn.setAttribute(Qt.WA_LayoutUsesWidgetRect) # OS X workaround hbox.addWidget(btn) if callback is None: btn.setEnabled(False) elif isinstance(callback, QtWidgets.QMenu): btn.setMenu(callback) else: btn.released.connect(callback) quickbuttonslayout.addLayout(hbox) # progress bar hbox = QtWidgets.QHBoxLayout() self.progressbar = QtWidgets.QProgressBar() self.progressbar.setSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) hbox.addWidget(self.progressbar) self.abortbutton = QtWidgets.QPushButton('Abort') self.abortbutton.setStyleSheet("background: #FF0000; color: #FFFFFF") self.abortbutton.released.connect(cmd.interrupt) hbox.addWidget(self.abortbutton) quickbuttonslayout.addLayout(hbox) quickbuttonslayout.addStretch() quickbuttons_stretch_index = quickbuttonslayout.count() - 1 # menu top level self.menubar = menubar = self.menuBar() # action groups actiongroups = {} def _addmenu(data, menu): '''Fill a menu from "data"''' menu.setTearOffEnabled(True) menu.setWindowTitle(menu.title()) # needed for Windows for item in data: if item[0] == 'separator': menu.addSeparator() elif item[0] == 'menu': _addmenu(item[2], menu.addMenu(item[1].replace('&', '&&'))) elif item[0] == 'command': command = item[2] if command is None: print('warning: skipping', item) else: if isinstance(command, str): command = lambda c=command: cmd.do(c) menu.addAction(item[1], command) elif item[0] == 'check': if len(item) > 4: menu.addAction( SettingAction(self, cmd, item[2], item[1], item[3], item[4])) else: menu.addAction( SettingAction(self, cmd, item[2], item[1])) elif item[0] == 'radio': label, name, value = item[1:4] try: group, type_, values = actiongroups[item[2]] except KeyError: group = QtWidgets.QActionGroup(self) type_, values = cmd.get_setting_tuple(name) actiongroups[item[2]] = group, type_, values action = QtWidgets.QAction(label, self) action.triggered.connect(lambda _=0, args=(name, value): cmd.set(*args, log=1, quiet=0)) self.setting_callbacks[cmd.setting._get_index( name)].append( lambda v, V=value, a=action: a.setChecked(v == V)) group.addAction(action) menu.addAction(action) action.setCheckable(True) if values[0] == value: action.setChecked(True) elif item[0] == 'open_recent_menu': self.open_recent_menu = menu.addMenu('Open Recent...') else: print('error:', item) # recent files menu self.open_recent_menu = None # for plugins self.menudict = {'': menubar} # menu for _, label, data in self.get_menudata(cmd): assert _ == 'menu' menu = menubar.addMenu(label) self.menudict[label] = menu _addmenu(data, menu) # hack for macOS to hide "Edit > Start Dictation" # https://bugreports.qt.io/browse/QTBUG-43217 if pymol.IS_MACOS: self.menudict['Edit'].setTitle('Edit_') QtCore.QTimer.singleShot( 10, lambda: self.menudict['Edit'].setTitle('Edit')) # recent files menu if self.open_recent_menu: @self.open_recent_menu.aboutToShow.connect def _(): self.open_recent_menu.clear() for fname in self.recent_filenames: self.open_recent_menu.addAction( fname if len(fname) < 128 else '...' + fname[-120:], lambda fname=fname: self.load_dialog(fname)) # some experimental window control menu = self.menudict['Display'].addSeparator() menu = self.menudict['Display'].addMenu('External GUI') menu.addAction('Toggle floating', self.toggle_ext_window_dockable, QtGui.QKeySequence('Ctrl+E')) ext_vis_action = self.ext_window.toggleViewAction() ext_vis_action.setText('Visible') menu.addAction(ext_vis_action) # extra key mappings (MacPyMOL compatible) QtWidgets.QShortcut(QtGui.QKeySequence('Ctrl+O'), self).activated.connect(self.file_open) QtWidgets.QShortcut(QtGui.QKeySequence('Ctrl+S'), self).activated.connect(self.session_save) # feedback self.feedback_timer = QtCore.QTimer() self.feedback_timer.setSingleShot(True) self.feedback_timer.timeout.connect(self.update_feedback) self.feedback_timer.start(100) # legacy plugin system self.menudict['Plugin'].addAction('Initialize Plugin System', self.initializePlugins) # focus in command line if options.external_gui: self.lineedit.setFocus() else: self.pymolwidget.setFocus() # Apply PyMOL stylesheet try: with open( cmd.exp_path('$PYMOL_DATA/pmg_qt/styles/pymol.sty')) as f: style = f.read() except IOError: print('Could not read PyMOL stylesheet.') print('DEBUG: PYMOL_DATA=' + repr(os.getenv('PYMOL_DATA'))) style = "" if style: self.setStyleSheet(style)
def __init__(self): QtWidgets.QWidget.__init__(self, parent, Qt.Window) self.setMinimumSize(400, 500) self.setWindowTitle('Register File Extensions') self.model = QtGui.QStandardItemModel(self) layout = QtWidgets.QVBoxLayout(self) self.setLayout(layout) label = QtWidgets.QLabel( "Select file types to register them with PyMOL", self) layout.addWidget(label) alluserslayout = QtWidgets.QHBoxLayout() alluserslayout.setObjectName("alluserslayout") layout.addLayout(alluserslayout) buttonlayout = QtWidgets.QHBoxLayout() buttonlayout.setObjectName("buttonlayout") layout.addLayout(buttonlayout) self.table = QtWidgets.QTableView(self) self.table.setModel(self.model) layout.addWidget(self.table) button = QtWidgets.QPushButton("Register Recommended (*)", self) buttonlayout.addWidget(button) button.pressed.connect(self.setRecommended) button = QtWidgets.QPushButton("Register All", self) buttonlayout.addWidget(button) button.pressed.connect(self.setAll) button = QtWidgets.QPushButton("Clear", self) button.setToolTip("Clean up Registry") buttonlayout.addWidget(button) button.pressed.connect(self.clear) if isAdmin(): r0 = QtWidgets.QRadioButton("Only for me") r0.setToolTip("HKEY_CURRENT_USER registry branch") r0.setChecked(True) r1 = QtWidgets.QRadioButton("For all users") r1.setToolTip("HKEY_LOCAL_MACHINE registry branch") allusersgroup = QtWidgets.QButtonGroup(self) allusersgroup.addButton(r0) allusersgroup.addButton(r1) allusersgroup.buttonClicked.connect(self.populateData) alluserslayout.addWidget(r0) alluserslayout.addWidget(r1) alluserslayout.addStretch() self.allusersbutton = r1 else: self.allusersbutton = None self.finalize_timer = QtCore.QTimer() self.finalize_timer.setSingleShot(True) self.finalize_timer.setInterval(500) self.finalize_timer.timeout.connect(finalize) self.populateData() # keep reference to window, otherwise Qt will auto-close it self._self_ref = self
def create_dialog(): dialog = QtWidgets.QDialog() dialog.setWindowTitle('Lighting Settings') sliders = [ "Diffuse Reflection", ('ambient', 0, 1, None), ('reflect', -1, 1, None), "Direct Light from Front", ('direct (+reflect)', -1, 1, None), # diffuse, coupled with "reflect" ('spec_direct', 0, 1, None), ('spec_direct_power', 0, 100, 1), "Free placeable directed Lights", ('light_count', 1, 8, 1), ('edit_light', 1, 7, 1), "Specular Reflection", ('spec_count', -1, 8, 1), # ('spec_power', -1, 200, 1), # deprecated since v1.5 ('shininess', 0, 100, None), # same as spec_power ('spec_reflect', -0.01, 1, None), ('specular', 0, 1, None), ('specular_intensity (=specular)', 0, 1, None), # same as specular "Ambient Occlusion (Surface only)", ('ambient_occlusion_mode', 0, 2, 1), ('ambient_occlusion_scale', 1.0, 50., None), ('ambient_occlusion_smooth', 1, 20, 1), "Ray trace only", ('power', 1, 10, None), ('reflect_power', 1, 10, None), ] layout = QtWidgets.QVBoxLayout(dialog) button_layout = QtWidgets.QHBoxLayout() layout.addLayout(button_layout) layout.setContentsMargins(5, 0, 5, 0) button_layout.addWidget( QtWidgets.QLabel("<font color=red>Presets:</font>")) presets = [ ("Default", preset_default), ("Metal", preset_metal), ("Plastic", preset_plastic), ("Rubber", preset_rubber), ("X-Ray", preset_xray), ] for name, fun in presets: btn = QtWidgets.QPushButton(name, dialog) btn.pressed.connect(fun) btn.setAutoDefault(False) button_layout.addWidget(btn) form_layout = QtWidgets.QFormLayout() form_layout.setContentsMargins(0, 0, 0, 0) form_layout.setVerticalSpacing(0) form_layout.setLabelAlignment(Qt.AlignLeft) layout.addLayout(form_layout) for i, item in enumerate(sliders, 1): if isinstance(item, str): label = QtWidgets.QLabel("<font color=blue>" + item + "</font>") form_layout.addRow(label) continue name, min, max, res = item if res is None: res = 0.01 if (max - min < 100) else 0.1 line_edit = QtWidgets.QLineEdit(dialog) slider = SettingSlider(dialog, name.split()[0], min, max, res, line_edit) h_layout = QtWidgets.QHBoxLayout() h_layout.addWidget(slider, 3) h_layout.addWidget(line_edit, 1) form_layout.addRow(name, h_layout) return dialog
def __init__(self, parent, protocol): super(Similarity_searches_results_window_qt, self).__init__(parent) self.protocol = protocol ######################### # Configure the window. # ######################### self.setWindowTitle(self._get_window_title()) # Sets the central widget. self.central_widget = QtWidgets.QWidget() self.setCentralWidget(self.central_widget) # The window has a main vbox layout. self.main_vbox = QtWidgets.QVBoxLayout() ################ # Upper frame. # ################ title_text = self._get_upper_frame_title() self.upper_frame_title = QtWidgets.QLabel(title_text) self.main_vbox.addWidget(self.upper_frame_title) ################# # Middle frame. # ################# # Scroll area which contains the widgets, set as the centralWidget. self.middle_scroll = QtWidgets.QScrollArea() self.main_vbox.addWidget(self.middle_scroll) # Widget that contains the collection of Vertical Box. self.middle_widget = QtWidgets.QWidget() # Scroll area properties. self.middle_scroll.setWidgetResizable(True) self.middle_scroll.setWidget(self.middle_widget) # QFormLayout in the middle frame. self.middle_formlayout = QtWidgets.QFormLayout() self.middle_widget.setLayout(self.middle_formlayout) #----------------- # Buttons frame. - #----------------- # Set the frame and its layout. self.buttons_frame = QtWidgets.QFrame() self.middle_formlayout.addRow(self.buttons_frame) self.buttons_hbox = QtWidgets.QHBoxLayout() self.buttons_frame.setLayout(self.buttons_hbox) # Build the control buttons. self.blast_select_all_button = QtWidgets.QPushButton(text="Select All") self.blast_select_all_button.clicked.connect(self.blast_select_all) self.blast_select_none_button = QtWidgets.QPushButton(text="Select None") self.blast_select_none_button.clicked.connect(self.blast_select_none) self.blast_select_n_button = QtWidgets.QPushButton(text="Select Top:") self.blast_select_n_button.clicked.connect(self.blast_select_n) for button in [self.blast_select_all_button, self.blast_select_none_button, self.blast_select_n_button]: self.buttons_hbox.addWidget(button) # Build the line-edit for selecting only top entries. self.blast_select_n_enf = PyMod_entryfield_qt(label_text="", value="10", validate={'validator': 'integer', 'min': 1, 'max': 5000}) self.blast_select_n_enf.entry.setFixedWidth(70) self.buttons_hbox.addWidget(self.blast_select_n_enf.entry) # Align to the left all these widgets. self.buttons_hbox.setAlignment(QtCore.Qt.AlignLeft) for button in [self.blast_select_all_button, self.blast_select_none_button, self.blast_select_n_button]: button.setFixedWidth(button.sizeHint().width()+30) #----------------- # Results frame. - #----------------- # Set the frame and its layout. self.results_frame = QtWidgets.QFrame() self.middle_formlayout.addRow(self.results_frame) self.results_grid = QtWidgets.QGridLayout() self.results_frame.setLayout(self.results_grid) # Calls a method which actually displays the similarity searches results. self.display_blast_hits() # Align the gridded widgets to the left. self.results_grid.setAlignment(QtCore.Qt.AlignLeft) self.results_grid.setHorizontalSpacing(30) ################# # Bottom frame. # ################# self.main_button = QtWidgets.QPushButton("Submit") self.main_button.clicked.connect(lambda a=None: self.protocol.blast_results_state()) self.main_vbox.addWidget(self.main_button) self.main_button.setFixedWidth(self.main_button.sizeHint().width()) # Sets the main vertical layout. self.central_widget.setLayout(self.main_vbox) self.main_vbox.setAlignment(self.main_button, QtCore.Qt.AlignCenter)
def initUI(self): #---------------------------- # Left frame (for headers). - #---------------------------- self.sequence_ID_groupbox = QtWidgets.QGroupBox('SEQUENCE ID') # self.sequence_ID_groupbox.setStyleSheet("QLabel {font: 14pt COURIER NEW font-weight: bold} ") id_frame_stylesheet = "QLabel {font: %spt %s; font-weight: %s; color: white}" % ( self.main_window.font_size, self.main_window.font, self.main_window.font_weight) self.sequence_ID_groupbox.setStyleSheet(id_frame_stylesheet) self.id_form_layout = QtWidgets.QFormLayout() #self.left_scroll self.left_scroll = QtWidgets.QScrollArea() self.left_scroll.setHorizontalScrollBarPolicy( QtCore.Qt.ScrollBarAlwaysOn) self.left_scroll.setVerticalScrollBarPolicy( QtCore.Qt.ScrollBarAsNeeded) self.left_scroll.resize(200, 400) self.left_scroll.setWidget( self.sequence_ID_groupbox ) # sequence_ID_groupbox dentro left_scroll area self.left_scroll.setWidgetResizable(True) #self.left_frame self.left_frame = QtWidgets.QFrame(self) self.left_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.left_frame.resize(200, 400) self.left_frame.setStyleSheet(self.style) self.left_frame.setFrameShadow(QtWidgets.QFrame.Sunken) #self.left_frame_layout self.left_frame_layout = QtWidgets.QVBoxLayout(self) self.left_frame_layout.addWidget(self.left_scroll) self.left_frame.setLayout( self.left_frame_layout) # left_frame_layout dentro left_frame #------------------------------- # Right frame (for sequences). - #------------------------------- # This groupbox self.sequence_SEQ_groupbox = QtWidgets.QGroupBox('SEQUENCES') seq_frame_stylesheet = "QLabel {font: %spt %s; font-weight: %s; color: white}" % ( self.main_window.font_size, self.main_window.font, self.main_window.font_weight) self.sequence_SEQ_groupbox.setStyleSheet(seq_frame_stylesheet) self.seq_form_layout = QtWidgets.QFormLayout() #self.right_scroll self.right_scroll = QtWidgets.QScrollArea() self.right_scroll.setHorizontalScrollBarPolicy( QtCore.Qt.ScrollBarAlwaysOn) self.right_scroll.setVerticalScrollBarPolicy( QtCore.Qt.ScrollBarAsNeeded) self.right_scroll.resize(900, 400) self.right_scroll.setWidget( self.sequence_SEQ_groupbox ) # sequence_ID_groupbox dentro left_scroll area self.right_scroll.setWidgetResizable(True) #self.right_frame self.right_frame = QtWidgets.QFrame(self) self.right_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.right_frame.resize(900, 400) self.right_frame.setStyleSheet(self.style) self.right_frame.setFrameShadow(QtWidgets.QFrame.Sunken) #self.right_frame_layout self.right_frame_layout = QtWidgets.QVBoxLayout(self) self.right_frame_layout.addWidget(self.right_scroll) self.right_frame.setLayout( self.right_frame_layout) # left_frame_layout dentro left_frame #connect the two Vertical Bars to move them togheter self.left_scroll.verticalScrollBar().valueChanged.connect( self.right_scroll.verticalScrollBar().setValue) self.right_scroll.verticalScrollBar().valueChanged.connect( self.left_scroll.verticalScrollBar().setValue) #---------------------------------- # Bottom part of the main window. - #---------------------------------- self.splitter1 = QtWidgets.QSplitter(QtCore.Qt.Horizontal) self.splitter1.addWidget(self.left_frame) self.splitter1.addWidget(self.right_frame) # creating sequence and position labels self.label_sequence = QtWidgets.QLabel(self) self.label_sequence.setText('Sequence:') self.label_sequence.setStyleSheet(small_font_style) self.textbox_sequence = QtWidgets.QLineEdit(self) self.textbox_sequence.setStyleSheet(self.style + "; " + small_font_style) self.textbox_sequence.setReadOnly(True) self.label_position = QtWidgets.QLabel(self) self.label_position.setText('Position:') self.label_position.setStyleSheet(small_font_style) self.textbox_position = QtWidgets.QLineEdit(self) self.textbox_position.setReadOnly(True) self.textbox_position.setStyleSheet(self.style + "; " + small_font_style) self.textbox_position.setMinimumWidth( 675) # Width of the residues message bar width. # creating an horizontal layout with sequence and position labels self.text_layout = QtWidgets.QHBoxLayout() self.text_layout.addWidget(self.label_sequence) self.text_layout.addWidget(self.textbox_sequence) self.text_layout.addWidget(self.label_position) self.text_layout.addWidget(self.textbox_position) # creating a layout with sequence window and labels self.grid = QtWidgets.QVBoxLayout() self.grid.addWidget(self.splitter1) self.grid.addLayout(self.text_layout) self.setLayout(self.grid)
def new_manager_widget(manager, title): dockWidget = QtWidgets.QDockWidget() dockWidget.setWindowTitle(title) widget = QtWidgets.QWidget() layout = QtWidgets.QVBoxLayout(widget) dockWidget.setWidget(widget) widget.setLayout(layout) model = QtGui.QStandardItemModel(0, 1, widget) tree = QtWidgets.QTreeView(widget) tree.setModel(model) tree.setHeaderHidden(True) current_key = None def update_treeview(): model.clear() for key in manager.get_keys(): item = QtGui.QStandardItem() item.setText(key) model.blockSignals(True) model.appendRow(item) model.blockSignals(False) @model.rowsInserted.connect def onRowsInserted(index): key = model.itemFromIndex(index).text() store_view(key) update_treeview() @model.dataChanged.connect def onDataChanged(index): new_key = model.itemFromIndex(index).text() if new_key == "": manager.clear(current_key) else: manager.rename(current_key, new_key) update_treeview() @dockWidget.visibilityChanged.connect def onVisibilityChanged(visible): if not visible: return update_treeview() @tree.clicked.connect def onClicked(index): nonlocal current_key key = model.itemFromIndex(index).text() current_key = key manager.recall(key) storeBtn = QtWidgets.QPushButton("Store", widget) @storeBtn.clicked.connect def onClicked(): count = len(manager.get_keys()) manager.store(f"view{count}") update_treeview() layout.addWidget(tree) layout.addWidget(storeBtn) return dockWidget
def build_protocol_middle_frame(self): #------------------ # Simple options. - #------------------ # Let users decide how to import new sequences when the query is a child element (that # is, it is already present in a cluster). if self.protocol.blast_query_element.is_child(): self.import_mode_vbox = QtWidgets.QVBoxLayout() self.import_mode_label = QtWidgets.QLabel("Hit Import Mode") self.import_mode_vbox.addWidget(self.import_mode_label) self.import_mode_button_group = QtWidgets.QButtonGroup() self.middle_formlayout.addRow(self.import_mode_vbox) # Build new alignment. new_alignment_radiobutton = QtWidgets.QRadioButton("Build a new alignment with the query and the new hit sequences") new_alignment_radiobutton._value = "build-new" new_alignment_radiobutton.setChecked(True) self.import_mode_vbox.addWidget(new_alignment_radiobutton) self.import_mode_button_group.addButton(new_alignment_radiobutton) # Expand alignment. expand_alignment_radiobutton = QtWidgets.QRadioButton("Expand the existing alignment by appending the new hit sequences") # "Expand the already existing cluster by appending to it the new hit sequences" expand_alignment_radiobutton._value = "expand" self.import_mode_vbox.addWidget(expand_alignment_radiobutton) self.import_mode_button_group.addButton(expand_alignment_radiobutton) # Each algorithm will have its own standard widgets. self.build_algorithm_standard_options_widgets() # E-value selection. if self.protocol.protocol_name in hmmer_protocols_names: e_value_threshold_enf_text = "c-Evalue Threshold" else: e_value_threshold_enf_text = "E-value Threshold" self.e_value_threshold_enf = PyMod_entryfield_qt(label_text=e_value_threshold_enf_text, value=str(self.protocol.e_value_threshold_default), validate={'validator': 'real', 'min': 0.0, 'max': 1000.0}) self.middle_formlayout.add_widget_to_align(self.e_value_threshold_enf, validate=True) # Max hit number selection. self.max_hits_enf = PyMod_entryfield_qt(label_text="Max Number of Hits", value=str(self.protocol.default_max_number_of_hits), validate={'validator': 'integer', 'min': 1, 'max': 5000}) self.middle_formlayout.add_widget_to_align(self.max_hits_enf, validate=True) # ------------------- # Advanced options. - # ------------------- self.show_advanced_button() # Minimum id% on with query. self.min_id_enf = PyMod_entryfield_qt(label_text="Min Id% Threshold", value="0", validate={'validator': 'integer', 'min': 0, 'max': 100}) self.middle_formlayout.add_widget_to_align(self.min_id_enf, advanced_option=True, validate=True) # Maximum id% on with query. self.max_id_enf = PyMod_entryfield_qt(label_text="Max Id% Threshold", value="100", validate={'validator': 'integer', 'min': 0, 'max': 100}) self.middle_formlayout.add_widget_to_align(self.max_id_enf, advanced_option=True, validate=True) # Minimum coverage on the query. self.min_coverage_enf = PyMod_entryfield_qt(label_text="Min Coverage% Threshold", value="0", validate={'validator': 'integer', 'min': 0, 'max': 100}) self.middle_formlayout.add_widget_to_align(self.min_coverage_enf, advanced_option=True, validate=True) # Advanced options for a specific algorithm. self.build_algorithm_advanced_options_widgets() self.middle_formlayout.set_input_widgets_width("auto")
def __init__( self, parent, title="New PyMod Window", upper_frame_title="New PyMod Window Sub-title", submit_command=None, submit_button_text="Submit", with_scroll=True, # geometry=None ): super(PyMod_tool_window_qt, self).__init__(parent) #------------------------ # Configure the window. - #------------------------ # Command executed when pressing on the main button of the window. self.submit_command = submit_command # Configure the window. self.setWindowTitle(title) # if geometry is not None: # self.setGeometry(*geometry) # Sets the central widget. self.central_widget = QtWidgets.QWidget() self.setCentralWidget(self.central_widget) # The window has a main vbox layout. self.main_vbox = QtWidgets.QVBoxLayout() #--------------- # Upper frame. - #--------------- self.upper_frame_title = QtWidgets.QLabel(upper_frame_title) self.main_vbox.addWidget(self.upper_frame_title) #---------------- # Middle frame. - #---------------- # Widget that contains the collection of Vertical Box. self.middle_widget = QtWidgets.QWidget() # The Vertical Box that contains other widgets to be displayed in the window. self.middle_vbox = QtWidgets.QVBoxLayout() self.middle_widget.setLayout(self.middle_vbox) # Scroll area which contains the widgets, set as the centralWidget. self.middle_scroll = QtWidgets.QScrollArea() # Scroll area properties. # self.middle_scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) # self.middle_scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.middle_scroll.setWidgetResizable(True) self.middle_scroll.setWidget(self.middle_widget) # QFormLayout in the middle frame. if self.middle_layout_type == "qform": self.middle_formlayout = PyMod_QFormLayout() self.middle_vbox.addLayout(self.middle_formlayout) elif self.middle_layout_type == "qgrid": self.middle_formlayout = QtWidgets.QGridLayout() self.middle_vbox.addLayout(self.middle_formlayout) else: raise KeyError("Unknown 'middle_layout_type': %s" % middle_layout_type) self.add_middle_frame_widgets() self.main_vbox.addWidget(self.middle_scroll) #---------------- # Bottom frame. - #---------------- self.submit_command = submit_command if self.submit_command is not None: self.main_button = QtWidgets.QPushButton(submit_button_text) self.main_button.clicked.connect( lambda a=None: self.submit_command()) self.main_vbox.addWidget(self.main_button) self.main_button.setFixedWidth(self.main_button.sizeHint().width()) # Sets the main vertical layout. self.central_widget.setLayout(self.main_vbox) self.main_vbox.setAlignment(self.main_button, QtCore.Qt.AlignCenter)
def setupUi(self, UpdateDialog): UpdateDialog.setObjectName("UpdateDialog") UpdateDialog.resize(950, 470) self.verticalLayout = QtWidgets.QVBoxLayout(UpdateDialog) self.verticalLayout.setObjectName("verticalLayout") self.select_comp_label = QtWidgets.QLabel(UpdateDialog) self.select_comp_label.setObjectName("select_comp_label") self.verticalLayout.addWidget(self.select_comp_label) self.components_tableWidget = QtWidgets.QTableWidget(UpdateDialog) default_font = QtGui.QFont() default_font.setPointSize(default_font.pointSize()-1) self.components_tableWidget.setFont(default_font) self.components_tableWidget.setProperty("showDropIndicator", False) self.components_tableWidget.setDragDropOverwriteMode(False) self.components_tableWidget.setAlternatingRowColors(True) self.components_tableWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) self.components_tableWidget.setGridStyle(QtCore.Qt.NoPen) self.components_tableWidget.setColumnCount(self.n_cols) self.components_tableWidget.setObjectName("components_tableWidget") self.components_tableWidget.setRowCount(1) vertical_header_item = QtWidgets.QTableWidgetItem() self.components_tableWidget.setVerticalHeaderItem(0, vertical_header_item) for i in range(self.n_cols): item = QtWidgets.QTableWidgetItem() self.components_tableWidget.setHorizontalHeaderItem(i, item) item = QtWidgets.QTableWidgetItem() self.components_tableWidget.setItem(0, self.component_col_idx, item) item = QtWidgets.QTableWidgetItem() self.components_tableWidget.setItem(0, self.databases_col_idx, item) self.components_tableWidget.horizontalHeader().setVisible(True) self.components_tableWidget.horizontalHeader().setCascadingSectionResizes(False) self.components_tableWidget.setColumnWidth(self.component_col_idx, 210) self.components_tableWidget.setColumnWidth(self.databases_col_idx, 180) self.components_tableWidget.setColumnWidth(self.status_col_idx, 190) # self.components_tableWidget.setColumnWidth(self.source_col_idx, 390) # self.components_tableWidget.setColumnWidth(self.last_download_col_idx, 250) self.components_tableWidget.horizontalHeader().setStretchLastSection(True) self.components_tableWidget.verticalHeader().setVisible(False) self.components_tableWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) self.verticalLayout.addWidget(self.components_tableWidget) self.statusLabel = QtWidgets.QLabel(UpdateDialog) self.statusLabel.setObjectName("statusLabel") self.verticalLayout.addWidget(self.statusLabel) self.installation_progressBar = QtWidgets.QProgressBar(UpdateDialog) self.installation_progressBar.setEnabled(True) self.installation_progressBar.setProperty("value", 10) self.installation_progressBar.setObjectName("installation_progressBar") self.verticalLayout.addWidget(self.installation_progressBar) self.buttonsHorizontalLayout = QtWidgets.QHBoxLayout() self.buttonsHorizontalLayout.setObjectName("buttonsHorizontalLayout") self.installSel_button = QtWidgets.QPushButton(UpdateDialog) self.installSel_button.setObjectName("installSel_button") self.buttonsHorizontalLayout.addWidget(self.installSel_button) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.buttonsHorizontalLayout.addItem(spacerItem) self.cancel_button = QtWidgets.QPushButton(UpdateDialog) self.cancel_button.setObjectName("cancel_button") self.buttonsHorizontalLayout.addWidget(self.cancel_button) self.verticalLayout.addLayout(self.buttonsHorizontalLayout) UpdateDialog.setWindowTitle("Install and update databases") self.select_comp_label.setText("Select components to install or update") self.components_tableWidget.setSortingEnabled(True) self.components_tableWidget.horizontalHeaderItem(self.component_col_idx).setText("Component") self.components_tableWidget.horizontalHeaderItem(self.databases_col_idx).setText("Databases Names") self.components_tableWidget.horizontalHeaderItem(self.status_col_idx).setText("Status") self.components_tableWidget.horizontalHeaderItem(self.source_col_idx).setText("Source") self.components_tableWidget.horizontalHeaderItem(self.last_download_col_idx).setText("Last Downloaded") __sortingEnabled = self.components_tableWidget.isSortingEnabled() self.components_tableWidget.setSortingEnabled(False) self.components_tableWidget.setSortingEnabled(__sortingEnabled) self.statusLabel.setText("") self.cancel_button.setText("Cancel") self.installSel_button.setText("Install Selected") QtCore.QMetaObject.connectSlotsByName(UpdateDialog)
def build_panel_elements(self, parent): ''' Responsible for creating all panel elements in order and adding them to the layout. ''' self.create_new_form = parent.load_form("create_shortcut", None) self.help_form = parent.load_form("help_shortcut", None) self.confirm_change = parent.load_form("change_confirm", None) self.model = QtGui.QStandardItemModel(self) self.proxy_model = QtCoreModels.QSortFilterProxyModel(self) self.proxy_model.setSourceModel(self.model) self.proxy_model.setFilterCaseSensitivity(Qt.CaseInsensitive) self.proxy_model.setFilterKeyColumn(-1) self.setWindowTitle('Keyboard Shortcut Menu') layout = QtWidgets.QVBoxLayout(self) self.setLayout(layout) # Create layout for filter bar and refresh button top_layout = QtWidgets.QGridLayout() layout.addLayout(top_layout) # Filter self.filter_le = QtWidgets.QLineEdit(self) top_layout.addWidget(self.filter_le) self.filter_le.setPlaceholderText("Filter") self.filter_le.textChanged.connect(self.proxy_model.setFilterRegExp) self.refresh_button = QtWidgets.QPushButton(self) self.refresh_button.resize(26, 26) top_layout.addWidget(self.refresh_button, 0, 1) # themed icons only available by default on X11 if self.refresh_button.icon().isNull(): self.refresh_button.setIcon(QtGui.QIcon( os.path.expandvars('$PYMOL_DATA/pmg_qt/icons/refresh.svg'))) self.refresh_button.setToolTip( "Refresh the table to reflect any external changes") self.refresh_button.clicked.connect(self.refresh_populate) # Table self.table = QtWidgets.QTableView(self) self.table.setModel(self.proxy_model) layout.addWidget(self.table) self.intial_populate() self.formatTable() # Add layout for buttons button_layout = QtWidgets.QGridLayout() layout.addLayout(button_layout) # Buttons self.create_new_button = QtWidgets.QPushButton(self) button_layout.addWidget(self.create_new_button, 0, 0) self.create_new_button.setText("Create New") self.create_new_button.setToolTip( "Add a key binding that does not currently appear on the table") self.create_new_button.clicked.connect( lambda: self.create_new_form._dialog.show()) self.delete_selected_button = QtWidgets.QPushButton(self) button_layout.addWidget(self.delete_selected_button, 0, 1) self.delete_selected_button.setText("Delete Selected") self.delete_selected_button.setToolTip( "Unbind selected key bindings and remove any that have been created") self.delete_selected_button.clicked.connect(self.delete_selected) self.delete_selected_button.setEnabled(False) self.reset_selected_button = QtWidgets.QPushButton(self) button_layout.addWidget(self.reset_selected_button, 0, 2) self.reset_selected_button.setText("Reset Selected") self.reset_selected_button.setToolTip( "Restore selected key bindings to their default values") self.reset_selected_button.clicked.connect(self.reset_selected) self.reset_selected_button.setEnabled(False) self.reset_all_button = QtWidgets.QPushButton(self) button_layout.addWidget(self.reset_all_button, 0, 3) self.reset_all_button.setText("Reset All") self.reset_all_button.setToolTip( "Restore all key bindings to their default values and remove any that have been created") self.reset_all_button.clicked.connect(self.reset_all_default) self.save_button = QtWidgets.QPushButton(self) button_layout.addWidget(self.save_button, 0, 4) self.save_button.setText("Save") self.save_button.setToolTip( "Save the current key bindings to be loaded automatically when opening PyMOL") self.save_button.clicked.connect(self.shortcut_manager.save_shortcuts) # Ensuring that confirmed key and binding remain in scope self.confirm_new_key = '' self.confirm_new_binding = '' # Connect create new and confirm menus self.create_new_shortcut_menu_connect() self.confirm_menu_connect() self.model.itemChanged.connect(self.itemChanged)
def __init__(self, parent=None, app=None): super(_BuilderPanel, self).__init__(parent) self.setWindowTitle("Builder") self.setObjectName("builder") self.cmd = app.pymol.cmd self.layout = QtWidgets.QVBoxLayout() self.setLayout(self.layout) self.buttons_layout = QtWidgets.QVBoxLayout() self.tabs = QtWidgets.QTabWidget(self) self.layout.setContentsMargins(5, 5, 5, 5); self.layout.setSpacing(5); self.layout.addWidget(self.tabs) self.layout.addLayout(self.buttons_layout) self.layout.addStretch() self.fragments_layout = QtWidgets.QGridLayout() self.fragments_layout.setContentsMargins(5, 5, 5, 5); self.fragments_layout.setSpacing(5); self.fragments_tab = QtWidgets.QWidget() self.fragments_tab.setLayout(self.fragments_layout) self.protein_layout = QtWidgets.QGridLayout() self.protein_layout.setContentsMargins(5, 5, 5, 5); self.protein_layout.setSpacing(5); self.protein_tab = QtWidgets.QWidget() self.protein_tab.setLayout(self.protein_layout) self.tabs.addTab(self.fragments_tab, "Chemical") self.tabs.addTab(self.protein_tab, "Protein") self.getIcons() buttons = [ [ ("H", "Hydrogen", lambda: self.replace("H", 1, 1, "Hydrogen")), ("C", "Carbon", lambda: self.replace("C", 4, 4, "Carbon")), ("N", "Nitrogen", lambda: self.replace("N", 4, 3, "Nitrogen")), ("O", "Oxygen", lambda: self.replace("O", 4, 2, "Oxygen")), ("P", "Phosphorus", lambda: self.replace("P",4,3, "Phosphorous")), ("S", "Sulfur", lambda: self.replace("S",2,2, "Sulfur")), ("F", "Fluorine", lambda: self.replace("F",1,1, "Fluorine")), ("Cl", "Chlorrine", lambda: self.replace("Cl",1,1, "Chlorine")), ("Br", "Bromine", lambda: self.replace("Br",1,1, "Bromine")), ("I", "Iodine", lambda: self.replace("I",1,1, "Iodine")), ("-CF3", "Trifluoromethane", lambda: self.replace("trifluoromethane",4,0, "trifluoro")), ("-OMe", "Methanol", lambda: self.replace("methanol",5,0, "methoxy")), ], [ ("CH4", "Methyl", lambda: self.grow("methane",1,0,"methyl")), ("C=C", "Ethylene", lambda: self.grow("ethylene",4,0,"vinyl")), ("C#C", "Acetylene", lambda: self.grow("acetylene",2,0,"alkynl")), ("C#N", "Cyanide", lambda: self.grow("cyanide",2,0,"cyano")), ("C=O", "Aldehyde", lambda: self.grow("formaldehyde",2,0,"carbonyl",)), ("C=OO", "Formic Acid", lambda: self.grow("formic",4,0,"carboxyl")), ("C=ON", "C->N amide", lambda: self.grow("formamide",5,0,"C->N amide")), ("NC=O", "N->C amide", lambda: self.grow("formamide",3,1,"N->C amide")), ("S=O2", "Sulfone", lambda: self.grow("sulfone",3,1,"sulfonyl")), ("P=O3", "Phosphite", lambda: self.grow("phosphite",4,0,"phosphoryl")), ("N=O2", "Nitro", lambda: self.grow("nitro",3,0,"nitro")), ], [ ("#cyc3", "Cyclopropane", lambda: self.grow("cyclopropane",4,0,"cyclopropyl")), ("#cyc4", "Cyclobutane", lambda: self.grow("cyclobutane",4,0,"cyclobutyl")), ("#cyc5", "Cyclopentane", lambda: self.grow("cyclopentane",5,0,"cyclopentyl")), ("#cyc6", "Cyclohexane", lambda: self.grow("cyclohexane",7,0,"cyclohexyl")), ("#cyc7", "Cycloheptane", lambda: self.grow("cycloheptane",8,0,"cycloheptyl")), ("#aro5", "Cyclopentadiene", lambda: self.grow("cyclopentadiene",5,0,"cyclopentadienyl")), ("#aro6", "Benzene", lambda: self.grow("benzene",6,0,"phenyl")), ("#aro65", "Indane", lambda: self.grow("indane",12,0,"indanyl")), ("#aro66", "Napthylene", lambda: self.grow("napthylene",13,0,"napthyl")), ("#aro67", "Benzocycloheptane", lambda: self.grow("benzocycloheptane",13,0, "benzocycloheptyl")), ] ] self.btn_icons = {} requestsize = QtCore.QSize(48, 48) for row, btn_row in enumerate(buttons): for col, bb in enumerate(btn_row): btn_label, btn_tooltip, btn_command = bb btn = makeFragmentButton() if btn_label.startswith('#'): icons = self.icons[btn_label[1:]] btn.setIcon(icons[0]) btn.setIconSize(icons[1].actualSize(requestsize)) self.btn_icons[btn] = icons else: btn.setText(btn_label) btn.setToolTip(btn_tooltip) btn.clicked.connect(btn_command) self.fragments_layout.addWidget(btn, row, col) buttons = [ [ 'Ace', 'Ala', 'Arg', 'Asn', 'Asp', 'Cys', 'Gln', 'Glu', 'Gly', 'His', 'Ile', 'Leu' ], [ 'Lys', 'Met', 'Phe', 'Pro', 'Ser', 'Thr', 'Trp', 'Tyr', 'Val', 'NMe', 'NHH' ] ] for row, btn_row in enumerate(buttons): for col, btn_label in enumerate(btn_row): btn = makeFragmentButton() btn.setText(btn_label) btn.setToolTip("Build %s residue" % btn_label) res = btn_label.lower() slot = lambda val=None, s=self,r=res: s.attach(r) btn.clicked.connect(slot) self.protein_layout.addWidget(btn, row, col) lab = QtWidgets.QLabel('Secondary Structure:') lab_cols = 3 self.ss_cbox = QtWidgets.QComboBox() self.ss_cbox.addItem("Alpha Helix") self.ss_cbox.addItem("Beta Sheet (Anti-Parallel)") self.ss_cbox.addItem("Beta Sheet (Parallel)") self.protein_layout.addWidget(lab, 2, 0, 1, lab_cols) self.protein_layout.addWidget(self.ss_cbox, 2, lab_cols, 1, 4) self.ss_cbox.currentIndexChanged[int].connect(self.ssIndexChanged) buttons = [ [ ( "@Atoms:", None, None), ( "Fix H", "Fix hydrogens on picked atoms", self.fixH), ( "Add H", "Add hydrogens to entire molecule", self.addH), ( "Invert", "Invert stereochemistry around pk1 (pk2 and pk3 will remain fixed)", self.invert), ( "Delete", "Remove atoms", self.removeAtom), ( "Clear", "Delete everything", self.clear), ( "@ Charge:", None, None), ( " +1 ", "Positive Charge", lambda: self.setCharge(1,"+1")), ( " 0 ", "Neutral Charge", lambda: self.setCharge(0,"neutral")), ( " -1 ", "Negative Charge", lambda: self.setCharge(-1,"-1")), ], [ ( "@Bonds:", None, None), ( "Create", "Create bond between pk1 and pk2", self.createBond), ( "Delete", "Delete bond between pk1 and pk2", self.deleteBond), ( "Cycle", "Cycle bond valence", self.cycleBond), ( " | ", "Create single bond", lambda: self.setOrder("1", "single")), ( " || ", "Create double bond", lambda: self.setOrder("2", "double")), ( " ||| ", "Create triple bond", lambda: self.setOrder("3", "triple")), ( "Arom", "Create aromatic bond", lambda: self.setOrder("4", "aromatic")), ( "@ Model:", None, None), ( "Clean", "Cleanup structure", self.clean), ( "Sculpt", "Molecular sculpting", self.sculpt), ( "Fix", "Fix atom positions", self.fix), ( "Rest", "Restrain atom positions", self.rest), ], [ ( "$El-stat", "Electrostatics term for 'Clean' action", "clean_electro_mode"), ( "@ ", None, None), ( "$Bumps", "Show VDW contacts during sculpting", "sculpt_vdw_vis_mode"), ( "@ ", None, None), ( "#Undo Enabled", "", "suspend_undo"), ( "Undo", "Undo last change", self.undo), ( "Redo", "Redo last change", self.redo), ] ] for row, btn_row in enumerate(buttons): btn_row_layout = QtWidgets.QHBoxLayout() self.buttons_layout.addLayout(btn_row_layout) for col, bb in enumerate(btn_row): btn_label, btn_tooltip, btn_command = bb if btn_label[0] == '@': btn = QtWidgets.QLabel(btn_label[1:]) elif btn_label[0] in ('#', '$'): btn = QtWidgets.QCheckBox(btn_label[1:]) setting = btn_command value = self.cmd.get_setting_int(setting) if btn_label[0] == '$': btn.setChecked(bool(value)) @btn.toggled.connect def _(checked, n=setting): self.cmd.set(n, checked, quiet=0) else: btn.setChecked(not value) @btn.toggled.connect def _(checked, n=setting): self.cmd.set(n, not checked, quiet=0) else: btn = makeFragmentButton() btn.setText(btn_label) btn.clicked.connect(btn_command) if btn_tooltip: btn.setToolTip(btn_tooltip) btn_row_layout.addWidget(btn) btn_row_layout.addStretch()
def __init__(self, parent, protocol): super(Hmmscan_results_window_qt, self).__init__(parent) self.protocol = protocol self.query_len = len( self.protocol.query_element.my_sequence.replace('-', '')) ######################### # Configure the window. # ######################### self.setWindowTitle("HMMSCAN Results") # Sets the central widget. self.central_widget = QtWidgets.QWidget() self.setCentralWidget(self.central_widget) # The window has a main vbox layout. self.main_vbox = QtWidgets.QVBoxLayout() # Parameters used to draw the 'QGraphicsView' widgets for showing domains. self.preferred_size_policy = QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) self.view_bg_color = "transparent" self.full_seq_pen = QtGui.QPen(QtGui.QColor(0, 0, 0, 0), 2) self.full_seq_color = "#7f7f7f" qcolor = QtGui.QColor(0, 0, 0) qcolor.setNamedColor(self.full_seq_color) self.full_seq_brush = QtGui.QBrush(qcolor) self.font_qcolor = QtGui.QColor(220, 220, 220, 255) self.font_size = 7 ################ # Upper frame. # ################ self.upper_frame = QtWidgets.QFrame() self.upper_frame_layout = QtWidgets.QGridLayout() self.upper_frame.setLayout(self.upper_frame_layout) self.main_vbox.addWidget(self.upper_frame) if 'query_descr' in self.protocol.parsed_res[ 0] and self.protocol.parsed_res[0]['query_descr']: labelseq = self.protocol.query_element.my_header # + '\n' + querydescr else: try: if len(self.protocol.query_element.description) > 79: labelseq = self.protocol.query_element.description[:78] + '...' else: labelseq = self.protocol.query_element.description except TypeError: labelseq = self.protocol.query_element.my_header self.upper_frame_title = QtWidgets.QLabel( "HMMSCAN search results for " + labelseq) self.upper_frame_layout.addWidget(self.upper_frame_title) #------------------------- # Domain graphics frame. - #------------------------- # Builds the scene where to draw the domain representations. self.canvas_plot_scene = QtWidgets.QGraphicsScene() self.canvas_plot_view = QtWidgets.QGraphicsView(self.canvas_plot_scene) self.canvas_plot_view.setFixedHeight(120) self.canvas_plot_view.setSizePolicy(self.preferred_size_policy) self.canvas_plot_view.setStyleSheet("background: %s" % self.view_bg_color) self.upper_frame_layout.addWidget(self.canvas_plot_view) # Draw a rectangle with the full sequence. self.x_init = 10 y_init = 95 # 95 self.domain_y_init = y_init - 7 self.full_seq_rect_w = 800 full_seq_rect_h = 10 self.canvas_plot_scene.addRect(self.x_init, y_init, self.full_seq_rect_w, full_seq_rect_h, self.full_seq_pen, self.full_seq_brush) # Draw the labels for the N- and C-terminal residues. text_offset_y = 15 text_offset_x = 10 text_n = self.canvas_plot_scene.addText("1") text_n.setPos(self.x_init - text_offset_x, y_init + text_offset_y) text_n.setDefaultTextColor(self.font_qcolor) text_n.setFont(QtGui.QFont(text_n.font().family(), self.font_size)) c_label = str(self.query_len) text_c = self.canvas_plot_scene.addText(c_label) text_offset_x_add = 5 if len(c_label) > 2: text_offset_x_add = 10 text_c.setPos( self.x_init + self.full_seq_rect_w - text_offset_x - text_offset_x_add, y_init + text_offset_y) text_c.setDefaultTextColor(self.font_qcolor) text_c.setFont(QtGui.QFont(text_c.font().family(), self.font_size)) ################# # Middle frame. # ################# # Scroll area which contains the widgets, set as the centralWidget. self.middle_scroll = QtWidgets.QScrollArea() self.main_vbox.addWidget(self.middle_scroll) # Widget that contains the collection of Vertical Box. self.middle_widget = QtWidgets.QWidget() # Scroll area properties. self.middle_scroll.setWidgetResizable(True) self.middle_scroll.setWidget(self.middle_widget) # QFormLayout in the middle frame. self.middle_formlayout = QtWidgets.QFormLayout() self.middle_widget.setLayout(self.middle_formlayout) #----------------- # Results frame. - #----------------- # Set the frame and its layout. self.results_frame = QtWidgets.QFrame() self.middle_formlayout.addRow(self.results_frame) self.results_grid = QtWidgets.QGridLayout() self.results_frame.setLayout(self.results_grid) # Calls a method which actually displays the similarity searches results. self.display_hmmscan_hits() # Align the gridded widgets to the left. self.results_grid.setAlignment(QtCore.Qt.AlignLeft) self.results_grid.setHorizontalSpacing(30) ################# # Bottom frame. # ################# self.main_button = QtWidgets.QPushButton("Submit") self.main_button.clicked.connect( lambda a=None: self.protocol.hmmer_results_state()) self.main_vbox.addWidget(self.main_button) self.main_button.setFixedWidth(self.main_button.sizeHint().width()) # Sets the main vertical layout. self.central_widget.setLayout(self.main_vbox) self.main_vbox.setAlignment(self.main_button, QtCore.Qt.AlignCenter)