def add_plugin_item(info): item = window.load_form('pluginitem', QtWidgets.QFrame()) item._widget = item._dialog item._widget.setFrameStyle(QtWidgets.QFrame.Sunken) item._widget.setFrameShape(QtWidgets.QFrame.Panel) item.w_title.setText(info.name) item.w_version.setText(info.get_version()) item.w_startup.setChecked(info.autoload) item.w_startup.stateChanged.connect(self.w_startup_changed) item.w_enable.pressed.connect(info.load) item.w_enable.pressed.connect(self.disable_load_button) item.w_uninstall.pressed.connect(info.uninstall) item.w_uninstall.pressed.connect(self.reload_plugins) if info.loaded: item.w_enable.setEnabled(False) if hasattr(info.module, 'settings_dialog'): item.w_settings.setVisible(True) else: item.w_settings.setVisible(False) item.w_info.pressed.connect(self.show_info) if info.loadtime: item.w_loadtime.setText("Took %.3f seconds to load" % info.loadtime) else: item.w_loadtime.setText("Not loaded") item._widget._form = item self.plugin_info[item] = info self.form.f_installed_layout.addWidget(item._widget)
def build_modeling_protocol_main_page(self): """ Starts to insert content in the "Main" page. """ # Builds a frame for each modeling_cluster. for (i, modeling_cluster) in enumerate( self.protocol.modeling_clusters_list): # Add a spacer to separate the sections for each modeling cluster. if i != 0 and self.protocol.multiple_chain_mode: spacer_frame = QtWidgets.QFrame() spacer_frame.setFrameShape(QtWidgets.QFrame.HLine) spacer_frame.setFrameShadow(QtWidgets.QFrame.Sunken) self.main_page_interior_layout.addRow(spacer_frame) show_symmetry_restraints_option = False # Widgets necessary to choose the templates for a single target sequence. modeling_option_label = QtWidgets.QLabel( "Modeling options for target: %s" % (modeling_cluster.target_name)) modeling_option_label.setStyleSheet(modeling_window_title_style) self.main_page_interior_layout.addRow(modeling_option_label) if self.protocol.multiple_chain_mode: # Use symmetry restraints option. if modeling_cluster.symmetry_restraints_id != None: show_symmetry_restraints_option = True symmetry_checkbox, symmetry_info = self.build_symmetry_restraints_option( modeling_cluster) if any((show_symmetry_restraints_option, )): # This might include other flags in future releases. additional_options_label = QtWidgets.QLabel( "Restraints options") additional_options_label.setStyleSheet( modeling_options_sections_style) self.main_page_interior_layout.addRow(additional_options_label) if show_symmetry_restraints_option: self.main_page_interior_layout.addRow( symmetry_checkbox, symmetry_info) # Build a series of widgets for loop ranges selection. modeling_option_label = QtWidgets.QLabel("Loop selection") modeling_option_label.setStyleSheet( modeling_options_sections_style) self.main_page_interior_layout.addRow(modeling_option_label) # Build a 'User_loop_selector_frame' object, which will contain information about # user-defined loops for this target. uls = User_loop_selector_frame_qt( parent=None, parent_window=self, modeling_cluster=modeling_cluster) modeling_cluster.user_loop_selector_frame = uls self.main_page_interior_layout.addRow(uls)
def reload_plugins(self, setting=None): from . import plugins window = getPyMOLWindow() self.clear_plugins() for info in sorted(plugins.values(), key=lambda i: i.name.lower()): item = window.load_form('pluginitem', QtWidgets.QFrame()) item._widget = item._dialog item._widget.setFrameStyle(QtWidgets.QFrame.Sunken) item._widget.setFrameShape(QtWidgets.QFrame.Panel) item.w_title.setText(info.name) item.w_version.setText(info.get_version()) item.w_startup.setChecked(info.autoload) item.w_startup.stateChanged.connect(self.w_startup_changed) item.w_enable.pressed.connect(info.load) item.w_enable.pressed.connect(self.disable_load_button) item.w_uninstall.pressed.connect(info.uninstall) item.w_uninstall.pressed.connect(self.reload_plugins) if info.loaded: item.w_enable.setEnabled(False) if hasattr(info.module, 'settings_dialog'): item.w_settings.setVisible(True) else: item.w_settings.setVisible(False) item.w_info.pressed.connect(self.show_info) if info.loadtime: item.w_loadtime.setText("Took %.3f seconds to load" % info.loadtime) else: item.w_loadtime.setText("Not loaded") item._widget._form = item self.plugin_info[item] = info self.form.f_installed_layout.addWidget(item._widget) self.filter_plugins() self.form.f_installed_layout.addStretch()
def __init__(self, *args, **kwargs): super(PyMod_plot_window_qt, self).__init__(*args, **kwargs) # Central widget. self.central_widget = QtWidgets.QWidget() self.setCentralWidget(self.central_widget) self.central_widget_layout = QtWidgets.QGridLayout() self.central_widget.setLayout(self.central_widget_layout) #------------------------------------------------ # Upper frame (contains the plot and controls). - #------------------------------------------------ expanding_size_policy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) preferred_size_policy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) # The upper frame contains three frames: info, plot and controls frames. # The infor and controls frames will be displayed only if the 'use_controls' # argument is set to 'True' when calling the 'build_plotting_area' method. self.upper_frame = QtWidgets.QFrame() self.upper_frame.setStyleSheet("background-color: #646464") self.upper_frame_layout = QtWidgets.QGridLayout() self.upper_frame.setLayout(self.upper_frame_layout) self.upper_frame.setSizePolicy(expanding_size_policy) self.central_widget_layout.addWidget(self.upper_frame, 0, 0) # Info frame, it contains the messagebar of the plot. self.info_frame = QtWidgets.QFrame() self.info_frame_layout = QtWidgets.QHBoxLayout() self.info_frame.setLayout(self.info_frame_layout) self.info_frame.setSizePolicy(preferred_size_policy) self.info_label = QtWidgets.QLabel("") self.info_frame_layout.addWidget(self.info_label) # Plot frame. self.plot_frame = QtWidgets.QFrame() # self.plot_frame.setStyleSheet("background-color: red") self.plot_frame_layout = QtWidgets.QGridLayout() self.plot_frame.setLayout(self.plot_frame_layout) self.plot_frame.setSizePolicy(expanding_size_policy) self.build_plot_widget() # Controls frame. self.controls_frame = QtWidgets.QWidget() self.controls_frame.setStyleSheet("background-color: #747474") self.controls_frame_layout = QtWidgets.QGridLayout() self.controls_frame.setLayout(self.controls_frame_layout) self.controls_frame_layout.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) self.controls_scrollarea = QtWidgets.QScrollArea() self.controls_scrollarea.setWidgetResizable(True) self.controls_scrollarea.setWidget(self.controls_frame) self.labels_title = QtWidgets.QLabel("Plots list") # Middle splitter. self.middle_splitter = QtWidgets.QSplitter(QtCore.Qt.Horizontal) self.middle_splitter.setSizePolicy(expanding_size_policy) #--------------------------------------- # Lower frame (contains some options). - #--------------------------------------- self.lower_frame = QtWidgets.QFrame() self.lower_frame_layout = QtWidgets.QGridLayout() self.lower_frame.setLayout(self.lower_frame_layout) self.central_widget_layout.addWidget(self.lower_frame, 1, 0) # View buttons. self.view_label = QtWidgets.QLabel("View:") self.lower_frame_layout.addWidget(self.view_label, 0, 0) self.home_view_button = QtWidgets.QPushButton("Fit to data") self.home_view_button.clicked.connect(self.on_home_button_click) self.lower_frame_layout.addWidget(self.home_view_button, 0, 1) # On click behaviour. The buttons will be shown later, in the # 'build_plotting_area' metohd. self.interact_buttons_group = QtWidgets.QButtonGroup() self.on_click_label = QtWidgets.QLabel("Interact on click:") self.interact_button = QtWidgets.QPushButton("Yes") self.interact_button.setCheckable(True) self.interact_buttons_group.addButton(self.interact_button) self.interact_button.clicked.connect(self.on_interact_button_click) self.no_interaction_button = QtWidgets.QPushButton("No") self.no_interaction_button.setCheckable(True) self.no_interaction_button.setChecked(True) self.interact_buttons_group.addButton(self.no_interaction_button) self.no_interaction_button.clicked.connect(self.on_no_interaction_button_click) # Show/hide all buttons. They will be shown later, in the 'build_plotting_area' # method. self.show_label = QtWidgets.QLabel("Show:") self.show_all_button = QtWidgets.QPushButton("All") self.show_all_button.clicked.connect(self.show_all_command) self.hide_all_button = QtWidgets.QPushButton("None") self.hide_all_button.clicked.connect(self.hide_all_command) self.lower_frame_layout.setAlignment(QtCore.Qt.AlignLeft) #--------------------- # Build a main menu. - #--------------------- self.save_to_csv_action = QtWidgets.QAction('Save to CSV', self) self.save_to_csv_action.triggered.connect(lambda a=None: self.save_to_csv_event()) self.save_to_png_action = QtWidgets.QAction('Save to PNG', self) self.save_to_png_action.triggered.connect(lambda a=None: self.save_to_png_event()) self.main_menubar = self.menuBar() self.file_menu = self.main_menubar.addMenu('File')
def initialize_map(self, pymod, data_array, pymod_elements, ref_residues, ref_selectors, title=None, pixel_size=5, feature_type="contact", threshold=8.0, interaction_center="ca"): # Sets the attributes. self.data_array = data_array self.pixel_size = pixel_size self.feature_type = feature_type self.threshold = threshold self.interaction_center = interaction_center if self.feature_type in ("contact", "distance"): self.pymod_elements = pymod_elements self.pymod_element = self.pymod_elements[0] else: self.pymod_elements = pymod_elements # Get the PyMod residues for each residue having an interaction center and the PyMOL selectors # for each residue. self.ref_residues = ref_residues self.ref_selectors = ref_selectors # Assign the methods to get the labels. if self.feature_type == "contact": self.get_value_label = self._get_value_label_contact elif self.feature_type == "distance": self.get_value_label = self._get_value_label_distance elif self.feature_type == "distances_difference": self.get_value_label = self._get_value_label_distance_diff elif self.feature_type == "distances_mean": self.get_value_label = self._get_value_label_distance_mean elif self.feature_type == "distances_std": self.get_value_label = self._get_value_label_distance_std else: raise KeyError(self.feature_type) # Set the canvas size. min_size = 150 h = self.pixel_size * len(self.data_array) win_size = min((910, h)) win_size = max((min_size, win_size)) if title: self.setWindowTitle(title) # Set some appearance parameters. self.controls_padding = 4 if self.feature_type in ("contact", "distance"): self.controls_font = "helvetica 11 bold" else: self.controls_font = "helvetica 10 bold" self.controls_config = { "fg": "black", "font": self.controls_font, "padx": self.controls_padding, "pady": self.controls_padding } self.labels_pack_config = { "side": "left", "pady": (0, 5), "padx": (5, 0) } self.buttons_pack_config = { "side": "left", "pady": (0, 5), "padx": (1, 0) } # Frame of the window containing a row for some control buttons, a row for # the plot and a row for a messagebar. self.plot_frame = QtWidgets.QWidget() self.plot_frame_layout = QtWidgets.QGridLayout() self.plot_frame.setLayout(self.plot_frame_layout) self.setCentralWidget(self.plot_frame) # Control frame. self.controls_frame = QtWidgets.QWidget() self.controls_frame_layout = QtWidgets.QGridLayout() self.controls_frame.setLayout(self.controls_frame_layout) self.plot_frame_layout.addWidget(self.controls_frame) self.delete_distances_button = QtWidgets.QPushButton( "Delete all distances in PyMOL") self.delete_distances_button.setEnabled(False) self.delete_distances_button.clicked.connect( lambda a=None: self.clear_plot()) self.controls_frame_layout.addWidget(self.delete_distances_button, 0, 0) self.scale_factor = 0 self.scale_down_button = QtWidgets.QPushButton("Zoom out") try: self.scale_down_button.setIcon(QtGui.QIcon.fromTheme("go-down")) except: pass self.scale_down_button.clicked.connect( lambda a=None: self.scale_plot_down()) self.controls_frame_layout.addWidget(self.scale_down_button, 0, 1) self.scale_up_button = QtWidgets.QPushButton("Zoom in") try: self.scale_up_button.setIcon(QtGui.QIcon.fromTheme("go-up")) except: pass self.scale_up_button.clicked.connect( lambda a=None: self.scale_plot_up()) self.controls_frame_layout.addWidget(self.scale_up_button, 0, 2) self.controls_frame_layout.setAlignment(QtCore.Qt.AlignLeft) # Frame containing the plot (with a scrollbar). self.canvas_plot_frame = QtWidgets.QWidget() self.canvas_plot_frame.setStyleSheet("background-color: white") self.canvas_plot_frame_layout = QtWidgets.QGridLayout() self.canvas_plot_frame.setLayout(self.canvas_plot_frame_layout) self.canvas_plot_scrollarea = QtWidgets.QScrollArea() self.canvas_plot_scrollarea.setWidgetResizable(True) self.canvas_plot_scrollarea.setWidget(self.canvas_plot_frame) self.plot_frame_layout.addWidget(self.canvas_plot_scrollarea) # Builds the scene where to draw the contact map. self.canvas_plot_scene = QtWidgets.QGraphicsScene() # Builds the graphics view containing the scene above. self.canvas_plot_view = Contact_map_graphics_view( self.canvas_plot_scene) self.canvas_plot_frame_layout.addWidget(self.canvas_plot_view) # A bottom frame fo the window, containing some buttons to interact with the graph. self.message_frame = QtWidgets.QFrame() self.message_frame_layout = QtWidgets.QHBoxLayout() self.message_frame.setLayout(self.message_frame_layout) self.plot_frame_layout.addWidget(self.message_frame) # Label to show which residue/position pair is currently being hovered by the mouse pointer. if self.feature_type in ("contact", "distance"): view_label_text = "Couple:" else: view_label_text = "Alignment positions:" self.view_label = QtWidgets.QLabel(view_label_text) # self.view_label.setStyleSheet(self.controls_config) self.message_frame_layout.addWidget(self.view_label) # Actually draws the contact map. self.draw_map()
def initialize_plot(self, pymod, target_element, residues_tags, plot_title, aa_list): self.pymod = pymod self.target_element = target_element self.residues_tags = residues_tags self.plot_title = plot_title self.setWindowTitle("%s Ramachandran Plot" % self.target_element.my_header) self.aa_list = aa_list # Frame of the window containing a row for some control buttons, a row for # the plot and a row for a messagebar. self.plot_frame = QtWidgets.QWidget() self.plot_frame_layout = QtWidgets.QGridLayout() self.plot_frame.setLayout(self.plot_frame_layout) self.setCentralWidget(self.plot_frame) # Control frame. self.controls_frame = QtWidgets.QWidget() self.controls_frame_layout = QtWidgets.QGridLayout() self.controls_frame.setLayout(self.controls_frame_layout) self.plot_frame_layout.addWidget(self.controls_frame, 0, 0) self.scale_factor = 0 self.scale_down_button = QtWidgets.QPushButton("Zoom out") try: self.scale_down_button.setIcon(QtGui.QIcon.fromTheme("go-down")) except: pass self.scale_down_button.clicked.connect( lambda a=None: self.scale_plot_down()) self.controls_frame_layout.addWidget(self.scale_down_button, 0, 0) self.scale_up_button = QtWidgets.QPushButton("Zoom in") try: self.scale_up_button.setIcon(QtGui.QIcon.fromTheme("go-up")) except: pass self.scale_up_button.clicked.connect( lambda a=None: self.scale_plot_up()) self.controls_frame_layout.addWidget(self.scale_up_button, 0, 1) self.controls_frame_layout.setAlignment(QtCore.Qt.AlignLeft) # Frame containing the plot (with a scrollbar). self.canvas_plot_frame = QtWidgets.QWidget() self.canvas_plot_frame.setStyleSheet("background-color: white") self.canvas_plot_frame_layout = QtWidgets.QGridLayout() self.canvas_plot_frame.setLayout(self.canvas_plot_frame_layout) self.canvas_plot_scrollarea = QtWidgets.QScrollArea() self.canvas_plot_scrollarea.setWidgetResizable(True) self.canvas_plot_scrollarea.setWidget(self.canvas_plot_frame) self.plot_frame_layout.addWidget(self.canvas_plot_scrollarea, 1, 0) self.default_pen = QtGui.QPen(QtGui.QColor(0, 0, 0, 255), 1) self.default_brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 230)) self.highlight_brush = QtGui.QBrush(QtGui.QColor(255, 0, 255)) self.highlight_region_brush = QtGui.QBrush(QtGui.QColor(0, 255, 255)) # Builds the scene where to draw the Ramachandran plot. self.canvas_plot_scene = QtWidgets.QGraphicsScene() # Builds the graphics view containing the scene above. self.canvas_plot_view = QtWidgets.QGraphicsView(self.canvas_plot_scene) self.canvas_plot_frame_layout.addWidget(self.canvas_plot_view) # A bottom frame fo the window, containing some buttons to interact with the graph. self.message_frame = QtWidgets.QFrame() self.message_frame_layout = QtWidgets.QFormLayout() self.message_frame.setLayout(self.message_frame_layout) self.plot_frame_layout.addWidget(self.message_frame, 1, 1) # Label to show which residue/position pair is currently being hovered by the mouse pointer. self.view_label_prefix = "Showing: " self.default_message = "Hover dots to color residues of the same type" # Hover over title. self.message_label = QtWidgets.QLabel(self.default_message) self.message_label.setStyleSheet(small_font_style) self.message_frame_layout.addRow(self.message_label) # Actually draws the plot. self.draw_plot() # Shows some data about the type of residues and their dihedral angles. self.regions_labels_dict = {} tot_regular_res = float(self.residues_count["T"]) label_params = [ ("F", "Residues in the most favoured regions", "residues in most favoured regions", True, True), ("A", "Residues in additional allowed regions", "residues in additional allowed regions", True, True), ("G", "Residues in generously allowed regions", "residues in generously allowed regions", True, True), ("D", "Residues in disallowed regions", "residues in disallowed regions", True, True), ("T", "Non-gly and non-pro residues (circles)", "non-glycine and non-proline residues", True, True), ("end_res", "End-residues", "end residues", False, False), ("gly", "Gly residues (triangles)", "glycine residues", True, False), ("pro", "Pro residues (squares)", "proline residues", True, False), ("total", "Total number of residues", "all residues", True, False) ] for region, label, message, active, use_ratio in label_params: region_label = Ramachandran_plot_info_labels( label, message, region, active, self) region_label.setStyleSheet(small_font_style) if use_ratio: text = "%s (%s%%)" % (self.residues_count[region], round( self.residues_count[region] / tot_regular_res * 100, 1)) else: text = str(self.residues_count[region]) region_label_count = QtWidgets.QLabel(text) region_label_count.setStyleSheet(small_font_style) self.message_frame_layout.addRow(region_label, region_label_count) self.regions_labels_dict[region] = { "info": region_label, "data": region_label_count }
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 __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)
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)