|
12 | 12 | import pkg_resources |
13 | 13 |
|
14 | 14 | from PyQt4 import QtGui, QtCore |
15 | | -from PyQt4.QtCore import Qt, pyqtSignal as Signal |
| 15 | +from PyQt4.QtCore import Qt, pyqtSignal as Signal, QSize |
16 | 16 | from PyQt4.QtGui import QCursor, QApplication, QTableView, QHeaderView, \ |
17 | | - QStyledItemDelegate, QSizePolicy, QColor |
| 17 | + QStyledItemDelegate, QSizePolicy, QColor, QListView |
18 | 18 |
|
19 | 19 | # Some Orange widgets might expect this here |
20 | 20 | from Orange.widgets.webview import WebView as WebviewWidget # pylint: disable=unused-import |
@@ -1198,6 +1198,35 @@ def attributeItem(var): |
1198 | 1198 | return attributeIconDict[var], var.name |
1199 | 1199 |
|
1200 | 1200 |
|
| 1201 | +class ListViewWithSizeHint(QListView): |
| 1202 | + def __init__(self, *args, preferred_size=None, **kwargs): |
| 1203 | + super().__init__(*args, **kwargs) |
| 1204 | + if isinstance(preferred_size, tuple): |
| 1205 | + preferred_size = QSize(*preferred_size) |
| 1206 | + self.preferred_size = preferred_size |
| 1207 | + |
| 1208 | + def sizeHint(self): |
| 1209 | + return self.preferred_size or super().sizeHint() |
| 1210 | + |
| 1211 | + |
| 1212 | +def listView(widget, master, value=None, model=None, box=None, callback=None, |
| 1213 | + sizeHint=None, **misc): |
| 1214 | + if box: |
| 1215 | + bg = vBox(widget, box, addToLayout=False) |
| 1216 | + else: |
| 1217 | + bg = widget |
| 1218 | + view = ListViewWithSizeHint(preferred_size=sizeHint) |
| 1219 | + view.setModel(model) |
| 1220 | + if value is not None: |
| 1221 | + connectControl(master, value, callback, |
| 1222 | + view.selectionModel().selectionChanged, |
| 1223 | + CallFrontListView(view), |
| 1224 | + CallBackListView(model, master, value)) |
| 1225 | + misc.setdefault('addSpace', True) |
| 1226 | + miscellanea(view, bg, widget, **misc) |
| 1227 | + return view |
| 1228 | + |
| 1229 | + |
1201 | 1230 | def listBox(widget, master, value=None, labels=None, box=None, callback=None, |
1202 | 1231 | selectionMode=QtGui.QListWidget.SingleSelection, |
1203 | 1232 | enableDragDrop=False, dragDropCallback=None, |
@@ -2443,6 +2472,23 @@ def __call__(self, *value): |
2443 | 2472 | self.func(**kwds) |
2444 | 2473 |
|
2445 | 2474 |
|
| 2475 | +class CallBackListView(ControlledCallback): |
| 2476 | + def __init__(self, model, widget, attribute): |
| 2477 | + super().__init__(widget, attribute) |
| 2478 | + self.model = model |
| 2479 | + |
| 2480 | + # triggered by selectionModel().selectionChanged() |
| 2481 | + def __call__(self, newSelection, _): |
| 2482 | + # This must be imported locally to avoid circular imports |
| 2483 | + from Orange.widgets.utils.itemmodels import PyListModel |
| 2484 | + indexes = newSelection.indexes() |
| 2485 | + if indexes: |
| 2486 | + value = newSelection.indexes()[0].row() |
| 2487 | + if isinstance(self.model, PyListModel): |
| 2488 | + value = self.model[value] |
| 2489 | + self.acyclic_setattr(value) |
| 2490 | + |
| 2491 | + |
2446 | 2492 | class CallBackListBox: |
2447 | 2493 | def __init__(self, control, widget): |
2448 | 2494 | self.control = control |
@@ -2607,6 +2653,25 @@ def action(self, value): |
2607 | 2653 | self.control.buttons[value].setChecked(1) |
2608 | 2654 |
|
2609 | 2655 |
|
| 2656 | +class CallFrontListView(ControlledCallFront): |
| 2657 | + def action(self, value): |
| 2658 | + model = self.control.model() |
| 2659 | + if not isinstance(value, int): |
| 2660 | + if isinstance(value, str): |
| 2661 | + search_role = Qt.DisplayRole |
| 2662 | + elif isinstance(value, Variable): |
| 2663 | + search_role = TableVariable |
| 2664 | + else: |
| 2665 | + search_role = Qt.DisplayRole |
| 2666 | + value = str(value) |
| 2667 | + for i in range(model.rowCount()): |
| 2668 | + if model.data(model.index(i), search_role) == value: |
| 2669 | + value = i |
| 2670 | + break |
| 2671 | + sel_model = self.control.selectionModel() |
| 2672 | + sel_model.select(model.index(value), sel_model.ClearAndSelect) |
| 2673 | + |
| 2674 | + |
2610 | 2675 | class CallFrontListBox(ControlledCallFront): |
2611 | 2676 | def action(self, value): |
2612 | 2677 | if value is not None: |
|
0 commit comments