def test_delegate(self): cases = ( (DState(Default(Leave()), None, None), ""), (DState(Leave(), None, None), "(leave)"), (DState(MDL(), [1], None), "(entropy)"), (DState(MDL(), [], None), "<removed>"), (DState(EqualFreq(2), [1], None), "(equal frequency k=2)"), (DState(EqualWidth(2), [1], None), "(equal width k=2)"), (DState(Remove(), None, None), "(removed)"), (DState(Custom([1]), None, None), "(custom)"), ) delegate = DiscDelegate() var = DiscreteVariable("C", ("a", "b")) model = VariableListModel() model.append(var) for state, text in cases: model.setData(model.index(0), state, Qt.UserRole) option = QStyleOptionViewItem() delegate.initStyleOption(option, model.index(0)) self.assertIn(text, option.text)
class OWSpiralogram(widget.OWWidget): name = 'Spiralogram' description = "Visualize time series' periodicity in a spiral heatmap." icon = 'icons/Spiralogram.svg' priority = 120 inputs = [("Time series", Table, 'set_data')] outputs = [("Time series", Timeseries)] ax1 = settings.Setting('months of year') ax2 = settings.Setting('years') agg_attr = settings.Setting([]) agg_func = settings.Setting(0) def __init__(self): self.data = None self.indices = [] box = gui.vBox(self.controlArea, 'Axes') self.combo_ax2 = gui.comboBox( box, self, 'ax2', label='Y axis:', callback=self.replot, sendSelectedValue=True, orientation='horizontal') self.combo_ax1 = gui.comboBox( box, self, 'ax1', label='Radial:', callback=self.replot, sendSelectedValue=True, orientation='horizontal') box = gui.vBox(self.controlArea, 'Aggregation') self.combo_func = gui.comboBox( box, self, 'agg_func', label='Function:', orientation='horizontal', callback=self.replot) func_model = ListModel(AGG_FUNCTIONS, parent=self) self.combo_func.setModel(func_model) self.attrlist_model = VariableListModel(parent=self) self.attrlist = QListView(selectionMode=QListView.ExtendedSelection) self.attrlist.setModel(self.attrlist_model) self.attrlist.selectionModel().selectionChanged.connect( self.attrlist_selectionChanged) box.layout().addWidget(self.attrlist) gui.rubber(self.controlArea) self.chart = chart = Spiralogram(self, selection_callback=self.on_selection) self.mainArea.layout().addWidget(chart) def attrlist_selectionChanged(self): self.agg_attr = [self.attrlist_model[i.row()] for i in self.attrlist.selectionModel().selectedIndexes()] self.replot() def set_data(self, data): self.data = data = None if data is None else Timeseries.from_data_table(data) def init_combos(): for combo in (self.combo_ax1, self.combo_ax2): combo.clear() self.attrlist_model[:] = [] for i in Spiralogram.AxesCategories: for combo in (self.combo_ax1, self.combo_ax2): combo.addItem(_enum_str(i)) for var in data.domain if data is not None else []: if (var.is_primitive() and (var is not data.time_variable or isinstance(var, TimeVariable) and data.time_delta is None)): self.attrlist_model.append(var) if var.is_discrete: for combo in (self.combo_ax1, self.combo_ax2): combo.addItem(gui.attributeIconDict[var], var.name) init_combos() self.chart.clear() if data is None: self.commit() return self.ax1 = 'months of year' self.ax2 = 'years' self.replot() def replot(self): vars = self.agg_attr func = AGG_FUNCTIONS[self.agg_func] # TODO test discrete if any(var.is_discrete for var in vars) and func != Mode: self.combo_func.setCurrentIndex(AGG_FUNCTIONS.index(Mode)) return try: ax1 = Spiralogram.AxesCategories[_enum_str(self.ax1, True)] except KeyError: ax1 = self.data.domain[self.ax1] # TODO: Allow having only a sinle (i.e. radial) axis try: ax2 = Spiralogram.AxesCategories[_enum_str(self.ax2, True)] except KeyError: ax2 = self.data.domain[self.ax2] self.chart.setSeries(self.data, vars, ax1, ax2, func) def on_selection(self, indices): self.indices = self.chart.selection_indices(indices) self.commit() def commit(self): self.send('Time series', self.data[self.indices] if self.data else None)