Example #1
0
    def __init__(self, parent = None, name = "task_toolbox"):
        QtGui.QWidget.__init__(self, parent)
        self.setObjectName = name

        # Hardware objects ----------------------------------------------------
        self.graphics_manager_hwobj = None

        # Internal variables --------------------------------------------------
        self.tree_brick = None
        self.previous_page_index = 0
        self.is_running = None

        # Graphic elements ----------------------------------------------------
        self.method_label = QtGui.QLabel("Collection method", self)
        self.method_label.setAlignment(QtCore.Qt.AlignCenter) 
        #Qt4_widget_colors.set_widget_color(self.method_label,
        #                                   Qt4_widget_colors.SKY_BLUE)
        #font = self.method_group_box.font()
        #font.setPointSize(10)
        #self.method_group_box.setFont(font)
    
        self.tool_box = QtGui.QToolBox(self)
        self.tool_box.setObjectName("tool_box")
        self.tool_box.setFixedWidth(475)
        #self.tool_box.setFont(font)
        
        self.discrete_page = CreateDiscreteWidget(self.tool_box, "Discrete",)
        self.char_page = CreateCharWidget(self.tool_box, "Characterise")
        self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page")
        self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan")
        self.xrf_spectrum_page = CreateXRFSpectrumWidget(self.tool_box, "xrf_spectrum")  
        self.advanced_page = CreateAdvancedWidget(self.tool_box, "advanced_scan")
        
        self.tool_box.addItem(self.discrete_page, "Standard Collection")
        self.tool_box.addItem(self.char_page, "Characterisation")
        self.tool_box.addItem(self.helical_page, "Helical Collection")
        self.tool_box.addItem(self.energy_scan_page, "Energy Scan")
        self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum")
        self.tool_box.addItem(self.advanced_page, "Advanced")

        self.button_box = QtGui.QWidget(self)
        self.create_task_button = QtGui.QPushButton("  Add to queue", self.button_box)
        self.create_task_button.setIcon(Qt4_Icons.load_icon("add_row.png"))
        msg = "Add the collection method to the selected sample"
        self.create_task_button.setToolTip(msg)

        self.collect_now_button = QtGui.QPushButton("Collect Now", self.button_box)
        self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png"))
        self.collect_now_button.hide()
        
        # Layout --------------------------------------------------------------
        #_method_group_box_vlayout = QtGui.QVBoxLayout(self.method_group_box)
        #_method_group_box_vlayout.addWidget(self.tool_box)
        #_method_group_box_vlayout.setSpacing(2)
        #_method_group_box_vlayout.setContentsMargins(2, 2, 2, 2)

        _button_box_hlayout = QtGui.QHBoxLayout(self.button_box)
        _button_box_hlayout.addWidget(self.collect_now_button)
        _button_box_hlayout.addStretch(0)
        _button_box_hlayout.addWidget(self.create_task_button)
        _button_box_hlayout.setSpacing(0)
        _button_box_hlayout.setContentsMargins(0, 0, 0, 0)

        _main_vlayout = QtGui.QVBoxLayout(self)
        _main_vlayout.addWidget(self.method_label)
        _main_vlayout.addWidget(self.tool_box)
        #_main_vlayout.addStretch(0)  
        _main_vlayout.addWidget(self.button_box)
        _main_vlayout.setSpacing(0)
        _main_vlayout.setContentsMargins(0, 0, 0, 0)

        # SizePolicies --------------------------------------------------------
        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
                           QtGui.QSizePolicy.Expanding)


        # Qt signal/slot connections ------------------------------------------
        self.create_task_button.clicked.connect(self.create_task_button_click)
        self.collect_now_button.clicked.connect(self.collect_now_button_click)
        self.tool_box.currentChanged.connect(self.current_page_changed)
Example #2
0
class TaskToolBoxWidget(QtGui.QWidget):
    def __init__(self, parent = None, name = "task_toolbox"):
        QtGui.QWidget.__init__(self, parent)
        self.setObjectName = name

        # Hardware objects ----------------------------------------------------
        self.graphics_manager_hwobj = None

        # Internal variables --------------------------------------------------
        self.tree_brick = None
        self.previous_page_index = 0

        # Graphic elements ----------------------------------------------------
        self.method_group_box = QtGui.QGroupBox(" Collection method", self)
        font = self.method_group_box.font()
        font.setPointSize(10)
        self.method_group_box.setFont(font)
    
        self.tool_box = QtGui.QToolBox(self.method_group_box)
        self.tool_box.setObjectName("tool_box")
        self.tool_box.setFixedWidth(475)
        self.tool_box.setFont(font)
        
        self.discrete_page = CreateDiscreteWidget(self.tool_box, "Discrete",)
        self.char_page = CreateCharWidget(self.tool_box, "Characterise")
        self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page")
        self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan")
        self.xrf_spectrum_page = CreateXRFSpectrumWidget(self.tool_box, "xrf_spectrum")  
        self.advanced_page = CreateAdvancedWidget(self.tool_box, "advanced_scan")
        
        self.tool_box.addItem(self.discrete_page, "Standard Collection")
        self.tool_box.addItem(self.char_page, "Characterisation")
        self.tool_box.addItem(self.helical_page, "Helical Collection")
        self.tool_box.addItem(self.energy_scan_page, "Energy Scan")
        self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum")
        self.tool_box.addItem(self.advanced_page, "Advanced")

        self.button_box = QtGui.QWidget(self)
        self.create_task_button = QtGui.QPushButton("  Add to queue", self.button_box)
        self.create_task_button.setIcon(QtGui.QIcon(Qt4_Icons.load("add_row.png")))
        msg = "Add the collection method to the selected sample"
        self.create_task_button.setToolTip(msg)
        
        # Layout --------------------------------------------------------------
        _method_group_box_vlayout = QtGui.QVBoxLayout(self.method_group_box)
        _method_group_box_vlayout.addWidget(self.tool_box)
        _method_group_box_vlayout.setSpacing(0)
        _method_group_box_vlayout.setContentsMargins(0, 0, 0, 0)

        _button_box_hlayout = QtGui.QHBoxLayout(self.button_box)
        _button_box_hlayout.addStretch(0)
        _button_box_hlayout.addWidget(self.create_task_button)
        _button_box_hlayout.setSpacing(0)
        _button_box_hlayout.setContentsMargins(0, 0, 0, 0)

        _main_vlayout = QtGui.QVBoxLayout(self)
        _main_vlayout.addWidget(self.method_group_box)
        #_main_vlayout.addStretch(0)  
        _main_vlayout.addWidget(self.button_box)
        _main_vlayout.setSpacing(0)
        _main_vlayout.setContentsMargins(0, 0, 0, 0)

        # SizePolicies --------------------------------------------------------
        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
                           QtGui.QSizePolicy.Expanding)


        # Qt signal/slot connections ------------------------------------------
        self.create_task_button.clicked.connect(self.create_task_button_click)
        self.tool_box.currentChanged.connect(self.current_page_changed)

        # Other ---------------------------------------------------------------   

    def set_tree_brick(self, brick):
        """
        Sets the tree brick of each page in the toolbox.
        """
        self.tree_brick = brick
        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).set_tree_brick(brick)

    def set_beamline_setup(self, beamline_setup_hwobj):
        self._beamline_setup_hwobj = beamline_setup_hwobj
        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).set_beamline_setup(beamline_setup_hwobj)

        self.graphics_manager_hwobj = beamline_setup_hwobj.shape_history_hwobj
        self.energy_scan_page.set_energy_scan_hwobj(\
             beamline_setup_hwobj.energyscan_hwobj)

        # Remove energy scan page from non tunable wavelentgh beamlines
        if not beamline_setup_hwobj.tunable_wavelength():
            self.tool_box.removeItem(self.tool_box.indexOf(self.energy_scan_page))
            self.energy_scan_page.hide()

    def update_data_path_model(self):
        for i in range(0, self.tool_box.count()):
            item = self.tool_box.widget(i)
            item.init_data_path_model()
            item.update_selection()

    def ispyb_logged_in(self, logged_in):
        """
        Handels the signal logged_in from the brick the handles LIMS (ISPyB)
        login, ie ProposalBrick. The signal is emitted when a user was 
        succesfully logged in.
        """
        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).ispyb_logged_in(logged_in)
            
    def current_page_changed(self, page_index):
        tree_items =  self.tree_brick.get_selected_items()

        if len(tree_items) > 0:        
            tree_item = tree_items[0]

            # Get the directory form the previous page and update 
            # the new page with the direcotry and run_number from the old.
            # IF sample, basket group selected.
            if type(tree_item) in (Qt4_queue_item.DataCollectionGroupQueueItem, \
                                  Qt4_queue_item.SampleQueueItem, \
                                  Qt4_queue_item.BasketQueueItem):
                new_pt = self.tool_box.widget(page_index)._path_template
                previous_pt = self.tool_box.widget(self.previous_page_index)._path_template
                new_pt.directory = previous_pt.directory
                new_pt.run_number = self._beamline_setup_hwobj.queue_model_hwobj.\
                    get_next_run_number(new_pt)
            elif isinstance(tree_item, Qt4_queue_item.DataCollectionQueueItem):
                data_collection = tree_item.get_model()
                if data_collection.experiment_type == EXPERIMENT_TYPE.HELICAL:
                    if self.tool_box.currentWidget() == self.helical_page:
                        self.create_task_button.setEnabled(True)
                elif self.tool_box.currentWidget() == self.discrete_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item, Qt4_queue_item.CharacterisationQueueItem):
                if self.tool_box.currentWidget() == self.char_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item, Qt4_queue_item.EnergyScanQueueItem):
                if self.tool_box.currentWidget() == self.energy_scan_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item, Qt4_queue_item.XRFScanQueueItem):
                if self.tool_box.currentWidget() == self.xrf_spectrum_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item, Qt4_queue_item.GenericWorkflowQueueItem):
                if self.tool_box.currentWidget() == self.workflow_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item, Qt4_queue_item.AdvancedQueueItem):
                if self.tool_box.currentWidget() == self.advanced_page:
                    self.create_task_button.setEnabled(True)

            self.tool_box.widget(page_index).selection_changed(tree_items)
            self.previous_page_index = page_index

    def selection_changed(self, items):
        """
        Called by the parent widget when selection in the tree changes.
        """
        if len(items) == 1:
            if isinstance(items[0], Qt4_queue_item.DataCollectionGroupQueueItem):
                self.create_task_button.setEnabled(False)
            else:
                self.create_task_button.setEnabled(True)
            if isinstance(items[0], Qt4_queue_item.DataCollectionQueueItem):
                data_collection = items[0].get_model()
                if data_collection.experiment_type == EXPERIMENT_TYPE.HELICAL:
                    self.tool_box.setCurrentWidget(self.helical_page)
                else:
                    self.tool_box.setCurrentWidget(self.discrete_page)
            elif isinstance(items[0], Qt4_queue_item.CharacterisationQueueItem):
                self.tool_box.setCurrentWidget(self.char_page)
            elif isinstance(items[0], Qt4_queue_item.EnergyScanQueueItem):
                self.tool_box.setCurrentWidget(self.energy_scan_page)
            elif isinstance(items[0], Qt4_queue_item.EnergyScanQueueItem):
                self.tool_box.setCurrentWidget(self.xrf_spectrum_page)
            elif isinstance(items[0], Qt4_queue_item.GenericWorkflowQueueItem):
                self.tool_box.setCurrentWidget(self.workflow_page)
            elif isinstance(items[0], Qt4_queue_item.AdvancedQueueItem):
                self.tool_box.setCurrentWidget(self.advanced_page)

        current_page = self.tool_box.currentWidget()
        current_page.selection_changed(items)

    def create_task_button_click(self):
        if self.tool_box.currentWidget().approve_creation():
            items = self.tree_brick.get_selected_items()

            if not items:
                logging.getLogger("user_level_log").\
                    warning("Select the sample or group you "\
                            "would like to add to.")
            else:
                for item in items:
                    shapes = self.graphics_manager_hwobj.get_selected_points()
                    task_model = item.get_model()

                    # Create a new group if sample is selected
                    if isinstance(task_model, queue_model_objects.Sample):
                        task_model = self.create_task_group(task_model)
                        if len(shapes):
                            for shape in shapes:
                                self.create_task(task_model, shape)
                        else:
                            self.create_task(task_model)
                    elif isinstance(task_model, queue_model_objects.Basket):
                        for sample_node in task_model.get_sample_list():
                            child_task_model = self.create_task_group(sample_node)
                            if len(shapes):
                                for shape in shapes:
                                    self.create_task(child_task_model, shape)
                            else:
                                self.create_task(child_task_model)
                    else:
                        if len(shapes):
                            for shape in shapes:
                                self.create_task(task_model, shape)
                        else:
                             self.create_task(task_model)
                self.tree_brick.select_last_added_item()

            self.tool_box.currentWidget().update_selection()

    def create_task_group(self, task_model):
        group_task_node = queue_model_objects.TaskGroup()
        current_item = self.tool_box.currentWidget()
        group_name = current_item._task_node_name
        group_task_node.set_name(group_name)
        num = task_model.get_next_number_for_name(group_name)
        group_task_node.set_number(num)

        self.tree_brick.queue_model_hwobj.\
            add_child(task_model, group_task_node)

        return group_task_node


    def create_task(self, task_node, shape = None):
        # Selected item is a task group
        if isinstance(task_node, queue_model_objects.TaskGroup):
            sample = task_node.get_parent()
            task_list = self.tool_box.currentWidget().create_task(sample, shape)

            for child_task_node in task_list:
                self.tree_brick.queue_model_hwobj.add_child(task_node, child_task_node)
        # The selected item is a task, make a copy.
        else:
            new_node = self.tree_brick.queue_model_hwobj.copy_node(task_node)
            self.tree_brick.queue_model_hwobj.add_child(task_node.get_parent(), new_node)
