[gnome-photos] pipeline: Loosen the requirement to have a parent during construction



commit 5eb07e5a515bc28bdf9699397697835bfbf998e8
Author: Debarshi Ray <debarshir gnome org>
Date:   Mon Feb 27 00:57:36 2017 +0100

    pipeline: Loosen the requirement to have a parent during construction
    
    It should be possible to load only the pipeline without loading the
    entire BaseItem, so that operations that don't need the entire graph
    can be performed without needless CPU and I/O consumption. Not having
    the graph also means not having a parent for the pipeline. Hence this
    change.

 src/photos-pipeline.c |   36 ++++++++++++++++++++++++++++--------
 src/photos-pipeline.h |    2 ++
 2 files changed, 30 insertions(+), 8 deletions(-)
---
diff --git a/src/photos-pipeline.c b/src/photos-pipeline.c
index 2376920..38462ea 100644
--- a/src/photos-pipeline.c
+++ b/src/photos-pipeline.c
@@ -36,7 +36,6 @@
 struct _PhotosPipeline
 {
   GObject parent_instance;
-  GeglNode *parent;
   GHashTable *hash;
   GeglNode *graph;
   gchar *snapshot;
@@ -212,12 +211,9 @@ photos_pipeline_constructed (GObject *object)
 
   G_OBJECT_CLASS (photos_pipeline_parent_class)->constructed (object);
 
-  gegl_node_add_child (self->parent, self->graph);
   input = gegl_node_get_input_proxy (self->graph, "input");
   output = gegl_node_get_output_proxy (self->graph, "output");
   gegl_node_link (input, output);
-
-  g_clear_object (&self->parent); /* We will not need it any more */
 }
 
 
@@ -236,7 +232,6 @@ photos_pipeline_dispose (GObject *object)
   g_clear_pointer (&self->hash, (GDestroyNotify) g_hash_table_unref);
 
   g_clear_object (&self->graph);
-  g_clear_object (&self->parent);
 
   G_OBJECT_CLASS (photos_pipeline_parent_class)->dispose (object);
 }
@@ -264,8 +259,13 @@ photos_pipeline_set_property (GObject *object, guint prop_id, const GValue *valu
   switch (prop_id)
     {
     case PROP_PARENT:
-      self->parent = GEGL_NODE (g_value_dup_object (value));
-      break;
+      {
+        GeglNode *parent;
+
+        parent = GEGL_NODE (g_value_get_object (value));
+        photos_pipeline_set_parent (self, parent);
+        break;
+      }
 
     case PROP_URI:
       self->uri = g_value_dup_string (value);
@@ -304,7 +304,7 @@ photos_pipeline_class_init (PhotosPipelineClass *class)
                                                         "GeglNode object",
                                                         "A GeglNode representing the parent graph",
                                                         GEGL_TYPE_NODE,
-                                                        G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
+                                                        G_PARAM_CONSTRUCT | G_PARAM_WRITABLE));
 
   g_object_class_install_property (object_class,
                                    PROP_URI,
@@ -713,6 +713,26 @@ photos_pipeline_revert_to_original (PhotosPipeline *self)
 
 
 void
+photos_pipeline_set_parent (PhotosPipeline *self, GeglNode *parent)
+{
+  GeglNode *old_parent;
+
+  g_return_if_fail (PHOTOS_IS_PIPELINE (self));
+  g_return_if_fail (parent == NULL || GEGL_IS_NODE (parent));
+
+  old_parent = gegl_node_get_parent (self->graph);
+  if (parent == old_parent)
+    return;
+
+  if (old_parent != NULL)
+    gegl_node_remove_child (old_parent, self->graph);
+
+  if (parent != NULL)
+    gegl_node_add_child (parent, self->graph);
+}
+
+
+void
 photos_pipeline_snapshot (PhotosPipeline *self)
 {
   g_free (self->snapshot);
diff --git a/src/photos-pipeline.h b/src/photos-pipeline.h
index 99c287d..a13249c 100644
--- a/src/photos-pipeline.h
+++ b/src/photos-pipeline.h
@@ -76,6 +76,8 @@ void                   photos_pipeline_revert            (PhotosPipeline *self);
 
 void                   photos_pipeline_revert_to_original(PhotosPipeline *self);
 
+void                   photos_pipeline_set_parent        (PhotosPipeline *self, GeglNode *parent);
+
 void                   photos_pipeline_snapshot          (PhotosPipeline *self);
 
 G_END_DECLS


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