|
1 | 1 | from qtpy import QtGui, QtCore, QtWidgets
|
| 2 | +from qtpy.QtCore import QPoint |
2 | 3 |
|
3 | 4 |
|
4 | 5 | class StandardItemModelIterator(object):
|
@@ -117,6 +118,24 @@ def on_model_item_changed(self, item):
|
117 | 118 | is_checked = [i for i, item in enumerate(model[1:]) if item.checked]
|
118 | 119 | self.checkedItemsChanged.emit(is_checked)
|
119 | 120 |
|
| 121 | + def select_offset(self, offset): |
| 122 | + """offset: 1 for next, -1 for previous""" |
| 123 | + |
| 124 | + model = self._model |
| 125 | + # model.blockSignals(True) |
| 126 | + indices_checked = [i for i, item in enumerate(model) if item.checked] |
| 127 | + first_checked = indices_checked[0] |
| 128 | + # check first_checked + offset, uncheck the rest |
| 129 | + to_check = first_checked + offset |
| 130 | + |
| 131 | + # wrap around |
| 132 | + to_check = to_check if to_check < len(model) else 1 |
| 133 | + to_check = to_check if to_check > 0 else len(model) - 1 |
| 134 | + |
| 135 | + is_checked = ["partial"] + [i == to_check for i in range(1, len(model))] |
| 136 | + for checked, item in zip(is_checked, model): |
| 137 | + item.checked = checked |
| 138 | + |
120 | 139 | def addItem(self, text):
|
121 | 140 | item = StandardItem(text)
|
122 | 141 | # not editable
|
@@ -222,6 +241,12 @@ def eventFilter(self, obj, event):
|
222 | 241 |
|
223 | 242 | return False
|
224 | 243 |
|
| 244 | + def wheelEvent(self, event): |
| 245 | + delta = event.angleDelta() |
| 246 | + assert isinstance(delta, QPoint) |
| 247 | + offset = 1 if delta.y() < 0 else -1 |
| 248 | + self._menu.select_offset(offset) |
| 249 | + |
225 | 250 |
|
226 | 251 | if __name__ == '__main__':
|
227 | 252 | import sys
|
|
0 commit comments