[gnome-break-timer] Tidy up initialization in settings, finish removing libgee



commit 2c954be4d700a3731109a39a1693a2ccf286ea20
Author: Dylan McCall <dylan dylanmccall ca>
Date:   Mon Nov 16 22:27:18 2020 -0800

    Tidy up initialization in settings, finish removing libgee

 meson.build                                     |  1 -
 src/daemon/Application.vala                     |  6 +-
 src/daemon/BreakManager.vala                    | 16 +----
 src/daemon/activity/ActivityMonitor.vala        |  6 +-
 src/daemon/break/BreakView.vala                 | 10 +--
 src/daemon/timerbreak/TimerBreakController.vala | 10 +--
 src/meson.build                                 |  1 -
 src/settings/Application.vala                   | 12 +++-
 src/settings/BreakManager.vala                  | 86 ++++++++++---------------
 src/settings/BreakSettingsDialog.vala           | 26 ++++----
 src/settings/MainWindow.vala                    | 28 ++++----
 src/settings/break/BreakType.vala               |  4 +-
 src/settings/panels/StatusPanel.vala            | 25 +++----
 src/settings/panels/WelcomePanel.vala           |  4 +-
 src/settings/timerbreak/TimerBreakType.vala     |  4 +-
 15 files changed, 115 insertions(+), 124 deletions(-)
---
diff --git a/meson.build b/meson.build
index 9a8f2ce..887301b 100644
--- a/meson.build
+++ b/meson.build
@@ -10,7 +10,6 @@ valac = meson.get_compiler('vala')
 cc = meson.get_compiler('c')
 
 cairo_dep = dependency('cairo')
-gee_dep = dependency('gee-0.8')
 gio_dep = dependency('gio-2.0')
 gio_unix_dep = dependency('gio-unix-2.0')
 glib_dep = dependency('glib-2.0')