Example #3
0
class TaskToolBoxWidget(QtGui.QWidget):
    def __init__(self, parent = None, name = "task_toolbox"):
        QtGui.QWidget.__init__(self, parent)
        self.setObjectName = name

        # Hardware objects ----------------------------------------------------
        self.graphics_manager_hwobj = None

        # Internal variables --------------------------------------------------
        self.tree_brick = None
        self.previous_page_index = 0
        self.is_running = None

        # Graphic elements ----------------------------------------------------
        self.method_label = QtGui.QLabel("Collection method", self)
        self.method_label.setAlignment(QtCore.Qt.AlignCenter) 
        #Qt4_widget_colors.set_widget_color(self.method_label,
        #                                   Qt4_widget_colors.SKY_BLUE)
        #font = self.method_group_box.font()
        #font.setPointSize(10)
        #self.method_group_box.setFont(font)
    
        self.tool_box = QtGui.QToolBox(self)
        self.tool_box.setObjectName("tool_box")
        self.tool_box.setFixedWidth(475)
        #self.tool_box.setFont(font)
        
        self.discrete_page = CreateDiscreteWidget(self.tool_box, "Discrete",)
        self.char_page = CreateCharWidget(self.tool_box, "Characterise")
        self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page")
        self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan")
        self.xrf_spectrum_page = CreateXRFSpectrumWidget(self.tool_box, "xrf_spectrum")  
        self.advanced_page = CreateAdvancedWidget(self.tool_box, "advanced_scan")
        
        self.tool_box.addItem(self.discrete_page, "Standard Collection")
        self.tool_box.addItem(self.char_page, "Characterisation")
        self.tool_box.addItem(self.helical_page, "Helical Collection")
        self.tool_box.addItem(self.energy_scan_page, "Energy Scan")
        self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum")
        self.tool_box.addItem(self.advanced_page, "Advanced")

        self.button_box = QtGui.QWidget(self)
        self.create_task_button = QtGui.QPushButton("  Add to queue", self.button_box)
        self.create_task_button.setIcon(Qt4_Icons.load_icon("add_row.png"))
        msg = "Add the collection method to the selected sample"
        self.create_task_button.setToolTip(msg)

        self.collect_now_button = QtGui.QPushButton("Collect Now", self.button_box)
        self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png"))
        self.collect_now_button.hide()
        
        # Layout --------------------------------------------------------------
        #_method_group_box_vlayout = QtGui.QVBoxLayout(self.method_group_box)
        #_method_group_box_vlayout.addWidget(self.tool_box)
        #_method_group_box_vlayout.setSpacing(2)
        #_method_group_box_vlayout.setContentsMargins(2, 2, 2, 2)

        _button_box_hlayout = QtGui.QHBoxLayout(self.button_box)
        _button_box_hlayout.addWidget(self.collect_now_button)
        _button_box_hlayout.addStretch(0)
        _button_box_hlayout.addWidget(self.create_task_button)
        _button_box_hlayout.setSpacing(0)
        _button_box_hlayout.setContentsMargins(0, 0, 0, 0)

        _main_vlayout = QtGui.QVBoxLayout(self)
        _main_vlayout.addWidget(self.method_label)
        _main_vlayout.addWidget(self.tool_box)
        #_main_vlayout.addStretch(0)  
        _main_vlayout.addWidget(self.button_box)
        _main_vlayout.setSpacing(0)
        _main_vlayout.setContentsMargins(0, 0, 0, 0)

        # SizePolicies --------------------------------------------------------
        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
                           QtGui.QSizePolicy.Expanding)


        # Qt signal/slot connections ------------------------------------------
        self.create_task_button.clicked.connect(self.create_task_button_click)
        self.collect_now_button.clicked.connect(self.collect_now_button_click)
        self.tool_box.currentChanged.connect(self.current_page_changed)

        # Other ---------------------------------------------------------------   

    def set_tree_brick(self, brick):
        """
        Sets the tree brick of each page in the toolbox.
        """
        self.tree_brick = brick
        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).set_tree_brick(brick)

    def use_osc_start_cbox(self, status):
        for i in range(0, self.tool_box.count()):
            acq_widget = self.tool_box.widget(i).get_acquisition_widget()
            if acq_widget:
                acq_widget.use_osc_start(status)

    def set_beamline_setup(self, beamline_setup_hwobj):
        self._beamline_setup_hwobj = beamline_setup_hwobj
        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).set_beamline_setup(beamline_setup_hwobj)

        self.graphics_manager_hwobj = beamline_setup_hwobj.shape_history_hwobj

        has_energy_scan = False
        has_xrf_spectrum = False

        if not beamline_setup_hwobj.diffractometer_hwobj.in_plate_mode():
            if hasattr(beamline_setup_hwobj, 'energyscan_hwobj'):
                if beamline_setup_hwobj.energyscan_hwobj is not None and \
                   beamline_setup_hwobj.tunable_wavelength():
                    has_energy_scan = True
                    self.energy_scan_page.set_energy_scan_hwobj(\
                         beamline_setup_hwobj.energyscan_hwobj)

            if hasattr(beamline_setup_hwobj, 'xrf_spectrum_hwobj'):
                if beamline_setup_hwobj.xrf_spectrum_hwobj is not None:
                    has_xrf_spectrum = True

        if not has_energy_scan:
            self.tool_box.removeItem(self.tool_box.indexOf(self.energy_scan_page))
            self.energy_scan_page.hide()
            logging.getLogger("GUI").warning("Energy scan task not available")
        if not has_xrf_spectrum:
            self.tool_box.removeItem(self.tool_box.indexOf(self.xrf_spectrum_page))
            self.xrf_spectrum_page.hide()
            logging.getLogger("GUI").warning("XRF spectrum task not available")

    def update_data_path_model(self):
        for i in range(0, self.tool_box.count()):
            item = self.tool_box.widget(i)
            item.init_data_path_model()
            item.update_selection()

    def ispyb_logged_in(self, logged_in):
        """
        Handels the signal logged_in from the brick the handles LIMS (ISPyB)
        login, ie ProposalBrick. The signal is emitted when a user was 
        succesfully logged in.
        """
        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).ispyb_logged_in(logged_in)
            
    def current_page_changed(self, page_index):
        tree_items =  self.tree_brick.get_selected_items()
        #self.collect_now_button.setHidden(page_index > 0)

        if len(tree_items) > 0:        
            tree_item = tree_items[0]

            # Get the directory form the previous page and update 
            # the new page with the directory and run_number from the old.
            # IF sample, basket group selected.
            if type(tree_item) in (Qt4_queue_item.DataCollectionGroupQueueItem, \
                                   Qt4_queue_item.SampleQueueItem, \
                                   Qt4_queue_item.BasketQueueItem):
                new_pt = self.tool_box.widget(page_index)._path_template
                previous_pt = self.tool_box.widget(self.previous_page_index)._path_template

                new_pt.directory = previous_pt.directory
                new_pt.base_prefix = previous_pt.base_prefix
                new_pt.run_number = self._beamline_setup_hwobj.queue_model_hwobj.\
                    get_next_run_number(new_pt)

            elif isinstance(tree_item, Qt4_queue_item.DataCollectionQueueItem):
                #self.collect_now_button.show()
                data_collection = tree_item.get_model()
                if data_collection.is_helical():
                    if self.tool_box.currentWidget() == self.helical_page:
                        self.create_task_button.setEnabled(True)
                elif data_collection.is_mesh():
                    if self.tool_box.currentWidget() == self.advanced_page:
                        self.create_task_button.setEnabled(True)
                elif self.tool_box.currentWidget() == self.discrete_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item, Qt4_queue_item.CharacterisationQueueItem):
                if self.tool_box.currentWidget() == self.char_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item, Qt4_queue_item.EnergyScanQueueItem):
                if self.tool_box.currentWidget() == self.energy_scan_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item, Qt4_queue_item.XRFSpectrumQueueItem):
                if self.tool_box.currentWidget() == self.xrf_spectrum_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item, Qt4_queue_item.GenericWorkflowQueueItem):
                if self.tool_box.currentWidget() == self.workflow_page:
                    self.create_task_button.setEnabled(True)

            self.tool_box.widget(page_index).selection_changed(tree_items)
            self.previous_page_index = page_index

    def selection_changed(self, items):
        """
        Called by the parent widget when selection in the tree changes.
        """
        title = "<b>Collection method template</b>"

        if len(items) == 1:
            data_model = items[0].get_model()
            title = "<b>%s</b>" % data_model.get_display_name()

            if isinstance(items[0], Qt4_queue_item.DataCollectionGroupQueueItem):
                self.create_task_button.setEnabled(False)
            else:
                self.create_task_button.setEnabled(True)
            if isinstance(items[0], Qt4_queue_item.DataCollectionQueueItem):
                if data_model.is_helical():
                    self.tool_box.setCurrentWidget(self.helical_page)
                elif data_model.is_mesh():
                    self.tool_box.setCurrentWidget(self.advanced_page)
                else:
                    self.tool_box.setCurrentWidget(self.discrete_page)
            elif isinstance(items[0], Qt4_queue_item.CharacterisationQueueItem):
                self.tool_box.setCurrentWidget(self.char_page)
            elif isinstance(items[0], Qt4_queue_item.EnergyScanQueueItem):
                self.tool_box.setCurrentWidget(self.energy_scan_page)
            elif isinstance(items[0], Qt4_queue_item.XRFSpectrumQueueItem):
                self.tool_box.setCurrentWidget(self.xrf_spectrum_page)
            elif isinstance(items[0], Qt4_queue_item.GenericWorkflowQueueItem):
                self.tool_box.setCurrentWidget(self.workflow_page)
            elif isinstance(items[0], Qt4_queue_item.SampleQueueItem):
                title = "<b>Sample: %s</b>" % data_model.get_display_name()
            self.method_label.setText(title) 

        current_page = self.tool_box.currentWidget()
        current_page.selection_changed(items)

    def create_task_button_click(self):
        if self.tool_box.currentWidget().approve_creation():
            items = self.tree_brick.get_selected_items()

            if not items:
                logging.getLogger("GUI").\
                    warning("Select the sample or group you "\
                            "would like to add to.")
            else:
                for item in items:
                    shapes = self.graphics_manager_hwobj.get_selected_points()
                    task_model = item.get_model()

                    # Create a new group if sample is selected
                    if isinstance(task_model, queue_model_objects.Sample):
                        task_model = self.create_task_group(task_model)
                        if self.tool_box.currentWidget() in (self.discrete_page, 
                           self.char_page, self.energy_scan_page, 
                           self.xrf_spectrum_page) and len(shapes):
                            #This could be done in more nicer way...
                            for shape in shapes:
                                self.create_task(task_model, shape)
                        else:
                            self.create_task(task_model)
                    elif isinstance(task_model, queue_model_objects.Basket):
                        for sample_node in task_model.get_sample_list():
                            child_task_model = self.create_task_group(sample_node)
                            if self.tool_box.currentWidget() in (self.discrete_page,
                               self.char_page, self.energy_scan_page, 
                               self.xrf_spectrum_page) and len(shapes):
                                for shape in shapes:
                                    self.create_task(child_task_model, shape)
                            else:
                                self.create_task(child_task_model)
                    else:
                        if self.tool_box.currentWidget() in (self.discrete_page,
                           self.char_page, self.energy_scan_page, 
                           self.xrf_spectrum_page) and len(shapes):
                            for shape in shapes:
                                self.create_task(task_model, shape)
                        else:
                             self.create_task(task_model)
                self.tree_brick.select_last_added_item()

            self.tool_box.currentWidget().update_selection()

    def create_task_group(self, task_model):
        group_task_node = queue_model_objects.TaskGroup()
        current_item = self.tool_box.currentWidget()

        group_name = current_item._task_node_name
        group_task_node.set_name(group_name)
        num = task_model.get_next_number_for_name(group_name)
        group_task_node.set_number(num)

        self.tree_brick.queue_model_hwobj.\
            add_child(task_model, group_task_node)

        return group_task_node


    def create_task(self, task_node, shape = None):
        # Selected item is a task group
        if isinstance(task_node, queue_model_objects.TaskGroup):
            sample = task_node.get_parent()
            task_list = self.tool_box.currentWidget().\
                create_task(sample, shape)

            for child_task_node in task_list:
                self.tree_brick.queue_model_hwobj.\
                     add_child(task_node, child_task_node)
        # The selected item is a task, make a copy.
        else:
            new_node = self.tree_brick.queue_model_hwobj.copy_node(task_node)
            new_node.acquisitions[0].acquisition_parameters.\
                centred_position.snapshot_image = self._beamline_setup_hwobj.\
                shape_history_hwobj.get_scene_snapshot()
            self.tree_brick.queue_model_hwobj.add_child(task_node.get_parent(), new_node)

    def collect_now_button_click(self):
        if self.is_running:
            self._beamline_setup_hwobj.collect_hwobj.stop_collect()
            self.is_running = False
            self.collect_now_button.setText("Collect Now")
            self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png"))
        elif self.tool_box.currentWidget().approve_creation():
            sample_item = self.tree_brick.dc_tree_widget.\
                 get_mounted_sample_item()
            self.collect_now_button.setText("Stop")   
            self.collect_now_button.setIcon(Qt4_Icons.load_icon("Stop.png"))

            self.is_running = True 
            self.tool_box.currentWidget().execute_task(\
                 sample_item.get_model())
            self.is_running = False
            self.collect_now_button.setText("Collect Now")
            self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png"))
