1
2 import datetime
3
4 from PyQt4 import QtGui, QtCore
5 from PyQt4.QtCore import Qt
6
7 from customeditor import CustomEditor, editingFinished
8 from camelot.core import constants
9 from camelot.view.art import Icon
10 from camelot.view.utils import local_date_format, date_from_string, ParsingError
11 from camelot.view.controls.decorated_line_edit import DecoratedLineEdit
12
14 """Widget for editing date values"""
15
16 calendar_action_trigger = QtCore.SIGNAL('trigger()')
17
24 CustomEditor.__init__(self, parent)
25
26 self.date_format = local_date_format()
27 self.line_edit = DecoratedLineEdit()
28 self.line_edit.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
29 self.line_edit.set_background_text( QtCore.QDate(2000,1,1).toString(self.date_format) )
30
31
32
33
34 special_date_menu = QtGui.QMenu(self)
35 calendar_widget_action = QtGui.QWidgetAction(special_date_menu)
36 self.calendar_widget = QtGui.QCalendarWidget(special_date_menu)
37 self.connect( self.calendar_widget, QtCore.SIGNAL('activated(const QDate&)'), self.calendar_widget_activated)
38 self.connect( self.calendar_widget, QtCore.SIGNAL('clicked(const QDate&)'), self.calendar_widget_activated)
39 calendar_widget_action.setDefaultWidget(self.calendar_widget)
40
41 self.connect( self, self.calendar_action_trigger, special_date_menu.hide )
42 special_date_menu.addAction(calendar_widget_action)
43 special_date_menu.addAction('Today')
44 special_date_menu.addAction('Far future')
45 self.special_date = QtGui.QToolButton(self)
46 self.special_date.setIcon(
47 Icon('tango/16x16/apps/office-calendar.png').getQIcon())
48 self.special_date.setAutoRaise(True)
49 self.special_date.setToolTip('Calendar and special dates')
50 self.special_date.setMenu(special_date_menu)
51 self.special_date.setPopupMode(QtGui.QToolButton.InstantPopup)
52 self.special_date.setFixedHeight(self.get_height())
53
54
55 self.set_enabled(editable)
56
57 if nullable:
58 special_date_menu.addAction('Clear')
59
60 self.hlayout = QtGui.QHBoxLayout()
61 self.hlayout.addWidget(self.line_edit)
62 self.hlayout.addWidget(self.special_date)
63
64 self.hlayout.setContentsMargins(0, 0, 0, 0)
65 self.hlayout.setMargin(0)
66 self.hlayout.setSpacing(0)
67
68 self.setContentsMargins(0, 0, 0, 0)
69 self.setLayout(self.hlayout)
70
71 self.minimum = datetime.date.min
72 self.maximum = datetime.date.max
73 self.setFocusProxy(self.line_edit)
74
75 self.connect(self.line_edit,
76 QtCore.SIGNAL('editingFinished()'),
77 self.editingFinished)
78 self.connect(self.line_edit,
79 QtCore.SIGNAL('textEdited(const QString&)'),
80 self.text_edited)
81 self.connect(special_date_menu,
82 QtCore.SIGNAL('triggered(QAction*)'),
83 self.setSpecialDate)
84
89
91 self.emit(QtCore.SIGNAL('editingFinished()'))
92
94 self.emit(QtCore.SIGNAL('editingFinished()'))
95
105
106 - def text_edited(self, text ):
107 try:
108 date_from_string( self.line_edit.user_input() )
109 self.line_edit.set_valid(True)
110 except ParsingError:
111 self.line_edit.set_valid(False)
112
119
121 self.line_edit.setEnabled(editable)
122 if editable:
123 self.special_date.show()
124 else:
125 self.special_date.hide()
126
128 if action.text().compare('Today') == 0:
129 self.set_value(datetime.date.today())
130 elif action.text().compare('Far future') == 0:
131 self.set_value(datetime.date( year = 2400, month = 12, day = 31 ))
132 elif action.text().compare('Clear') == 0:
133 self.set_value(None)
134 self.emit(QtCore.SIGNAL('editingFinished()'))
135