Skip to content

Commit 73c4107

Browse files
committed
Customizable plot: no need for QApplication at import
1 parent 5de36a7 commit 73c4107

File tree

2 files changed

+86
-64
lines changed

2 files changed

+86
-64
lines changed

Orange/widgets/visualize/owbarplot.py

Lines changed: 76 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import List, Optional, Tuple, Union
1+
from typing import List, Optional, Tuple, Union, Dict
22
from functools import lru_cache
33
from xml.sax.saxutils import escape
44

@@ -27,7 +27,7 @@
2727
from Orange.widgets.utils.state_summary import format_summary_details
2828
from Orange.widgets.visualize.owscatterplotgraph import LegendItem
2929
from Orange.widgets.visualize.utils.customizableplot import Updater, \
30-
BaseParameterSetter as Setter
30+
CommonParameterSetter
3131
from Orange.widgets.visualize.utils.plotutils import AxisItem, \
3232
HelpEventDelegate
3333
from Orange.widgets.widget import OWWidget, Input, Output, Msg
@@ -65,40 +65,79 @@ def mouseClickEvent(self, ev):
6565
ev.accept()
6666

6767

68-
class BarPlotGraph(gui.OWComponent, pg.PlotWidget, Setter):
68+
class ParameterSetter(CommonParameterSetter):
6969
GRID_LABEL, SHOW_GRID_LABEL = "Gridlines", "Show"
7070
DEFAULT_ALPHA_GRID, DEFAULT_SHOW_GRID = 80, True
7171
BOTTOM_AXIS_LABEL, IS_VERTICAL_LABEL = "Bottom axis", "Vertical tick text"
72-
initial_settings = {
73-
Setter.LABELS_BOX: {
74-
Setter.FONT_FAMILY_LABEL: Updater.FONT_FAMILY_SETTING,
75-
Setter.TITLE_LABEL: Updater.FONT_SETTING,
76-
Setter.AXIS_TITLE_LABEL: Updater.FONT_SETTING,
77-
Setter.AXIS_TICKS_LABEL: Updater.FONT_SETTING,
78-
Setter.LEGEND_LABEL: Updater.FONT_SETTING,
79-
},
80-
Setter.ANNOT_BOX: {
81-
Setter.TITLE_LABEL: {Setter.TITLE_LABEL: ("", "")},
82-
},
83-
Setter.PLOT_BOX: {
84-
GRID_LABEL: {
85-
SHOW_GRID_LABEL: (None, True),
86-
Updater.ALPHA_LABEL: (range(0, 255, 5), DEFAULT_ALPHA_GRID),
72+
73+
def __init__(self, master):
74+
self.grid_settings: Dict = None
75+
self.master: BarPlotGraph = master
76+
super().__init__()
77+
78+
def update_setters(self):
79+
self.grid_settings = {
80+
Updater.ALPHA_LABEL: self.DEFAULT_ALPHA_GRID,
81+
self.SHOW_GRID_LABEL: self.DEFAULT_SHOW_GRID,
82+
}
83+
84+
self.initial_settings = {
85+
self.LABELS_BOX: {
86+
self.FONT_FAMILY_LABEL: self.FONT_FAMILY_SETTING,
87+
self.TITLE_LABEL: self.FONT_SETTING,
88+
self.AXIS_TITLE_LABEL: self.FONT_SETTING,
89+
self.AXIS_TICKS_LABEL: self.FONT_SETTING,
90+
self.LEGEND_LABEL: self.FONT_SETTING,
91+
},
92+
self.ANNOT_BOX: {
93+
self.TITLE_LABEL: {self.TITLE_LABEL: ("", "")},
8794
},
88-
BOTTOM_AXIS_LABEL: {
89-
IS_VERTICAL_LABEL: (None, True),
95+
self.PLOT_BOX: {
96+
self.GRID_LABEL: {
97+
self.SHOW_GRID_LABEL: (None, True),
98+
Updater.ALPHA_LABEL: (range(0, 255, 5),
99+
self.DEFAULT_ALPHA_GRID),
100+
},
101+
self.BOTTOM_AXIS_LABEL: {
102+
self.IS_VERTICAL_LABEL: (None, True),
103+
},
90104
},
91-
},
92-
}
105+
}
106+
107+
def update_grid(**settings):
108+
self.grid_settings.update(**settings)
109+
self.master.showGrid(y=self.grid_settings[self.SHOW_GRID_LABEL],
110+
alpha=self.grid_settings[Updater.ALPHA_LABEL] / 255)
111+
112+
def update_bottom_axis(**settings):
113+
axis = self.master.getAxis("bottom")
114+
axis.setRotateTicks(settings[self.IS_VERTICAL_LABEL])
115+
116+
self._setters[self.PLOT_BOX] = {
117+
self.GRID_LABEL: update_grid,
118+
self.BOTTOM_AXIS_LABEL: update_bottom_axis,
119+
}
120+
121+
@property
122+
def title_item(self):
123+
return self.master.getPlotItem().titleLabel
124+
125+
@property
126+
def axis_items(self):
127+
return [value["item"] for value in
128+
self.master.getPlotItem().axes.values()]
129+
130+
@property
131+
def legend_items(self):
132+
return self.master.legend.items
133+
134+
135+
class BarPlotGraph(gui.OWComponent, pg.PlotWidget):
93136
selection_changed = Signal(list)
94137
bar_width = 0.8
95138

96139
def __init__(self, master, parent=None):
97140
gui.OWComponent.__init__(self, master)
98-
self.grid_settings = {
99-
Updater.ALPHA_LABEL: self.DEFAULT_ALPHA_GRID,
100-
self.SHOW_GRID_LABEL: self.DEFAULT_SHOW_GRID,
101-
}
102141
self.selection = []
103142
self.master: OWBarPlot = master
104143
self.state: int = SELECT
@@ -115,14 +154,17 @@ def __init__(self, master, parent=None):
115154
self.hideAxis("bottom")
116155
self.getPlotItem().buttonsHidden = True
117156
self.getPlotItem().setContentsMargins(10, 0, 0, 10)
118-
self.showGrid(y=self.DEFAULT_SHOW_GRID,
119-
alpha=self.DEFAULT_ALPHA_GRID / 255)
120157
self.getViewBox().setMouseMode(pg.ViewBox.PanMode)
121158
self.legend = self._create_legend()
122159

123160
self.tooltip_delegate = HelpEventDelegate(self.help_event)
124161
self.scene().installEventFilter(self.tooltip_delegate)
125162

163+
self.parameter_setter = ParameterSetter(self)
164+
165+
self.showGrid(y=self.parameter_setter.DEFAULT_SHOW_GRID,
166+
alpha=self.parameter_setter.DEFAULT_ALPHA_GRID / 255)
167+
126168
def _create_legend(self):
127169
legend = LegendItem()
128170
legend.setParentItem(self.getViewBox())
@@ -140,7 +182,8 @@ def update_legend(self):
140182
)
141183
self.legend.addItem(dot, escape(text))
142184
self.legend.show()
143-
Updater.update_legend_font(self.legend.items, **self.legend_settings)
185+
Updater.update_legend_font(self.legend.items,
186+
**self.parameter_setter.legend_settings)
144187

145188
def reset_graph(self):
146189
self.clear()
@@ -275,33 +318,6 @@ def help_event(self, ev: QGraphicsSceneHelpEvent):
275318
else:
276319
return False
277320

278-
@property
279-
def title_item(self):
280-
return self.getPlotItem().titleLabel
281-
282-
@property
283-
def axis_items(self):
284-
return [value["item"] for value in self.getPlotItem().axes.values()]
285-
286-
@property
287-
def legend_items(self):
288-
return self.legend.items
289-
290-
def update_setters(self):
291-
def update_grid(**settings):
292-
self.grid_settings.update(**settings)
293-
self.showGrid(y=self.grid_settings[self.SHOW_GRID_LABEL],
294-
alpha=self.grid_settings[Updater.ALPHA_LABEL] / 255)
295-
296-
def update_bottom_axis(**settings):
297-
axis = self.getAxis("bottom")
298-
axis.setRotateTicks(settings[self.IS_VERTICAL_LABEL])
299-
300-
self._setters[self.PLOT_BOX] = {
301-
self.GRID_LABEL: update_grid,
302-
self.BOTTOM_AXIS_LABEL: update_bottom_axis,
303-
}
304-
305321

306322
class OWBarPlot(OWWidget):
307323
name = "Bar Plot"
@@ -353,7 +369,9 @@ def __init__(self):
353369
self.__pending_selection = self.selection
354370

355371
self.setup_gui()
356-
VisualSettingsDialog(self, BarPlotGraph.initial_settings)
372+
VisualSettingsDialog(
373+
self, self.graph.parameter_setter.initial_settings
374+
)
357375

358376
def setup_gui(self):
359377
self._add_graph()
@@ -613,7 +631,7 @@ def send_report(self):
613631
self.report_plot()
614632

615633
def set_visual_settings(self, key: KeyType, value: ValueType):
616-
self.graph.set_parameter(key, value)
634+
self.graph.parameter_setter.set_parameter(key, value)
617635
self.visual_settings[key] = value
618636

619637
def sizeHint(self): # pylint: disable=no-self-use

Orange/widgets/visualize/tests/test_owbarplot.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -311,36 +311,40 @@ def test_visual_settings(self):
311311
key, value = ("Fonts", "Title", "Italic"), True
312312
self.widget.set_visual_settings(key, value)
313313
font.setPointSize(20)
314-
self.assertFontEqual(graph.title_item.item.font(), font)
314+
self.assertFontEqual(
315+
graph.parameter_setter.title_item.item.font(), font
316+
)
315317

316318
key, value = ("Fonts", "Axis title", "Font size"), 16
317319
self.widget.set_visual_settings(key, value)
318320
key, value = ("Fonts", "Axis title", "Italic"), True
319321
self.widget.set_visual_settings(key, value)
320322
font.setPointSize(16)
321-
for item in graph.axis_items:
323+
for item in graph.parameter_setter.axis_items:
322324
self.assertFontEqual(item.label.font(), font)
323325

324326
key, value = ("Fonts", "Axis ticks", "Font size"), 15
325327
self.widget.set_visual_settings(key, value)
326328
key, value = ("Fonts", "Axis ticks", "Italic"), True
327329
self.widget.set_visual_settings(key, value)
328330
font.setPointSize(15)
329-
for item in graph.axis_items:
331+
for item in graph.parameter_setter.axis_items:
330332
self.assertFontEqual(item.style["tickFont"], font)
331333

332334
key, value = ("Fonts", "Legend", "Font size"), 14
333335
self.widget.set_visual_settings(key, value)
334336
key, value = ("Fonts", "Legend", "Italic"), True
335337
self.widget.set_visual_settings(key, value)
336338
font.setPointSize(14)
337-
legend_item = list(graph.legend_items)[0]
339+
legend_item = list(graph.parameter_setter.legend_items)[0]
338340
self.assertFontEqual(legend_item[1].item.font(), font)
339341

340342
key, value = ("Annotations", "Title", "Title"), "Foo"
341343
self.widget.set_visual_settings(key, value)
342-
self.assertEqual(graph.title_item.item.toPlainText(), "Foo")
343-
self.assertEqual(graph.title_item.text, "Foo")
344+
self.assertEqual(
345+
graph.parameter_setter.title_item.item.toPlainText(), "Foo"
346+
)
347+
self.assertEqual(graph.parameter_setter.title_item.text, "Foo")
344348

345349
key, value = ("Figure", "Gridlines", "Show"), False
346350
self.assertTrue(graph.getAxis("left").grid)

0 commit comments

Comments
 (0)