[gnome-notes] window-base: re-populate the notebooks selection menu when needed



commit 1dccd621a8fef4111aa3f8a77aa3ec86619fed36
Author: Jonathan Kang <jonathankang gnome org>
Date:   Tue Feb 2 17:44:23 2021 +0800

    window-base: re-populate the notebooks selection menu when needed
    
    In previous commit, signal display-notebooks-changed was added. This
    means that we can re-populate the notebooks menu when a notebook is
    added/removed.

 src/bjb-window-base.c | 32 ++++++++++++++++++++++++++++++--
 1 file changed, 30 insertions(+), 2 deletions(-)
---
diff --git a/src/bjb-window-base.c b/src/bjb-window-base.c
index 5dfaf38..8291cc5 100644
--- a/src/bjb-window-base.c
+++ b/src/bjb-window-base.c
@@ -45,6 +45,7 @@ struct _BjbWindowBase
   BjbController        *controller;
   gchar                *entry; // FIXME, remove this
 
+  gulong                display_notebooks_changed;
 
   GtkStack             *stack;
   BjbWindowViewType     current_view;
@@ -83,6 +84,9 @@ struct _BjbWindowBase
 /* Gobject */
 G_DEFINE_TYPE (BjbWindowBase, bjb_window_base, HDY_TYPE_APPLICATION_WINDOW)
 
+static void get_all_notebooks_cb (GList   *notebooks,
+                                  gpointer user_data);
+
 static void
 destroy_note_if_needed (BjbWindowBase *self)
 {
@@ -176,11 +180,29 @@ on_title_changed (BjbWindowBase *self,
     biji_note_obj_set_title (self->note, str);
 }
 
+static void
+on_display_notebooks_changed (BjbController *controller,
+                              gboolean       items_to_show,
+                              gboolean       remaining_items,
+                              BjbWindowBase *self)
+{
+  BijiManager *manager;
+
+  gtk_container_foreach (GTK_CONTAINER (self->notebooks_box),
+                         (GtkCallback) gtk_widget_destroy, NULL);
+
+  manager = bjb_window_base_get_manager (GTK_WIDGET (self));
+  biji_get_all_notebooks_async (manager, NULL, get_all_notebooks_cb, self);
+}
+
 static void
 bjb_window_base_finalize (GObject *object)
 {
   BjbWindowBase *self = BJB_WINDOW_BASE (object);
 
+  if (self->display_notebooks_changed != 0)
+    g_signal_handler_disconnect (self->controller, self->display_notebooks_changed);
+
   g_clear_object (&self->controller);
 
   G_OBJECT_CLASS (bjb_window_base_parent_class)->finalize (object);
@@ -558,7 +580,7 @@ append_notebook (BijiItem      *notebook,
   gtk_label_set_xalign (GTK_LABEL (label), 0);
 
   gtk_widget_show (button);
-  gtk_box_pack_end (GTK_BOX (self->notebooks_box), button, TRUE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX (self->notebooks_box), button, TRUE, TRUE, 0);
 }
 
 static int
@@ -664,8 +686,14 @@ bjb_window_base_constructed (GObject *obj)
   manager = bjb_window_base_get_manager (GTK_WIDGET (self));
   biji_get_all_notebooks_async (manager, NULL, get_all_notebooks_cb, self);
 
-  /* Connection to window signals */
+  if (self->display_notebooks_changed != 0)
+    g_signal_handler_disconnect (self->controller, self->display_notebooks_changed);
+  self->display_notebooks_changed = g_signal_connect (self->controller,
+                                                      "display-notebooks-changed",
+                                                      G_CALLBACK (on_display_notebooks_changed),
+                                                      self);
 
+  /* Connection to window signals */
   g_signal_connect (GTK_WIDGET (self),
                     "destroy",
                     G_CALLBACK (bjb_window_base_destroy),


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