[gnome-clocks] Try to reduce deps between appwindow/toolbar and clocks



commit 915b77c5e209f0a6ab4cc8cd0f4d2f7a79317569
Author: Paolo Borelli <pborelli gnome org>
Date:   Sun Nov 18 18:56:27 2012 +0100

    Try to reduce deps between appwindow/toolbar and clocks
    
    This refactoring starts to untangle mutual assupmtions between the main
    window and the different clocks panels. I am not really happy with the
    result yet....

 gnomeclocks/alarm.py     |   39 ++++++++++-----
 gnomeclocks/app.py       |  119 +++++++++++++++++++++++++---------------------
 gnomeclocks/clocks.py    |   12 +++--
 gnomeclocks/stopwatch.py |    2 +
 gnomeclocks/timer.py     |   15 +++---
 gnomeclocks/utils.py     |    4 +-
 gnomeclocks/world.py     |   24 +++++++--
 7 files changed, 129 insertions(+), 86 deletions(-)
---
diff --git a/gnomeclocks/alarm.py b/gnomeclocks/alarm.py
index 82aba25..1dbd9ee 100644
--- a/gnomeclocks/alarm.py
+++ b/gnomeclocks/alarm.py
@@ -21,7 +21,7 @@ import errno
 import time
 import json
 from datetime import datetime, timedelta
-from gi.repository import GLib, Gio, GObject, Gtk, GdkPixbuf
+from gi.repository import GLib, GObject, Gtk, GdkPixbuf
 from clocks import Clock
 from utils import Dirs, SystemSettings, LocalizedWeekdays, Alert
 from widgets import DigitalClockDrawing, SelectableIconView, ContentView
@@ -72,8 +72,7 @@ class AlarmItem:
 
     def __init__(self, name=None, hour=None, minute=None, days=EVERY_DAY):
         self.update(name=name, hour=hour, minute=minute, days=days)
-        self.alert = Alert("alarm-clock-elapsed", name,
-                           self._on_notification_activated)
+        self.alert = Alert("alarm-clock-elapsed", name)
 
     def update(self, name=None, hour=None, minute=None, days=EVERY_DAY):
         self.name = name
@@ -111,10 +110,6 @@ class AlarmItem:
         self.snooze_time = start_time + timedelta(minutes=9)
         self.is_snoozing = False
 
-    def _on_notification_activated(self, notif, action, data):
-        app = Gio.Application.get_default()
-        app.win.show_clock(app.win.alarm)
-
     def snooze(self):
         self.is_snoozing = True
         self.alert.stop()
@@ -417,7 +412,12 @@ class AlarmStandalone(Gtk.EventBox):
 class Alarm(Clock):
     def __init__(self):
         # Translators: "New" refers to an alarm
