from PyQt5 import QtWidgets from PyQt5.QtCore import Qt import db.tags import gui.tags.signal import gui.tags.table.menu import gui.tags.table.model import gui.tags.dialog from model.tag import Tag, ValidTagForm class Widget(QtWidgets.QTableView): def __init__(self, database, parent, add_tag_signal): super().__init__(parent) self._database = database self._update_tag_signal = gui.tags.signal.UpdateTag() tags = db.tags.get(self._database.cursor()) table_model = gui.tags.table.model.TableModel(tags) self.setModel(table_model) self.sortByColumn( gui.tags.table.model.default_sort[0], gui.tags.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: gui.tags.table.menu.open(self._database, self, self._update_tag_signal, position)) add_tag_signal.get().connect(lambda tag: self.insert(tag)) self._update_tag_signal.get().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(gui.tags.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) gui.tags.dialog.update( self._database, self, self._update_tag_signal, row, tag).exec_() elif event.key() == Qt.Key_Delete: rows = self.get_selected_rows() gui.tags.dialog.show_delete(self._database, 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) gui.tags.dialog.update(self._database, self, self._update_tag_signal, row, tag).exec_()