[gnome-photos] edit-palette, preview-view: Reset when entering edit mode



commit 614e2cb3771fb6d234ab71b6d370c62be3a29f4a
Author: Debarshi Ray <debarshir gnome org>
Date:   Fri Nov 27 18:47:50 2015 +0100

    edit-palette, preview-view: Reset when entering edit mode
    
    ... so that the EditTools don't carry forward any state from the
    previous item that we might have been editing.
    
    To ensure that all the tools are destroyed, we use a weak reference to
    track the current active tool. A strong reference would mislead us by
    keeping the tool from previous session alive.

 src/photos-edit-palette.c |   76 ++++++++++++++++++++++++++-------------------
 src/photos-edit-palette.h |    2 +
 src/photos-preview-view.c |   27 +++++++++++++--
 3 files changed, 69 insertions(+), 36 deletions(-)
---
diff --git a/src/photos-edit-palette.c b/src/photos-edit-palette.c
index ffddb8c..45f9726 100644
--- a/src/photos-edit-palette.c
+++ b/src/photos-edit-palette.c
@@ -32,6 +32,7 @@
 struct _PhotosEditPalette
 {
   GtkListBox parent_instance;
+  GIOExtensionPoint *extension_point;
   GList *tools;
 };
 
@@ -135,11 +136,6 @@ photos_edit_palette_dispose (GObject *object)
 static void
 photos_edit_palette_init (PhotosEditPalette *self)
 {
-  GIOExtensionPoint *extension_point;
-  GList *extensions;
-  GList *l;
-  GtkSizeGroup *size_group;
-
   gtk_widget_set_vexpand (GTK_WIDGET (self), TRUE);
   gtk_list_box_set_selection_mode (GTK_LIST_BOX (self), GTK_SELECTION_NONE);
   gtk_list_box_set_header_func (GTK_LIST_BOX (self),
@@ -147,35 +143,9 @@ photos_edit_palette_init (PhotosEditPalette *self)
                                 NULL,
                                 NULL);
 
-  extension_point = g_io_extension_point_lookup (PHOTOS_TOOL_EXTENSION_POINT_NAME);
-  extensions = g_io_extension_point_get_extensions (extension_point);
-  extensions = g_list_copy (extensions);
-  extensions = g_list_sort (extensions, photos_edit_palette_extensions_sort_func);
-
-  size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
-
-  for (l = extensions; l != NULL; l = l->next)
-    {
-      GIOExtension *extension = (GIOExtension *) l->data;
-      GType type;
-      GtkWidget *row;
-      PhotosTool *tool;
-
-      type = g_io_extension_get_type (extension);
-      tool = PHOTOS_TOOL (g_object_new (type, NULL));
-      self->tools = g_list_prepend (self->tools, g_object_ref (tool));
-
-      row = photos_edit_palette_row_new (tool, size_group);
-      gtk_container_add (GTK_CONTAINER (self), row);
-
-      g_signal_connect_swapped (tool, "hide-requested", G_CALLBACK (photos_edit_palette_hide_requested), 
self);
-
-      g_object_unref (tool);
-    }
+  self->extension_point = g_io_extension_point_lookup (PHOTOS_TOOL_EXTENSION_POINT_NAME);
 
   gtk_widget_show_all (GTK_WIDGET (self));
-  g_object_unref (size_group);
-  g_list_free (extensions);
 }
 
 
@@ -219,3 +189,45 @@ photos_edit_palette_hide_details (PhotosEditPalette *self)
 
   g_signal_emit (self, signals[TOOL_CHANGED], 0, NULL);
 }
+
+
+void
+photos_edit_palette_show (PhotosEditPalette *self)
+{
+  GList *extensions;
+  GList *l;
+  GtkSizeGroup *size_group;
+
+  gtk_container_foreach (GTK_CONTAINER (self), (GtkCallback) gtk_widget_destroy, NULL);
+  g_list_free_full (self->tools, g_object_unref);
+  self->tools = NULL;
+
+  extensions = g_io_extension_point_get_extensions (self->extension_point);
+  extensions = g_list_copy (extensions);
+  extensions = g_list_sort (extensions, photos_edit_palette_extensions_sort_func);
+
+  size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+
+  for (l = extensions; l != NULL; l = l->next)
+    {
+      GIOExtension *extension = (GIOExtension *) l->data;
+      GType type;
+      GtkWidget *row;
+      PhotosTool *tool;
+
+      type = g_io_extension_get_type (extension);
+      tool = PHOTOS_TOOL (g_object_new (type, NULL));
+      self->tools = g_list_prepend (self->tools, g_object_ref (tool));
+
+      row = photos_edit_palette_row_new (tool, size_group);
+      gtk_container_add (GTK_CONTAINER (self), row);
+
+      g_signal_connect_swapped (tool, "hide-requested", G_CALLBACK (photos_edit_palette_hide_requested), 
self);
+
+      g_object_unref (tool);
+    }
+
+  gtk_widget_show_all (GTK_WIDGET (self));
+  g_object_unref (size_group);
+  g_list_free (extensions);
+}
diff --git a/src/photos-edit-palette.h b/src/photos-edit-palette.h
index f9bffc9..5b488cd 100644
--- a/src/photos-edit-palette.h
+++ b/src/photos-edit-palette.h
@@ -44,6 +44,8 @@ GtkWidget             *photos_edit_palette_new                    (void);
 
 void                   photos_edit_palette_hide_details           (PhotosEditPalette *self);
 
