Exemplo n.º 1
0
    def update_control(self):
        """ Update the control area of the widget. Populate the list
        views with keys from attribute labels.
        
        """
        keys = self.get_suitable_keys(self.data)

        model = PyListModel(keys)
        self.separate_view.setModel(model)
        self.connect(
            self.separate_view.selectionModel(),
            SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
            self.on_separate_key_changed)

        model = PyListModel(keys)
        self.relevant_view.setModel(model)
        self.connect(
            self.relevant_view.selectionModel(),
            SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
            self.on_relevant_key_changed)

        self.openContext("", keys)

        # Get the selected keys from the open context
        context = self.currentContexts[""]
        separate_keys = getattr(context, "separate_keys", set())
        relevant_keys = getattr(context, "relevant_keys", set())

        def select(model, selection_model, selected_items):
            all_items = list(model)
            try:
                indices = [all_items.index(item) for item in selected_items]
            except:
                indices = []
            for ind in indices:
                selection_model.select(model.index(ind),
                                       QItemSelectionModel.Select)

        self._disable_updates = True
        try:
            select(self.relevant_view.model(),
                   self.relevant_view.selectionModel(), relevant_keys)

            select(self.separate_view.model(),
                   self.separate_view.selectionModel(), separate_keys)
        finally:
            self._disable_updates = False
Exemplo n.º 2
0
    def set_data(self, data=None):
        """ Set the input example table.
        """
        self.closeContext()
        self.clear()
        self.data = data
        self.error(0)
        self.warning(0)
        if data and not self.get_suitable_keys(data):
            self.error(0, "Data has no suitable attribute labels.")
            data = None

        if data:
            self.info_box.setText("{0} genes\n{1} experiments".format(
                len(data), len(data.domain)))
            self.update_control()
            self.split_data()
        else:
            self.separate_view.setModel(PyListModel([]))
            self.relevant_view.setModel(PyListModel([]))
            self.groups_scroll_area.setWidget(QWidget())
            self.info_box.setText("No data on input.\n")
            self.commit()
Exemplo n.º 3
0
 def __init__(self, parent=None):
     QWidget.__init__(self, parent)
     self._values_model = PyListModel([], parent=self)
     layout = QVBoxLayout()
     layout.setContentsMargins(0, 0, 0, 0)
     def group_box(title):
         box = QGroupBox(title)
         box.setFlat(True)
         lay = QVBoxLayout()
         lay.setContentsMargins(0, 0, 0, 0)
         box.setLayout(lay)
         return box
     
     self.labels_combo = QComboBox()
     self.values_view = QListView()
     self.values_view.setSelectionMode(QListView.ExtendedSelection)
     self.values_view.setModel(self._values_model)
     
     
     self.connect(self.labels_combo, SIGNAL("activated(int)"),
                  self.on_label_activated)
     
     self.connect(self.values_view.selectionModel(),
                  SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
                  self.on_values_selection)
     
     l_box = group_box("Label")
     v_box = group_box("Values")
     
     l_box.layout().addWidget(self.labels_combo)
     v_box.layout().addWidget(self.values_view)
     
     layout.addWidget(l_box)
     layout.addWidget(v_box)
     
     self.setLayout(layout)
     
     self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
     
     self._block_selection_emit = False
     
     self.labels = []
     self.set_labels([])
Exemplo n.º 4
0
class LabelSelectionWidget(QWidget):
    """ A widget for selection of label values.
    """
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self._values_model = PyListModel([], parent=self)
        layout = QVBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)
        def group_box(title):
            box = QGroupBox(title)
            box.setFlat(True)
            lay = QVBoxLayout()
            lay.setContentsMargins(0, 0, 0, 0)
            box.setLayout(lay)
            return box
        
        self.labels_combo = QComboBox()
        self.values_view = QListView()
        self.values_view.setSelectionMode(QListView.ExtendedSelection)
        self.values_view.setModel(self._values_model)
        
        
        self.connect(self.labels_combo, SIGNAL("activated(int)"),
                     self.on_label_activated)
        
        self.connect(self.values_view.selectionModel(),
                     SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
                     self.on_values_selection)
        
        l_box = group_box("Label")
        v_box = group_box("Values")
        
        l_box.layout().addWidget(self.labels_combo)
        v_box.layout().addWidget(self.values_view)
        
        layout.addWidget(l_box)
        layout.addWidget(v_box)
        
        self.setLayout(layout)
        
        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        
        self._block_selection_emit = False
        
        self.labels = []
        self.set_labels([])
        
    def clear(self):
        self.labels_combo.clear()
        self._values_model[:] = []
        self.labels = []
        
    def set_labels(self, labels):
        """ Set the labels to display.
        """
        self.clear()
        if isinstance(labels, dict):
            labels = labels.items()
            
        self.labels = labels
        for label, values in labels:
            self.labels_combo.addItem(label)
            
        if labels:
            self.set_current_label(0)
