[devhelp/wip/book-list] Implement DhBookListSimple private class



commit 6a908860a3a4bb79d2061262ece8440eaf824934
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Mon Apr 23 11:11:16 2018 +0200

    Implement DhBookListSimple private class

 devhelp/dh-book-list-simple.c |  185 +++++++++++++++++++++++++++++++++++++++++
 devhelp/dh-book-list-simple.h |   61 ++++++++++++++
 devhelp/meson.build           |    1 +
 docs/reference/meson.build    |    1 +
 po/POTFILES.in                |    1 +
 5 files changed, 249 insertions(+), 0 deletions(-)
---
diff --git a/devhelp/dh-book-list-simple.c b/devhelp/dh-book-list-simple.c
new file mode 100644
index 0000000..0df119d
--- /dev/null
+++ b/devhelp/dh-book-list-simple.c
@@ -0,0 +1,185 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
+/*
+ * This file is part of Devhelp.
+ *
+ * Copyright (C) 2018 Sébastien Wilmet <swilmet gnome org>
+ *
+ * Devhelp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * Devhelp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Devhelp.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "dh-book-list-simple.h"
+
+struct _DhBookListSimplePrivate {
+        /* List of DhBookList*. */
+        GList *book_lists;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (DhBookListSimple, _dh_book_list_simple, DH_TYPE_BOOK_LIST)
+
+static void
+dh_book_list_simple_dispose (GObject *object)
+{
+        DhBookListSimple *list_simple = DH_BOOK_LIST_SIMPLE (object);
+
+        g_list_free_full (list_simple->priv->book_lists, g_object_unref);
+        list_simple->priv->book_lists = NULL;
+
+        G_OBJECT_CLASS (_dh_book_list_simple_parent_class)->dispose (object);
+}
+
+static void
+_dh_book_list_simple_class_init (DhBookListSimpleClass *klass)
+{
+        GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+        object_class->dispose = dh_book_list_simple_dispose;
+}
+
+static void
+_dh_book_list_simple_init (DhBookListSimple *list_simple)
+{
+        list_simple->priv = _dh_book_list_simple_get_instance_private (list_simple);
+}
+
+/* Returns: (transfer full) (element-type DhBook). */
+static GList *
+generate_list (DhBookListSimple *list_simple)
+{
+        GList *ret = NULL;
+        GList *book_list_node;
+
+        for (book_list_node = list_simple->priv->book_lists;
+             book_list_node != NULL;
+             book_list_node = book_list_node->next) {
+                DhBookList *book_list = DH_BOOK_LIST (book_list_node->data);
+                GList *books;
+                GList *book_node;
+
+                books = dh_book_list_get_books (book_list);
+
+                /* First DhBookList, take all DhBook's. */
+                if (book_list_node == list_simple->priv->book_lists) {
+                        g_assert (ret == NULL);
+                        ret = g_list_copy_deep (books, (GCopyFunc) g_object_ref, NULL);
+                        continue;
+                }
+
+                for (book_node = books; book_node != NULL; book_node = book_node->next) {
+                        DhBook *book = DH_BOOK (book_node->data);
+
+                        /* Ensure to have unique book IDs. */
+                        if (g_list_find_custom (ret, book, (GCompareFunc)dh_book_cmp_by_id) == NULL)
+                                ret = g_list_prepend (ret, g_object_ref (book));
+                }
+        }
+
+        return ret;
+}
+
+static void
+repopulate (DhBookListSimple *list_simple)
+{
+        GList *old_list;
+        GList *old_list_copy;
+        GList *new_list;
+        GList *old_node;
+        GList *new_node;
+
+        old_list = dh_book_list_get_books (DH_BOOK_LIST (list_simple));
+        old_list_copy = g_list_copy_deep (old_list, (GCopyFunc) g_object_ref, NULL);
+
+        new_list = generate_list (list_simple);
+
+        for (old_node = old_list_copy; old_node != NULL; old_node = old_node->next) {
+                DhBook *old_book = DH_BOOK (old_node->data);
+
+                if (g_list_find (new_list, old_book) == NULL)
+                        dh_book_list_remove_book (DH_BOOK_LIST (list_simple), old_book);
+        }
+
+        for (new_node = new_list; new_node != NULL; new_node = new_node->next) {
+                DhBook *new_book = DH_BOOK (new_node->data);
+
+                if (g_list_find (old_list_copy, new_book) == NULL)
+                        dh_book_list_add_book (DH_BOOK_LIST (list_simple), new_book);
+        }
+
+        g_list_free_full (old_list_copy, g_object_unref);
+        g_list_free_full (new_list, g_object_unref);
+}
+
+static void
+book_list_add_book_cb (DhBookList       *book_list,
+                       DhBook           *book,
+                       DhBookListSimple *list_simple)
+{
+        repopulate (list_simple);
+}
+
+static void
+book_list_remove_book_cb (DhBookList       *book_list,
+                          DhBook           *book,
+                          DhBookListSimple *list_simple)
+{
+        repopulate (list_simple);
+}
+
+static void
+set_book_lists (DhBookListSimple *list_simple,
+                GList            *book_lists)
+{
+        GList *l;
+
+        g_assert (list_simple->priv->book_lists == NULL);
+
+        for (l = book_lists; l != NULL; l = l->next) {
+                DhBookList *book_list;
+
+                if (!DH_IS_BOOK_LIST (l->data)) {
+                        g_warn_if_reached ();
+                        continue;
+                }
+
+                book_list = l->data;
+                list_simple->priv->book_lists = g_list_prepend (list_simple->priv->book_lists,
+                                                                g_object_ref (book_list));
+
+                g_signal_connect_object (book_list,
+                                         "add-book",
+                                         G_CALLBACK (book_list_add_book_cb),
+                                         list_simple,
+                                         G_CONNECT_AFTER);
+
+                g_signal_connect_object (book_list,
+                                         "remove-book",
+                                         G_CALLBACK (book_list_remove_book_cb),
+                                         list_simple,
+                                         G_CONNECT_AFTER);
+        }
+
+        list_simple->priv->book_lists = g_list_reverse (list_simple->priv->book_lists);
+
+        repopulate (list_simple);
+}
+
+DhBookList *
+_dh_book_list_simple_new (GList *book_lists)
+{
+        DhBookListSimple *list_simple;
+
+        list_simple = g_object_new (DH_TYPE_BOOK_LIST_SIMPLE, NULL);
+        set_book_lists (list_simple, book_lists);
+
+        return DH_BOOK_LIST (list_simple);
+}
diff --git a/devhelp/dh-book-list-simple.h b/devhelp/dh-book-list-simple.h
new file mode 100644
index 0000000..f8211ac
--- /dev/null
+++ b/devhelp/dh-book-list-simple.h
@@ -0,0 +1,61 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
+/*
+ * This file is part of Devhelp.
+ *
+ * Copyright (C) 2018 Sébastien Wilmet <swilmet gnome org>
+ *
+ * Devhelp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * Devhelp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Devhelp.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef DH_BOOK_LIST_SIMPLE_H
+#define DH_BOOK_LIST_SIMPLE_H
+
+#include <glib-object.h>
+#include "dh-book-list.h"
+
+G_BEGIN_DECLS
+
+#define DH_TYPE_BOOK_LIST_SIMPLE             (_dh_book_list_simple_get_type ())
+#define DH_BOOK_LIST_SIMPLE(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), DH_TYPE_BOOK_LIST_SIMPLE, 
DhBookListSimple))
+#define DH_BOOK_LIST_SIMPLE_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), DH_TYPE_BOOK_LIST_SIMPLE, 
DhBookListSimpleClass))
+#define DH_IS_BOOK_LIST_SIMPLE(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DH_TYPE_BOOK_LIST_SIMPLE))
+#define DH_IS_BOOK_LIST_SIMPLE_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), DH_TYPE_BOOK_LIST_SIMPLE))
+#define DH_BOOK_LIST_SIMPLE_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), DH_TYPE_BOOK_LIST_SIMPLE, 
DhBookListSimpleClass))
+
+typedef struct _DhBookListSimple         DhBookListSimple;
+typedef struct _DhBookListSimpleClass    DhBookListSimpleClass;
+typedef struct _DhBookListSimplePrivate  DhBookListSimplePrivate;
+
+struct _DhBookListSimple {
+        DhBookList parent;
+
+        DhBookListSimplePrivate *priv;
+};
+
+struct _DhBookListSimpleClass {
+        DhBookListClass parent_class;
+
+        /* Padding for future expansion */
+        gpointer padding[12];
+};
+
+G_GNUC_INTERNAL
+GType           _dh_book_list_simple_get_type   (void);
+
+G_GNUC_INTERNAL
+DhBookList *    _dh_book_list_simple_new        (GList *book_lists);
+
+G_END_DECLS
+
+#endif /* DH_BOOK_LIST_SIMPLE_H */
diff --git a/devhelp/meson.build b/devhelp/meson.build
index 2d8c3d3..ac89def 100644
--- a/devhelp/meson.build
+++ b/devhelp/meson.build
@@ -34,6 +34,7 @@ libdevhelp_public_c_files = [
 ]
 
 libdevhelp_private_c_files = [
+        'dh-book-list-simple.c',
         'dh-error.c',
         'dh-parser.c',
         'dh-search-context.c',
diff --git a/docs/reference/meson.build b/docs/reference/meson.build
index ac9c213..c5511bb 100644
--- a/docs/reference/meson.build
+++ b/docs/reference/meson.build
@@ -11,6 +11,7 @@ GNOME.gtkdoc(
                 'api-breaks.xml'
         ],
         ignore_headers : [
+                'dh-book-list-simple.h',
                 'dh-dconf-migration.h',
                 'dh-error.h',
                 'dh-parser.h',
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 1e78344..6c4837f 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -7,6 +7,7 @@ data/org.gnome.libdevhelp-3.gschema.xml
 devhelp/dh-assistant-view.c
 devhelp/dh-book.c
 devhelp/dh-book-list.c
+devhelp/dh-book-list-simple.c
 devhelp/dh-book-manager.c
 devhelp/dh-book-tree.c
 devhelp/dh-completion.c


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