-        Clock.__init__(self, _("Alarm"), _("New"), True)
+        Clock.__init__(self, _("Alarm"), _("New"))
+
+        self.notebook = Gtk.Notebook()
+        self.notebook.set_show_tabs(False)
+        self.notebook.set_show_border(False)
+        self.add(self.notebook)
 
         self.liststore = Gtk.ListStore(bool,
                                        GdkPixbuf.Pixbuf,
@@ -429,7 +429,7 @@ class Alarm(Clock):
         contentview = ContentView(self.iconview,
                                   "alarm-symbolic",
                                   _("Select <b>New</b> to add an alarm"))
-        self.add(contentview)
+        self.notebook.append_page(contentview, None)
 
         self.iconview.connect("item-activated", self._on_item_activated)
         self.iconview.connect("selection-changed", self._on_selection_changed)
@@ -440,16 +440,32 @@ class Alarm(Clock):
         self.show_all()
 
         self.standalone = AlarmStandalone(self)
+        self.notebook.append_page(self.standalone, None)
 
         self.timeout_id = GLib.timeout_add(1000, self._check_alarms)
 
+    def set_mode(self, mode):
+        self.mode = mode
+        if mode is Clock.Mode.NORMAL:
+            self.iconview.unselect_all()
+            self.notebook.set_current_page(0)
+            self.iconview.set_selection_mode(False)
+        elif mode is Clock.Mode.STANDALONE:
+            self.notebook.set_current_page(1)
+        elif mode is Clock.Mode.SELECTION:
+            self.iconview.set_selection_mode(True)
+
+    @GObject.Signal
+    def alarm_ringing(self):
+        self.set_mode(Clock.Mode.STANDALONE)
+
     def _check_alarms(self):
         for i in self.liststore:
             thumb = self.liststore.get_value(i.iter, 3)
             alarm = thumb.get_alarm()
             if alarm.check_expired():
                 self.standalone.set_alarm(alarm, True)
-                self.emit("item-activated")
+                self.emit("alarm-ringing")
         return True
 
     def _on_item_activated(self, iconview, path):
@@ -460,9 +476,6 @@ class Alarm(Clock):
     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
diff --git a/gnomeclocks/app.py b/gnomeclocks/app.py
index 210625e..ed7394d 100644
--- a/gnomeclocks/app.py
+++ b/gnomeclocks/app.py
@@ -60,6 +60,7 @@ class Window(Gtk.ApplicationWindow):
         self.notebook = Gtk.Notebook()
         self.notebook.set_show_tabs(False)
         self.notebook.set_show_border(False)
+        self.notebook.show()
 
         self.world = World()
         self.alarm = Alarm()
@@ -72,45 +73,43 @@ class Window(Gtk.ApplicationWindow):
 
         self.vbox.pack_start(self.toolbar, False, False, 0)
 
-        self.single_evbox = Gtk.EventBox()
-
         self.vbox.pack_end(self.notebook, True, True, 0)
         for view in self.views:
             self.notebook.append_page(view, None)
-        self.notebook.append_page(self.single_evbox, None)
 
         self.world.connect("item-activated", self._on_item_activated)
+
         self.alarm.connect("item-activated", self._on_item_activated)
+        self.alarm.connect("alarm-ringing", self._on_alarm_ringing)
 
-        self.toolbar.connect("view-clock", self._on_view_clock)
-        self.vbox.show_all()
-        self.show_all()
-        self.toolbar.show_overview_toolbar()
+        self.timer.connect("alarm-ringing", self._on_alarm_ringing)
+
+        self.toolbar.connect("back-clicked", self._on_back_clicked)
+        self.toolbar.connect("clock-changed", self._on_clock_changed)
 
-    def show_clock(self, view):
-        self.toolbar.activate_view(view)
+        self.vbox.show()
 
     def _on_item_activated(self, view):
-        def show_standalone_page():
-            self.toolbar.show_standalone_toolbar(view.standalone)
-            self.single_evbox.add(view.standalone)
-            self.notebook.set_current_page(-1)
-
-        if self.notebook.get_current_page() != len(self.views):
-            self.embed.spotlight(show_standalone_page)
-
-    def _on_view_clock(self, button, view):
-        def show_clock_view():
-            for child in self.single_evbox.get_children():
-                self.single_evbox.remove(child)
-            view.unselect_all()
-            self.notebook.set_current_page(self.views.index(view))
-            self.toolbar.show_overview_toolbar()
-
-        if self.single_evbox.get_children():
-            self.embed.spotlight(show_clock_view)
-        else:
-            show_clock_view()
+        def show_clock_standalone():
+            view.set_mode(Clock.Mode.STANDALONE)
+            self.toolbar.update_toolbar(view)
+
+        self.embed.spotlight(show_clock_standalone)
+
+    def _on_alarm_ringing(self, view):
+        self.notebook.set_current_page(self.views.index(view))
+        self.toolbar.update_toolbar(view)
+
+    def _on_back_clicked(self, button, view):
+        def show_clock_overview():
+            view.set_mode(Clock.Mode.NORMAL)
+            self.toolbar.update_toolbar(view)
+
+        self.embed.spotlight(show_clock_overview)
+
+    def _on_clock_changed(self, button, view):
+        self.notebook.set_current_page(self.views.index(view))
+        self.toolbar.update_toolbar(view)
 
     def _on_new_activated(self, action, param):
         self.toolbar.current_view.open_new_dialog()
@@ -232,7 +231,7 @@ class ClocksToolbar(Gtk.Toolbar):
 
         self.back_button = SymbolicButton("go-previous-symbolic")
         self.back_button.connect("clicked",
-            lambda w: self.emit("view-clock", self.current_view))
+            lambda w: self.emit("back-clicked", self.current_view))
         left_box.pack_start(self.back_button, False, False, 0)
 
         center_item = Gtk.ToolItem()
