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)
def __init__(self, parent=None, filename='', title='Text Editor'): super(TextEditor, self).__init__() self.highlight = None self.root = self self.root.setWindowTitle(title) menubar = self.root.menuBar() filemenu = menubar.addMenu("File") filemenu.addAction("Open", self.doOpen, QtGui.QKeySequence("Ctrl+O")) filemenu.addAction("Save", self.doSave, QtGui.QKeySequence("Ctrl+S")) filemenu.addAction("Save as ...", self.doSaveAs, QtGui.QKeySequence("Ctrl+Shift+S")) syntaxmenu = menubar.addMenu("Syntax") syntaxgroup = QtWidgets.QActionGroup(self) self.syntaxactions = {} for label in ['Python', 'PML', 'Plain Text']: key = label.split()[0].lower() action = syntaxmenu.addAction(label, lambda t=key: self.setSyntax(t)) syntaxgroup.addAction(action) action.setCheckable(True) self.syntaxactions[key] = action self.text = QtWidgets.QPlainTextEdit() self.text.setFont(getMonospaceFont()) self.root.setCentralWidget(self.text) connectFontContextMenu(self.text) self._open(filename) self.root.show() self.root.raise_()
def make_main_menu(self): """ This method is called when initializing the main window in order to build its main menu. """ self.menubar = self.menuBar() self.menubar.setNativeMenuBar(False) #--------------- # "File" menu. - #--------------- self.file_menu = self.menubar.addMenu('File') # Sequences submenu. self.sequences_submenu = QtWidgets.QMenu('Sequences and Structures', self) self.file_menu.addMenu(self.sequences_submenu) add_qt_menu_command(self.sequences_submenu, 'Open from File', self.pymod.open_file_from_the_main_menu) add_qt_menu_command(self.sequences_submenu, 'Add Raw Sequence', self.pymod.show_raw_seq_input_window) add_qt_menu_command(self.sequences_submenu, 'Import PyMOL Objects', self.pymod.import_pymol_selections_from_main_menu) # self.file_menu.addSeparator() # Submenu to open alignments. self.alignment_files_submenu = QtWidgets.QMenu('Alignments', self) self.file_menu.addMenu(self.alignment_files_submenu) add_qt_menu_command(self.alignment_files_submenu, 'Open from File', self.pymod.open_alignment_from_main_menu) # Submenu to open results files from external programs. self.external_results_submenu = QtWidgets.QMenu( 'External Programs Results', self) self.file_menu.addMenu(self.external_results_submenu) self.hhsuite_results_submenu = QtWidgets.QMenu('HH-suite', self) self.external_results_submenu.addMenu(self.hhsuite_results_submenu) add_qt_menu_command(self.hhsuite_results_submenu, 'Template Search (.hhr)', self.pymod.open_hhsuite_hhr_from_main_menu) add_qt_menu_command(self.hhsuite_results_submenu, 'Multiple Sequence Alignment (.a3m)', self.pymod.open_hhsuite_a3m_from_main_menu) self.file_menu.addSeparator() # Workspace submenu. self.sessions_submenu = QtWidgets.QMenu('Sessions', self) self.file_menu.addMenu(self.sessions_submenu) add_qt_menu_command(self.sessions_submenu, 'New', self.pymod.start_new_session_from_main_menu) add_qt_menu_command(self.sessions_submenu, 'Save', self.pymod.save_session_from_main_menu) add_qt_menu_command(self.sessions_submenu, 'Open', self.pymod.open_session_from_main_menu) self.file_menu.addSeparator() # Exit command. add_qt_menu_command(self.file_menu, 'Exit', self.pymod.exit_from_main_menu) #---------------- # "Tools" menu. - #---------------- self.tools_menu = self.menubar.addMenu('Tools') # Database search for homologous sequences. self.database_search_submenu = QtWidgets.QMenu('Database Search', self) self.tools_menu.addMenu(self.database_search_submenu) self.blast_tools_submenu = QtWidgets.QMenu('BLAST', self) self.database_search_submenu.addMenu(self.blast_tools_submenu) add_qt_menu_command( self.blast_tools_submenu, 'Local BLAST', lambda: self.pymod.launch_blast_algorithm("blastp")) add_qt_menu_command(self.blast_tools_submenu, 'Remote BLAST', lambda: self.pymod.launch_blast_algorithm("blast")) add_qt_menu_command( self.database_search_submenu, 'PSI-BLAST', lambda: self.pymod.launch_blast_algorithm("psi-blast")) self.database_search_submenu.addSeparator() add_qt_menu_command( self.database_search_submenu, 'phmmer', lambda: self.pymod.launch_hmmer_algorithm("phmmer")) add_qt_menu_command( self.database_search_submenu, 'jackhmmer', lambda: self.pymod.launch_hmmer_algorithm("jackhmmer")) add_qt_menu_command( self.database_search_submenu, 'hmmsearch', lambda: self.pymod.launch_hmmer_algorithm("hmmsearch")) # Alignment tools self.alignments_tools_submenu = QtWidgets.QMenu( 'Alignment Tools', self) self.tools_menu.addMenu(self.alignments_tools_submenu) # Sequence alignment tools. self.sequence_alignments_submenu = QtWidgets.QMenu( 'Sequence Alignment', self) self.alignments_tools_submenu.addMenu(self.sequence_alignments_submenu) add_qt_menu_command( self.sequence_alignments_submenu, 'ClustalW', lambda: self.pymod.launch_alignment_from_the_main_menu( "clustalw", "regular")) add_qt_menu_command( self.sequence_alignments_submenu, 'Clustal Omega', lambda: self.pymod.launch_alignment_from_the_main_menu( "clustalo", "regular")) add_qt_menu_command( self.sequence_alignments_submenu, 'MUSCLE', lambda: self.pymod.launch_alignment_from_the_main_menu( "muscle", "regular")) add_qt_menu_command( self.sequence_alignments_submenu, 'SALIGN (Sequence Alignment)', lambda: self.pymod.launch_alignment_from_the_main_menu( "salign-seq", "regular")) # Profile alignment tools. self.sequence_profile_alignments_submenu = QtWidgets.QMenu( 'Profile Alignment', self) self.alignments_tools_submenu.addMenu( self.sequence_profile_alignments_submenu) add_qt_menu_command( self.sequence_profile_alignments_submenu, 'ClustalW', lambda: self.pymod.launch_alignment_from_the_main_menu( "clustalw", "profile")) add_qt_menu_command( self.sequence_profile_alignments_submenu, 'Clustal Omega', lambda: self.pymod.launch_alignment_from_the_main_menu( "clustalo", "profile")) add_qt_menu_command( self.sequence_profile_alignments_submenu, 'SALIGN (Sequence Alignment)', lambda: self.pymod.launch_alignment_from_the_main_menu( "salign-seq", "profile")) # Structural alignment tools. self.structural_alignment_submenu = QtWidgets.QMenu( 'Structural Alignment', self) self.alignments_tools_submenu.addMenu( self.structural_alignment_submenu) # add_qt_menu_command(self.structural_alignment_submenu, 'Superpose', self.pymod.superpose_from_main_menu) add_qt_menu_command( self.structural_alignment_submenu, 'CE Alignment', lambda: self.pymod.launch_alignment_from_the_main_menu( "ce", "regular")) add_qt_menu_command( self.structural_alignment_submenu, 'SALIGN (Structure Alignment)', lambda: self.pymod.launch_alignment_from_the_main_menu( "salign-str", "regular")) # Domain tools. self.domain_analysis_submenu = QtWidgets.QMenu('Domains Analysis', self) self.tools_menu.addMenu(self.domain_analysis_submenu) self.hmmscan_tools_submenu = QtWidgets.QMenu('hmmscan', self) self.domain_analysis_submenu.addMenu(self.hmmscan_tools_submenu) add_qt_menu_command(self.hmmscan_tools_submenu, 'Local hmmscan', lambda: self.pymod.launch_domain_analysis("local")) add_qt_menu_command( self.hmmscan_tools_submenu, 'Remote hmmscan', lambda: self.pymod.launch_domain_analysis("remote")) # Structural analysis. self.structural_analysis_submenu = QtWidgets.QMenu( 'Structural Analysis', self) self.tools_menu.addMenu(self.structural_analysis_submenu) add_qt_menu_command(self.structural_analysis_submenu, 'Ramachandran Plot', self.pymod.ramachandran_plot_from_main_menu) add_qt_menu_command(self.structural_analysis_submenu, 'Contact Map', self.pymod.contact_map_from_main_menu) add_qt_menu_command(self.structural_analysis_submenu, 'Structural Divergence Plot', self.pymod.sda_from_main_menu) self.structural_analysis_submenu.addSeparator() add_qt_menu_command(self.structural_analysis_submenu, 'Assess with DOPE', self.pymod.dope_from_main_menu) self.structural_analysis_submenu.addSeparator() add_qt_menu_command(self.structural_analysis_submenu, 'PSIPRED', self.pymod.launch_psipred_from_main_menu) # Modeling. self.modeling_submenu = QtWidgets.QMenu('Modeling', self) self.tools_menu.addMenu(self.modeling_submenu) add_qt_menu_command(self.modeling_submenu, "MODELLER (Homology Modeling)", self.pymod.launch_modeller_hm_from_main_menu) add_qt_menu_command(self.modeling_submenu, "MODELLER (Loop Modeling)", self.pymod.launch_modeller_lr_from_main_menu) # Options. self.tools_menu.addSeparator() add_qt_menu_command(self.tools_menu, 'Options', self.pymod.show_pymod_options_window) #--------------------- # "Alignments" menu. - #--------------------- self.alignments_menu = self.menubar.addMenu('Alignments') self.build_alignment_submenu() #----------------- # "Models" menu. - #----------------- # When the plugin is started there are no models. self.models_menu = self.menubar.addMenu('Models') self.build_models_submenu() #-------------------- # "Selection" menu. - #-------------------- self.main_selection_menu = self.menubar.addMenu('Selection') add_qt_menu_command(self.main_selection_menu, 'Select All [Ctrl+a]', self.pymod.select_all_from_main_menu) add_qt_menu_command(self.main_selection_menu, 'Deselect All [Esc]', self.pymod.deselect_all_from_main_menu) # Structures selection submenu. self.selection_structures_menu = QtWidgets.QMenu('Structures', self) self.main_selection_menu.addMenu(self.selection_structures_menu) add_qt_menu_command(self.selection_structures_menu, 'Show All in PyMOL [Ctrl+s]', self.pymod.show_all_structures_from_main_menu) add_qt_menu_command(self.selection_structures_menu, 'Hide All in PyMOL [Ctrl+h]', self.pymod.hide_all_structures_from_main_menu) self.selection_structures_menu.addSeparator() add_qt_menu_command(self.selection_structures_menu, 'Select All', self.pymod.select_all_structures_from_main_menu) add_qt_menu_command(self.selection_structures_menu, 'Deselect All', self.pymod.deselect_all_structures_from_main_menu) # Clusters selection submenu. self.selection_clusters_menu = QtWidgets.QMenu('Clusters', self) self.main_selection_menu.addMenu(self.selection_clusters_menu) add_qt_menu_command(self.selection_clusters_menu, 'Expand All', self.pymod.expand_all_clusters_from_main_menu) add_qt_menu_command(self.selection_clusters_menu, 'Collapse All', self.pymod.collapse_all_clusters_from_main_menu) #------------------ # "Display" menu. - #------------------ self.display_menu = self.menubar.addMenu('Display') if self.pymod.DEVELOP: add_qt_menu_command(self.display_menu, 'Print Selected Sequences', command=self.print_selected) # Color menu. self.main_color_menu = QtWidgets.QMenu('Color all Sequences', self) self.display_menu.addMenu(self.main_color_menu) add_qt_menu_command( self.main_color_menu, 'By Default Color', command=lambda: self.color_selection("all", None, "regular")) self.main_residues_colors_menu = QtWidgets.QMenu( 'By Residue Properties', self) self.main_color_menu.addMenu(self.main_residues_colors_menu) add_qt_menu_command( self.main_residues_colors_menu, 'Residue Type', command=lambda: self.color_selection("all", None, "residue_type")) add_qt_menu_command( self.main_residues_colors_menu, 'Polarity', command=lambda: self.color_selection("all", None, "polarity")) add_qt_menu_command(self.main_color_menu, 'By Secondary Structure', command=lambda: self.color_selection( "all", None, "secondary-auto")) # Font selection. self.font_selection_menu = QtWidgets.QMenu('Font Selection', self) self.display_menu.addMenu(self.font_selection_menu) if self.pymod.DEVELOP: add_qt_menu_command(self.display_menu, 'Font Type and Size', self.pymod.change_font_from_main_menu) # Font size selection. self.font_size_selection_menu = QtWidgets.QMenu('Font Size', self) self.font_selection_menu.addMenu(self.font_size_selection_menu) font_size_action_group = QtWidgets.QActionGroup( self.font_size_selection_menu) font_size_action_group.setExclusive(True) for font_size in ("6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16"): action = font_size_action_group.addAction( QtWidgets.QAction(font_size, self.font_size_selection_menu, checkable=True)) self.font_size_selection_menu.addAction(action) if font_size == str(self.font_size): action.setChecked(True) action.triggered.connect(lambda a=None, t=None, s=font_size: self. pymod.change_font_from_action(t, s)) # Font type selection. self.font_type_selection_menu = QtWidgets.QMenu('Font Type', self) self.font_selection_menu.addMenu(self.font_type_selection_menu) font_type_action_group = QtWidgets.QActionGroup( self.font_type_selection_menu) font_type_action_group.setExclusive(True) for font_type in self.get_available_fonts(): action = font_type_action_group.addAction( QtWidgets.QAction(font_type, self.font_type_selection_menu, checkable=True)) self.font_type_selection_menu.addAction(action) if font_type == str(self.font): action.setChecked(True) action.triggered.connect(lambda a=None, t=font_type, s=None: self. pymod.change_font_from_action(t, s)) #--------------- # "Help" menu. - #--------------- self.help_menu = self.menubar.addMenu('Help') if self.pymod.DEVELOP: add_qt_menu_command(self.help_menu, 'Test', self.pymod.launch_default) add_qt_menu_command(self.help_menu, 'Online Documentation', self.pymod.open_online_documentation) add_qt_menu_command(self.help_menu, 'About', self.pymod.show_about_dialog) self.help_menu.addSeparator() add_qt_menu_command(self.help_menu, "Install PyMod Components", self.pymod.launch_components_installation) add_qt_menu_command(self.help_menu, "Check for Database Updates", self.pymod.launch_databases_update) if self.pymod.TEST: self.help_menu.addSeparator() self.examples_menu = QtWidgets.QMenu('Examples', self) self.help_menu.addMenu(self.examples_menu) add_qt_menu_command( self.examples_menu, "Load random sequence from UniProt", lambda a=None: self.pymod.load_uniprot_random()) add_qt_menu_command(self.examples_menu, "Load random PDB entry", lambda a=None: self.pymod.load_pdb_random())