Example #4
0
    def __init__(self, parent=None, name="task_toolbox"):
        QtGui.QWidget.__init__(self, parent)
        self.setObjectName = name

        # Hardware objects ----------------------------------------------------
        self.graphics_manager_hwobj = None

        # Internal variables --------------------------------------------------
        self.tree_brick = None
        self.previous_page_index = 0
        self.is_running = None

        # Graphic elements ----------------------------------------------------
        self.method_label = QtGui.QLabel("Collection method", self)
        self.method_label.setAlignment(QtCore.Qt.AlignCenter)
        #Qt4_widget_colors.set_widget_color(self.method_label,
        #                                   Qt4_widget_colors.SKY_BLUE)
        #font = self.method_group_box.font()
        #font.setPointSize(10)
        #self.method_group_box.setFont(font)

        self.tool_box = QtGui.QToolBox(self)
        self.tool_box.setObjectName("tool_box")
        self.tool_box.setFixedWidth(475)
        #self.tool_box.setFont(font)

        self.discrete_page = CreateDiscreteWidget(
            self.tool_box,
            "Discrete",
        )
        self.char_page = CreateCharWidget(self.tool_box, "Characterise")
        self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page")
        self.energy_scan_page = CreateEnergyScanWidget(self.tool_box,
                                                       "energy_scan")
        self.xrf_spectrum_page = CreateXRFSpectrumWidget(
            self.tool_box, "xrf_spectrum")
        self.advanced_page = CreateAdvancedWidget(self.tool_box,
                                                  "advanced_scan")

        self.tool_box.addItem(self.discrete_page, "Standard Collection")
        self.tool_box.addItem(self.char_page, "Characterisation")
        self.tool_box.addItem(self.helical_page, "Helical Collection")
        self.tool_box.addItem(self.energy_scan_page, "Energy Scan")
        self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum")
        self.tool_box.addItem(self.advanced_page, "Advanced")

        self.button_box = QtGui.QWidget(self)
        self.create_task_button = QtGui.QPushButton("  Add to queue",
                                                    self.button_box)
        self.create_task_button.setIcon(Qt4_Icons.load_icon("add_row.png"))
        msg = "Add the collection method to the selected sample"
        self.create_task_button.setToolTip(msg)

        self.collect_now_button = QtGui.QPushButton("Collect Now",
                                                    self.button_box)
        self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png"))
        self.collect_now_button.hide()

        # Layout --------------------------------------------------------------
        #_method_group_box_vlayout = QtGui.QVBoxLayout(self.method_group_box)
        #_method_group_box_vlayout.addWidget(self.tool_box)
        #_method_group_box_vlayout.setSpacing(2)
        #_method_group_box_vlayout.setContentsMargins(2, 2, 2, 2)

        _button_box_hlayout = QtGui.QHBoxLayout(self.button_box)
        _button_box_hlayout.addWidget(self.collect_now_button)
        _button_box_hlayout.addStretch(0)
        _button_box_hlayout.addWidget(self.create_task_button)
        _button_box_hlayout.setSpacing(0)
        _button_box_hlayout.setContentsMargins(0, 0, 0, 0)

        _main_vlayout = QtGui.QVBoxLayout(self)
        _main_vlayout.addWidget(self.method_label)
        _main_vlayout.addWidget(self.tool_box)
        #_main_vlayout.addStretch(0)
        _main_vlayout.addWidget(self.button_box)
        _main_vlayout.setSpacing(0)
        _main_vlayout.setContentsMargins(0, 0, 0, 0)

        # SizePolicies --------------------------------------------------------
        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
                           QtGui.QSizePolicy.Expanding)

        # Qt signal/slot connections ------------------------------------------
        self.create_task_button.clicked.connect(self.create_task_button_click)
        self.collect_now_button.clicked.connect(self.collect_now_button_click)
        self.tool_box.currentChanged.connect(self.current_page_changed)
    def __init__(self, parent = None, name = "task_toolbox"):
        QtGui.QWidget.__init__(self, parent)
        self.setObjectName = name

        # Hardware objects ----------------------------------------------------
        self.graphics_manager_hwobj = None

        # Internal variables --------------------------------------------------
        self.tree_brick = None
        self.previous_page_index = 0

        # Graphic elements ----------------------------------------------------
        self.method_group_box = QtGui.QGroupBox(" Collection method", self)
        font = self.method_group_box.font()
        font.setPointSize(10)
        self.method_group_box.setFont(font)
    
        self.tool_box = QtGui.QToolBox(self.method_group_box)
        self.tool_box.setObjectName("tool_box")
        self.tool_box.setFixedWidth(475)
        self.tool_box.setFont(font)
        
        self.discrete_page = CreateDiscreteWidget(self.tool_box, "Discrete",)
        self.char_page = CreateCharWidget(self.tool_box, "Characterise")
        self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page")
        self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan")
        self.xrf_scan_page = CreateXRFScanWidget(self.tool_box, "xrf_scan")  
        self.advanced_scan_page = CreateAdvancedScanWidget(self.tool_box, "advanced_scan")
        
        self.tool_box.addItem(self.discrete_page, "Standard Collection")
        self.tool_box.addItem(self.char_page, "Characterisation")
        self.tool_box.addItem(self.helical_page, "Helical Collection")
        self.tool_box.addItem(self.energy_scan_page, "Energy Scan")
        self.tool_box.addItem(self.xrf_scan_page, "XRF Scan")
        self.tool_box.addItem(self.advanced_scan_page, "Advanced")

        self.button_box = QtGui.QWidget(self)
        self.create_task_button = QtGui.QPushButton("  Add to queue", self.button_box)
        self.create_task_button.setIcon(QtGui.QIcon(Qt4_Icons.load("add_row.png")))
        msg = "Add the collection method to the selected sample"
        self.create_task_button.setToolTip(msg)
        
        # Layout --------------------------------------------------------------
        self.method_group_box_layout = QtGui.QVBoxLayout(self)
        self.method_group_box_layout.addWidget(self.tool_box)
        self.method_group_box_layout.setSpacing(0)
        self.method_group_box_layout.setContentsMargins(0, 0, 0, 0)
        self.method_group_box.setLayout(self.method_group_box_layout)

        self.button_box_layout = QtGui.QHBoxLayout(self)
        self.button_box_layout.addStretch(0)
        self.button_box_layout.addWidget(self.create_task_button)
        self.button_box_layout.setSpacing(0)
        self.button_box_layout.setContentsMargins(0, 0, 0, 0)
        self.button_box.setLayout(self.button_box_layout)

        self.main_layout = QtGui.QVBoxLayout(self)
        self.main_layout.addWidget(self.method_group_box)
        self.main_layout.addWidget(self.button_box)
        self.main_layout.setSpacing(0)
        self.main_layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(self.main_layout) 

        # SizePolicies --------------------------------------------------------
        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
                           QtGui.QSizePolicy.Expanding)


        # Qt signal/slot connections ------------------------------------------
        self.connect(self.create_task_button, QtCore.SIGNAL("clicked()"),
                     self.create_task_button_click)

        self.connect(self.tool_box, QtCore.SIGNAL("currentChanged( int )"),
                     self.current_page_changed)