@@ -255,7 +254,7 @@ class ClocksToolbar(Gtk.Toolbar):
             self.button_box.pack_start(button, True, True, 0)
             button.connect("toggled", self._on_toggled, view)
             self.view_buttons[view] = button
-            if view.has_selection_mode:
+            if hasattr(view, "can_select"):
                 view.connect("notify::can-select", self._on_can_select_changed)
             if view == views[0]:
                 self.current_view = view
@@ -291,28 +290,40 @@ class ClocksToolbar(Gtk.Toolbar):
 
         self.selection_handler = 0
 
+        self.show_all()
+        self.update_toolbar(self.current_view)
+
         self.embed._selectionToolbar._toolbarDelete.connect("clicked", self._on_delete_clicked)
 
     @GObject.Signal(arg_types=(Clock,))
-    def view_clock(self, view):
+    def back_clicked(self, view):
+        self.select_button.set_sensitive(view.can_select)
+
+    @GObject.Signal(arg_types=(Clock,))
+    def clock_changed(self, view):
         self.current_view = view
-        if view.has_selection_mode:
+        if hasattr(view, "can_select"):
             self.select_button.set_sensitive(view.can_select)
 
-    def activate_view(self, view):
+    def update_toolbar(self, view):
         if view is not self.current_view:
             self.view_buttons[view].set_active(True)
-
-    def show_overview_toolbar(self):
+        if view.mode is Clock.Mode.NORMAL:
+            self._show_normal_toolbar()
+        elif view.mode is Clock.Mode.STANDALONE:
+            self._show_standalone_toolbar()
+        elif view.mode is Clock.Mode.SELECTION:
+            self._show_selection_toolbar()
+
+    def _show_normal_toolbar(self):
         self.get_style_context().remove_class("selection-mode")
-        self.standalone = None
         self.button_box.show()
         if self.current_view.new_label:
             self.new_button.set_label(self.current_view.new_label)
             self.new_button.show()
         else:
             self.new_button.hide()
-        self.select_button.set_visible(self.current_view.has_selection_mode)
+        self.select_button.set_visible(hasattr(self.current_view, "can_select"))
         self.back_button.hide()
         self.title_label.hide()
         self.edit_button.hide()
@@ -321,26 +332,25 @@ class ClocksToolbar(Gtk.Toolbar):
             self.current_view.disconnect_by_func(self._on_selection_changed)
             self.selection_handler = 0
 
-    def show_standalone_toolbar(self, widget):
+    def _show_standalone_toolbar(self):
         self.get_style_context().remove_class("selection-mode")
-        self.standalone = widget
         self.button_box.hide()
         self.new_button.hide()
         self.select_button.hide()
         self.back_button.show_all()
-        self.title_label.set_markup("<b>%s</b>" % self.standalone.get_name())
+        standalone = self.current_view.standalone
+        self.title_label.set_markup("<b>%s</b>" % standalone.get_name())
         self.title_label.show()
-        self.edit_button.set_visible(self.standalone.can_edit)
+        self.edit_button.set_visible(standalone.can_edit)
         self.done_button.hide()
 
-    def show_selection_toolbar(self):
+    def _show_selection_toolbar(self):
         self.get_style_context().add_class("selection-mode")
-        self.standalone = None
         self.button_box.hide()
         self.new_button.hide()
         self.select_button.hide()
         self.back_button.hide()
-        self.set_selection_label(0)
+        self._set_selection_label(0)
         self.title_label.show()
         self.edit_button.hide()
         self.done_button.show()
@@ -349,9 +359,9 @@ class ClocksToolbar(Gtk.Toolbar):
                                         self._on_selection_changed)
 
     def _on_toggled(self, widget, view):
