7198: Date editor crashes on invalid date

Revalidate the date upon every change, and disable
OKing the dialog when it is not valid, for usability review.

If it is not good, we can always revert this commit.
This commit is contained in:
Vassilii Khachaturov 2013-11-16 23:47:50 +02:00
parent b1d040deb1
commit b770de1a10

View File

@ -47,7 +47,7 @@ unambiguously built using UI controls such as menus and spin buttons.
#
#-------------------------------------------------------------------------
import logging
__LOG = logging.getLogger(".EditDate")
LOG = logging.getLogger(".EditDate")
#-------------------------------------------------------------------------
#
@ -128,6 +128,7 @@ class EditDate(ManagedWindow):
self.top.get_object('title'),
_('Date selection'))
self.ok_button = self.top.get_object('ok_button')
self.calendar_box = self.top.get_object('calendar_box')
for name in Date.ui_calendar_names:
self.calendar_box.get_model().append([name])
@ -202,10 +203,18 @@ class EditDate(ManagedWindow):
self.return_date = None
for o in self.top.get_objects():
try:
if o != self.ok_button:
o.connect_after('changed', self.revalidate)
except TypeError:
pass # some of them don't support the signal, ignore them...
self.revalidate()
self.show()
while True:
response = self.window.run()
LOG.debug("response: {0}".format(response))
if response == Gtk.ResponseType.HELP:
display_help(webpage=WIKI_HELP_PAGE,
section=WIKI_HELP_SEC)
@ -213,26 +222,43 @@ class EditDate(ManagedWindow):
break
else:
if response == Gtk.ResponseType.OK:
(the_quality, the_modifier, the_calendar, the_value,
the_text, the_newyear) = self.build_date_from_ui()
self.return_date = Date(self.date)
try:
self.return_date.set(
quality=the_quality,
modifier=the_modifier,
calendar=the_calendar,
value=the_value,
text=the_text,
newyear=the_newyear)
except DateError as e:
d = e.date # Invalid Date object!
d.set(modifier=Date.MOD_TEXTONLY,
# pray that the displayer doesn't choke here!
text=displayer.display(d))
self.return_date = d
# if the user pressed OK/enter while inside an edit field,
# e.g., the year,
# build_date_from_ui won't pick up the new text in the
# run of revalidate that allowed the OK!
if not self.revalidate():
continue
self.return_date = Date()
self.return_date.copy(self.date)
self.close()
break
def revalidate(self, obj = None):
"""
If anything changed, revalidate the date and
enable/disable the "OK" button based on the result.
"""
(the_quality, the_modifier, the_calendar, the_value,
the_text, the_newyear) = self.build_date_from_ui()
LOG.debug("revalidate: {0} changed, value: {1}".format(
obj, the_value))
d = Date(self.date)
try:
d.set(
quality=the_quality,
modifier=the_modifier,
calendar=the_calendar,
value=the_value,
text=the_text,
newyear=the_newyear)
self.date.copy(d)
LOG.debug("return_date set to: {0}".format(d.to_struct()))
self.ok_button.set_sensitive(1)
return True
except DateError as e:
self.ok_button.set_sensitive(0)
return False
def build_menu_names(self, obj):
"""
Define the menu entry for the :class:`.ManagedWindow`