Example #6
0
    def __init__(self, parent = None, name = "task_toolbox"):
        QtGui.QWidget.__init__(self, parent)
        self.setObjectName = name

        # LNLS
        self.parent = parent

        # Hardware objects ----------------------------------------------------
        self.graphics_manager_hwobj = None

        # Internal variables --------------------------------------------------
        self.tree_brick = None
        self.previous_page_index = 0

        # Graphic elements ----------------------------------------------------
        self.method_group_box = QtGui.QGroupBox(" Collection method", self)
        font = self.method_group_box.font()
        font.setPointSize(10)
        self.method_group_box.setFont(font)

        # -------------------------------------------------------
        # LNLS
        style_string = """QToolBox { background-color: rgb(0,128,255); }"""
        self.setStyleSheet(style_string)
        # -------------------------------------------------------

        self.tool_box = QtGui.QToolBox(self.method_group_box)
        self.tool_box.setObjectName("tool_box")
        self.tool_box.setFixedWidth(475)
        # LNLS
        self.tool_box.setFixedHeight(705)
        self.tool_box.setFont(font)
        
        self.discrete_page = CreateDiscreteWidget(self.tool_box, "Discrete", parent_class=self)
        # LNLS
        #self.char_page = CreateCharWidget(self.tool_box, "Characterise")
        #self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page")
        self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan", parent_class=self)
        #self.xrf_spectrum_page = CreateXRFSpectrumWidget(self.tool_box, "xrf_spectrum")  
        #self.advanced_page = CreateAdvancedWidget(self.tool_box, "advanced_scan")
        
        self.tool_box.addItem(self.discrete_page, QtGui.QIcon(Qt4_Icons.load("down_small.png")), "Standard Collection")
        #self.tool_box.addItem(self.char_page, "Characterisation")
        #self.tool_box.addItem(self.helical_page, "Helical Collection")
        self.tool_box.addItem(self.energy_scan_page, QtGui.QIcon(Qt4_Icons.load("down_small.png")), "Energy Scan")
        #self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum")
        #self.tool_box.addItem(self.advanced_page, "Advanced")

        self.button_box = QtGui.QWidget(self)
        self.create_task_button = QtGui.QPushButton("  Add to queue", self.button_box)
        self.create_task_button.setIcon(QtGui.QIcon(Qt4_Icons.load("add_row.png")))
        msg = "Add the collection method to the selected sample"
        self.create_task_button.setToolTip(msg)
        
        # Layout --------------------------------------------------------------
        _method_group_box_vlayout = QtGui.QVBoxLayout(self.method_group_box)
        _method_group_box_vlayout.addWidget(self.tool_box)
        _method_group_box_vlayout.setSpacing(0)
        _method_group_box_vlayout.setContentsMargins(0, 0, 0, 0)

        _button_box_hlayout = QtGui.QHBoxLayout(self.button_box)
        _button_box_hlayout.addStretch(0)
        _button_box_hlayout.addWidget(self.create_task_button)
        _button_box_hlayout.setSpacing(0)
        _button_box_hlayout.setContentsMargins(0, 0, 0, 0)

        _main_vlayout = QtGui.QVBoxLayout(self)
        _main_vlayout.addWidget(self.method_group_box)
        #_main_vlayout.addStretch(0)  
        _main_vlayout.addWidget(self.button_box)
        _main_vlayout.setSpacing(0)
        _main_vlayout.setContentsMargins(0, 0, 0, 0)

        # SizePolicies --------------------------------------------------------
        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
                           QtGui.QSizePolicy.Expanding)


        # Qt signal/slot connections ------------------------------------------
        self.create_task_button.clicked.connect(self.create_task_button_click)
        self.tool_box.currentChanged.connect(self.current_page_changed)
