aboutsummaryrefslogtreecommitdiff
path: root/todo/util/gui/date_input.py
blob: 06536c7e8ac485a14ddcc04060e17ff04fe9ec66 (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
74
75
76
77
78
79
from PyQt5 import QtWidgets, QtCore, QtGui

import todo.gui.icon

class DateInput(QtWidgets.QLineEdit):

    def __init__(self, init_date: str, parent):
        super().__init__(parent)
        self.setReadOnly(True)
        self.installEventFilter(self)
        self._date = init_date
        self.update(init_date)
        self._is_editing = False

    def eventFilter(self, source, event):
        if source is self and event.type() == QtCore.QEvent.FocusIn:
            if not self._is_editing:
                self._is_editing = True
                Calendar(self, self._date, self.update).exec_()
            else:
                self._is_editing = False
                self.clearFocus()
        return super(DateInput, self).eventFilter(source, event)

    def update(self, date: str):
        self._date = date
        self.setText(date)

class Calendar(QtWidgets.QDialog):

    def __init__(self, parent: QtWidgets.QWidget, init_date: str, update_date):
        super().__init__(parent)

        self._update_date = update_date
        self._calendar = QtWidgets.QCalendarWidget(self)

        self.setWindowTitle("Sélectionnez une date")
        self.setMinimumSize(QtCore.QSize(300, 400))

        layout = QtWidgets.QVBoxLayout(self)
        self.setLayout(layout)

        self._calendar.setMinimumDate(QtCore.QDate.currentDate())
        self._calendar.activated.connect(self.select)
        if init_date:
            self._calendar.setSelectedDate(QtCore.QDate.fromString(init_date, "dd/MM/yyyy"))
        layout.addWidget(self._calendar)

        buttons = QtWidgets.QWidget(self)
        buttons_layout = QtWidgets.QHBoxLayout(buttons)
        layout.addWidget(buttons)

        accept_button = QtWidgets.QPushButton("Sélectionner", self)
        accept_button.setIcon(todo.gui.icon.dialog_ok(accept_button.style()))
        accept_button.clicked.connect(self.select)
        buttons_layout.addWidget(accept_button)

        reset_button = QtWidgets.QPushButton("Effacer", self)
        reset_button.setIcon(todo.gui.icon.dialog_reset(reset_button.style()))
        reset_button.clicked.connect(self.reset)
        buttons_layout.addWidget(reset_button)

        cancel_button = QtWidgets.QPushButton("Annuler", self)
        cancel_button.setIcon(todo.gui.icon.dialog_cancel(cancel_button.style()))
        cancel_button.clicked.connect(lambda: self.reject())
        buttons_layout.addWidget(cancel_button)

    def select(self):
        self.accept()
        self._update_date(self._calendar.selectedDate().toString("dd/MM/yyyy"))

    def reset(self):
        self.accept()
        self._update_date("")

    def keyPressEvent(self, event):
        super().keyPressEvent(event)
        if event.key() in (QtCore.Qt.Key_Delete, QtCore.Qt.Key_Backspace):
            self.reset()