app: add API to add overlays in image coordinates

and update their positions when the shell scrolls and zooms.
This commit is contained in:
Michael Natterer 2010-02-20 14:52:37 +01:00
parent d488cc650a
commit 9b75184442
2 changed files with 92 additions and 0 deletions

View File

@ -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);
}

View File

@ -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);