from PyQt5 import QtWidgets, QtCore from typing import List, Tuple from todo.model.tag import Tag import todo.db.tags import todo.database class SelectionSignal(QtCore.QObject): _signal = QtCore.pyqtSignal(list, name = "selection") def __init__(self): QtCore.QObject.__init__(self) def emit(self, tag_ids): self._signal.emit(tag_ids) def connect(self, f): self._signal.connect(f) def widget(parent, init_tags: List[int]) -> Tuple[QtWidgets.QWidget, SelectionSignal]: widget = QtWidgets.QWidget(parent) signal = SelectionSignal() layout = QtWidgets.QVBoxLayout(widget) widget.setLayout(layout) layout.addWidget(QtWidgets.QLabel("Tags")) list_widget = QtWidgets.QListWidget() list_widget.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) layout.addWidget(list_widget) tags = sorted(todo.db.tags.get(todo.database.cursor()), key=lambda t: t.name) for tag in tags: item = QtWidgets.QListWidgetItem(tag.name) list_widget.addItem(item) if tag.id in init_tags: item.setSelected(True) def on_item_selection_changed(): tag_texts = [item.text() for item in list_widget.selectedItems()] signal.emit([tag.id for tag in tags if tag.name in tag_texts]) list_widget.itemSelectionChanged.connect(on_item_selection_changed) return (widget, signal)