[gimp] app: add API to add overlays in image coordinates



commit 9b75184442a12d6d339c199cf365fb833ee65897
Author: Michael Natterer <mitch gimp org>
Date:   Sat Feb 20 14:52:37 2010 +0100

    app: add API to add overlays in image coordinates
    
    and update their positions when the shell scrolls and zooms.

 app/display/gimpdisplayshell.c |   85 ++++++++++++++++++++++++++++++++++++++++
 app/display/gimpdisplayshell.h |    7 +++
 2 files changed, 92 insertions(+), 0 deletions(-)
---
diff --git a/app/display/gimpdisplayshell.c b/app/display/gimpdisplayshell.c
index e6c9d31..e0aeaf6 100644
--- a/app/display/gimpdisplayshell.c
+++ b/app/display/gimpdisplayshell.c
@@ -138,6 +138,10 @@ static void      gimp_display_shell_zoom_button_callback
 static void      gimp_display_shell_sync_config    (GimpDisplayShell  *shell,
                                                     GimpDisplayConfig *config);
 
+static void      gimp_display_shell_remove_overlay (GtkWidget        *canvas,
+                                                    GtkWidget        *child,
+                                                    GimpDisplayShell *shell);
+
 
 G_DEFINE_TYPE_WITH_CODE (GimpDisplayShell, gimp_display_shell,
                          GTK_TYPE_VBOX,
@@ -484,6 +488,10 @@ gimp_display_shell_constructor (GType                  type,
   gtk_widget_set_size_request (shell->canvas, shell_width, shell_height);
   gtk_container_set_border_width (GTK_CONTAINER (shell->canvas), 10);
 
+  g_signal_connect (shell->canvas, "remove",
+                    G_CALLBACK (gimp_display_shell_remove_overlay),
+                    shell);
+
   gimp_display_shell_dnd_init (shell);
   gimp_display_shell_selection_init (shell);
 
@@ -1048,6 +1056,14 @@ gimp_display_shell_sync_config (GimpDisplayShell  *shell,
     }
 }
 
+static void
+gimp_display_shell_remove_overlay (GtkWidget        *canvas,
+                                   GtkWidget        *child,
+                                   GimpDisplayShell *shell)
+{
+  shell->children = g_list_remove (shell->children, child);
+}
+
 
 /*  public functions  */
 
@@ -1067,6 +1083,39 @@ gimp_display_shell_new (GimpDisplay       *display,
                        NULL);
 }
 
+void
+gimp_display_shell_add_overlay (GimpDisplayShell *shell,
+                                GtkWidget        *child,
+                                gdouble           image_x,
+                                gdouble           image_y)
+{
+  gdouble *x_data;
+  gdouble *y_data;
+  gdouble  x, y;
+
+  g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+  g_return_if_fail (GTK_IS_WIDGET (shell));
+
+  x_data = g_new (gdouble, 1);
+  y_data = g_new (gdouble, 1);
+
+  *x_data = image_x;
+  *y_data = image_y;
+
+  g_object_set_data_full (G_OBJECT (child), "image-x", x_data,
+                          (GDestroyNotify) g_free);
+  g_object_set_data_full (G_OBJECT (child), "image-y", y_data,
+                          (GDestroyNotify) g_free);
+
+  shell->children = g_list_prepend (shell->children, child);
+
+  gimp_display_shell_transform_xy_f (shell, image_x, image_y, &x, &y, FALSE);
+
+  gimp_overlay_box_add_child (GIMP_OVERLAY_BOX (shell->canvas), child, 0.0, 0.0);
+  gimp_overlay_box_set_child_position (GIMP_OVERLAY_BOX (shell->canvas),
+                                       child, x, y);
+}
+
 GimpImageWindow *
 gimp_display_shell_get_window (GimpDisplayShell *shell)
 {
@@ -1257,16 +1306,52 @@ gimp_display_shell_scale_changed (GimpDisplayShell *shell)
 void
 gimp_display_shell_scaled (GimpDisplayShell *shell)
 {
+  GList *list;
+
   g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
 
+  for (list = shell->children; list; list = g_list_next (list))
+    {
+      GtkWidget *child = list->data;
+      gdouble   *x_data;
+      gdouble   *y_data;
+      gdouble    x, y;
+
+      x_data = g_object_get_data (G_OBJECT (child), "image-x");
+      y_data = g_object_get_data (G_OBJECT (child), "image-y");
+
+      gimp_display_shell_transform_xy_f (shell, *x_data, *y_data, &x, &y, FALSE);
+
+      gimp_overlay_box_set_child_position (GIMP_OVERLAY_BOX (shell->canvas),
+                                           child, x, y);
+    }
+
   g_signal_emit (shell, display_shell_signals[SCALED], 0);
 }
 
 void
 gimp_display_shell_scrolled (GimpDisplayShell *shell)
 {
+  GList *list;
+
   g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
 
+  for (list = shell->children; list; list = g_list_next (list))
+    {
+      GtkWidget *child = list->data;
+      gdouble   *x_data;
+      gdouble   *y_data;
+      gdouble    x, y;
+
+      x_data = g_object_get_data (G_OBJECT (child), "image-x");
+      y_data = g_object_get_data (G_OBJECT (child), "image-y");
+
+      gimp_display_shell_transform_xy_f (shell, *x_data, *y_data, &x, &y, FALSE);
+
+      gimp_overlay_box_set_child_position (GIMP_OVERLAY_BOX (shell->canvas),
+                                           child, x, y);
+    }
+
   g_signal_emit (shell, display_shell_signals[SCROLLED], 0);
 }
 
diff --git a/app/display/gimpdisplayshell.h b/app/display/gimpdisplayshell.h
index 62eeb36..90db259 100644
--- a/app/display/gimpdisplayshell.h
+++ b/app/display/gimpdisplayshell.h
@@ -112,6 +112,8 @@ struct _GimpDisplayShell
 
   Selection         *selection;        /*  Selection (marching ants)          */
 
+  GList             *children;
+
   GtkWidget         *canvas;           /*  GimpCanvas widget                  */
   GdkGC             *grid_gc;          /*  GC for grid drawing                */
   GdkGC             *pen_gc;           /*  GC for felt pen drawing            */
@@ -217,6 +219,11 @@ GtkWidget       * gimp_display_shell_new           (GimpDisplay        *display,
                                                     gdouble             scale,
                                                     GimpUIManager      *popup_manager);
 
+void              gimp_display_shell_add_overlay   (GimpDisplayShell   *shell,
+                                                    GtkWidget          *child,
+                                                    gdouble             image_x,
+                                                    gdouble             image_y);
+
 GimpImageWindow * gimp_display_shell_get_window    (GimpDisplayShell   *shell);
 GimpStatusbar   * gimp_display_shell_get_statusbar (GimpDisplayShell   *shell);
 



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