class Alarm(Clock): def __init__(self): # Translators: "New" refers to an alarm Clock.__init__(self, _("Alarm"), _("New"), True) self.liststore = Gtk.ListStore(bool, GdkPixbuf.Pixbuf, str, GObject.TYPE_PYOBJECT, GObject.TYPE_PYOBJECT) self.iconview = SelectableIconView(self.liststore, 0, 1, 2) contentview = ContentView(self.iconview, "alarm-symbolic", _("Select <b>New</b> to add an alarm")) self.add(contentview) self.iconview.connect("item-activated", self._on_item_activated) self.iconview.connect("selection-changed", self._on_selection_changed) self.storage = AlarmsStorage() self.load_alarms() self.show_all() self.timeout_id = GObject.timeout_add(1000, self._check_alarms) def _check_alarms(self): for i in self.liststore: alarm = self.liststore.get_value(i.iter, 4) if alarm.check_expired(): widget = self.liststore.get_value(i.iter, 3) alert = widget.get_alert() alert.show() standalone = widget.get_standalone_widget() standalone.set_ringing(True) self.emit("show-standalone", widget) return True def _on_notification_activated(self, notif, action, data): win = self.get_toplevel() win.show_clock(self) def _on_item_activated(self, iconview, path): alarm = self.liststore[path][3] self.emit("show-standalone", alarm) def _on_selection_changed(self, iconview): self.emit("selection-changed") def set_selection_mode(self, active): self.iconview.set_selection_mode(active) @GObject.Property(type=bool, default=False) def can_select(self): return len(self.liststore) != 0 def get_selection(self): return self.iconview.get_selection() def delete_selected(self): selection = self.get_selection() alarms = [] for path in selection: alarms.append(self.liststore[path][-1]) self.delete_alarms(alarms) def load_alarms(self): self.alarms = self.storage.load() for alarm in self.alarms: self.add_alarm_widget(alarm) def add_alarm(self, alarm): self.alarms.append(alarm) self.storage.save(self.alarms) self.add_alarm_widget(alarm) self.show_all() def add_alarm_widget(self, alarm): alert = Alert("alarm-clock-elapsed", alarm.name, self._on_notification_activated) widget = AlarmWidget(self, alarm, alert) label = GLib.markup_escape_text(alarm.name) view_iter = self.liststore.append([False, widget.get_pixbuf(), "<b>%s</b>" % label, widget, alarm]) self.notify("can-select") def update_alarm(self, old_alarm, new_alarm): i = self.alarms.index(old_alarm) self.alarms[i] = new_alarm self.storage.save(self.alarms) self.iconview.unselect_all() self.liststore.clear() self.load_alarms() self.notify("can-select") return self.alarms[i] def delete_alarms(self, alarms): for a in alarms: self.alarms.remove(a) self.storage.save(self.alarms) self.iconview.unselect_all() self.liststore.clear() self.load_alarms() self.notify("can-select") def open_new_dialog(self): window = AlarmDialog(self.get_toplevel()) window.connect("response", self._on_dialog_response) window.show_all() def _on_dialog_response(self, dialog, response): if response == 1: alarm = dialog.get_alarm_item() self.add_alarm(alarm) dialog.destroy()
class World(Clock): def __init__(self): # Translators: "New" refers to a world clock Clock.__init__(self, _("World"), _("New"), True) self.liststore = Gtk.ListStore(bool, GdkPixbuf.Pixbuf, str, GObject.TYPE_PYOBJECT) self.iconview = SelectableIconView(self.liststore, 0, 1, 2) contentview = ContentView(self.iconview, "document-open-recent-symbolic", _("Select <b>New</b> to add a world clock")) self.timeview = TimeAdjustingView(contentview) self.add(self.timeview) self._update_source_id = None self.timeview.connect("time-changed", self._on_timeview_time_changed) self.iconview.connect("item-activated", self._on_item_activated) self.iconview.connect("selection-changed", self._on_selection_changed) self.storage = WorldClockStorage() self.clocks = [] self.load_clocks() self.show_all() self.timeout_id = GObject.timeout_add(1000, self._update_clocks) def _update_clocks(self): time_override = self.timeview.get_seconds() for c in self.clocks: c.update(time_override) return True def _schedule_update(self): if self._update_source_id: GLib.source_remove(self._update_source_id) self._update_source_id = None self._update_source_id = GLib.idle_add(self._update_clocks) def _on_timeview_time_changed(self, timeview): self._schedule_update() def _on_item_activated(self, iconview, path): d = self.liststore[path][3] self.emit("show-standalone", d) def _on_selection_changed(self, iconview): self.emit("selection-changed") def set_selection_mode(self, active): self.iconview.set_selection_mode(active) @GObject.Property(type=bool, default=False) def can_select(self): return len(self.liststore) != 0 def get_selection(self): return self.iconview.get_selection() def delete_selected(self): selection = self.get_selection() items = [] for treepath in selection: items.append(self.liststore[treepath][3]) self.delete_clocks(items) def load_clocks(self): self.clocks = self.storage.load() for clock in self.clocks: self.add_clock_widget(clock) def add_clock(self, location): for c in self.clocks: if c.location.get_code() == location.get_code(): # duplicate return clock = DigitalClock(location) self.clocks.append(clock) self.storage.save(self.clocks) self.add_clock_widget(clock) self.show_all() def add_clock_widget(self, clock): name = clock.location.get_city_name() label = GLib.markup_escape_text(name) view_iter = self.liststore.append([False, clock.get_pixbuf(), "<b>%s</b>" % label, clock]) path = self.liststore.get_path(view_iter) clock.set_path(self.liststore, path) self.notify("can-select") def delete_clocks(self, clocks): for c in clocks: self.clocks.remove(c) self.storage.save(self.clocks) self.iconview.unselect_all() self.liststore.clear() self.load_clocks() self.notify("can-select") def open_new_dialog(self): window = NewWorldClockDialog(self.get_toplevel()) window.connect("response", self._on_dialog_response) window.show_all() def _on_dialog_response(self, dialog, response): if response == 1: l = dialog.get_location() self.add_clock(l) dialog.destroy()