[geary/mjog/user-plugins: 7/26] Add UI to preferences window for managing optional plugins



commit c29078728402094220cc82ce390b68260a52e2ff
Author: Michael Gratton <mike vee net>
Date:   Mon Mar 2 12:25:08 2020 +1100

    Add UI to preferences window for managing optional plugins

 meson.build                                        |  1 +
 src/client/application/application-client.vala     |  3 +-
 .../components/components-preferences-window.vala  | 86 +++++++++++++++++++++-
 src/client/meson.build                             |  1 +
 4 files changed, 89 insertions(+), 2 deletions(-)
---
diff --git a/meson.build b/meson.build
index 43a46c1b..84fe0710 100644
--- a/meson.build
+++ b/meson.build
@@ -87,6 +87,7 @@ json_glib = dependency('json-glib-1.0', version: '>= 1.0')
 libhandy = dependency('libhandy-0.0', version: '>= 0.0.10')
 libmath = cc.find_library('m')
 libpeas = dependency('libpeas-1.0', version: '>= 1.24.0')
+libpeas_gtk = dependency('libpeas-gtk-1.0', version: '>= 1.24.0')
 libsecret = dependency('libsecret-1', version: '>= 0.11')
 libsoup = dependency('libsoup-2.4', version: '>= 2.48')
 libunwind_dep = dependency(
diff --git a/src/client/application/application-client.vala b/src/client/application/application-client.vala
index ff4e51c7..45472b49 100644
--- a/src/client/application/application-client.vala
+++ b/src/client/application/application-client.vala
@@ -632,7 +632,8 @@ public class Application.Client : Gtk.Application {
         yield this.present();
 
         Components.PreferencesWindow prefs = new Components.PreferencesWindow(
-            get_active_main_window()
+            get_active_main_window(),
+            this.controller.plugins
         );
         prefs.show();
     }
diff --git a/src/client/components/components-preferences-window.vala 
b/src/client/components/components-preferences-window.vala
index 794f3650..e99e4ac7 100644
--- a/src/client/components/components-preferences-window.vala
+++ b/src/client/components/components-preferences-window.vala
@@ -28,13 +28,22 @@ public class Components.PreferencesWindow : Hdy.PreferencesWindow {
         set { base.set_application(value); }
     }
 
+    private Application.PluginManager plugins;
 
-    public PreferencesWindow(Application.MainWindow parent) {
+
+    public PreferencesWindow(Application.MainWindow parent,
+                             Application.PluginManager plugins) {
         Object(
             application: parent.application,
             transient_for: parent
         );
+        this.plugins = plugins;
+
+        add_general_pane();
+        add_plugin_pane();
+    }
 
+    private void add_general_pane() {
         var autoselect = new Gtk.Switch();
         autoselect.valign = CENTER;
 
@@ -104,6 +113,8 @@ public class Components.PreferencesWindow : Hdy.PreferencesWindow {
         group.add(startup_notifications_row);
 
         var page = new Hdy.PreferencesPage();
+        /// Translators: Preferences page title
+        page.title = _("Preferences");
         page.propagate_natural_height = true;
         page.propagate_natural_width = true;
         page.add(group);
@@ -148,6 +159,79 @@ public class Components.PreferencesWindow : Hdy.PreferencesWindow {
         this.delete_event.connect(on_delete);
     }
 
+    private void add_plugin_pane() {
+        var group = new Hdy.PreferencesGroup();
+        /// Translators: Preferences group title
+        //group.title = _("Plugins");
+        /// Translators: Preferences group description
+        //group.description = _("Optional features for Geary");
+
+        Application.Client? application = this.application;
+        if (application != null) {
+            foreach (Peas.PluginInfo plugin in
+                     this.plugins.get_optional_plugins()) {
+                group.add(new_plugin_row(plugin));
+            }
+        }
+
+        var page = new Hdy.PreferencesPage();
+        /// Translators: Preferences page title
+        page.title = _("Plugins");
+        page.propagate_natural_width = true;
+        page.add(group);
+        page.show_all();
+
+        add(page);
+    }
+
+    private Hdy.ActionRow new_plugin_row(Peas.PluginInfo plugin) {
+        var @switch = new Gtk.Switch();
+        @switch.active = plugin.is_loaded();
+        @switch.notify["active"].connect_after(
+            () => enable_plugin(plugin, switch)
+        );
+        @switch.valign = CENTER;
+
+        var row = new Hdy.ActionRow();
+        row.title = plugin.get_name();
+        row.subtitle = plugin.get_description();
+        row.activatable_widget = @switch;
+        row.add_action(@switch);
+
+        return row;
+    }
+
+    private void enable_plugin(Peas.PluginInfo plugin, Gtk.Switch @switch) {
+        if (@switch.active && !plugin.is_loaded()) {
+            bool loaded = false;
+            try {
+                loaded = this.plugins.load_optional(plugin);
+            } catch (GLib.Error err) {
+                warning(
+                    "Plugin %s not able to be loaded: %s",
+                    plugin.get_name(), err.message
+                );
+            }
+            if (!loaded) {
+                @switch.active = false;
+            }
+        } else if (!@switch.active && plugin.is_loaded()) {
+            bool unloaded = false;
+            try {
+                unloaded = this.plugins.unload_optional(plugin);
+            } catch (GLib.Error err) {
+                warning(
+                    "Plugin %s not able to be loaded: %s",
+                    plugin.get_name(), err.message
+                );
+            }
+            if (!unloaded) {
+                @switch.active = true;
+            }
+        }
+    }
+
+
     private void on_close() {
         close();
     }
diff --git a/src/client/meson.build b/src/client/meson.build
index cf8d8a83..1960dd48 100644
--- a/src/client/meson.build
+++ b/src/client/meson.build
@@ -133,6 +133,7 @@ geary_client_dependencies = [
   libhandy,
   libmath,
   libpeas,
+  libpeas_gtk,
   libsecret,
   libsoup,
   libxml,


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