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 todo.db.task_tags.one_is_used(todo.database.cursor(), tags) and len(rows) > 0: todo.gui.tags.panel.dialog.confirm_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_()