예제 #1
0
        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)
예제 #2
0
    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_()
예제 #3
0
    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())