aboutsummaryrefslogtreecommitdiff
path: root/todo/gui/tags/panel/table/widget.py
blob: b36759d509277809059f475b74ab029ba82896d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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_()