-        self.emit("view-clock", view)
+        self.emit("clock-changed", view)
 
-    def set_selection_label(self, n):
+    def _set_selection_label(self, n):
         if n == 0:
             self.title_label.set_markup("(%s)" % _("Click on items to select them"))
         else:
@@ -361,7 +371,7 @@ class ClocksToolbar(Gtk.Toolbar):
     def _on_selection_changed(self, view):
         selection = view.get_selection()
         n_selected = len(selection)
-        self.set_selection_label(n_selected)
+        self._set_selection_label(n_selected)
         self.embed.set_show_selectionbar(n_selected > 0)
 
     def _on_can_select_changed(self, view, pspec):
@@ -369,20 +379,21 @@ class ClocksToolbar(Gtk.Toolbar):
             self.select_button.set_sensitive(view.can_select)
 
     def _on_select_clicked(self, button):
-        self.show_selection_toolbar()
-        self.current_view.set_selection_mode(True)
+        self.current_view.set_mode(Clock.Mode.SELECTION)
+        self.update_toolbar(self.current_view)
 
     def _on_edit_clicked(self, button):
-        self.standalone.open_edit_dialog()
+        standalone = self.current_view.standalone
+        standalone.open_edit_dialog()
 
     def _on_done_clicked(self, widget):
-        self.show_overview_toolbar()
-        self.current_view.set_selection_mode(False)
+        self.current_view.set_mode(Clock.Mode.NORMAL)
+        self.update_toolbar(self.current_view)
         self.embed.set_show_selectionbar(False)
 
     def _on_delete_clicked(self, widget):
         self.current_view.delete_selected()
-        self.set_selection_label(0)
+        self._set_selection_label(0)
         self.embed.set_show_selectionbar(False)
 
 
diff --git a/gnomeclocks/clocks.py b/gnomeclocks/clocks.py
index b3a2dab..0aebecc 100644
--- a/gnomeclocks/clocks.py
+++ b/gnomeclocks/clocks.py
@@ -20,8 +20,12 @@ from gi.repository import GObject, Gtk
 
 
 class Clock(Gtk.EventBox):
+    class Mode:
+        NORMAL = 0
+        STANDALONE = 1
+        SELECTION = 2
 
-    def __init__(self, label, new_label=None, has_selection_mode=False):
+    def __init__(self, label, new_label=None):
         Gtk.EventBox.__init__(self)
 
         # We catch map/unmap here to allow pausing of expensive UI
@@ -32,7 +36,7 @@ class Clock(Gtk.EventBox):
 
         self.label = label
         self.new_label = new_label
-        self.has_selection_mode = has_selection_mode
+        self.mode = Clock.Mode.NORMAL
         self.get_style_context().add_class('view')
         self.get_style_context().add_class('content-view')
 
@@ -50,10 +54,10 @@ class Clock(Gtk.EventBox):
     def get_selection(self):
         pass
 
-    def unselect_all(self):
+    def delete_selected(self):
         pass
 
-    def delete_selected(self):
+    def set_mode(self, mode):
         pass
 
     def _ui_freeze(self, widget):
diff --git a/gnomeclocks/stopwatch.py b/gnomeclocks/stopwatch.py
index 5898816..6336488 100644
--- a/gnomeclocks/stopwatch.py
+++ b/gnomeclocks/stopwatch.py
@@ -102,6 +102,8 @@ class Stopwatch(Clock):
         scroll.add(self.laps_view)
         vbox.pack_start(scroll, True, True, 0)
 
+        self.show_all()
+
     def _on_left_button_clicked(self, widget):
         if self.state in (Stopwatch.State.RESET, Stopwatch.State.STOPPED):
             self.state = Stopwatch.State.RUNNING
diff --git a/gnomeclocks/timer.py b/gnomeclocks/timer.py
index 826411e..a5f2c14 100644
--- a/gnomeclocks/timer.py
+++ b/gnomeclocks/timer.py
@@ -17,7 +17,7 @@
 # Author: Seif Lotfy <seif lotfy collabora co uk>
 
 import time