Example #7
0
class TaskToolBoxWidget(QtGui.QWidget):
    def __init__(self, parent=None, name="task_toolbox"):
        QtGui.QWidget.__init__(self, parent)
        self.setObjectName = name

        # Hardware objects ----------------------------------------------------
        self.graphics_manager_hwobj = None

        # Internal variables --------------------------------------------------
        self.tree_brick = None
        self.previous_page_index = 0
        self.is_running = None

        # Graphic elements ----------------------------------------------------
        self.method_label = QtGui.QLabel("Collection method", self)
        self.method_label.setAlignment(QtCore.Qt.AlignCenter)
        #Qt4_widget_colors.set_widget_color(self.method_label,
        #                                   Qt4_widget_colors.SKY_BLUE)
        #font = self.method_group_box.font()
        #font.setPointSize(10)
        #self.method_group_box.setFont(font)

        self.tool_box = QtGui.QToolBox(self)
        self.tool_box.setObjectName("tool_box")
        self.tool_box.setFixedWidth(475)
        #self.tool_box.setFont(font)

        self.discrete_page = CreateDiscreteWidget(
            self.tool_box,
            "Discrete",
        )
        self.char_page = CreateCharWidget(self.tool_box, "Characterise")
        self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page")
        self.energy_scan_page = CreateEnergyScanWidget(self.tool_box,
                                                       "energy_scan")
        self.xrf_spectrum_page = CreateXRFSpectrumWidget(
            self.tool_box, "xrf_spectrum")
        self.advanced_page = CreateAdvancedWidget(self.tool_box,
                                                  "advanced_scan")

        self.tool_box.addItem(self.discrete_page, "Standard Collection")
        self.tool_box.addItem(self.char_page, "Characterisation")
        self.tool_box.addItem(self.helical_page, "Helical Collection")
        self.tool_box.addItem(self.energy_scan_page, "Energy Scan")
        self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum")
        self.tool_box.addItem(self.advanced_page, "Advanced")

        self.button_box = QtGui.QWidget(self)
        self.create_task_button = QtGui.QPushButton("  Add to queue",
                                                    self.button_box)
        self.create_task_button.setIcon(Qt4_Icons.load_icon("add_row.png"))
        msg = "Add the collection method to the selected sample"
        self.create_task_button.setToolTip(msg)

        self.collect_now_button = QtGui.QPushButton("Collect Now",
                                                    self.button_box)
        self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png"))
        self.collect_now_button.hide()

        # Layout --------------------------------------------------------------
        #_method_group_box_vlayout = QtGui.QVBoxLayout(self.method_group_box)
        #_method_group_box_vlayout.addWidget(self.tool_box)
        #_method_group_box_vlayout.setSpacing(2)
        #_method_group_box_vlayout.setContentsMargins(2, 2, 2, 2)

        _button_box_hlayout = QtGui.QHBoxLayout(self.button_box)
        _button_box_hlayout.addWidget(self.collect_now_button)
        _button_box_hlayout.addStretch(0)
        _button_box_hlayout.addWidget(self.create_task_button)
        _button_box_hlayout.setSpacing(0)
        _button_box_hlayout.setContentsMargins(0, 0, 0, 0)

        _main_vlayout = QtGui.QVBoxLayout(self)
        _main_vlayout.addWidget(self.method_label)
        _main_vlayout.addWidget(self.tool_box)
        #_main_vlayout.addStretch(0)
        _main_vlayout.addWidget(self.button_box)
        _main_vlayout.setSpacing(0)
        _main_vlayout.setContentsMargins(0, 0, 0, 0)

        # SizePolicies --------------------------------------------------------
        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
                           QtGui.QSizePolicy.Expanding)

        # Qt signal/slot connections ------------------------------------------
        self.create_task_button.clicked.connect(self.create_task_button_click)
        self.collect_now_button.clicked.connect(self.collect_now_button_click)
        self.tool_box.currentChanged.connect(self.current_page_changed)

        # Other ---------------------------------------------------------------

    def set_tree_brick(self, brick):
        """
        Sets the tree brick of each page in the toolbox.
        """
        self.tree_brick = brick
        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).set_tree_brick(brick)

    def use_osc_start_cbox(self, status):
        for i in range(0, self.tool_box.count()):
            acq_widget = self.tool_box.widget(i).get_acquisition_widget()
            if acq_widget:
                acq_widget.use_osc_start(status)

    def set_beamline_setup(self, beamline_setup_hwobj):
        self._beamline_setup_hwobj = beamline_setup_hwobj
        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).set_beamline_setup(beamline_setup_hwobj)

        self.graphics_manager_hwobj = beamline_setup_hwobj.shape_history_hwobj

        has_energy_scan = False
        has_xrf_spectrum = False

        if not beamline_setup_hwobj.diffractometer_hwobj.in_plate_mode():
            if hasattr(beamline_setup_hwobj, 'energyscan_hwobj'):
                if beamline_setup_hwobj.energyscan_hwobj is not None and \
                   beamline_setup_hwobj.tunable_wavelength():
                    has_energy_scan = True
                    self.energy_scan_page.set_energy_scan_hwobj(\
                         beamline_setup_hwobj.energyscan_hwobj)

            if hasattr(beamline_setup_hwobj, 'xrf_spectrum_hwobj'):
                if beamline_setup_hwobj.xrf_spectrum_hwobj is not None:
                    has_xrf_spectrum = True

        if not has_energy_scan:
            self.tool_box.removeItem(
                self.tool_box.indexOf(self.energy_scan_page))
            self.energy_scan_page.hide()
            logging.getLogger("GUI").warning("Energy scan task not available")
        if not has_xrf_spectrum:
            self.tool_box.removeItem(
                self.tool_box.indexOf(self.xrf_spectrum_page))
            self.xrf_spectrum_page.hide()
            logging.getLogger("GUI").warning("XRF spectrum task not available")

    def update_data_path_model(self):
        for i in range(0, self.tool_box.count()):
            item = self.tool_box.widget(i)
            item.init_data_path_model()
            item.update_selection()

    def ispyb_logged_in(self, logged_in):
        """
        Handels the signal logged_in from the brick the handles LIMS (ISPyB)
        login, ie ProposalBrick. The signal is emitted when a user was 
        succesfully logged in.
        """
        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).ispyb_logged_in(logged_in)

    def current_page_changed(self, page_index):
        tree_items = self.tree_brick.get_selected_items()
        #self.collect_now_button.setHidden(page_index > 0)

        if len(tree_items) > 0:
            tree_item = tree_items[0]

            # Get the directory form the previous page and update
            # the new page with the directory and run_number from the old.
            # IF sample, basket group selected.
            if type(tree_item) in (Qt4_queue_item.DataCollectionGroupQueueItem, \
                                   Qt4_queue_item.SampleQueueItem, \
                                   Qt4_queue_item.BasketQueueItem):
                new_pt = self.tool_box.widget(page_index)._path_template
                previous_pt = self.tool_box.widget(
                    self.previous_page_index)._path_template

                new_pt.directory = previous_pt.directory
                new_pt.base_prefix = previous_pt.base_prefix
                new_pt.run_number = self._beamline_setup_hwobj.queue_model_hwobj.\
                    get_next_run_number(new_pt)

            elif isinstance(tree_item, Qt4_queue_item.DataCollectionQueueItem):
                #self.collect_now_button.show()
                data_collection = tree_item.get_model()
                if data_collection.is_helical():
                    if self.tool_box.currentWidget() == self.helical_page:
                        self.create_task_button.setEnabled(True)
                elif data_collection.is_mesh():
                    if self.tool_box.currentWidget() == self.advanced_page:
                        self.create_task_button.setEnabled(True)
                elif self.tool_box.currentWidget() == self.discrete_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item,
                            Qt4_queue_item.CharacterisationQueueItem):
                if self.tool_box.currentWidget() == self.char_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item, Qt4_queue_item.EnergyScanQueueItem):
                if self.tool_box.currentWidget() == self.energy_scan_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item, Qt4_queue_item.XRFSpectrumQueueItem):
                if self.tool_box.currentWidget() == self.xrf_spectrum_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item,
                            Qt4_queue_item.GenericWorkflowQueueItem):
                if self.tool_box.currentWidget() == self.workflow_page:
                    self.create_task_button.setEnabled(True)

            self.tool_box.widget(page_index).selection_changed(tree_items)
            self.previous_page_index = page_index

    def selection_changed(self, items):
        """
        Called by the parent widget when selection in the tree changes.
        """
        title = "<b>Collection method template</b>"

        if len(items) == 1:
            data_model = items[0].get_model()
            title = "<b>%s</b>" % data_model.get_display_name()

            if isinstance(items[0],
                          Qt4_queue_item.DataCollectionGroupQueueItem):
                self.create_task_button.setEnabled(False)
            else:
                self.create_task_button.setEnabled(True)
            if isinstance(items[0], Qt4_queue_item.DataCollectionQueueItem):
                if data_model.is_helical():
                    self.tool_box.setCurrentWidget(self.helical_page)
                elif data_model.is_mesh():
                    self.tool_box.setCurrentWidget(self.advanced_page)
                else:
                    self.tool_box.setCurrentWidget(self.discrete_page)
            elif isinstance(items[0],
                            Qt4_queue_item.CharacterisationQueueItem):
                self.tool_box.setCurrentWidget(self.char_page)
            elif isinstance(items[0], Qt4_queue_item.EnergyScanQueueItem):
                self.tool_box.setCurrentWidget(self.energy_scan_page)
            elif isinstance(items[0], Qt4_queue_item.XRFSpectrumQueueItem):
                self.tool_box.setCurrentWidget(self.xrf_spectrum_page)
            elif isinstance(items[0], Qt4_queue_item.GenericWorkflowQueueItem):
                self.tool_box.setCurrentWidget(self.workflow_page)
            elif isinstance(items[0], Qt4_queue_item.SampleQueueItem):
                title = "<b>Sample: %s</b>" % data_model.get_display_name()
            self.method_label.setText(title)

        current_page = self.tool_box.currentWidget()
        current_page.selection_changed(items)

    def create_task_button_click(self):
        if self.tool_box.currentWidget().approve_creation():
            items = self.tree_brick.get_selected_items()

            if not items:
                logging.getLogger("GUI").\
                    warning("Select the sample or group you "\
                            "would like to add to.")
            else:
                for item in items:
                    shapes = self.graphics_manager_hwobj.get_selected_points()
                    task_model = item.get_model()

                    # Create a new group if sample is selected
                    if isinstance(task_model, queue_model_objects.Sample):
                        task_model = self.create_task_group(task_model)
                        if self.tool_box.currentWidget() in (
                                self.discrete_page, self.char_page,
                                self.energy_scan_page,
                                self.xrf_spectrum_page) and len(shapes):
                            #This could be done in more nicer way...
                            for shape in shapes:
                                self.create_task(task_model, shape)
                        else:
                            self.create_task(task_model)
                    elif isinstance(task_model, queue_model_objects.Basket):
                        for sample_node in task_model.get_sample_list():
                            child_task_model = self.create_task_group(
                                sample_node)
                            if self.tool_box.currentWidget() in (
                                    self.discrete_page, self.char_page,
                                    self.energy_scan_page,
                                    self.xrf_spectrum_page) and len(shapes):
                                for shape in shapes:
                                    self.create_task(child_task_model, shape)
                            else:
                                self.create_task(child_task_model)
                    else:
                        if self.tool_box.currentWidget() in (
                                self.discrete_page, self.char_page,
                                self.energy_scan_page,
                                self.xrf_spectrum_page) and len(shapes):
                            for shape in shapes:
                                self.create_task(task_model, shape)
                        else:
                            self.create_task(task_model)
                self.tree_brick.select_last_added_item()

            self.tool_box.currentWidget().update_selection()

    def create_task_group(self, task_model):
        group_task_node = queue_model_objects.TaskGroup()
        current_item = self.tool_box.currentWidget()

        group_name = current_item._task_node_name
        group_task_node.set_name(group_name)
        num = task_model.get_next_number_for_name(group_name)
        group_task_node.set_number(num)

        self.tree_brick.queue_model_hwobj.\
            add_child(task_model, group_task_node)

        return group_task_node

    def create_task(self, task_node, shape=None):
        # Selected item is a task group
        if isinstance(task_node, queue_model_objects.TaskGroup):
            sample = task_node.get_parent()
            task_list = self.tool_box.currentWidget().\
                create_task(sample, shape)

            for child_task_node in task_list:
                self.tree_brick.queue_model_hwobj.\
                     add_child(task_node, child_task_node)
        # The selected item is a task, make a copy.
        else:
            new_node = self.tree_brick.queue_model_hwobj.copy_node(task_node)
            new_node.acquisitions[0].acquisition_parameters.\
                centred_position.snapshot_image = self._beamline_setup_hwobj.\
                shape_history_hwobj.get_scene_snapshot()
            self.tree_brick.queue_model_hwobj.add_child(
                task_node.get_parent(), new_node)

    def collect_now_button_click(self):
        if self.is_running:
            self._beamline_setup_hwobj.collect_hwobj.stop_collect()
            self.is_running = False
            self.collect_now_button.setText("Collect Now")
            self.collect_now_button.setIcon(
                Qt4_Icons.load_icon("VCRPlay2.png"))
        elif self.tool_box.currentWidget().approve_creation():
            sample_item = self.tree_brick.dc_tree_widget.\
                 get_mounted_sample_item()
            self.collect_now_button.setText("Stop")
            self.collect_now_button.setIcon(Qt4_Icons.load_icon("Stop.png"))

            self.is_running = True
            self.tool_box.currentWidget().execute_task(\
                 sample_item.get_model())
            self.is_running = False
            self.collect_now_button.setText("Collect Now")
            self.collect_now_button.setIcon(
                Qt4_Icons.load_icon("VCRPlay2.png"))
