mirror of https://github.com/GNOME/gimp.git
app: add API to add overlays in image coordinates
and update their positions when the shell scrolls and zooms.
This commit is contained in:
parent
d488cc650a
commit
9b75184442
|
@ -138,6 +138,10 @@ static void gimp_display_shell_zoom_button_callback
|
||||||
static void gimp_display_shell_sync_config (GimpDisplayShell *shell,
|
static void gimp_display_shell_sync_config (GimpDisplayShell *shell,
|
||||||
GimpDisplayConfig *config);
|
GimpDisplayConfig *config);
|
||||||
|
|
||||||
|
static void gimp_display_shell_remove_overlay (GtkWidget *canvas,
|
||||||
|
GtkWidget *child,
|
||||||
|
GimpDisplayShell *shell);
|
||||||
|
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_CODE (GimpDisplayShell, gimp_display_shell,
|
G_DEFINE_TYPE_WITH_CODE (GimpDisplayShell, gimp_display_shell,
|
||||||
GTK_TYPE_VBOX,
|
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_widget_set_size_request (shell->canvas, shell_width, shell_height);
|
||||||
gtk_container_set_border_width (GTK_CONTAINER (shell->canvas), 10);
|
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_dnd_init (shell);
|
||||||
gimp_display_shell_selection_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 */
|
/* public functions */
|
||||||
|
|
||||||
|
@ -1067,6 +1083,39 @@ gimp_display_shell_new (GimpDisplay *display,
|
||||||
NULL);
|
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 *
|
GimpImageWindow *
|
||||||
gimp_display_shell_get_window (GimpDisplayShell *shell)
|
gimp_display_shell_get_window (GimpDisplayShell *shell)
|
||||||
{
|
{
|
||||||
|
@ -1257,16 +1306,52 @@ gimp_display_shell_scale_changed (GimpDisplayShell *shell)
|
||||||
void
|
void
|
||||||
gimp_display_shell_scaled (GimpDisplayShell *shell)
|
gimp_display_shell_scaled (GimpDisplayShell *shell)
|
||||||
{
|
{
|
||||||
|
GList *list;
|
||||||
|
|
||||||
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
|
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);
|
g_signal_emit (shell, display_shell_signals[SCALED], 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gimp_display_shell_scrolled (GimpDisplayShell *shell)
|
gimp_display_shell_scrolled (GimpDisplayShell *shell)
|
||||||
{
|
{
|
||||||
|
GList *list;
|
||||||
|
|
||||||
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
|
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);
|
g_signal_emit (shell, display_shell_signals[SCROLLED], 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -112,6 +112,8 @@ struct _GimpDisplayShell
|
||||||
|
|
||||||
Selection *selection; /* Selection (marching ants) */
|
Selection *selection; /* Selection (marching ants) */
|
||||||
|
|
||||||
|
GList *children;
|
||||||
|
|
||||||
GtkWidget *canvas; /* GimpCanvas widget */
|
GtkWidget *canvas; /* GimpCanvas widget */
|
||||||
GdkGC *grid_gc; /* GC for grid drawing */
|
GdkGC *grid_gc; /* GC for grid drawing */
|
||||||
GdkGC *pen_gc; /* GC for felt pen drawing */
|
GdkGC *pen_gc; /* GC for felt pen drawing */
|
||||||
|
@ -217,6 +219,11 @@ GtkWidget * gimp_display_shell_new (GimpDisplay *display,
|
||||||
gdouble scale,
|
gdouble scale,
|
||||||
GimpUIManager *popup_manager);
|
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);
|
GimpImageWindow * gimp_display_shell_get_window (GimpDisplayShell *shell);
|
||||||
GimpStatusbar * gimp_display_shell_get_statusbar (GimpDisplayShell *shell);
|
GimpStatusbar * gimp_display_shell_get_statusbar (GimpDisplayShell *shell);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue