Skip to content

Commit d6c3792

Browse files
authored
Merge pull request #5821 from janezd/pylistmodeltooltip-arg
PyListModelTooltip: Improve handling of tooltip argument
2 parents 55d77e0 + 3c82d6e commit d6c3792

File tree

3 files changed

+61
-11
lines changed

3 files changed

+61
-11
lines changed

Orange/widgets/data/owfeatureconstructor.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,14 +144,12 @@ def __init__(self, *args, **kwargs):
144144
self.attributescb.setModel(self.attrs_model)
145145

146146
sorted_funcs = sorted(self.FUNCTIONS)
147-
self.funcs_model = itemmodels.PyListModelTooltip()
147+
self.funcs_model = itemmodels.PyListModelTooltip(
148+
chain(["Select Function"], sorted_funcs),
149+
chain([''], [self.FUNCTIONS[func].__doc__ for func in sorted_funcs])
150+
)
148151
self.funcs_model.setParent(self)
149152

150-
self.funcs_model[:] = chain(["Select Function"], sorted_funcs)
151-
self.funcs_model.tooltips[:] = chain(
152-
[''],
153-
[self.FUNCTIONS[func].__doc__ for func in sorted_funcs])
154-
155153
self.functionscb = ComboBoxSearch(
156154
minimumContentsLength=16,
157155
sizeAdjustPolicy=QComboBox.AdjustToMinimumContentsLengthWithIcon,

Orange/widgets/utils/itemmodels.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,12 +358,17 @@ def remove(self, val):
358358

359359

360360
class PyListModelTooltip(PyListModel):
361-
def __init__(self, iterable=None, tooltips=[], **kwargs):
361+
def __init__(self, iterable=None, tooltips=(), **kwargs):
362362
super().__init__(iterable, **kwargs)
363+
if not isinstance(tooltips, Sequence):
364+
# may be a generator; if not, fail
365+
tooltips = list(tooltips)
363366
self.tooltips = tooltips
364367

365368
def data(self, index, role=Qt.DisplayRole):
366369
if role == Qt.ToolTipRole:
370+
if index.row() >= len(self.tooltips):
371+
return None
367372
return self.tooltips[index.row()]
368373
else:
369374
return super().data(index, role)

Orange/widgets/utils/tests/test_itemmodels.py

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
import unittest
55
from unittest.mock import patch
66

7-
import numpy as np
8-
97
from AnyQt.QtCore import Qt, QModelIndex
108
from AnyQt.QtTest import QSignalSpy
119

@@ -14,8 +12,8 @@
1412
ContinuousVariable, DiscreteVariable, StringVariable, TimeVariable
1513
from Orange.widgets.utils import colorpalettes
1614
from Orange.widgets.utils.itemmodels import \
17-
AbstractSortTableModel, PyTableModel,\
18-
PyListModel, VariableListModel, DomainModel, ContinuousPalettesModel, \
15+
PyTableModel, PyListModel, PyListModelTooltip,\
16+
VariableListModel, DomainModel, ContinuousPalettesModel, \
1917
_as_contiguous_range
2018
from Orange.widgets.gui import TableVariable
2119
from orangewidget.tests.base import GuiTest
@@ -481,5 +479,54 @@ def testIndexOf(self):
481479
self.assertIsNone(model.indexOf(42))
482480

483481

482+
class TestPyListModelTooltip(GuiTest):
483+
def test_tooltips_size(self):
484+
def data(i):
485+
return model.data(model.index(i, 0))
486+
487+
def tip(i):
488+
return model.data(model.index(i, 0), Qt.ToolTipRole)
489+
490+
# Not enough tooptips - return None
491+
model = PyListModelTooltip(["foo", "bar", "baz"], ["footip", "bartip"])
492+
self.assertEqual(data(1), "bar")
493+
self.assertEqual(data(2), "baz")
494+
self.assertIsNone(data(3))
495+
self.assertEqual(tip(1), "bartip")
496+
self.assertIsNone(tip(2))
497+
498+
# No tooltips
499+
model = PyListModelTooltip(["foo", "bar", "baz"])
500+
self.assertIsNone(tip(1))
501+
self.assertIsNone(tip(2))
502+
503+
# Too many tooltips
504+
model = PyListModelTooltip(["foo", "bar"], ["footip", "bartip", "btip"])
505+
self.assertEqual(data(0), "foo")
506+
self.assertEqual(data(1), "bar")
507+
self.assertIsNone(data(2))
508+
self.assertEqual(tip(1), "bartip")
509+
self.assertEqual(tip(2), "btip")
510+
511+
def test_tooltip_arg(self):
512+
def tip(i):
513+
return model.data(model.index(i, 0), Qt.ToolTipRole)
514+
515+
# Allow generators
516+
s = dict(a="ta", b="tb")
517+
model = PyListModelTooltip(s, s.values())
518+
self.assertEqual(tip(0), "ta")
519+
self.assertEqual(tip(1), "tb")
520+
521+
# Basically backward compatibility; this behaviour diverges from
522+
# behaviour of data role
523+
s = []
524+
model = PyListModelTooltip(["foo"], s)
525+
self.assertIsNone(tip(0))
526+
527+
s += ["footip"]
528+
self.assertEqual(tip(1), "footip")
529+
530+
484531
if __name__ == "__main__":
485532
unittest.main()

0 commit comments

Comments
 (0)