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
def make_pymol_qicon(): icons_dir = os.path.expandvars('$PYMOL_DATA/pymol/icons') icon = QtGui.QIcon() for size in (16, 32, 128): icon.addFile(os.path.join(icons_dir, 'icon2_%dx%d.png' % (size, size)), QtCore.QSize(size, size)) return icon
def update_pyvol(form): """ GUI wrapper for updating PyVOL using pip """ update_pypi_pyvol() msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setWindowTitle("PyVOL Updated") msg.setInformativeText("The PyVOL backend has been updated; however, PyMOL will not load the new code until it is restarted.") msg.setStandardButtons(QtWidgets.QMessageBox.Ok) msg.setMinimumSize(QtCore.QSize(600, 200)) # Doesn't seem to work msg.exec_() refresh_installation_status(form)
def uninstall_pyvol(form): """ Attempts to uninstall PyVOL using pip """ subprocess.check_output([sys.executable, "-m", "pip", "uninstall", "-y", "bio-pyvol"]) msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setWindowTitle("PyVOL Backend Uninstalled") msg.setInformativeText("The PyVOL backend has been uninstalled; however, the plugin must also be uninstalled using PyMOL's plugin manager.") msg.setStandardButtons(QtWidgets.QMessageBox.Ok) msg.setMinimumSize(QtCore.QSize(600, 200)) # Doesn't seem to work msg.exec_() refresh_installation_status(form)
def update_pyvol(): """ Attempts to update PyVOL using conda """ from conda.cli import python_api python_api.run_command(python_api.Commands.UPDATE, "bio-pyvol") msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setWindowTitle("PyVOL Updated") msg.setInformativeText( "The PyVOL backend has been updated; however, PyMOL will not load the new code until it is restarted." ) msg.setStandardButtons(QtWidgets.QMessageBox.Ok) msg.setMinimumSize(QtCore.QSize(600, 200)) # Doesn't seem to work msg.exec_() refresh_installation_status(form)
def pymolviewport(self, w, h): cw, ch = self.cmd.get_viewport() pw = self.pymolwidget scale = pw.fb_scale # maintain aspect ratio if h < 1: if w < 1: pw.resizeGL(int(scale * pw.width()), int(scale * pw.height())) return h = (w * ch) / cw if w < 1: w = (h * cw) / ch win_size = self.size() delta = QtCore.QSize(w - cw, h - ch) / scale # window resize self.resize(delta + win_size)
def update_pyvol(form): """ Attempts to update PyVOL using pip """ import subprocess import sys form.status_label.setText("Updating PyVOL") subprocess.check_output( [sys.executable, "-m", "pip", "install", "--upgrade", "bio-pyvol"]) msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setWindowTitle("PyVOL Updated") msg.setInformativeText( "The PyVOL backend has been updated; however, PyMOL will not load the new code until it is restarted." ) msg.setStandardButtons(QtWidgets.QMessageBox.Ok) msg.setMinimumSize(QtCore.QSize(600, 200)) # Doesn't seem to work msg.exec_() refresh_installation_status(form)
def sizeHint(self): return QtCore.QSize(600, 200)
def sizeHint(self): # default 640 + internal_gui, 480 + internal_feedback return QtCore.QSize(860, 498)
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()