diff --git a/src/sugar3/graphics/alert.py b/src/sugar3/graphics/alert.py index fd9dfa34..70f86954 100644 --- a/src/sugar3/graphics/alert.py +++ b/src/sugar3/graphics/alert.py @@ -346,9 +346,35 @@ class _TimeoutIcon(Gtk.Alignment): self._text.set_markup('%s' % 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 user. If the user does not select a button before the timeout, the response callback is called and the alert is usually removed. @@ -389,35 +415,14 @@ class TimeoutAlert(Alert): """ def __init__(self, timeout=5, **kwargs): - Alert.__init__(self, **kwargs) - - self._timeout = timeout + _TimeoutAlert.__init__(self, timeout, _('Continue'), **kwargs) icon = Icon(icon_name='dialog-cancel') self.add_button(Gtk.ResponseType.CANCEL, _('Cancel'), icon) 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) - - 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): +class NotifyAlert(_TimeoutAlert): """ Timeout alert with only an "OK" button. This should be used just for notifications and not for user interaction. The alert will timeout after @@ -448,21 +453,4 @@ class NotifyAlert(Alert): """ def __init__(self, timeout=5, **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, _('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 + _TimeoutAlert.__init__(self, timeout, _('Ok'), **kwargs)