Skip to content

Commit 6ef747b

Browse files
authored
Merge pull request #7091 from biolab/thicker-slider
[ENH] SliderGraph: thicker threshold line
2 parents 872e4ae + df5114a commit 6ef747b

File tree

2 files changed

+65
-4
lines changed

2 files changed

+65
-4
lines changed

Orange/widgets/utils/slidergraph.py

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,34 @@
77
from Orange.widgets.visualize.utils.plotutils import PlotWidget
88

99

10+
class InteractiveInfiniteLine(InfiniteLine): # pylint: disable=abstract-method
11+
"""
12+
A subclass of InfiniteLine that provides custom hover behavior.
13+
"""
14+
15+
def __init__(self, angle=90, pos=None, movable=False, bounds=None,
16+
normal_pen=None, highlight_pen=None, **kwargs):
17+
super().__init__(angle=angle, pos=pos, movable=movable, bounds=bounds, **kwargs)
18+
self._normal_pen = normal_pen
19+
self._highlight_pen = highlight_pen
20+
self.setPen(normal_pen)
21+
22+
def hoverEvent(self, ev):
23+
"""
24+
Override hoverEvent to provide custom hover behavior.
25+
26+
Parameters
27+
----------
28+
ev : HoverEvent
29+
The hover event from pyqtgraph
30+
"""
31+
32+
if ev.isEnter() and self._highlight_pen is not None:
33+
self.setPen(self._highlight_pen)
34+
elif ev.isExit() and self._normal_pen is not None:
35+
self.setPen(self._normal_pen)
36+
37+
1038
class SliderGraph(PlotWidget):
1139
"""
1240
An widget graph element that shows a line plot with more sequences. It
@@ -136,14 +164,23 @@ def _plot_cutpoint(self, x):
136164
self._line = None
137165
return
138166
if self._line is None:
139-
# plot interactive vertical line
140-
self._line = InfiniteLine(
167+
normal_pen = mkPen(
168+
self.palette().text().color(), width=4,
169+
style=Qt.SolidLine, capStyle=Qt.RoundCap
170+
)
171+
highlight_pen = mkPen(
172+
self.palette().link().color(), width=4,
173+
style=Qt.SolidLine, capStyle=Qt.RoundCap
174+
)
175+
176+
self._line = InteractiveInfiniteLine(
141177
angle=90, pos=x, movable=True,
142178
bounds=self.selection_limit if self.selection_limit is not None
143-
else (self.x.min(), self.x.max())
179+
else (self.x.min(), self.x.max()),
180+
normal_pen=normal_pen,
181+
highlight_pen=highlight_pen
144182
)
145183
self._line.setCursor(Qt.SizeHorCursor)
146-
self._line.setPen(mkPen(self.palette().text().color(), width=2))
147184
self._line.sigPositionChanged.connect(self._on_cut_changed)
148185
self.addItem(self._line)
149186
else:

Orange/widgets/utils/tests/test_slidergraph.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from unittest.mock import Mock
2+
13
import numpy as np
24
from AnyQt.QtCore import Qt
35

@@ -105,3 +107,25 @@ def test_plot_no_cutpoint(self):
105107
p.update(x, self.data, [Qt.red])
106108
# pylint: disable=protected-access
107109
self.assertIsNone(p._line)
110+
111+
def test_hover_event(self):
112+
p = self.widget.plot
113+
x = np.arange(len(self.data[0]))
114+
p.update(x, self.data, [Qt.red], cutpoint_x=1)
115+
116+
# pylint: disable=protected-access
117+
self.assertIsNotNone(p._line)
118+
119+
enter_event = Mock()
120+
enter_event.isEnter.return_value = True
121+
enter_event.isExit.return_value = False
122+
123+
p._line.hoverEvent(enter_event)
124+
self.assertEqual(p._line.pen, p._line._highlight_pen)
125+
126+
exit_event = Mock()
127+
exit_event.isEnter.return_value = False
128+
exit_event.isExit.return_value = True
129+
130+
p._line.hoverEvent(exit_event)
131+
self.assertEqual(p._line.pen, p._line._normal_pen)

0 commit comments

Comments
 (0)