diff options
Diffstat (limited to 'todo/gui/tags/panel/table/widget.py')
-rw-r--r-- | todo/gui/tags/panel/table/widget.py | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/todo/gui/tags/panel/table/widget.py b/todo/gui/tags/panel/table/widget.py new file mode 100644 index 0000000..b36759d --- /dev/null +++ b/todo/gui/tags/panel/table/widget.py @@ -0,0 +1,73 @@ +from PyQt5 import QtWidgets +from PyQt5.QtCore import Qt + +from todo.model.tag import Tag, ValidTagForm +import todo.database +import todo.db.tags +import todo.db.task_tags +import todo.gui.tags.panel.dialog +import todo.gui.tags.panel.signal +import todo.gui.tags.panel.table.menu +import todo.gui.tags.panel.table.model + +class Widget(QtWidgets.QTableView): + + def __init__(self, parent, add_tag_signal): + super().__init__(parent) + + self._update_tag_signal = todo.gui.tags.panel.signal.UpdateTag() + + tags = todo.db.tags.get(todo.database.cursor()) + table_model = todo.gui.tags.panel.table.model.TableModel(tags) + + self.setModel(table_model) + self.sortByColumn( + todo.gui.tags.panel.table.model.default_sort[0], + todo.gui.tags.panel.table.model.default_sort[1]) + self.setSortingEnabled(True) + self.setSelectionBehavior(QtWidgets.QTableView.SelectRows) + self.horizontalHeader().setStretchLastSection(True) + self.resizeColumns() + + self.doubleClicked.connect(lambda index: self.on_double_click(index.row())) + + # # Menu + self.setContextMenuPolicy(Qt.CustomContextMenu) + self.customContextMenuRequested.connect(lambda position: todo.gui.tags.panel.table.menu.open(self, self._update_tag_signal, position)) + + add_tag_signal.connect(lambda tag: self.insert(tag)) + self._update_tag_signal.connect(lambda row, tag: self.update(row, tag)) + + def insert(self, tag): + self.model().insert_tag(self.horizontalHeader(), tag) + self.resizeColumns() + + def update(self, row, tag): + row = self.model().update_tag(self.horizontalHeader(), row, tag) + self.selectRow(row) + self.resizeColumns() + + def resizeColumns(self): + for column in range(todo.gui.tags.panel.table.model.columns): + self.resizeColumnToContents(column) + + def keyPressEvent(self, event): + super().keyPressEvent(event) + if event.key() in (Qt.Key_Return, Qt.Key_Enter): + rows = self.get_selected_rows() + if len(rows) == 1: + row = rows[0] + tag = self.model().get_at(row) + todo.gui.tags.panel.dialog.update(self, self._update_tag_signal, row, tag).exec_() + elif event.key() == Qt.Key_Delete: + rows = self.get_selected_rows() + tags = self.model().row_ids(rows) + if not db.task_tags.one_is_used(todo.database.cursor(), tags): + todo.gui.tags.panel.dialog.show_delete(self, rows) + + def get_selected_rows(self): + return list(set([index.row() for index in self.selectedIndexes()])) + + def on_double_click(self, row: int): + tag = self.model().get_at(row) + todo.gui.tags.panel.dialog.update(self, self._update_tag_signal, row, tag).exec_() |