Example #8
0
class TaskToolBoxWidget(QtGui.QWidget):
    def __init__(self, parent = None, name = "task_toolbox"):
        QtGui.QWidget.__init__(self, parent)
        self.setObjectName = name

        # LNLS
        self.parent = parent

        # Hardware objects ----------------------------------------------------
        self.graphics_manager_hwobj = None

        # Internal variables --------------------------------------------------
        self.tree_brick = None
        self.previous_page_index = 0

        # Graphic elements ----------------------------------------------------
        self.method_group_box = QtGui.QGroupBox(" Collection method", self)
        font = self.method_group_box.font()
        font.setPointSize(10)
        self.method_group_box.setFont(font)

        # -------------------------------------------------------
        # LNLS
        style_string = """QToolBox { background-color: rgb(0,128,255); }"""
        self.setStyleSheet(style_string)
        # -------------------------------------------------------

        self.tool_box = QtGui.QToolBox(self.method_group_box)
        self.tool_box.setObjectName("tool_box")
        self.tool_box.setFixedWidth(475)
        # LNLS
        self.tool_box.setFixedHeight(705)
        self.tool_box.setFont(font)
        
        self.discrete_page = CreateDiscreteWidget(self.tool_box, "Discrete", parent_class=self)
        # LNLS
        #self.char_page = CreateCharWidget(self.tool_box, "Characterise")
        #self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page")
        self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan", parent_class=self)
        #self.xrf_spectrum_page = CreateXRFSpectrumWidget(self.tool_box, "xrf_spectrum")  
        #self.advanced_page = CreateAdvancedWidget(self.tool_box, "advanced_scan")
        
        self.tool_box.addItem(self.discrete_page, QtGui.QIcon(Qt4_Icons.load("down_small.png")), "Standard Collection")
        #self.tool_box.addItem(self.char_page, "Characterisation")
        #self.tool_box.addItem(self.helical_page, "Helical Collection")
        self.tool_box.addItem(self.energy_scan_page, QtGui.QIcon(Qt4_Icons.load("down_small.png")), "Energy Scan")
        #self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum")
        #self.tool_box.addItem(self.advanced_page, "Advanced")

        self.button_box = QtGui.QWidget(self)
        self.create_task_button = QtGui.QPushButton("  Add to queue", self.button_box)
        self.create_task_button.setIcon(QtGui.QIcon(Qt4_Icons.load("add_row.png")))
        msg = "Add the collection method to the selected sample"
        self.create_task_button.setToolTip(msg)
        
        # Layout --------------------------------------------------------------
        _method_group_box_vlayout = QtGui.QVBoxLayout(self.method_group_box)
        _method_group_box_vlayout.addWidget(self.tool_box)
        _method_group_box_vlayout.setSpacing(0)
        _method_group_box_vlayout.setContentsMargins(0, 0, 0, 0)

        _button_box_hlayout = QtGui.QHBoxLayout(self.button_box)
        _button_box_hlayout.addStretch(0)
        _button_box_hlayout.addWidget(self.create_task_button)
        _button_box_hlayout.setSpacing(0)
        _button_box_hlayout.setContentsMargins(0, 0, 0, 0)

        _main_vlayout = QtGui.QVBoxLayout(self)
        _main_vlayout.addWidget(self.method_group_box)
        #_main_vlayout.addStretch(0)  
        _main_vlayout.addWidget(self.button_box)
        _main_vlayout.setSpacing(0)
        _main_vlayout.setContentsMargins(0, 0, 0, 0)

        # SizePolicies --------------------------------------------------------
        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
                           QtGui.QSizePolicy.Expanding)


        # Qt signal/slot connections ------------------------------------------
        self.create_task_button.clicked.connect(self.create_task_button_click)
        self.tool_box.currentChanged.connect(self.current_page_changed)

        # Other ---------------------------------------------------------------   

    def set_tree_brick(self, brick):
        """
        Sets the tree brick of each page in the toolbox.
        """
        self.tree_brick = brick
        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).set_tree_brick(brick)

    def set_beamline_setup(self, beamline_setup_hwobj):
        self._beamline_setup_hwobj = beamline_setup_hwobj
        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).set_beamline_setup(beamline_setup_hwobj)

        self.graphics_manager_hwobj = beamline_setup_hwobj.shape_history_hwobj
        self.energy_scan_page.set_energy_scan_hwobj(beamline_setup_hwobj.energyscan_hwobj)

        # Remove energy scan page from non tunable wavelentgh beamlines
        if not beamline_setup_hwobj.tunable_wavelength():
             self.tool_box.removeItem(self.tool_box.indexOf(self.energy_scan_page))
             self.energy_scan_page.hide()
             logging.getLogger("user_level_log").info("Energy scan task not available")
        
        has_xrf_spectrum = False
        if hasattr(beamline_setup_hwobj, 'xrf_spectrum_hwobj'):
            if beamline_setup_hwobj.xrf_spectrum_hwobj:
                has_xrf_spectrum = True

        if not has_xrf_spectrum:
            self.tool_box.removeItem(self.tool_box.indexOf(self.xrf_spectrum_page))
            self.xrf_spectrum_page.hide()
            logging.getLogger("user_level_log").info("XRF spectrum task not available")

    def update_data_path_model(self):
        for i in range(0, self.tool_box.count()):
            item = self.tool_box.widget(i)
            item.init_data_path_model()
            item.update_selection()

    def ispyb_logged_in(self, logged_in):
        """
        Handels the signal logged_in from the brick the handles LIMS (ISPyB)
        login, ie ProposalBrick. The signal is emitted when a user was 
        succesfully logged in.
        """
        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).ispyb_logged_in(logged_in)
            
    def current_page_changed(self, page_index):
        tree_items =  self.tree_brick.get_selected_items()

        if len(tree_items) > 0:        
            tree_item = tree_items[0]

            # Get the directory form the previous page and update 
            # the new page with the direcotry and run_number from the old.
            # IF sample, basket group selected.
            if type(tree_item) in (Qt4_queue_item.DataCollectionGroupQueueItem, \
                                  Qt4_queue_item.SampleQueueItem, \
                                  Qt4_queue_item.BasketQueueItem):
                new_pt = self.tool_box.widget(page_index)._path_template
                previous_pt = self.tool_box.widget(self.previous_page_index)._path_template
                new_pt.directory = previous_pt.directory
                new_pt.run_number = self._beamline_setup_hwobj.queue_model_hwobj.\
                    get_next_run_number(new_pt)
            elif isinstance(tree_item, Qt4_queue_item.DataCollectionQueueItem):
                data_collection = tree_item.get_model()
                # if data_collection.experiment_type == EXPERIMENT_TYPE.HELICAL:
                #     if self.tool_box.currentWidget() == self.helical_page:
                #         self.create_task_button.setEnabled(True)
                # elif self.tool_box.currentWidget() == self.discrete_page:
                if self.tool_box.currentWidget() == self.discrete_page:
                    # LNLS
                    #self.create_task_button.setEnabled(True)
                    self.create_task_button.setEnabled(False)
            # elif isinstance(tree_item, Qt4_queue_item.CharacterisationQueueItem):
            #     if self.tool_box.currentWidget() == self.char_page:
            #         self.create_task_button.setEnabled(True)
            elif isinstance(tree_item, Qt4_queue_item.EnergyScanQueueItem):
                if self.tool_box.currentWidget() == self.energy_scan_page:
                    # LNLS
                    #self.create_task_button.setEnabled(True)
                    self.create_task_button.setEnabled(False)
            # elif isinstance(tree_item, Qt4_queue_item.XRFSpectrumQueueItem):
            #     if self.tool_box.currentWidget() == self.xrf_spectrum_page:
            #         self.create_task_button.setEnabled(True)
            # elif isinstance(tree_item, Qt4_queue_item.GenericWorkflowQueueItem):
            #     if self.tool_box.currentWidget() == self.workflow_page:
            #         self.create_task_button.setEnabled(True)
            # elif isinstance(tree_item, Qt4_queue_item.AdvancedQueueItem):
            #     if self.tool_box.currentWidget() == self.advanced_page:
            #         self.create_task_button.setEnabled(True)

            self.tool_box.widget(page_index).selection_changed(tree_items)
            self.previous_page_index = page_index

    def selection_changed(self, items):
        """
        Called by the parent widget when selection in the tree changes.
        """
        if len(items) == 1:
            # ----------------------------------
            # LNLS
            # if (isinstance(items[0], Qt4_queue_item.DataCollectionGroupQueueItem):
            #     self.create_task_button.setEnabled(False)
            # else:
            #     self.create_task_button.setEnabled(True)
            if (isinstance(items[0], Qt4_queue_item.SampleQueueItem)):
                self.create_task_button.setEnabled(True)
            else:
                self.create_task_button.setEnabled(False)
            # ----------------------------------

            if isinstance(items[0], Qt4_queue_item.DataCollectionQueueItem):
                data_collection = items[0].get_model()
                # if data_collection.experiment_type == EXPERIMENT_TYPE.HELICAL:
                #     self.tool_box.setCurrentWidget(self.helical_page)
                # else:
                if data_collection.experiment_type == EXPERIMENT_TYPE.NATIVE:
                    self.tool_box.setCurrentWidget(self.discrete_page)
                    # LNLS

                if (self.parent.session_hwobj):
                    self.parent.session_hwobj.set_base_image_directory(self.discrete_page._data_path_widget._base_image_dir)

            # elif isinstance(items[0], Qt4_queue_item.CharacterisationQueueItem):
            #     self.tool_box.setCurrentWidget(self.char_page)
            elif isinstance(items[0], Qt4_queue_item.EnergyScanQueueItem):
                self.tool_box.setCurrentWidget(self.energy_scan_page)

                if (self.parent.session_hwobj):
                    self.parent.session_hwobj.set_base_image_directory(self.energy_scan_page._data_path_widget._base_image_dir)
            # elif isinstance(items[0], Qt4_queue_item.XRFSpectrumQueueItem):
            #     self.tool_box.setCurrentWidget(self.xrf_spectrum_page)
            # elif isinstance(items[0], Qt4_queue_item.GenericWorkflowQueueItem):
            #     self.tool_box.setCurrentWidget(self.workflow_page)
            # elif isinstance(items[0], Qt4_queue_item.AdvancedQueueItem):
            #     self.tool_box.setCurrentWidget(self.advanced_page)

        current_page = self.tool_box.currentWidget()
        current_page.selection_changed(items)

    def create_task_button_click(self):
        if self.tool_box.currentWidget().approve_creation():
            items = self.tree_brick.get_selected_items()

            if not items:
                logging.getLogger("user_level_log").\
                    warning("Select the sample or group you "\
                            "would like to add to.")
            else:
                for item in items:
                    shapes = self.graphics_manager_hwobj.get_selected_points()
                    task_model = item.get_model()

                    # Create a new group if sample is selected
                    if isinstance(task_model, queue_model_objects.Sample):
                        task_model = self.create_task_group(task_model)
                        # if self.tool_box.currentWidget() in (self.discrete_page, 
                        #    self.char_page, self.energy_scan_page, 
                        #    self.xrf_spectrum_page) and len(shapes):
                        if self.tool_box.currentWidget() in(self.discrete_page, self.energy_scan_page) and len(shapes):
                            #This could be done in more nicer way...
                            for shape in shapes:
                                self.create_task(task_model, shape)
                        else:
                            self.create_task(task_model)
                    elif isinstance(task_model, queue_model_objects.Basket):
                        for sample_node in task_model.get_sample_list():
                            child_task_model = self.create_task_group(sample_node)
                            # if self.tool_box.currentWidget() in (self.discrete_page,
                            #    self.char_page, self.energy_scan_page, 
                            #    self.xrf_spectrum_page) and len(shapes):
                            if self.tool_box.currentWidget() in(self.discrete_page, self.energy_scan_page) and len(shapes):
                                for shape in shapes:
                                    self.create_task(child_task_model, shape)
                            else:
                                self.create_task(child_task_model)
                    else:
                        # if self.tool_box.currentWidget() in (self.discrete_page,
                        #    self.char_page, self.energy_scan_page, 
                        #    self.xrf_spectrum_page) and len(shapes):
                        if self.tool_box.currentWidget() in(self.discrete_page, self.energy_scan_page) and len(shapes):
                            for shape in shapes:
                                self.create_task(task_model, shape)
                        else:
                             self.create_task(task_model)
                self.tree_brick.select_last_added_item()

            self.tool_box.currentWidget().update_selection()

    def create_task_group(self, task_model):
        group_task_node = queue_model_objects.TaskGroup()
        current_item = self.tool_box.currentWidget()

        group_name = current_item._task_node_name
        group_task_node.set_name(group_name)
        num = task_model.get_next_number_for_name(group_name)
        group_task_node.set_number(num)

        self.tree_brick.queue_model_hwobj.\
            add_child(task_model, group_task_node)

        return group_task_node

    def create_task(self, task_node, shape = None):
        # Selected item is a task group
        if isinstance(task_node, queue_model_objects.TaskGroup):
            sample = task_node.get_parent()
            task_list = self.tool_box.currentWidget().create_task(sample, shape)

            for child_task_node in task_list:
                self.tree_brick.queue_model_hwobj.add_child(task_node, child_task_node)
        # The selected item is a task, make a copy.
        else:
            # LNLS
            new_node = self.tree_brick.queue_model_hwobj.copy_node(task_node)
            self.tree_brick.queue_model_hwobj.add_child(task_node.get_parent(), new_node)
