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
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()
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([])
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)
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)