[devhelp: 3/3] Use DhCompletion



commit bacbd8563199347ba0088a4f19b7da0b49c82431
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Sat Jan 6 14:35:30 2018 +0100

    Use DhCompletion
    
    The GCompletion object was created in each DhSidebar (so it was
    duplicated when there were several main windows). And DhSidebar needed
    to maintain the GCompletion when books are added/removed.
    
    Now the GList of DhCompletion objects is created on the fly, with each
    DhCompletion object stored and created lazily in DhBook.
    
    Devhelp now compiles without any deprecation warning.

 docs/reference/api-breaks.xml       |    6 ++
 docs/reference/devhelp-sections.txt |    2 +-
 src/dh-book.c                       |   34 +++++-----
 src/dh-book.h                       |    5 +-
 src/dh-sidebar.c                    |  123 +++++++++-------------------------
 5 files changed, 60 insertions(+), 110 deletions(-)
---
diff --git a/docs/reference/api-breaks.xml b/docs/reference/api-breaks.xml
index 1288056..c47c2b5 100644
--- a/docs/reference/api-breaks.xml
+++ b/docs/reference/api-breaks.xml
@@ -225,6 +225,12 @@
           used only inside DhSidebar).
         </para>
       </listitem>
+      <listitem>
+        <para>
+          <code>dh_book_get_completions()</code> has been replaced by
+          <link linkend="dh-book-get-completion">dh_book_get_completion()</link>.
+        </para>
+      </listitem>
     </itemizedlist>
   </refsect1>
 </part>
diff --git a/docs/reference/devhelp-sections.txt b/docs/reference/devhelp-sections.txt
index 06376db..047580e 100644
--- a/docs/reference/devhelp-sections.txt
+++ b/docs/reference/devhelp-sections.txt
@@ -34,7 +34,7 @@ dh_book_get_title
 dh_book_get_language
 dh_book_get_links
 dh_book_get_tree
-dh_book_get_completions
+dh_book_get_completion
 dh_book_get_enabled
 dh_book_set_enabled
 dh_book_cmp_by_id
diff --git a/src/dh-book.c b/src/dh-book.c
index 7db76e8..91960ea 100644
--- a/src/dh-book.c
+++ b/src/dh-book.c
@@ -4,7 +4,7 @@
  * Copyright (C) 2002 Mikael Hallendal <micke imendio com>
  * Copyright (C) 2004-2008 Imendio AB
  * Copyright (C) 2010 Lanedo GmbH
- * Copyright (C) 2017 Sébastien Wilmet <swilmet gnome org>
+ * Copyright (C) 2017, 2018 Sébastien Wilmet <swilmet gnome org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -82,8 +82,7 @@ typedef struct {
         /* List of DhLink*. */
         GList *links;
 
-        /* Generated list of completions (gchar*) in the book. */
-        GList *completions;
+        DhCompletion *completion;
 
         GFileMonitor *index_file_monitor;
         BookMonitorEvent last_monitor_event;
@@ -103,6 +102,7 @@ dh_book_dispose (GObject *object)
 
         priv = dh_book_get_instance_private (DH_BOOK (object));
 
+        g_clear_object (&priv->completion);
         g_clear_object (&priv->index_file_monitor);
 
         if (priv->monitor_event_timeout_id != 0) {
@@ -126,7 +126,6 @@ dh_book_finalize (GObject *object)
         g_free (priv->language);
         _dh_util_free_book_tree (priv->tree);
         g_list_free_full (priv->links, (GDestroyNotify)dh_link_unref);
-        g_list_free_full (priv->completions, g_free);
 
         G_OBJECT_CLASS (dh_book_parent_class)->finalize (object);
 }
@@ -503,14 +502,14 @@ dh_book_get_tree (DhBook *book)
 }
 
 /**
- * dh_book_get_completions:
+ * dh_book_get_completion:
  * @book: a #DhBook.
  *
- * Returns: (element-type utf8) (transfer none) (nullable): the completions
- * associated with the book.
+ * Returns: (transfer none): the #DhCompletion of @book.
+ * Since: 3.28
  */