Example #9
0
    def __init__(self, parent = None, name="task_toolbox"):
        QWidget.__init__(self, parent)
        self.setObjectName = name

        # Hardware objects ----------------------------------------------------
        self.graphics_manager_hwobj = None

        # Internal variables --------------------------------------------------
        self.tree_brick = None
        self.previous_page_index = 0
        self.is_running = None
        self.path_conflict = False
        self.acq_conflict = False
        self.enable_collect = False

        # Graphic elements ----------------------------------------------------
        self.method_label = QLabel("Collection method", self)
        self.method_label.setAlignment(Qt.AlignCenter)

        self.tool_box = QToolBox(self)
        self.tool_box.setObjectName("tool_box")
        #self.tool_box.setFixedWidth(600)

        self.discrete_page = CreateDiscreteWidget(self.tool_box, "Discrete",)
        self.char_page = CreateCharWidget(self.tool_box, "Characterise")
        self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page")
        self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan")
        self.xrf_spectrum_page = CreateXRFSpectrumWidget(self.tool_box, "xrf_spectrum")
        if hasattr(parent.getHardwareObject('beamline-setup'),
                   'gphl_workflow_hwobj'):
            self.gphl_workflow_page = CreateGphlWorkflowWidget(self.tool_box,
                                                               "gphl_workflow")
        else:
            self.gphl_workflow_page = None
        self.advanced_page = CreateAdvancedWidget(self.tool_box, "advanced_scan")
        self.xray_imaging_page = CreateXrayImagingWidget(self.tool_box, "xray_imaging")

        self.tool_box.addItem(self.discrete_page, "Standard Collection")
        self.tool_box.addItem(self.char_page, "Characterisation")
        self.tool_box.addItem(self.helical_page, "Helical Collection")
        self.tool_box.addItem(self.energy_scan_page, "Energy Scan")
        self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum")
        if self.gphl_workflow_page is not None:
            self.tool_box.addItem(self.gphl_workflow_page,
                                  "GPhL Workflows")
        self.tool_box.addItem(self.advanced_page, "Advanced")
        self.tool_box.addItem(self.xray_imaging_page, "Xray Imaging")

        self.button_box = QWidget(self)
        self.create_task_button = QPushButton("  Add to queue", self.button_box)
        self.create_task_button.setIcon(Qt4_Icons.load_icon("add_row.png"))
        msg = "Add the collection method to the selected sample"
        self.create_task_button.setToolTip(msg)
        self.create_task_button.setEnabled(False)

        self.collect_now_button = QPushButton("Collect Now", self.button_box)
        self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png"))
        self.collect_now_button.setToolTip(
            "Add the collection method to the queue and execute it")

        # Layout --------------------------------------------------------------
        _button_box_hlayout = QHBoxLayout(self.button_box)
        _button_box_hlayout.addWidget(self.collect_now_button)
        _button_box_hlayout.addStretch(0)
        _button_box_hlayout.addWidget(self.create_task_button)
        _button_box_hlayout.setSpacing(0)
        _button_box_hlayout.setContentsMargins(0, 0, 0, 0)

        _main_vlayout = QVBoxLayout(self)
        _main_vlayout.addWidget(self.method_label)
        _main_vlayout.addWidget(self.tool_box)
        _main_vlayout.addWidget(self.button_box)
        _main_vlayout.setSpacing(0)
        _main_vlayout.setContentsMargins(0, 0, 0, 0)

        # SizePolicies --------------------------------------------------------
        #self.setSizePolicy(QSizePolicy.Expanding,
        #                   QSizePolicy.Expanding)

        # Qt signal/slot connections ------------------------------------------
        self.create_task_button.clicked.connect(self.create_task_button_click)
        self.collect_now_button.clicked.connect(self.collect_now_button_click)
        self.tool_box.currentChanged.connect(self.current_page_changed)

        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).acqParametersConflictSignal.connect(\
               self.acq_parameters_conflict_changed)
            self.tool_box.widget(i).pathTempleConflictSignal.connect(\
               self.path_template_conflict_changed)
Example #10
0
    def __init__(self, parent = None, name="task_toolbox"):
        QWidget.__init__(self, parent)
        self.setObjectName = name

        # Hardware objects ----------------------------------------------------
        self.graphics_manager_hwobj = None

        # Internal variables --------------------------------------------------
        self.tree_brick = None
        self.previous_page_index = 0
        self.is_running = None
        self.path_conflict = False
        self.acq_conflict = False
        self.enable_collect = False

        # Graphic elements ----------------------------------------------------
        self.method_label = QLabel("Collection method", self)
        self.method_label.setAlignment(Qt.AlignCenter)

        self.tool_box = QToolBox(self)
        self.tool_box.setObjectName("tool_box")
        #self.tool_box.setFixedWidth(600)

        self.discrete_page = CreateDiscreteWidget(self.tool_box, "Discrete",)
        self.char_page = CreateCharWidget(self.tool_box, "Characterise")
        self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page")
        self.energy_scan_page = CreateEnergyScanWidget(self.tool_box, "energy_scan")
        self.xrf_spectrum_page = CreateXRFSpectrumWidget(self.tool_box, "xrf_spectrum")
        if hasattr(parent.getHardwareObject('beamline-setup'),
                   'gphl_workflow_hwobj'):
            self.gphl_workflow_page = CreateGphlWorkflowWidget(self.tool_box,
                                                               "gphl_workflow")
        else:
            self.gphl_workflow_page = None
        self.advanced_page = CreateAdvancedWidget(self.tool_box, "advanced_scan")
        self.xray_imaging_page = CreateXrayImagingWidget(self.tool_box, "xray_imaging")

        self.tool_box.addItem(self.discrete_page, "Standard Collection")
        self.tool_box.addItem(self.char_page, "Characterisation")
        self.tool_box.addItem(self.helical_page, "Helical Collection")
        self.tool_box.addItem(self.energy_scan_page, "Energy Scan")
        self.tool_box.addItem(self.xrf_spectrum_page, "XRF Spectrum")
        if self.gphl_workflow_page is not None:
            self.tool_box.addItem(self.gphl_workflow_page,
                                  "GPhL Workflows")
        self.tool_box.addItem(self.advanced_page, "Advanced")
        self.tool_box.addItem(self.xray_imaging_page, "Xray Imaging")

        self.button_box = QWidget(self)
        self.create_task_button = QPushButton("  Add to queue", self.button_box)
        self.create_task_button.setIcon(Qt4_Icons.load_icon("add_row.png"))
        msg = "Add the collection method to the selected sample"
        self.create_task_button.setToolTip(msg)
        self.create_task_button.setEnabled(False)

        self.collect_now_button = QPushButton("Collect Now", self.button_box)
        self.collect_now_button.setIcon(Qt4_Icons.load_icon("VCRPlay2.png"))
        self.collect_now_button.setToolTip(
            "Add the collection method to the queue and execute it")

        # Layout --------------------------------------------------------------
        _button_box_hlayout = QHBoxLayout(self.button_box)
        _button_box_hlayout.addWidget(self.collect_now_button)
        _button_box_hlayout.addStretch(0)
        _button_box_hlayout.addWidget(self.create_task_button)
        _button_box_hlayout.setSpacing(0)
        _button_box_hlayout.setContentsMargins(0, 0, 0, 0)

        _main_vlayout = QVBoxLayout(self)
        _main_vlayout.addWidget(self.method_label)
        _main_vlayout.addWidget(self.tool_box)
        _main_vlayout.addWidget(self.button_box)
        _main_vlayout.setSpacing(0)
        _main_vlayout.setContentsMargins(0, 0, 0, 0)

        # SizePolicies --------------------------------------------------------
        #self.setSizePolicy(QSizePolicy.Expanding,
        #                   QSizePolicy.Expanding)

        # Qt signal/slot connections ------------------------------------------
        self.create_task_button.clicked.connect(self.create_task_button_click)
        self.collect_now_button.clicked.connect(self.collect_now_button_click)
        self.tool_box.currentChanged.connect(self.current_page_changed)

        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).acqParametersConflictSignal.connect(\
               self.acq_parameters_conflict_changed)
            self.tool_box.widget(i).pathTempleConflictSignal.connect(\
               self.path_template_conflict_changed)
Example #11
0
    def __init__(self, parent=None, name="task_toolbox"):
        QtGui.QWidget.__init__(self, parent)
        self.setObjectName = name

        # Hardware objects ----------------------------------------------------
        self.graphics_manager_hwobj = None

        # Internal variables --------------------------------------------------
        self.tree_brick = None
        self.previous_page_index = 0

        # Graphic elements ----------------------------------------------------
        self.method_group_box = QtGui.QGroupBox(" Collection method", self)
        font = self.method_group_box.font()
        font.setPointSize(10)
        self.method_group_box.setFont(font)

        self.tool_box = QtGui.QToolBox(self.method_group_box)
        self.tool_box.setObjectName("tool_box")
        self.tool_box.setFixedWidth(475)
        self.tool_box.setFont(font)

        self.discrete_page = CreateDiscreteWidget(
            self.tool_box,
            "Discrete",
        )
        self.char_page = CreateCharWidget(self.tool_box, "Characterise")
        self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page")
        self.energy_scan_page = CreateEnergyScanWidget(self.tool_box,
                                                       "energy_scan")
        self.xrf_scan_page = CreateXRFScanWidget(self.tool_box, "xrf_scan")
        self.advanced_scan_page = CreateAdvancedScanWidget(
            self.tool_box, "advanced_scan")

        self.tool_box.addItem(self.discrete_page, "Standard Collection")
        self.tool_box.addItem(self.char_page, "Characterisation")
        self.tool_box.addItem(self.helical_page, "Helical Collection")
        self.tool_box.addItem(self.energy_scan_page, "Energy Scan")
        self.tool_box.addItem(self.xrf_scan_page, "XRF Scan")
        self.tool_box.addItem(self.advanced_scan_page, "Advanced")

        self.button_box = QtGui.QWidget(self)
        self.create_task_button = QtGui.QPushButton("  Add to queue",
                                                    self.button_box)
        self.create_task_button.setIcon(
            QtGui.QIcon(Qt4_Icons.load("add_row.png")))
        msg = "Add the collection method to the selected sample"
        self.create_task_button.setToolTip(msg)

        # Layout --------------------------------------------------------------
        self.method_group_box_layout = QtGui.QVBoxLayout(self)
        self.method_group_box_layout.addWidget(self.tool_box)
        self.method_group_box_layout.setSpacing(0)
        self.method_group_box_layout.setContentsMargins(0, 0, 0, 0)
        self.method_group_box.setLayout(self.method_group_box_layout)

        self.button_box_layout = QtGui.QHBoxLayout(self)
        self.button_box_layout.addStretch(0)
        self.button_box_layout.addWidget(self.create_task_button)
        self.button_box_layout.setSpacing(0)
        self.button_box_layout.setContentsMargins(0, 0, 0, 0)
        self.button_box.setLayout(self.button_box_layout)

        self.main_layout = QtGui.QVBoxLayout(self)
        self.main_layout.addWidget(self.method_group_box)
        #self.main_layout.addStretch(0)
        self.main_layout.addWidget(self.button_box)
        self.main_layout.setSpacing(0)
        self.main_layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(self.main_layout)

        # SizePolicies --------------------------------------------------------
        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
                           QtGui.QSizePolicy.Expanding)

        # Qt signal/slot connections ------------------------------------------
        self.create_task_button.clicked.connect(self.create_task_button_click)

        self.connect(self.tool_box, QtCore.SIGNAL("currentChanged( int )"),
                     self.current_page_changed)