-from gi.repository import GLib, Gtk
+from gi.repository import GLib,  GObject, Gtk
 from clocks import Clock
 from utils import Alert
 from widgets import Spinner
@@ -170,14 +170,15 @@ class Timer(Clock):
         self.timer_screen = TimerScreen(self, size_group)
         self.notebook.append_page(self.timer_screen, None)
 
-        self.alert = Alert("complete", "Ta Da !",
-                           self._on_notification_activated)
+        self.show_all()
+
+        self.alert = Alert("complete", "Ta Da !")
 
         self._ui_is_frozen = False
 
-    def _on_notification_activated(self, notif, action, data):
-        win = self.get_toplevel()
-        win.show_clock(self)
+    @GObject.Signal
+    def alarm_ringing(self):
+        self.alert.show()
 
     def show_setup_screen(self, reset):
         self.notebook.set_current_page(0)
@@ -224,7 +225,7 @@ class Timer(Clock):
     def count(self):
         t = time.time()
         if t >= self.deadline:
-            self.alert.show()
+            self.emit("alarm-ringing")
             self.state = Timer.State.STOPPED
             self._remove_timeout()
             self.timer_screen.set_time(0, 0, 0)
diff --git a/gnomeclocks/utils.py b/gnomeclocks/utils.py
index 8944ffd..d2b8334 100644
--- a/gnomeclocks/utils.py
+++ b/gnomeclocks/utils.py
@@ -127,7 +127,7 @@ class LocalizedWeekdays:
 
 
 class Alert:
-    def __init__(self, soundid, msg, callback):
+    def __init__(self, soundid, msg):
         try:
             self.canberra = pycanberra.Canberra()
         except Exception as e:
@@ -139,8 +139,6 @@ class Alert:
         self.notification = None
         if Notify.is_initted() or Notify.init("GNOME Clocks"):
             self.notification = Notify.Notification.new("Clocks", msg, 'clocks')
-            # the special "default" action should not display a button
-            self.notification.add_action("default", "Show", callback, None, None)
         else:
             print "Error: Could not trigger Alert"
 
diff --git a/gnomeclocks/world.py b/gnomeclocks/world.py
index 7c7ca10..4f68439 100644
--- a/gnomeclocks/world.py
+++ b/gnomeclocks/world.py
@@ -318,7 +318,12 @@ class ClockStandalone(Gtk.EventBox):
 class World(Clock):
     def __init__(self):
         # Translators: "New" refers to a world clock
-        Clock.__init__(self, _("World"), _("New"), True)
+        Clock.__init__(self, _("World"), _("New"))
+
+        self.notebook = Gtk.Notebook()
+        self.notebook.set_show_tabs(False)
+        self.notebook.set_show_border(False)
+        self.add(self.notebook)
 
         self.liststore = Gtk.ListStore(bool,
                                        GdkPixbuf.Pixbuf,
@@ -330,7 +335,7 @@ class World(Clock):
         contentview = ContentView(self.iconview,
                                   "document-open-recent-symbolic",
                                   _("Select <b>New</b> to add a world clock"))
-        self.add(contentview)
+        self.notebook.append_page(contentview, None)
 
         self.iconview.connect("item-activated", self._on_item_activated)
         self.iconview.connect("selection-changed", self._on_selection_changed)
@@ -341,9 +346,21 @@ class World(Clock):
         self.show_all()
 
         self.standalone = ClockStandalone()
+        self.notebook.append_page(self.standalone, None)
 
         self.timeout_id = GLib.timeout_add(1000, self._update_clocks)
 
+    def set_mode(self, mode):
+        self.mode = mode
+        if mode is Clock.Mode.NORMAL:
+            self.iconview.unselect_all()
+            self.notebook.set_current_page(0)
+            self.iconview.set_selection_mode(False)
+        elif mode is Clock.Mode.STANDALONE:
+            self.notebook.set_current_page(1)
+        elif mode is Clock.Mode.SELECTION:
+            self.iconview.set_selection_mode(True)
+
     def _update_clocks(self):
         for i in self.liststore:
             thumb = self.liststore.get_value(i.iter, 3)
@@ -359,9 +376,6 @@ class World(Clock):
     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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]