[devhelp] Settings: add API for the "books-disabled" GSettings key



commit 2476b53ff07adc4813ed69179a1a98a25715db5e
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Wed Apr 4 11:56:20 2018 +0200

    Settings: add API for the "books-disabled" GSettings key
    
    And use it in DhBookManager. The use of the "books-disabled" GSettings
    key was localized only in DhBookManager.

 devhelp/dh-book-manager.c           |  139 +++--------------------------
 devhelp/dh-settings.c               |  169 +++++++++++++++++++++++++++++++++--
 devhelp/dh-settings.h               |    8 ++
 docs/reference/devhelp-sections.txt |    2 +
 4 files changed, 186 insertions(+), 132 deletions(-)
---
diff --git a/devhelp/dh-book-manager.c b/devhelp/dh-book-manager.c
index f466db8..69c5ef6 100644
--- a/devhelp/dh-book-manager.c
+++ b/devhelp/dh-book-manager.c
@@ -126,9 +126,6 @@ typedef struct {
 
         /* List of NewPossibleBookData* */
         GSList *new_possible_books_data;
-
-        /* List of book IDs (gchar*) currently disabled */
-        GList *books_disabled;
 } DhBookManagerPrivate;
 
 enum {
@@ -201,12 +198,7 @@ dh_book_manager_dispose (GObject *object)
 static void
 dh_book_manager_finalize (GObject *object)
 {
-        DhBookManager *book_manager = DH_BOOK_MANAGER (object);
-        DhBookManagerPrivate *priv = dh_book_manager_get_instance_private (book_manager);
-
-        g_list_free_full (priv->books_disabled, g_free);
-
-        if (singleton == book_manager)
+        if (singleton == DH_BOOK_MANAGER (object))
                 singleton = NULL;
 
         G_OBJECT_CLASS (dh_book_manager_parent_class)->finalize (object);
@@ -282,87 +274,6 @@ dh_book_manager_class_init (DhBookManagerClass *klass)
 }
 
 static void
-load_books_disabled (DhBookManager *book_manager)
-{
-        DhBookManagerPrivate *priv = dh_book_manager_get_instance_private (book_manager);
-        DhSettings *settings;
-        GSettings *contents_settings;
-        gchar **books_disabled_strv;
-        gint i;
-
-        g_assert (priv->books_disabled == NULL);
-
-        settings = dh_settings_get_default ();
-        contents_settings = dh_settings_peek_contents_settings (settings);
-        books_disabled_strv = g_settings_get_strv (contents_settings, "books-disabled");
-
-        if (books_disabled_strv == NULL)
-                return;
-
-        for (i = 0; books_disabled_strv[i] != NULL; i++) {
-                gchar *book_id = books_disabled_strv[i];
-                priv->books_disabled = g_list_prepend (priv->books_disabled, book_id);
-        }
-
-        priv->books_disabled = g_list_reverse (priv->books_disabled);
-
-        g_free (books_disabled_strv);
-}
-
-static void
-store_books_disabled (DhBookManager *book_manager)
-{
-        DhBookManagerPrivate *priv = dh_book_manager_get_instance_private (book_manager);
-        DhSettings *settings;
-        GSettings *contents_settings;
-        GVariantBuilder *builder;
-        GVariant *variant;
-        GList *l;
-
-        builder = g_variant_builder_new (G_VARIANT_TYPE_STRING_ARRAY);
-
-        for (l = priv->books_disabled; l != NULL; l = l->next) {
-                const gchar *book_id = l->data;
-                g_variant_builder_add (builder, "s", book_id);
-        }
-
-        variant = g_variant_builder_end (builder);
-        g_variant_builder_unref (builder);
-
-        settings = dh_settings_get_default ();
-        contents_settings = dh_settings_peek_contents_settings (settings);
-        g_settings_set_value (contents_settings, "books-disabled", variant);
-}
-
-static GList *
-find_book_in_disabled_list (GList  *books_disabled,
-                            DhBook *book)
-{
-        const gchar *book_id;
-        GList *node;
-
-        book_id = dh_book_get_id (book);
-
-        for (node = books_disabled; node != NULL; node = node->next) {
-                const gchar *cur_book_id = node->data;
-
-                if (g_strcmp0 (book_id, cur_book_id) == 0)
-                        return node;
-        }
-
-        return NULL;
-}
-
-static gboolean
-is_book_disabled_in_conf (DhBookManager *book_manager,
-                          DhBook        *book)
-{
-        DhBookManagerPrivate *priv = dh_book_manager_get_instance_private (book_manager);
-
-        return find_book_in_disabled_list (priv->books_disabled, book) != NULL;
-}
-
-static void
 remove_book (DhBookManager *book_manager,
              DhBook        *book)
 {
@@ -410,22 +321,11 @@ static void
 book_enabled_cb (DhBook        *book,
                  DhBookManager *book_manager)
 {
-        DhBookManagerPrivate *priv = dh_book_manager_get_instance_private (book_manager);
-        GList *node;
-        gchar *book_id;
-
-        node = find_book_in_disabled_list (priv->books_disabled, book);
-
-        /* When setting as enabled a given book, we should have it in the
-         * disabled books list!
-         */
-        g_return_if_fail (node != NULL);
-
-        book_id = node->data;
-        g_free (book_id);
-        priv->books_disabled = g_list_delete_link (priv->books_disabled, node);
+        DhSettings *settings;
 
-        store_books_disabled (book_manager);
+        settings = dh_settings_get_default ();
+        g_return_if_fail (!dh_settings_is_book_enabled (settings, book));
+        dh_settings_set_book_enabled (settings, book, TRUE);
 
         g_signal_emit (book_manager,
                        signals[SIGNAL_BOOK_ENABLED],
@@ -437,21 +337,11 @@ static void
 book_disabled_cb (DhBook        *book,
                   DhBookManager *book_manager)
 {
-        DhBookManagerPrivate *priv = dh_book_manager_get_instance_private (book_manager);
-        GList *node;
-        const gchar *book_id;
-
-        node = find_book_in_disabled_list (priv->books_disabled, book);
-
-        /* When setting as disabled a given book, we shouldn't have it in the
-         * disabled books list!
-         */
-        g_return_if_fail (node == NULL);
+        DhSettings *settings;
 
-        book_id = dh_book_get_id (book);
-        priv->books_disabled = g_list_append (priv->books_disabled,
-                                              g_strdup (book_id));
-        store_books_disabled (book_manager);
+        settings = dh_settings_get_default ();
+        g_return_if_fail (dh_settings_is_book_enabled (settings, book));
+        dh_settings_set_book_enabled (settings, book, FALSE);
 
         g_signal_emit (book_manager,
                        signals[SIGNAL_BOOK_DISABLED],
@@ -466,13 +356,11 @@ static gboolean
 create_book_from_index_file (DhBookManager *book_manager,
                              GFile         *index_file)
 {
-        DhBookManagerPrivate *priv;
+        DhBookManagerPrivate *priv = dh_book_manager_get_instance_private (book_manager);
         DhBook *book;
-        gboolean book_enabled;
+        DhSettings *settings;
         GList *l;
 
-        priv = dh_book_manager_get_instance_private (book_manager);
-
         /* Check if a DhBook at the same location has already been loaded. */
         for (l = priv->books; l != NULL; l = l->next) {
                 DhBook *cur_book = DH_BOOK (l->data);
@@ -502,8 +390,8 @@ create_book_from_index_file (DhBookManager *book_manager,
                                             book,
                                             (GCompareFunc)dh_book_cmp_by_title);
 
-        book_enabled = !is_book_disabled_in_conf (book_manager, book);
-        dh_book_set_enabled (book, book_enabled);
+        settings = dh_settings_get_default ();
+        dh_book_set_enabled (book, dh_settings_is_book_enabled (settings, book));
 
         g_signal_connect_object (book,
                                  "deleted",
@@ -769,7 +657,6 @@ populate (DhBookManager *book_manager)
 static void
 dh_book_manager_init (DhBookManager *book_manager)
 {
-        load_books_disabled (book_manager);
         populate (book_manager);
 }
 
diff --git a/devhelp/dh-settings.c b/devhelp/dh-settings.c
index 82acb4b..a09edaa 100644
--- a/devhelp/dh-settings.c
+++ b/devhelp/dh-settings.c
@@ -50,6 +50,9 @@
 struct _DhSettingsPrivate {
         GSettings *gsettings_contents;
 
+        /* List of book IDs (gchar*) currently disabled. */
+        GList *books_disabled;
+
         guint group_books_by_language : 1;
 };
 
@@ -65,6 +68,101 @@ static DhSettings *default_instance = NULL;
 G_DEFINE_TYPE_WITH_PRIVATE (DhSettings, dh_settings, G_TYPE_OBJECT);
 
 static void
+load_books_disabled (DhSettings *settings)
+{
+        gchar **books_disabled_strv;
+        gint i;
+
+        g_assert (settings->priv->books_disabled == NULL);
+
+        books_disabled_strv = g_settings_get_strv (settings->priv->gsettings_contents,
+                                                   "books-disabled");
+
+        if (books_disabled_strv == NULL)
+                return;
+
+        for (i = 0; books_disabled_strv[i] != NULL; i++) {
+                gchar *book_id = books_disabled_strv[i];
+                settings->priv->books_disabled = g_list_prepend (settings->priv->books_disabled, book_id);
+        }
+
+        settings->priv->books_disabled = g_list_reverse (settings->priv->books_disabled);
+
+        g_free (books_disabled_strv);
+}
+
+static void
+store_books_disabled (DhSettings *settings)
+{
+        GVariantBuilder *builder;
+        GVariant *variant;
+        GList *l;
+
+        builder = g_variant_builder_new (G_VARIANT_TYPE_STRING_ARRAY);
+
+        for (l = settings->priv->books_disabled; l != NULL; l = l->next) {
+                const gchar *book_id = l->data;
+                g_variant_builder_add (builder, "s", book_id);
+        }
+
+        variant = g_variant_builder_end (builder);
+        g_variant_builder_unref (builder);
+
+        g_settings_set_value (settings->priv->gsettings_contents, "books-disabled", variant);
+}
+
+static GList *
+find_in_books_disabled (DhSettings  *settings,
+                        const gchar *book_id)
+{
+        GList *node;
+
+        for (node = settings->priv->books_disabled; node != NULL; node = node->next) {
+                const gchar *cur_book_id = node->data;
+
+                if (g_strcmp0 (book_id, cur_book_id) == 0)
+                        return node;
+        }
+
+        return NULL;
+}
+
+static void
+enable_book (DhSettings  *settings,
+             const gchar *book_id)
+{
+        GList *node;
+
+        node = find_in_books_disabled (settings, book_id);
+
+        /* Already enabled. */
+        if (node == NULL)
+                return;
+
+        g_free (node->data);
+        settings->priv->books_disabled = g_list_delete_link (settings->priv->books_disabled, node);
+
+        store_books_disabled (settings);
+}
+
+static void
+disable_book (DhSettings  *settings,
+              const gchar *book_id)
+{
+        GList *node;
+
+        node = find_in_books_disabled (settings, book_id);
+
+        /* Already disabled. */
+        if (node != NULL)
+                return;
+
+        settings->priv->books_disabled = g_list_append (settings->priv->books_disabled,
+                                                        g_strdup (book_id));
+        store_books_disabled (settings);
+}
+
+static void
 dh_settings_get_property (GObject    *object,
                           guint       prop_id,
                           GValue     *value,
@@ -115,7 +213,11 @@ dh_settings_dispose (GObject *object)
 static void
 dh_settings_finalize (GObject *object)
 {
-        if (default_instance == DH_SETTINGS (object))
+        DhSettings *settings = DH_SETTINGS (object);
+
+        g_list_free_full (settings->priv->books_disabled, g_free);
+
+        if (default_instance == settings)
                 default_instance = NULL;
 
         G_OBJECT_CLASS (dh_settings_parent_class)->finalize (object);
@@ -159,15 +261,16 @@ dh_settings_init (DhSettings *settings)
 DhSettings *
 _dh_settings_new (const gchar *contents_path)
 {
-        DhSettings *object;
+        DhSettings *settings;
 
         g_return_val_if_fail (contents_path != NULL, NULL);
 
-        object = g_object_new (DH_TYPE_SETTINGS, NULL);
-        object->priv->gsettings_contents = g_settings_new_with_path (SETTINGS_SCHEMA_ID_CONTENTS,
-                                                                     contents_path);
+        settings = g_object_new (DH_TYPE_SETTINGS, NULL);
+        settings->priv->gsettings_contents = g_settings_new_with_path (SETTINGS_SCHEMA_ID_CONTENTS,
+                                                                       contents_path);
+        load_books_disabled (settings);
 
-        return object;
+        return settings;
 }
 
 /**
@@ -293,3 +396,57 @@ dh_settings_bind_group_books_by_language (DhSettings *settings)
                          G_SETTINGS_BIND_DEFAULT |
                          G_SETTINGS_BIND_NO_SENSITIVITY);
 }
+
+/**
+ * dh_settings_is_book_enabled:
+ * @settings: a #DhSettings.
+ * @book: a #DhBook.
+ *
+ * Returns whether @book is enabled according to the "books-disabled" #GSettings
+ * key. If the @book ID is present in "books-disabled", this function returns
+ * %FALSE, otherwise %TRUE is returned.
+ *
+ * Returns: whether @book is enabled.
+ * Since: 3.30
+ */
+gboolean
+dh_settings_is_book_enabled (DhSettings *settings,
+                             DhBook     *book)
+{
+        const gchar *book_id;
+
+        g_return_val_if_fail (DH_IS_SETTINGS (settings), FALSE);
+        g_return_val_if_fail (DH_IS_BOOK (book), FALSE);
+
+        book_id = dh_book_get_id (book);
+        return find_in_books_disabled (settings, book_id) == NULL;
+}
+
+/**
+ * dh_settings_set_book_enabled:
+ * @settings: a #DhSettings.
+ * @book: a #DhBook.
+ * @enabled: the new value.
+ *
+ * Modifies the "books-disabled" #GSettings key. It adds or removes the @book ID
+ * from "books-disabled".
+ *
+ * Since: 3.30
+ */
+void
+dh_settings_set_book_enabled (DhSettings *settings,
+                              DhBook     *book,
+                              gboolean    enabled)
+{
+        const gchar *book_id;
+
+        g_return_if_fail (DH_IS_SETTINGS (settings));
+        g_return_if_fail (DH_IS_BOOK (book));
+
+        book_id = dh_book_get_id (book);
+
+        if (enabled)
+                enable_book (settings, book_id);
+        else
+                disable_book (settings, book_id);
+}
diff --git a/devhelp/dh-settings.h b/devhelp/dh-settings.h
index ff3527c..77f3061 100644
--- a/devhelp/dh-settings.h
+++ b/devhelp/dh-settings.h
@@ -23,6 +23,7 @@
 #define DH_SETTINGS_H
 
 #include <gio/gio.h>
+#include <devhelp/dh-book.h>
 
 G_BEGIN_DECLS
 
@@ -70,6 +71,13 @@ void            dh_settings_set_group_books_by_language         (DhSettings *set
 
 void            dh_settings_bind_group_books_by_language        (DhSettings *settings);
 
+gboolean        dh_settings_is_book_enabled                     (DhSettings *settings,
+                                                                 DhBook     *book);
+
+void            dh_settings_set_book_enabled                    (DhSettings *settings,
+                                                                 DhBook     *book,
+                                                                 gboolean    enabled);
+
 G_END_DECLS
 
 #endif /* DH_SETTINGS_H */
diff --git a/docs/reference/devhelp-sections.txt b/docs/reference/devhelp-sections.txt
index 50ba4b5..6266b17 100644
--- a/docs/reference/devhelp-sections.txt
+++ b/docs/reference/devhelp-sections.txt
@@ -158,6 +158,8 @@ dh_settings_bind_all
 dh_settings_get_group_books_by_language
 dh_settings_set_group_books_by_language
 dh_settings_bind_group_books_by_language
+dh_settings_is_book_enabled
+dh_settings_set_book_enabled
 <SUBSECTION Standard>
 DH_IS_SETTINGS
 DH_IS_SETTINGS_CLASS


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