#            self.labels_combo.setCurrentIndex(0)
            
    def set_selection(self, label, values):
        """ Set the selection to label and values
        """
        if isinstance(label, basestring):
            labels = [l for l, _ in self.labels]
            index = labels.index(label) if label in labels else -1
        else:
            index = label
            
        if index >= 0:
            if index != self.labels_combo.currentIndex():
                self.set_current_label(index)
                
            all_values = list(self._values_model)
            values = [v for v in values if v in all_values]
            selection = QItemSelection()
            for i, v in enumerate(self._values_model):
                if v in values:
                    index = self._values_model.index(i, 0)
                    selection.select(index, index)
            self.values_view.selectionModel().select(selection,  QItemSelectionModel.ClearAndSelect)
        else:
            self.values_view.selectionModel().clear()
            
    def set_current_label(self, index):
        """ Set the current label
        """
        self.labels_combo.setCurrentIndex(index)
        label, values = self.labels[index]
        # Block selection changed
        with self._blocked_signals():
            self._values_model[:] = values
        
    def on_label_activated(self, index):
        label, values = self.labels[index]
        with self._blocked_signals():
            self._values_model[:] = values
        self.emit(SIGNAL("label_activated()"))
        self.emit(SIGNAL("label_activated(int)"), index)
    
    def on_values_selection(self, selected, deselected):
        label, values = self.current_selection()
        self.emit(SIGNAL("selection_changed()"))
        self.emit(SIGNAL("selection_changed(PyQt_PyObject, PyQt_PyObject)"),
                  label, values)
        
    def selection_indexes(self):
        """ Return the values selection indices.
        """
        selection = self.values_view.selectionModel().selection()
        indexes = selection.indexes()
        return sorted(set([i.row() for i in indexes]))        
        
    def current_selection(self):
        """ Return the current label and selected values.
        """
        i = self.labels_combo.currentIndex()

        if i == -1:
            # When clearing the labels model / combobox
            return None, None

        label, all_values = self.labels[i]
        values = [all_values[i] for i in self.selection_indexes()]
        return label, values
    
    def _blocked_signals(self):
        """ Return a context handler blocking all emited signals from this
        object.
         
        """
        class block(object):
            def __enter__(blocker):
                self.blockSignals(True)
            def __exit__(blocker, *args):
                self.blockSignals(False)
                return False
        return block()
                
    def sizeHint(self):
        return QSize(100, 200)
Exemplo n.º 5
0
    def __init__(self,
                 parent=None,
                 signalManager=None,
                 title="Quality Control"):
        OWWidget.__init__(self, parent, signalManager, title, wantGraph=True)

        self.inputs = [("Experiment Data", Orange.data.Table, self.set_data)]

        ## Settings
        self.selected_distance_index = 0

        ## Attributes
        self.data = None
        self.distances = None
        self.groups = None
        self.unique_pos = None
        self.base_group_index = 0

        ## GUI
        box = OWGUI.widgetBox(self.controlArea, "Info")
        self.info_box = OWGUI.widgetLabel(box, "\n")

        ## Separate By box
        box = OWGUI.widgetBox(self.controlArea, "Separate By")
        self.split_by_model = PyListModel()
        self.split_by_view = QListView()
        self.split_by_view.setSelectionMode(QListView.ExtendedSelection)
        self.split_by_view.setModel(self.split_by_model)
        box.layout().addWidget(self.split_by_view)

        self.connect(
            self.split_by_view.selectionModel(),
            SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
            self.on_split_key_changed)

        ## Sort By box
        box = OWGUI.widgetBox(self.controlArea, "Sort By")
        self.sort_by_model = PyListModel()
        self.sort_by_view = QListView()
        self.sort_by_view.setSelectionMode(QListView.ExtendedSelection)
        self.sort_by_view.setModel(self.sort_by_model)
        box.layout().addWidget(self.sort_by_view)

        self.connect(
            self.sort_by_view.selectionModel(),
            SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
            self.on_sort_key_changed)

        ## Distance box
        box = OWGUI.widgetBox(self.controlArea, "Distance Measure")
        OWGUI.comboBox(box,
                       self,
                       "selected_distance_index",
                       items=[t[0] for t in self.DISTANCE_FUNCTIONS],
                       callback=self.on_distance_measure_changed)

        self.connect(self.graphButton, SIGNAL("clicked()"), self.save_graph)

        self.scene = QGraphicsScene()
        self.scene_view = QualityGraphicsView(self.scene)
        self.scene_view.setRenderHints(QPainter.Antialiasing)
        self.scene_view.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
        self.mainArea.layout().addWidget(self.scene_view)

        self.connect(self.scene_view, SIGNAL("view_size_changed(QSize)"),
                     self.on_view_resize)

        self._disable_updates = False
        self._cached_distances = {}
        self._base_index_hints = {}
        self.main_widget = None

        self.resize(800, 600)