move guts of TimeoutAlert and NotifyAlert to a private class

Create a private class for the button, timeout and response.  Use the
private class as parent for both NotifyAlert and TimeoutAlert.

Extends the spurious response fix (cfeabdc) to NotifyAlert.

Also use g_timeout_add in preference to g_timeout_add_seconds, because
the latter is less precise in implementation.

Tested by changing the Register alert temporarily.
This commit is contained in:
James Cameron 2015-10-16 14:06:51 +11:00
parent d2e1793108
commit 0e724a78eb

View File

@ -346,9 +346,35 @@ class _TimeoutIcon(Gtk.Alignment):
self._text.set_markup('<b>%s</b>' % GLib.markup_escape_text(str(text))) self._text.set_markup('<b>%s</b>' % GLib.markup_escape_text(str(text)))
class TimeoutAlert(Alert): class _TimeoutAlert(Alert):
def __init__(self, timeout=5, label=_('Ok'), **kwargs):
Alert.__init__(self, **kwargs)
self._timeout = timeout
self._timeout_text = _TimeoutIcon()
self._timeout_text.set_text(self._timeout)
self.add_button(Gtk.ResponseType.OK, label, self._timeout_text)
self._timeout_text.show()
self._timeout_sid = GLib.timeout_add(1000, self.__timeout_cb)
def __timeout_cb(self):
self._timeout -= 1
self._timeout_text.set_text(self._timeout)
if self._timeout == 0:
Alert._response(self, Gtk.ResponseType.OK)
return False
return True
def _response(self, *args):
GLib.source_remove(self._timeout_sid)
Alert._response(self, *args)
class TimeoutAlert(_TimeoutAlert):
""" """
This is a ready-made two button (Cancel, Continue) alert. The continue This is a ready-made two button (Continue, Cancel) alert. The continue
button contains a visual countdown indicating the time remaining to the button contains a visual countdown indicating the time remaining to the
user. If the user does not select a button before the timeout, the user. If the user does not select a button before the timeout, the
response callback is called and the alert is usually removed. response callback is called and the alert is usually removed.
@ -389,35 +415,14 @@ class TimeoutAlert(Alert):
""" """
def __init__(self, timeout=5, **kwargs): def __init__(self, timeout=5, **kwargs):
Alert.__init__(self, **kwargs) _TimeoutAlert.__init__(self, timeout, _('Continue'), **kwargs)
self._timeout = timeout
icon = Icon(icon_name='dialog-cancel') icon = Icon(icon_name='dialog-cancel')
self.add_button(Gtk.ResponseType.CANCEL, _('Cancel'), icon) self.add_button(Gtk.ResponseType.CANCEL, _('Cancel'), icon)
icon.show() icon.show()
self._timeout_text = _TimeoutIcon()
self._timeout_text.set_text(self._timeout)
self.add_button(Gtk.ResponseType.OK, _('Continue'), self._timeout_text)
self._timeout_text.show()
self._timeout_sid = GLib.timeout_add(1000, self.__timeout) class NotifyAlert(_TimeoutAlert):
def __timeout(self):
self._timeout -= 1
self._timeout_text.set_text(self._timeout)
if self._timeout == 0:
Alert._response(self, Gtk.ResponseType.OK)
return False
return True
def _response(self, *args):
GLib.source_remove(self._timeout_sid)
Alert._response(self, *args)
class NotifyAlert(Alert):
""" """
Timeout alert with only an "OK" button. This should be used just for Timeout alert with only an "OK" button. This should be used just for
notifications and not for user interaction. The alert will timeout after notifications and not for user interaction. The alert will timeout after
@ -448,21 +453,4 @@ class NotifyAlert(Alert):
""" """
def __init__(self, timeout=5, **kwargs): def __init__(self, timeout=5, **kwargs):
Alert.__init__(self, **kwargs) _TimeoutAlert.__init__(self, timeout, _('Ok'), **kwargs)
self._timeout = timeout
self._timeout_text = _TimeoutIcon()
self._timeout_text.set_text(self._timeout)
self.add_button(Gtk.ResponseType.OK, _('Ok'), self._timeout_text)
self._timeout_text.show()
GLib.timeout_add(1000, self.__timeout)
def __timeout(self):
self._timeout -= 1
self._timeout_text.set_text(self._timeout)
if self._timeout == 0:
self._response(Gtk.ResponseType.OK)
return False
return True