Example #12
0
class TaskToolBoxWidget(QtGui.QWidget):
    def __init__(self, parent=None, name="task_toolbox"):
        QtGui.QWidget.__init__(self, parent)
        self.setObjectName = name

        # Hardware objects ----------------------------------------------------
        self.graphics_manager_hwobj = None

        # Internal variables --------------------------------------------------
        self.tree_brick = None
        self.previous_page_index = 0

        # Graphic elements ----------------------------------------------------
        self.method_group_box = QtGui.QGroupBox(" Collection method", self)
        font = self.method_group_box.font()
        font.setPointSize(10)
        self.method_group_box.setFont(font)

        self.tool_box = QtGui.QToolBox(self.method_group_box)
        self.tool_box.setObjectName("tool_box")
        self.tool_box.setFixedWidth(475)
        self.tool_box.setFont(font)

        self.discrete_page = CreateDiscreteWidget(
            self.tool_box,
            "Discrete",
        )
        self.char_page = CreateCharWidget(self.tool_box, "Characterise")
        self.helical_page = CreateHelicalWidget(self.tool_box, "helical_page")
        self.energy_scan_page = CreateEnergyScanWidget(self.tool_box,
                                                       "energy_scan")
        self.xrf_scan_page = CreateXRFScanWidget(self.tool_box, "xrf_scan")
        self.advanced_scan_page = CreateAdvancedScanWidget(
            self.tool_box, "advanced_scan")

        self.tool_box.addItem(self.discrete_page, "Standard Collection")
        self.tool_box.addItem(self.char_page, "Characterisation")
        self.tool_box.addItem(self.helical_page, "Helical Collection")
        self.tool_box.addItem(self.energy_scan_page, "Energy Scan")
        self.tool_box.addItem(self.xrf_scan_page, "XRF Scan")
        self.tool_box.addItem(self.advanced_scan_page, "Advanced")

        self.button_box = QtGui.QWidget(self)
        self.create_task_button = QtGui.QPushButton("  Add to queue",
                                                    self.button_box)
        self.create_task_button.setIcon(
            QtGui.QIcon(Qt4_Icons.load("add_row.png")))
        msg = "Add the collection method to the selected sample"
        self.create_task_button.setToolTip(msg)

        # Layout --------------------------------------------------------------
        self.method_group_box_layout = QtGui.QVBoxLayout(self)
        self.method_group_box_layout.addWidget(self.tool_box)
        self.method_group_box_layout.setSpacing(0)
        self.method_group_box_layout.setContentsMargins(0, 0, 0, 0)
        self.method_group_box.setLayout(self.method_group_box_layout)

        self.button_box_layout = QtGui.QHBoxLayout(self)
        self.button_box_layout.addStretch(0)
        self.button_box_layout.addWidget(self.create_task_button)
        self.button_box_layout.setSpacing(0)
        self.button_box_layout.setContentsMargins(0, 0, 0, 0)
        self.button_box.setLayout(self.button_box_layout)

        self.main_layout = QtGui.QVBoxLayout(self)
        self.main_layout.addWidget(self.method_group_box)
        #self.main_layout.addStretch(0)
        self.main_layout.addWidget(self.button_box)
        self.main_layout.setSpacing(0)
        self.main_layout.setContentsMargins(0, 0, 0, 0)
        self.setLayout(self.main_layout)

        # SizePolicies --------------------------------------------------------
        self.setSizePolicy(QtGui.QSizePolicy.Expanding,
                           QtGui.QSizePolicy.Expanding)

        # Qt signal/slot connections ------------------------------------------
        self.create_task_button.clicked.connect(self.create_task_button_click)

        self.connect(self.tool_box, QtCore.SIGNAL("currentChanged( int )"),
                     self.current_page_changed)

        # Other ---------------------------------------------------------------

    def set_tree_brick(self, brick):
        """
        Sets the tree brick of each page in the toolbox.
        """
        self.tree_brick = brick

        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).set_tree_brick(brick)

    def set_beamline_setup(self, beamline_setup_hwobj):
        self._beamline_setup_hwobj = beamline_setup_hwobj
        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).set_beamline_setup(beamline_setup_hwobj)

        self.graphics_manager_hwobj = beamline_setup_hwobj.shape_history_hwobj
        self.energy_scan_page.set_energy_scan_hwobj(
            beamline_setup_hwobj.energyscan_hwobj)

        # Remove energy scan page from non tunable wavelentgh beamlines
        if not beamline_setup_hwobj.tunable_wavelength():
            self.tool_box.removeItem(self.energy_scan_page)
            self.energy_scan_page.hide()

    def update_data_path_model(self):
        for i in range(0, self.tool_box.count()):
            item = self.tool_box.item(i)
            item.init_data_path_model()
            item.update_selection()

    def ispyb_logged_in(self, logged_in):
        """
        Handels the signal logged_in from the brick the handles LIMS (ISPyB)
        login, ie ProposalBrick. The signal is emitted when a user was 
        succesfully logged in.
        """
        #import pdb;pdb.set_trace()
        for i in range(0, self.tool_box.count()):
            self.tool_box.widget(i).ispyb_logged_in(logged_in)

    def current_page_changed(self, page_index):
        tree_items = self.tree_brick.get_selected_items()

        if len(tree_items) > 0:
            tree_item = tree_items[0]

            # Get the directory form the previous page and update
            # the new page with the direcotry and run_number from the old.
            # IFF sample or group selected.
            if isinstance(tree_item, Qt4_queue_item.DataCollectionGroupQueueItem) or\
                    isinstance(tree_item, Qt4_queue_item.SampleQueueItem):
                new_pt = self.tool_box.widget(page_index)._path_template
                previous_pt = self.tool_box.widget(
                    self.previous_page_index)._path_template
                new_pt.directory = previous_pt.directory
                new_pt.run_number = self._beamline_setup_hwobj.queue_model_hwobj.\
                    get_next_run_number(new_pt)
            elif isinstance(tree_item, Qt4_queue_item.DataCollectionQueueItem):
                data_collection = tree_item.get_model()
                if data_collection.experiment_type == EXPERIMENT_TYPE.HELICAL:
                    if self.tool_box.currentWidget() == self.helical_page:
                        self.create_task_button.setEnabled(True)
                elif data_collection.experiment_type == EXPERIMENT_TYPE.MESH:
                    if self.tool_box.currentWidget(
                    ) == self.advanced_scan_page:
                        self.create_task_button.setEnabled(True)
                elif self.tool_box.currentWidget() == self.discrete_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item,
                            Qt4_queue_item.CharacterisationQueueItem):
                if self.tool_box.currentWidget() == self.char_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item, Qt4_queue_item.EnergyScanQueueItem):
                if self.tool_box.currentWidget() == self.energy_scan_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item, Qt4_queue_item.XRFScanQueueItem):
                if self.tool_box.currentWidget() == self.xrf_scan_page:
                    self.create_task_button.setEnabled(True)
            elif isinstance(tree_item,
                            Qt4_queue_item.GenericWorkflowQueueItem):
                if self.tool_box.currentWidget() == self.workflow_page:
                    self.create_task_button.setEnabled(True)

            self.tool_box.widget(page_index).selection_changed(tree_items)
            self.previous_page_index = page_index

    def selection_changed(self, items):
        """
        Called by the parent widget when selection in the tree changes.
        """
        if len(items) == 1:

            if isinstance(items[0],
                          Qt4_queue_item.DataCollectionGroupQueueItem):
                self.create_task_button.setEnabled(False)
            else:
                self.create_task_button.setEnabled(True)

            if isinstance(items[0], Qt4_queue_item.DataCollectionQueueItem):
                data_collection = items[0].get_model()

                if data_collection.experiment_type == EXPERIMENT_TYPE.HELICAL:
                    self.tool_box.setCurrentWidget(self.helical_page)
                else:
                    self.tool_box.setCurrentWidget(self.discrete_page)
            elif isinstance(items[0],
                            Qt4_queue_item.CharacterisationQueueItem):
                self.tool_box.setCurrentWidget(self.char_page)
            elif isinstance(items[0], Qt4_queue_item.EnergyScanQueueItem):
                self.tool_box.setCurrentWidget(self.energy_scan_page)
            elif isinstance(items[0], Qt4_queue_item.EnergyScanQueueItem):
                self.tool_box.setCurrentWidget(self.xrf_scan_page)
            elif isinstance(items[0], Qt4_queue_item.GenericWorkflowQueueItem):
                self.tool_box.setCurrentWidget(self.workflow_page)

        current_page = self.tool_box.currentWidget()
        current_page.selection_changed(items)

    def create_task_button_click(self):
        if self.tool_box.currentWidget().approve_creation():
            items = self.tree_brick.get_selected_items()

            if not items:
                logging.getLogger("user_level_log").\
                    warning("Select the sample or group you "\
                            "would like to add to.")
            else:
                for item in items:
                    shapes = self.graphics_manager_hwobj.get_selected_shapes()
                    task_model = item.get_model()

                    # Create a new group if sample is selected
                    if isinstance(task_model, queue_model_objects.Sample):
                        group_task_node = queue_model_objects.TaskGroup()
                        current_item = self.tool_box.currentWidget()
                        """if current_item is self.workflow_page:
                            group_name = current_item._workflow_cbox.currentText()
                        else:
                            group_name = current_item._task_node_name"""
                        group_name = current_item._task_node_name

                        group_task_node.set_name(group_name)
                        num = task_model.get_next_number_for_name(group_name)
                        group_task_node.set_number(num)

                        self.tree_brick.queue_model_hwobj.\
                          add_child(task_model, group_task_node)

                        task_model = group_task_node

                    if len(shapes):
                        for shape in shapes:
                            self.create_task(task_model, shape)
                    else:
                        self.create_task(task_model)

            self.tool_box.currentWidget().update_selection()

    def create_task(self, task_node, shape=None):
        # Selected item is a task group
        if isinstance(task_node, queue_model_objects.TaskGroup):
            sample = task_node.get_parent()
            task_list = self.tool_box.currentWidget().create_task(
                sample, shape)

            for child_task_node in task_list:
                self.tree_brick.queue_model_hwobj.add_child(
                    task_node, child_task_node)

        # The selected item is a task, make a copy.
        else:
            new_node = self.tree_brick.queue_model_hwobj.copy_node(task_node)
            self.tree_brick.queue_model_hwobj.add_child(
                task_node.get_parent(), new_node)