[gimp] app: fake the size of a gruop layer by overriding GimpViewable::get_size()



commit f7ce31d62f122a707a54f263ea41bcdbe84eae7f
Author: Michael Natterer <mitch gimp org>
Date:   Tue Mar 8 18:04:23 2011 +0100

    app: fake the size of a gruop layer by overriding GimpViewable::get_size()
    
    instead of messing with GimpItem's width and height members.

 app/core/gimpgrouplayer.c |   63 +++++++++++++++++++++++++++++++-------------
 1 files changed, 44 insertions(+), 19 deletions(-)
---
diff --git a/app/core/gimpgrouplayer.c b/app/core/gimpgrouplayer.c
index dcd5533..799f8cf 100644
--- a/app/core/gimpgrouplayer.c
+++ b/app/core/gimpgrouplayer.c
@@ -51,6 +51,11 @@ struct _GimpGroupLayerPrivate
   GeglNode       *graph;
   GeglNode       *offset_node;
   gint            suspend_resize;
+
+  /*  hackish temp states to make the projection/tiles stuff work  */
+  gboolean        reallocate_projection;
+  gint            reallocate_width;
+  gint            reallocate_height;
 };
 
 #define GET_PRIVATE(item) G_TYPE_INSTANCE_GET_PRIVATE (item, \
@@ -73,6 +78,9 @@ static void            gimp_group_layer_get_property (GObject         *object,
 static gint64          gimp_group_layer_get_memsize  (GimpObject      *object,
                                                       gint64          *gui_size);
 
+static gboolean        gimp_group_layer_get_size     (GimpViewable    *viewable,
+                                                      gint            *width,
+                                                      gint            *height);
 static GimpContainer * gimp_group_layer_get_children (GimpViewable    *viewable);
 
 static GimpItem      * gimp_group_layer_duplicate    (GimpItem        *item,
@@ -180,6 +188,7 @@ gimp_group_layer_class_init (GimpGroupLayerClass *klass)
   gimp_object_class->get_memsize   = gimp_group_layer_get_memsize;
 
   viewable_class->default_stock_id = "gtk-directory";
+  viewable_class->get_size         = gimp_group_layer_get_size;
   viewable_class->get_children     = gimp_group_layer_get_children;
 
   item_class->duplicate            = gimp_group_layer_duplicate;
@@ -332,6 +341,25 @@ gimp_group_layer_get_memsize (GimpObject *object,
                                                                   gui_size);
 }
 
+static gboolean
+gimp_group_layer_get_size (GimpViewable *viewable,
+                           gint         *width,
+                           gint         *height)
+{
+  GimpGroupLayerPrivate *private = GET_PRIVATE (viewable);
+
+  if (private->reallocate_width  != 0 &&
+      private->reallocate_height != 0)
+    {
+      *width  = private->reallocate_width;
+      *height = private->reallocate_height;
+
+      return TRUE;
+    }
+
+  return GIMP_VIEWABLE_CLASS (parent_class)->get_size (viewable, width, height);
+}
+
 static GimpContainer *
 gimp_group_layer_get_children (GimpViewable *viewable)
 {
@@ -391,10 +419,8 @@ gimp_group_layer_duplicate (GimpItem *item,
                                  position++);
         }
 
-      /* FIXME: need to change the item's extents to resume_resize()
-       * will actually reallocate the projection's pyramid
-       */
-      GIMP_ITEM (new_group)->width++;
+      /*  force the projection to reallocate itself  */
+      GET_PRIVATE (new_group)->reallocate_projection = TRUE;
 
       gimp_group_layer_resume_resize (new_group, FALSE);
     }
@@ -1012,34 +1038,33 @@ gimp_group_layer_update_size (GimpGroupLayer *group)
         }
     }
 
-  if (x      != old_x     ||
-      y      != old_y     ||
-      width  != old_width ||
+  if (private->reallocate_projection ||
+      x      != old_x                ||
+      y      != old_y                ||
+      width  != old_width            ||
       height != old_height)
     {
-      if (width  != old_width ||
+      if (private->reallocate_projection ||
+          width  != old_width            ||
           height != old_height)
         {
           TileManager *tiles;
 
-          /*  FIXME: find a better way to do this: need to set the item's
-           *  extents to the new values so the projection will create
-           *  its tiles with the right size
+          private->reallocate_projection = FALSE;
+
+          /*  temporarily change the return values of gimp_viewable_get_size()
+           *  so the projection allocates itself correctly
            */
-          item->width  = width;
-          item->height = height;
+          private->reallocate_width  = width;
+          private->reallocate_height = height;
 
           gimp_projectable_structure_changed (GIMP_PROJECTABLE (group));
 
           tiles = gimp_projection_get_tiles_at_level (private->projection,
                                                       0, NULL);
 
-          /*  FIXME: need to set the item's extents back to the old
-           *  values so gimp_drawable_set_tiles_full() will emit all
-           *  signals needed by the layer tree to update itself
-           */
-          item->width  = old_width;
-          item->height = old_height;
+          private->reallocate_width  = 0;
+          private->reallocate_height = 0;
 
           gimp_drawable_set_tiles_full (GIMP_DRAWABLE (group),
                                         FALSE, NULL,



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