-GList *
-dh_book_get_completions (DhBook *book)
+DhCompletion *
+dh_book_get_completion (DhBook *book)
 {
         DhBookPrivate *priv;
 
@@ -518,22 +517,23 @@ dh_book_get_completions (DhBook *book)
 
         priv = dh_book_get_instance_private (book);
 
-        if (!priv->enabled)
-                return NULL;
-
-        if (priv->completions == NULL) {
+        if (priv->completion == NULL) {
                 GList *l;
 
+                priv->completion = dh_completion_new ();
+
                 for (l = priv->links; l != NULL; l = l->next) {
                         DhLink *link = l->data;
-                        gchar *str;
+                        const gchar *str;
 
-                        str = g_strdup (dh_link_get_name (link));
-                        priv->completions = g_list_prepend (priv->completions, str);
+                        str = dh_link_get_name (link);
+                        dh_completion_add_string (priv->completion, str);
                 }
+
+                dh_completion_sort (priv->completion);
         }
 
-        return priv->completions;
+        return priv->completion;
 }
 
 /**
diff --git a/src/dh-book.h b/src/dh-book.h
index 0a38707..4149f88 100644
--- a/src/dh-book.h
+++ b/src/dh-book.h
@@ -4,7 +4,7 @@
  * Copyright (C) 2002 Mikael Hallendal <micke imendio com>
  * Copyright (C) 2005-2008 Imendio AB
  * Copyright (C) 2010 Lanedo GmbH
- * Copyright (C) 2017 Sébastien Wilmet <swilmet gnome org>
+ * Copyright (C) 2017, 2018 Sébastien Wilmet <swilmet gnome org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -24,6 +24,7 @@
 #define DH_BOOK_H
 
 #include <gio/gio.h>
+#include "dh-completion.h"
 
 G_BEGIN_DECLS
 
@@ -64,7 +65,7 @@ GList *      dh_book_get_links       (DhBook *book);
 
 GNode *      dh_book_get_tree        (DhBook *book);
 
-GList *      dh_book_get_completions (DhBook *book);
+DhCompletion *dh_book_get_completion (DhBook *book);
 
 gboolean     dh_book_get_enabled     (DhBook *book);
 
diff --git a/src/dh-sidebar.c b/src/dh-sidebar.c
index 3500ad0..b1fce84 100644
--- a/src/dh-sidebar.c
+++ b/src/dh-sidebar.c
@@ -5,7 +5,7 @@
  * Copyright (C) 2005-2008 Imendio AB
  * Copyright (C) 2010 Lanedo GmbH
  * Copyright (C) 2013 Aleksander Morgado <aleksander gnu org>
- * Copyright (C) 2015 Sébastien Wilmet <swilmet gnome org>
+ * Copyright (C) 2015, 2017, 2018 Sébastien Wilmet <swilmet gnome org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -62,7 +62,6 @@ typedef struct {
         GtkTreeView *hitlist_view;
         GtkScrolledWindow *sw_hitlist;
 
-        GCompletion *completion;
         guint idle_complete_id;
         guint idle_search_id;
 } DhSidebarPrivate;
@@ -97,22 +96,11 @@ dh_sidebar_dispose (GObject *object)
 }
 
 static void
-dh_sidebar_finalize (GObject *object)
-{
-        DhSidebarPrivate *priv = dh_sidebar_get_instance_private (DH_SIDEBAR (object));
-
-        g_clear_pointer (&priv->completion, g_completion_free);
-
-        G_OBJECT_CLASS (dh_sidebar_parent_class)->finalize (object);
-}
-
-static void
 dh_sidebar_class_init (DhSidebarClass *klass)
 {
         GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
         object_class->dispose = dh_sidebar_dispose;
-        object_class->finalize = dh_sidebar_finalize;
 
         /**
          * DhSidebar::link-selected:
@@ -180,74 +168,13 @@ setup_search_idle (DhSidebar *sidebar)
                 priv->idle_search_id = g_idle_add (search_idle_cb, sidebar);
 }
 
-/******************************************************************************/
-
-static void
-completion_add_book (DhSidebar *sidebar,
-                     DhBook    *book)
-{
-        DhSidebarPrivate *priv = dh_sidebar_get_instance_private (sidebar);
-        GList *completions;
-
-        if (G_UNLIKELY (priv->completion == NULL))
-                priv->completion = g_completion_new (NULL);
-
-        completions = dh_book_get_completions (book);
-        if (completions != NULL)
-                g_completion_add_items (priv->completion, completions);
-}
-
-static void
-completion_delete_book (DhSidebar *sidebar,
-                        DhBook    *book)
-{
-        DhSidebarPrivate *priv = dh_sidebar_get_instance_private (sidebar);
-        GList *completions;
-
-        if (G_UNLIKELY (priv->completion == NULL))
-                return;
-
-        completions = dh_book_get_completions (book);
-        if (completions != NULL)
-                g_completion_remove_items (priv->completion, completions);
-}
-
-static void
-book_created_or_enabled_cb (DhBookManager *book_manager,
-                            DhBook        *book,
-                            DhSidebar     *sidebar)
-{
-        completion_add_book (sidebar, book);
-
-        /* Update current search if any */
-        setup_search_idle (sidebar);
-}
-
 static void
-book_deleted_or_disabled_cb (DhBookManager *book_manager,
-                             DhBook        *book,
-                             DhSidebar     *sidebar)
+book_manager_changed_cb (DhSidebar *sidebar)
 {
-        completion_delete_book (sidebar, book);
-
-        /* Update current search if any */
+        /* Update current search if any. */
         setup_search_idle (sidebar);
 }
 
-static void
-completion_populate (DhSidebar *sidebar)
-{
-        DhBookManager *book_manager;
-        GList *books;
-        GList *l;
-
-        book_manager = dh_book_manager_get_singleton ();
-        books = dh_book_manager_get_books (book_manager);
-
-        for (l = books; l != NULL; l = l->next)
-                completion_add_book (sidebar, DH_BOOK (l->data));
-}
-
 /******************************************************************************/
 
 static void
@@ -402,12 +329,29 @@ complete_idle_cb (gpointer user_data)
 {
         DhSidebar *sidebar = DH_SIDEBAR (user_data);
         DhSidebarPrivate *priv = dh_sidebar_get_instance_private (sidebar);
+        DhBookManager *book_manager;
+        GList *books;
+        GList *l;
+        GList *completion_objects = NULL;
         const gchar *search_text;
-        gchar *completed = NULL;
+        gchar *completed;
+
+        book_manager = dh_book_manager_get_singleton ();
+        books = dh_book_manager_get_books (book_manager);
+        for (l = books; l != NULL; l = l->next) {
+                DhBook *cur_book = DH_BOOK (l->data);
+
+                if (dh_book_get_enabled (cur_book)) {
+                        DhCompletion *completion;
+
+                        completion = dh_book_get_completion (cur_book);
+                        completion_objects = g_list_prepend (completion_objects, completion);
+                }
+        }
 
         search_text = gtk_entry_get_text (priv->entry);
+        completed = dh_completion_aggregate_complete (completion_objects, search_text);
 
-        g_completion_complete (priv->completion, search_text, &completed);
         if (completed != NULL) {
                 guint16 n_chars_before;
 
@@ -417,11 +361,12 @@ complete_idle_cb (gpointer user_data)
                 gtk_editable_set_position (GTK_EDITABLE (priv->entry), n_chars_before);
                 gtk_editable_select_region (GTK_EDITABLE (priv->entry),
                                             n_chars_before, -1);
-                g_free (completed);
         }
 
-        priv->idle_complete_id = 0;
+        g_list_free (completion_objects);
+        g_free (completed);
 
+        priv->idle_complete_id = 0;
         return G_SOURCE_REMOVE;
 }
 
@@ -586,27 +531,27 @@ dh_sidebar_init (DhSidebar *sidebar)
 
         g_signal_connect_object (book_manager,
                                  "book-created",
-                                 G_CALLBACK (book_created_or_enabled_cb),
+                                 G_CALLBACK (book_manager_changed_cb),
                                  sidebar,
-                                 0);
+                                 G_CONNECT_SWAPPED);
 
         g_signal_connect_object (book_manager,
                                  "book-enabled",
-                                 G_CALLBACK (book_created_or_enabled_cb),
+                                 G_CALLBACK (book_manager_changed_cb),
                                  sidebar,
-                                 0);
+                                 G_CONNECT_SWAPPED);
 
         g_signal_connect_object (book_manager,
                                  "book-deleted",
-                                 G_CALLBACK (book_deleted_or_disabled_cb),
+                                 G_CALLBACK (book_manager_changed_cb),
                                  sidebar,
-                                 0);
+                                 G_CONNECT_SWAPPED);
 
         g_signal_connect_object (book_manager,
                                  "book-disabled",
-                                 G_CALLBACK (book_deleted_or_disabled_cb),
+                                 G_CALLBACK (book_manager_changed_cb),
                                  sidebar,
-                                 0);
+                                 G_CONNECT_SWAPPED);
 
         /* Setup the book tree */
         priv->sw_book_tree = GTK_SCROLLED_WINDOW (gtk_scrolled_window_new (NULL, NULL));
@@ -627,8 +572,6 @@ dh_sidebar_init (DhSidebar *sidebar)
         gtk_widget_set_vexpand (GTK_WIDGET (priv->sw_book_tree), TRUE);
         gtk_container_add (GTK_CONTAINER (sidebar), GTK_WIDGET (priv->sw_book_tree));
 
-        completion_populate (sidebar);
-
         gtk_widget_show_all (GTK_WIDGET (sidebar));
 }
 


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