+void                   photos_edit_palette_show                   (PhotosEditPalette *self);
+
 G_END_DECLS
 
 #endif /* PHOTOS_EDIT_PALETTE_H */
diff --git a/src/photos-preview-view.c b/src/photos-preview-view.c
index 0f6bd8c..192ea43 100644
--- a/src/photos-preview-view.c
+++ b/src/photos-preview-view.c
@@ -427,9 +427,12 @@ photos_preview_view_tool_changed (PhotosPreviewView *self, PhotosTool *tool)
     return;
 
   if (priv->current_tool != NULL)
-    photos_tool_deactivate (priv->current_tool);
+    {
+      photos_tool_deactivate (priv->current_tool);
+      g_object_remove_weak_pointer (G_OBJECT (priv->current_tool), (gpointer *) &priv->current_tool);
+      priv->current_tool = NULL;
+    }
 
-  g_clear_object (&priv->current_tool);
   view_container = gtk_stack_get_visible_child (GTK_STACK (priv->stack));
   view = photos_preview_view_get_view_from_view_container (view_container);
 
@@ -437,7 +440,9 @@ photos_preview_view_tool_changed (PhotosPreviewView *self, PhotosTool *tool)
     {
       PhotosBaseItem *item;
 
-      priv->current_tool = g_object_ref (tool);
+      priv->current_tool = tool;
+      g_object_add_weak_pointer (G_OBJECT (priv->current_tool), (gpointer *) &priv->current_tool);
+
       item = PHOTOS_BASE_ITEM (photos_base_manager_get_active_object (priv->item_mngr));
       photos_tool_activate (priv->current_tool, item, GEGL_GTK_VIEW (view));
     }
@@ -479,6 +484,7 @@ photos_preview_view_window_mode_changed (PhotosPreviewView *self, PhotosWindowMo
 
     case PHOTOS_WINDOW_MODE_EDIT:
       gtk_revealer_set_reveal_child (GTK_REVEALER (priv->revealer), TRUE);
+      photos_edit_palette_show (PHOTOS_EDIT_PALETTE (priv->palette));
       photos_preview_nav_buttons_hide (priv->nav_buttons);
       break;
 
@@ -505,13 +511,25 @@ photos_preview_view_dispose (GObject *object)
   g_clear_object (&priv->node);
   g_clear_object (&priv->item_mngr);
   g_clear_object (&priv->mode_cntrlr);
-  g_clear_object (&priv->current_tool);
 
   G_OBJECT_CLASS (photos_preview_view_parent_class)->dispose (object);
 }
 
 
 static void
+photos_preview_view_finalize (GObject *object)
+{
+  PhotosPreviewView *self = PHOTOS_PREVIEW_VIEW (object);
+  PhotosPreviewViewPrivate *priv = self->priv;
+
+  if (priv->current_tool != NULL)
+    g_object_remove_weak_pointer (G_OBJECT (priv->current_tool), (gpointer *) &priv->current_tool);
+
+  G_OBJECT_CLASS (photos_preview_view_parent_class)->finalize (object);
+}
+
+
+static void
 photos_preview_view_constructed (GObject *object)
 {
   PhotosPreviewView *self = PHOTOS_PREVIEW_VIEW (object);
@@ -637,6 +655,7 @@ photos_preview_view_class_init (PhotosPreviewViewClass *class)
 
   object_class->constructed = photos_preview_view_constructed;
   object_class->dispose = photos_preview_view_dispose;
+  object_class->finalize = photos_preview_view_finalize;
   object_class->set_property = photos_preview_view_set_property;
 
   g_object_class_install_property (object_class,


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