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()
|