diff --git a/src/daemon/Application.vala b/src/daemon/Application.vala
index 8d5ff56..8cbf723 100644
--- a/src/daemon/Application.vala
+++ b/src/daemon/Application.vala
@@ -77,14 +77,14 @@ public class Application : Gtk.Application {
         try {
             this.ui_manager.init ();
         } catch (GLib.Error error) {
-            GLib.error("Error initializing ui: %s", error.message);
+            GLib.error("Error initializing ui_manager: %s", error.message);
         }
 
         this.break_manager = new BreakManager (ui_manager, activity_monitor);
         try {
-            this.break_manager.init ();
+            this.break_manager.init (null);
         } catch (GLib.Error error) {
-            GLib.error("Error initializing ui: %s", error.message);
+            GLib.error("Error initializing break_manager: %s", error.message);
         }
 
         this.restore_state ();
diff --git a/src/daemon/BreakManager.vala b/src/daemon/BreakManager.vala
index 5f20ce0..6df7e38 100644
--- a/src/daemon/BreakManager.vala
+++ b/src/daemon/BreakManager.vala
@@ -32,14 +32,8 @@ public class BreakManager : GLib.Object, GLib.Initable {
         this.settings = new GLib.Settings ("org.gnome.BreakTimer");
 
         this.breaks = new GLib.HashTable<string, BreakType> (str_hash, str_equal);
-        this.breaks.set(
-            "microbreak",
-            new MicroBreakType (activity_monitor, ui_manager)
-        );
-        this.breaks.set(
-            "restbreak",
-            new RestBreakType (activity_monitor, ui_manager)
-        );
+        this.breaks.set("microbreak", new MicroBreakType (activity_monitor, ui_manager));
+        this.breaks.set("restbreak", new RestBreakType (activity_monitor, ui_manager));
 
         this.settings.bind ("enabled", this, "master-enabled", GLib.SettingsBindFlags.DEFAULT);
         this.settings.bind ("selected-breaks", this, "selected-break-ids", GLib.SettingsBindFlags.DEFAULT);
@@ -73,11 +67,7 @@ public class BreakManager : GLib.Object, GLib.Initable {
         }
 
         foreach (BreakType break_type in this.all_breaks ()) {
-            try {
-                break_type.init (cancellable);
-            } catch (GLib.Error error) {
-                GLib.warning ("Error initializing break type %s: %s", break_type.id, error.message);
-            }
+            break_type.init (cancellable);
         }
 
         return true;
diff --git a/src/daemon/activity/ActivityMonitor.vala b/src/daemon/activity/ActivityMonitor.vala
index e0959eb..c2bac3e 100644
--- a/src/daemon/activity/ActivityMonitor.vala
+++ b/src/daemon/activity/ActivityMonitor.vala
@@ -21,9 +21,6 @@ using BreakTimer.Daemon.Util;
 namespace BreakTimer.Daemon.Activity {
 
 public class ActivityMonitor : GLib.Object {
-    public signal void detected_idle (UserActivity activity);
-    public signal void detected_activity (UserActivity activity);
-
     private PausableTimeout poll_activity_timeout;
     private UserActivity last_activity;
     private int64 last_active_timestamp;
@@ -31,6 +28,9 @@ public class ActivityMonitor : GLib.Object {
     private ISessionStatus session_status;
     private ActivityMonitorBackend backend;
 
+    public signal void detected_idle (UserActivity activity);
+    public signal void detected_activity (UserActivity activity);
+
     public ActivityMonitor (ISessionStatus session_status, ActivityMonitorBackend backend) {
         this.session_status = session_status;
         this.backend = backend;
diff --git a/src/daemon/break/BreakView.vala b/src/daemon/break/BreakView.vala
index 40157f7..aa80cf9 100644
--- a/src/daemon/break/BreakView.vala
+++ b/src/daemon/break/BreakView.vala
@@ -24,6 +24,11 @@ public abstract class BreakView : UIFragment {
 
     private int64 last_break_notification_time = 0;
 
+    /** The break is active and has been given UI focus. This is the point where we start caring about it. */
+    public signal void focused_and_activated ();
+    /** The break has lost UI focus. We don't need to display anything at this point. */
+    public signal void lost_ui_focus ();
+
     protected BreakView (BreakController break_controller, UIManager ui_manager) {
         this.ui_manager = ui_manager;
         this.break_controller = break_controller;
@@ -37,11 +42,6 @@ public abstract class BreakView : UIFragment {
         break_controller.finished.connect_after ( () => { this.release_ui_focus (); });
     }
 
-    /** The break is active and has been given UI focus. This is the point where we start caring about it. */
-    public signal void focused_and_activated ();
-    /** The break has lost UI focus. We don't need to display anything at this point. */
-    public signal void lost_ui_focus ();
-
     public abstract string get_status_message ();
 
     /**
diff --git a/src/daemon/timerbreak/TimerBreakController.vala b/src/daemon/timerbreak/TimerBreakController.vala
index 22a2f07..f63c273 100644
--- a/src/daemon/timerbreak/TimerBreakController.vala
+++ b/src/daemon/timerbreak/TimerBreakController.vala
@@ -42,6 +42,11 @@ public abstract class TimerBreakController : BreakController {
     private StatefulTimer counting_timer = new StatefulTimer ();
     private StatefulTimer delayed_timer = new StatefulTimer ();
 
+    /** Fires continually, as long as the break is active and counting down. */
+    public signal void counting (int lap_time, int total_time);
+    /** Fires as long as the break is active but is not counting down. */
+    public signal void delayed (int lap_time, int total_time);
+
     protected TimerBreakController (ActivityMonitor activity_monitor, int fuzzy_seconds = 0) {
         base ();
         this.fuzzy_seconds = fuzzy_seconds;
@@ -69,11 +74,6 @@ public abstract class TimerBreakController : BreakController {
         this.finished.connect (this.finished_cb);
     }
 
-    /** Fires continually, as long as the break is active and counting down. */
-    public signal void counting (int lap_time, int total_time);
-    /** Fires as long as the break is active but is not counting down. */
-    public signal void delayed (int lap_time, int total_time);
-
     public override Json.Object serialize () {
         Json.Object json_root = base.serialize ();
         json_root.set_string_member ("interval_countdown", this.interval_countdown.serialize ());
diff --git a/src/meson.build b/src/meson.build
index c10bf75..e81aeaf 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -21,7 +21,6 @@ subdir('daemon')
 common_dependencies = [
     cairo_dep,
     config_lib_dep,
-    gee_dep,
     gio_dep,
     gio_unix_dep,
     gtk_dep,
diff --git a/src/settings/Application.vala b/src/settings/Application.vala
index 9e99600..f80565b 100644
--- a/src/settings/Application.vala
+++ b/src/settings/Application.vala
@@ -105,8 +105,18 @@ public class Application : Gtk.Application {
         this.set_accels_for_action ("app.quit", {"<Primary>q"});
 
         this.break_manager = new BreakManager (this);
+        try {
+            this.break_manager.init (null);
+        } catch (GLib.Error error) {
+            GLib.error("Error initializing break_manager: %s", error.message);
+        }
+
         this.main_window = new MainWindow (this, this.break_manager);
-        this.break_manager.load_breaks ();
+        try {
+            this.main_window.init (null);
+        } catch (GLib.Error error) {
+            GLib.error("Error initializing main_window: %s", error.message);
+        }
     }
 
     private void delayed_start () {
diff --git a/src/settings/BreakManager.vala b/src/settings/BreakManager.vala
index f9bdbd8..6422f7f 100644
--- a/src/settings/BreakManager.vala
+++ b/src/settings/BreakManager.vala
@@ -30,8 +30,7 @@ public class BreakManager : GLib.Object {
 
     private IBreakTimer break_daemon;
 
-    private Gee.Map<string, BreakType> breaks;
-    private GLib.List<BreakType> breaks_ordered;
+    private GLib.List<BreakType> breaks;
 
     private GLib.Settings settings;
     public bool master_enabled { get; set; }
@@ -40,11 +39,25 @@ public class BreakManager : GLib.Object {
 
     IBackgroundPortal? background_portal = null;
 
+    public signal void break_status_available ();
+    public signal void status_changed ();
+
     public BreakManager (Application application) {
         this.application = application;
-        this.breaks = new Gee.HashMap<string, BreakType> ();
-        this.breaks_ordered = new GLib.List<BreakType> ();
 
+        this.settings = new GLib.Settings ("org.gnome.BreakTimer");
+
+        this.breaks = new GLib.List<BreakType> ();
+        this.breaks.append(new MicroBreakType ());
+        this.breaks.append(new RestBreakType ());
+
+        this.settings.bind ("enabled", this, "master-enabled", SettingsBindFlags.DEFAULT);
+        this.settings.bind ("selected-breaks", this, "selected-break-ids", SettingsBindFlags.DEFAULT);
+
+        this.notify["master-enabled"].connect ( this.on_master_enabled_changed );
+    }
+
+    public bool init (GLib.Cancellable? cancellable) throws GLib.Error {
         if (this.get_is_in_flatpak ()) {
             // TODO: Does this work outside of a flatpak? We could remove the
             // extra file we install in data/autostart, which would be nice.
@@ -56,23 +69,25 @@ public class BreakManager : GLib.Object {
                 );
             } catch (GLib.IOError error) {
                 GLib.warning ("Error connecting to xdg desktop portal: %s", error.message);
+                throw error;
             }
         }
 
-        this.settings = new GLib.Settings ("org.gnome.BreakTimer");
-        this.settings.bind ("enabled", this, "master-enabled", SettingsBindFlags.DEFAULT);
-        this.settings.bind ("selected-breaks", this, "selected-break-ids", SettingsBindFlags.DEFAULT);
+        GLib.Bus.watch_name (
+            GLib.BusType.SESSION,
+            Config.DAEMON_APPLICATION_ID,
+            GLib.BusNameWatcherFlags.NONE,
+            this.break_daemon_appeared,
+            this.break_daemon_disappeared
+        );
 
-        // We choose not to send a signal when master_enabled changes because
-        // we might be starting the break daemon at the same time, so the
-        // value of is_working () could fluctuate unpleasantly.
-        //this.notify["master-enabled"].connect ( () => { this.status_changed (); });
-        this.notify["master-enabled"].connect ( this.on_master_enabled_changed );
-    }
+        foreach (BreakType break_type in this.all_breaks ()) {
+            break_type.status_changed.connect (this.break_status_changed);
+            break_type.init (cancellable);
+        }
 
-    public signal void break_status_available ();
-    public signal void break_added (BreakType break_type);
-    public signal void status_changed ();
+        return true;
+    }
 
     private void on_master_enabled_changed () {
         // Launch the break timer service if the break manager is enabled
@@ -112,50 +127,15 @@ public class BreakManager : GLib.Object {
         return GLib.FileUtils.test (flatpak_info_path, GLib.FileTest.EXISTS);
     }
 
-    public void load_breaks () {
-        this.add_break (new MicroBreakType ());
-        this.add_break (new RestBreakType ());
-
-        this.status_changed ();
-
-        GLib.Bus.watch_name (
-            GLib.BusType.SESSION,
-            Config.DAEMON_APPLICATION_ID,
-            GLib.BusNameWatcherFlags.NONE,
-            this.break_daemon_appeared,
-            this.break_daemon_disappeared
-        );
-    }
-
-    public Gee.Set<string> all_break_ids () {
-        return this.breaks.keys;
-    }
-
     public unowned GLib.List<BreakType> all_breaks () {
-        return this.breaks_ordered;
+        return this.breaks;
     }
 
     /**
      * @returns true if the break daemon is working correctly.
      */
     public bool is_working () {
-        return (this.master_enabled == false || this.breaks.size == 0 || this.break_daemon != null);
-    }
-
-    public BreakType? get_break_type_for_name (string name) {
-        return this.breaks.get (name);
-    }
-
-    private void add_break (BreakType break_type) {
-        try {
-            break_type.init (null);
-        } catch (GLib.Error error) {
-            GLib.warning ("Error initializing break type %s: %s", break_type.id, error.message);
-        }
-        this.breaks.set (break_type.id, break_type);
-        this.breaks_ordered.append (break_type);
-        break_type.status_changed.connect (this.break_status_changed);
-        this.break_added (break_type);
+        return (this.master_enabled == false || this.break_daemon != null);
     }
 
     private void break_status_changed (BreakType break_type, BreakStatus? break_status) {
diff --git a/src/settings/BreakSettingsDialog.vala b/src/settings/BreakSettingsDialog.vala
index 91ab2ce..4a4f084 100644
--- a/src/settings/BreakSettingsDialog.vala
+++ b/src/settings/BreakSettingsDialog.vala
@@ -75,10 +75,24 @@ public class BreakSettingsDialog : Gtk.Dialog {
 
         content.show_all ();
 
-        break_manager.break_added.connect (this.break_added_cb);
         this.configuration_chooser.notify["selected-break-ids"].connect (this.update_break_configuration);
     }
 
+    public bool init (GLib.Cancellable? cancellable) throws GLib.Error {
+        foreach (BreakType break_type in this.break_manager.all_breaks ()) {
+            var settings_widget = break_type.settings_widget;
+            this.breaks_grid.add (settings_widget);
+            settings_widget.realize ();
+            settings_widget.set_valign (Gtk.Align.CENTER);
+            settings_widget.set_vexpand (true);
+            settings_widget.set_margin_top (10);
+            settings_widget.set_margin_bottom (10);
+            this.update_break_configuration ();
+        }
+
+        return true;
+    }
+
     private void update_break_configuration () {
         foreach (BreakType break_type in this.break_manager.all_breaks ()) {
             if (break_type.id in this.configuration_chooser.selected_break_ids) {
@@ -89,16 +103,6 @@ public class BreakSettingsDialog : Gtk.Dialog {
         }
     }
 
-    private void break_added_cb (BreakType break_type) {
-        var settings_widget = break_type.settings_widget;
-        breaks_grid.add (settings_widget);
-        settings_widget.realize ();
-        settings_widget.set_valign (Gtk.Align.CENTER);
-        settings_widget.set_vexpand (true);
-        settings_widget.set_margin_top (10);
-        settings_widget.set_margin_bottom (10);
-        this.update_break_configuration ();
-    }
 
     private void response_cb (int response_id) {
         if (response_id == Gtk.ResponseType.CLOSE) {
diff --git a/src/settings/MainWindow.vala b/src/settings/MainWindow.vala
index ebd1b14..4a27c65 100644
--- a/src/settings/MainWindow.vala
+++ b/src/settings/MainWindow.vala
@@ -20,7 +20,7 @@ using BreakTimer.Settings.Panels;
 
 namespace BreakTimer.Settings {
 
-public class MainWindow : Gtk.ApplicationWindow {
+public class MainWindow : Gtk.ApplicationWindow, GLib.Initable {
     private BreakManager break_manager;
 
     private GLib.Menu app_menu;
@@ -107,11 +107,26 @@ public class MainWindow : Gtk.ApplicationWindow {
         this.header.show_all ();
         content.show_all ();
 
-        break_manager.break_added.connect (this.break_added_cb);
         break_manager.notify["foreground-break"].connect (this.update_visible_panel);
         this.update_visible_panel ();
     }
 
+    public bool init (GLib.Cancellable? cancellable) throws GLib.Error {
+        foreach (BreakType break_type in this.break_manager.all_breaks ()) {
+            var info_widget = break_type.info_widget;
+            this.main_stack.add_named (info_widget, break_type.id);
+            info_widget.set_margin_start (20);
+            info_widget.set_margin_end (20);
+            info_widget.set_halign (Gtk.Align.CENTER);
+            info_widget.set_valign (Gtk.Align.CENTER);
+        }
+
+        this.break_settings_dialog.init (cancellable);
+        this.status_panel.init (cancellable);
+
+        return true;
+    }
+
     public Gtk.Widget get_master_switch () {
         return this.master_switch;
     }
@@ -125,15 +140,6 @@ public class MainWindow : Gtk.ApplicationWindow {
         return null;
     }
 
-    private void break_added_cb (BreakType break_type) {
-        var info_widget = break_type.info_widget;
-        this.main_stack.add_named (info_widget, break_type.id);
-        info_widget.set_margin_start (20);
-        info_widget.set_margin_end (20);
-        info_widget.set_halign (Gtk.Align.CENTER);
-        info_widget.set_valign (Gtk.Align.CENTER);
-    }
-
     private void update_visible_panel () {
         // Use a transition when switching from the welcome panel
         Gtk.StackTransitionType transition;
diff --git a/src/settings/break/BreakType.vala b/src/settings/break/BreakType.vala
index 50e9dea..a1db481 100644
--- a/src/settings/break/BreakType.vala
+++ b/src/settings/break/BreakType.vala
@@ -29,13 +29,13 @@ public abstract class BreakType : GLib.Object, GLib.Initable {
 
     public GLib.Settings settings;
 
+    public signal void status_changed (BreakStatus? status);
+
     protected BreakType (string id, GLib.Settings settings) {
         this.id = id;
         this.settings = settings;
     }
 
-    public signal void status_changed (BreakStatus? status);
-
     public virtual bool init (GLib.Cancellable? cancellable) throws GLib.Error {
         this.info_widget = this.create_info_widget ();
         this.status_widget = this.create_status_widget ();
diff --git a/src/settings/panels/StatusPanel.vala b/src/settings/panels/StatusPanel.vala
index 3a351b7..46867c8 100644
--- a/src/settings/panels/StatusPanel.vala
+++ b/src/settings/panels/StatusPanel.vala
@@ -19,7 +19,7 @@ using BreakTimer.Settings.Break;
 
 namespace BreakTimer.Settings.Panels {
 
-private class StatusPanel : Gtk.Stack {
+private class StatusPanel : Gtk.Stack, GLib.Initable {
     private BreakManager break_manager;
 
     private Gtk.Grid breaks_list;
@@ -47,10 +47,22 @@ private class StatusPanel : Gtk.Stack {
         this.error_message = builder.get_object ("status_error") as Gtk.Widget;
         this.add (this.error_message);
 
-        break_manager.break_added.connect (this.break_added_cb);
         break_manager.status_changed.connect (this.status_changed_cb);
     }
 
+    public bool init (GLib.Cancellable? cancellable) throws GLib.Error {
+        foreach (BreakType break_type in this.break_manager.all_breaks ()) {
+            var status_widget = break_type.status_widget;
+            this.breaks_list.add (status_widget);
+            status_widget.set_margin_top (18);
+            status_widget.set_margin_end (20);
+            status_widget.set_margin_bottom (18);
+            status_widget.set_margin_start (20);
+        }
+
+        return true;
+    }
+
     private Gtk.Grid build_breaks_list (BreakManager break_manager) {
         var breaks_list = new Gtk.Grid ();
         breaks_list.set_orientation (Gtk.Orientation.VERTICAL);
@@ -60,15 +72,6 @@ private class StatusPanel : Gtk.Stack {
         return breaks_list;
     }
 
-    private void break_added_cb (BreakType break_type) {
-        var status_widget = break_type.status_widget;
-        this.breaks_list.add (status_widget);
-        status_widget.set_margin_top (18);
-        status_widget.set_margin_end (20);
-        status_widget.set_margin_bottom (18);
-        status_widget.set_margin_start (20);
-    }
-
     private void status_changed_cb () {
         bool any_breaks_enabled = false;
 
diff --git a/src/settings/panels/WelcomePanel.vala b/src/settings/panels/WelcomePanel.vala
index b9de5c8..60ab750 100644
--- a/src/settings/panels/WelcomePanel.vala
+++ b/src/settings/panels/WelcomePanel.vala
@@ -36,6 +36,8 @@ private class WelcomePanel : Gtk.Stack {
     private Gtk.Container breaks_page;
     private Gtk.Container ready_page;
 
+    public signal void tour_finished ();
+
     public WelcomePanel (BreakManager break_manager, Gtk.Builder builder, MainWindow main_window) {
         GLib.Object ();
 
@@ -78,8 +80,6 @@ private class WelcomePanel : Gtk.Stack {
         break_manager.notify["master-enabled"].connect (this.on_master_switch_toggled);
     }
 
-    public signal void tour_finished ();
-
     public bool is_active () {
         return this.current_step < Step.READY;
     }
diff --git a/src/settings/timerbreak/TimerBreakType.vala b/src/settings/timerbreak/TimerBreakType.vala
index 4913c0f..0bd6eb4 100644
--- a/src/settings/timerbreak/TimerBreakType.vala
+++ b/src/settings/timerbreak/TimerBreakType.vala
@@ -29,14 +29,14 @@ public abstract class TimerBreakType : BreakType {
 
     public IBreakTimer_TimerBreak? break_server;
 
+    public signal void timer_status_changed (TimerBreakStatus? status);
+
     protected TimerBreakType (string name, GLib.Settings settings) {
         base (name, settings);
         settings.bind ("interval-seconds", this, "interval", SettingsBindFlags.GET);
         settings.bind ("duration-seconds", this, "duration", SettingsBindFlags.GET);
     }
 
-    public signal void timer_status_changed (TimerBreakStatus? status);
-
     public override bool init (GLib.Cancellable? cancellable) throws GLib.Error {
         GLib.Bus.watch_name (
             GLib.BusType.SESSION,


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