From 0d3f7193817375d963643d84699f3efe927f0a79 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Mon, 26 Jun 2017 19:50:31 +0200 Subject: [PATCH] app: add gimp_draw_tool_set_widget() and use it in all ported tools which so far manages drawing of the widget's GimpCanvasItem. Remove GimpDrawTool::draw() implementations from most of the affected tools. --- app/tools/gimpblendtool.c | 24 +++--------------- app/tools/gimpcroptool.c | 24 +++--------------- app/tools/gimpdrawtool.c | 46 +++++++++++++++++++++++++++++++++- app/tools/gimpdrawtool.h | 4 +++ app/tools/gimpfreeselecttool.c | 25 +++--------------- app/tools/gimpmeasuretool.c | 22 +++------------- app/tools/gimptransformtool.c | 6 ++--- app/tools/gimpvectortool.c | 24 +++--------------- 8 files changed, 71 insertions(+), 104 deletions(-) diff --git a/app/tools/gimpblendtool.c b/app/tools/gimpblendtool.c index 72a5aa0197..259f209bba 100644 --- a/app/tools/gimpblendtool.c +++ b/app/tools/gimpblendtool.c @@ -119,8 +119,6 @@ static void gimp_blend_tool_options_notify (GimpTool *tool, GimpToolOptions *options, const GParamSpec *pspec); -static void gimp_blend_tool_draw (GimpDrawTool *draw_tool); - static void gimp_blend_tool_start (GimpBlendTool *blend_tool, GimpDisplay *display); static void gimp_blend_tool_halt (GimpBlendTool *blend_tool); @@ -189,9 +187,8 @@ gimp_blend_tool_register (GimpToolRegisterCallback callback, static void gimp_blend_tool_class_init (GimpBlendToolClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GimpToolClass *tool_class = GIMP_TOOL_CLASS (klass); - GimpDrawToolClass *draw_tool_class = GIMP_DRAW_TOOL_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GimpToolClass *tool_class = GIMP_TOOL_CLASS (klass); object_class->dispose = gimp_blend_tool_dispose; @@ -209,8 +206,6 @@ gimp_blend_tool_class_init (GimpBlendToolClass *klass) tool_class->undo = gimp_blend_tool_undo; tool_class->redo = gimp_blend_tool_redo; tool_class->options_notify = gimp_blend_tool_options_notify; - - draw_tool_class->draw = gimp_blend_tool_draw; } static void @@ -368,6 +363,8 @@ gimp_blend_tool_button_press (GimpTool *tool, blend_tool->end_x, blend_tool->end_y); + gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), blend_tool->line); + gimp_tool_widget_hover (blend_tool->line, coords, state, TRUE); g_signal_connect (blend_tool->line, "changed", @@ -682,19 +679,6 @@ gimp_blend_tool_options_notify (GimpTool *tool, } } -static void -gimp_blend_tool_draw (GimpDrawTool *draw_tool) -{ - GimpBlendTool *blend_tool = GIMP_BLEND_TOOL (draw_tool); - - if (blend_tool->line) - { - GimpCanvasItem *item = gimp_tool_widget_get_item (blend_tool->line); - - gimp_draw_tool_add_item (draw_tool, item); - } -} - static void gimp_blend_tool_start (GimpBlendTool *blend_tool, GimpDisplay *display) diff --git a/app/tools/gimpcroptool.c b/app/tools/gimpcroptool.c index ace1c6bfd3..9bb9d04569 100644 --- a/app/tools/gimpcroptool.c +++ b/app/tools/gimpcroptool.c @@ -87,8 +87,6 @@ static void gimp_crop_tool_options_notify (GimpTool GimpToolOptions *options, const GParamSpec *pspec); -static void gimp_crop_tool_draw (GimpDrawTool *draw_tool); - static void gimp_crop_tool_rectangle_changed (GimpToolWidget *rectangle, GimpCropTool *crop_tool); static void gimp_crop_tool_rectangle_response (GimpToolWidget *rectangle, @@ -156,9 +154,8 @@ gimp_crop_tool_register (GimpToolRegisterCallback callback, static void gimp_crop_tool_class_init (GimpCropToolClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GimpToolClass *tool_class = GIMP_TOOL_CLASS (klass); - GimpDrawToolClass *draw_tool_class = GIMP_DRAW_TOOL_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GimpToolClass *tool_class = GIMP_TOOL_CLASS (klass); object_class->constructed = gimp_crop_tool_constructed; @@ -171,8 +168,6 @@ gimp_crop_tool_class_init (GimpCropToolClass *klass) tool_class->oper_update = gimp_crop_tool_oper_update; tool_class->cursor_update = gimp_crop_tool_cursor_update; tool_class->options_notify = gimp_crop_tool_options_notify; - - draw_tool_class->draw = gimp_crop_tool_draw; } static void @@ -280,6 +275,8 @@ gimp_crop_tool_button_press (GimpTool *tool, crop_tool->rectangle = widget = gimp_tool_rectangle_new (shell); + gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), widget); + for (i = 0; i < G_N_ELEMENTS (properties); i++) g_object_bind_property (G_OBJECT (options), properties[i], G_OBJECT (widget), properties[i], @@ -459,19 +456,6 @@ gimp_crop_tool_options_notify (GimpTool *tool, } } -static void -gimp_crop_tool_draw (GimpDrawTool *draw_tool) -{ - GimpCropTool *crop_tool = GIMP_CROP_TOOL (draw_tool); - - if (crop_tool->rectangle) - { - GimpCanvasItem *item = gimp_tool_widget_get_item (crop_tool->rectangle); - - gimp_draw_tool_add_item (draw_tool, item); - } -} - static void gimp_crop_tool_rectangle_changed (GimpToolWidget *rectangle, GimpCropTool *crop_tool) diff --git a/app/tools/gimpdrawtool.c b/app/tools/gimpdrawtool.c index db321a7c9b..fc55082147 100644 --- a/app/tools/gimpdrawtool.c +++ b/app/tools/gimpdrawtool.c @@ -49,6 +49,7 @@ #include "display/gimpdisplayshell.h" #include "display/gimpdisplayshell-items.h" #include "display/gimpdisplayshell-transform.h" +#include "display/gimptoolwidget.h" #include "gimpdrawtool.h" @@ -164,6 +165,7 @@ gimp_draw_tool_control (GimpTool *tool, case GIMP_TOOL_ACTION_HALT: if (gimp_draw_tool_is_active (draw_tool)) gimp_draw_tool_stop (draw_tool); + gimp_draw_tool_set_widget (draw_tool, NULL); break; case GIMP_TOOL_ACTION_COMMIT: @@ -269,7 +271,12 @@ gimp_draw_tool_undraw (GimpDrawTool *draw_tool) static void gimp_draw_tool_real_draw (GimpDrawTool *draw_tool) { - /* the default implementation does nothing */ + if (draw_tool->widget) + { + GimpCanvasItem *item = gimp_tool_widget_get_item (draw_tool->widget); + + gimp_draw_tool_add_item (draw_tool, item); + } } void @@ -424,6 +431,43 @@ gimp_draw_tool_calc_distance_square (GimpDrawTool *draw_tool, return SQR (tx2 - tx1) + SQR (ty2 - ty1); } +void +gimp_draw_tool_set_widget (GimpDrawTool *draw_tool, + GimpToolWidget *widget) +{ + g_return_if_fail (GIMP_IS_DRAW_TOOL (draw_tool)); + g_return_if_fail (widget == NULL || GIMP_IS_TOOL_WIDGET (widget)); + + if (widget == draw_tool->widget) + return; + + if (draw_tool->widget) + { + if (gimp_draw_tool_is_active (draw_tool)) + { + GimpCanvasItem *item = gimp_tool_widget_get_item (draw_tool->widget); + + gimp_draw_tool_remove_item (draw_tool, item); + } + + g_object_unref (draw_tool->widget); + } + + draw_tool->widget = widget; + + if (draw_tool->widget) + { + g_object_ref (draw_tool->widget); + + if (gimp_draw_tool_is_active (draw_tool)) + { + GimpCanvasItem *item = gimp_tool_widget_get_item (draw_tool->widget); + + gimp_draw_tool_add_item (draw_tool, item); + } + } +} + void gimp_draw_tool_add_preview (GimpDrawTool *draw_tool, GimpCanvasItem *item) diff --git a/app/tools/gimpdrawtool.h b/app/tools/gimpdrawtool.h index a5eee944a7..aa8fa01f32 100644 --- a/app/tools/gimpdrawtool.h +++ b/app/tools/gimpdrawtool.h @@ -51,6 +51,7 @@ struct _GimpDrawTool guint draw_timeout; /* draw delay timeout ID */ guint64 last_draw_time; /* time of last draw(), monotonically */ + GimpToolWidget *widget; GimpCanvasItem *preview; GimpCanvasItem *item; GList *group_stack; @@ -90,6 +91,9 @@ gdouble gimp_draw_tool_calc_distance_square (GimpDrawTool *draw_too gdouble x2, gdouble y2); +void gimp_draw_tool_set_widget (GimpDrawTool *draw_tool, + GimpToolWidget *widget); + void gimp_draw_tool_add_preview (GimpDrawTool *draw_tool, GimpCanvasItem *item); void gimp_draw_tool_remove_preview (GimpDrawTool *draw_tool, diff --git a/app/tools/gimpfreeselecttool.c b/app/tools/gimpfreeselecttool.c index 0bb076ea4a..6f0f14fb4a 100644 --- a/app/tools/gimpfreeselecttool.c +++ b/app/tools/gimpfreeselecttool.c @@ -98,8 +98,6 @@ static void gimp_free_select_tool_active_modifier_key (GimpTool GdkModifierType state, GimpDisplay *display); -static void gimp_free_select_tool_draw (GimpDrawTool *draw_tool); - static void gimp_free_select_tool_real_select (GimpFreeSelectTool *fst, GimpDisplay *display, const GimpVector2 *points, @@ -142,9 +140,8 @@ gimp_free_select_tool_register (GimpToolRegisterCallback callback, static void gimp_free_select_tool_class_init (GimpFreeSelectToolClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GimpToolClass *tool_class = GIMP_TOOL_CLASS (klass); - GimpDrawToolClass *draw_tool_class = GIMP_DRAW_TOOL_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GimpToolClass *tool_class = GIMP_TOOL_CLASS (klass); object_class->finalize = gimp_free_select_tool_finalize; @@ -158,8 +155,6 @@ gimp_free_select_tool_class_init (GimpFreeSelectToolClass *klass) tool_class->modifier_key = gimp_free_select_tool_modifier_key; tool_class->active_modifier_key = gimp_free_select_tool_active_modifier_key; - draw_tool_class->draw = gimp_free_select_tool_draw; - klass->select = gimp_free_select_tool_real_select; g_type_class_add_private (klass, sizeof (GimpFreeSelectToolPrivate)); @@ -340,6 +335,8 @@ gimp_free_select_tool_button_press (GimpTool *tool, private->polygon = gimp_tool_polygon_new (shell); + gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), private->polygon); + g_signal_connect (private->polygon, "changed", G_CALLBACK (gimp_free_select_tool_polygon_changed), fst); @@ -475,20 +472,6 @@ gimp_free_select_tool_active_modifier_key (GimpTool *tool, } } -static void -gimp_free_select_tool_draw (GimpDrawTool *draw_tool) -{ - GimpFreeSelectTool *fst = GIMP_FREE_SELECT_TOOL (draw_tool); - GimpFreeSelectToolPrivate *priv = fst->private; - - if (priv->polygon) - { - GimpCanvasItem *item = gimp_tool_widget_get_item (priv->polygon); - - gimp_draw_tool_add_item (draw_tool, item); - } -} - static void gimp_free_select_tool_real_select (GimpFreeSelectTool *fst, GimpDisplay *display, diff --git a/app/tools/gimpmeasuretool.c b/app/tools/gimpmeasuretool.c index 19f956a76b..f311e59c70 100644 --- a/app/tools/gimpmeasuretool.c +++ b/app/tools/gimpmeasuretool.c @@ -90,8 +90,6 @@ static void gimp_measure_tool_cursor_update (GimpTool *tool, GdkModifierType state, GimpDisplay *display); -static void gimp_measure_tool_draw (GimpDrawTool *draw_tool); - static void gimp_measure_tool_compass_changed (GimpToolWidget *widget, GimpMeasureTool *measure); static void gimp_measure_tool_compass_status (GimpToolWidget *widget, @@ -140,8 +138,7 @@ gimp_measure_tool_register (GimpToolRegisterCallback callback, static void gimp_measure_tool_class_init (GimpMeasureToolClass *klass) { - GimpToolClass *tool_class = GIMP_TOOL_CLASS (klass); - GimpDrawToolClass *draw_tool_class = GIMP_DRAW_TOOL_CLASS (klass); + GimpToolClass *tool_class = GIMP_TOOL_CLASS (klass); tool_class->control = gimp_measure_tool_control; tool_class->button_press = gimp_measure_tool_button_press; @@ -151,8 +148,6 @@ gimp_measure_tool_class_init (GimpMeasureToolClass *klass) tool_class->active_modifier_key = gimp_measure_tool_active_modifier_key; tool_class->oper_update = gimp_measure_tool_oper_update; tool_class->cursor_update = gimp_measure_tool_cursor_update; - - draw_tool_class->draw = gimp_measure_tool_draw; } static void @@ -238,6 +233,8 @@ gimp_measure_tool_button_press (GimpTool *tool, measure->x[2], measure->y[2]); + gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), measure->compass); + gimp_tool_widget_hover (measure->compass, coords, state, TRUE); g_signal_connect (measure->compass, "changed", @@ -402,19 +399,6 @@ gimp_measure_tool_cursor_update (GimpTool *tool, GIMP_TOOL_CLASS (parent_class)->cursor_update (tool, coords, state, display); } -static void -gimp_measure_tool_draw (GimpDrawTool *draw_tool) -{ - GimpMeasureTool *measure = GIMP_MEASURE_TOOL (draw_tool); - - if (measure->compass) - { - GimpCanvasItem *item = gimp_tool_widget_get_item (measure->compass); - - gimp_draw_tool_add_item (draw_tool, item); - } -} - static void gimp_measure_tool_compass_changed (GimpToolWidget *widget, GimpMeasureTool *measure) diff --git a/app/tools/gimptransformtool.c b/app/tools/gimptransformtool.c index 273341bb24..e6a0bcd70c 100644 --- a/app/tools/gimptransformtool.c +++ b/app/tools/gimptransformtool.c @@ -765,9 +765,7 @@ gimp_transform_tool_draw (GimpDrawTool *draw_tool) G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL); - item = gimp_tool_widget_get_item (tr_tool->widget); - - gimp_draw_tool_add_item (draw_tool, item); + GIMP_DRAW_TOOL_CLASS (parent_class)->draw (draw_tool); } if (options->type == GIMP_TRANSFORM_TYPE_SELECTION) @@ -1369,6 +1367,8 @@ gimp_transform_tool_get_widget (GimpTransformTool *tr_tool) widget = GIMP_TRANSFORM_TOOL_GET_CLASS (tr_tool)->get_widget (tr_tool); + gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tr_tool), widget); + g_object_bind_property (G_OBJECT (options), "grid-type", G_OBJECT (widget), "guide-type", G_BINDING_SYNC_CREATE | diff --git a/app/tools/gimpvectortool.c b/app/tools/gimpvectortool.c index 865c13d2c4..322d40e31b 100644 --- a/app/tools/gimpvectortool.c +++ b/app/tools/gimpvectortool.c @@ -106,8 +106,6 @@ static void gimp_vector_tool_cursor_update (GimpTool *tool, GdkModifierType state, GimpDisplay *display); -static void gimp_vector_tool_draw (GimpDrawTool *draw_tool); - static void gimp_vector_tool_start (GimpVectorTool *vector_tool, GimpDisplay *display); static void gimp_vector_tool_halt (GimpVectorTool *vector_tool); @@ -184,9 +182,8 @@ gimp_vector_tool_register (GimpToolRegisterCallback callback, static void gimp_vector_tool_class_init (GimpVectorToolClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GimpToolClass *tool_class = GIMP_TOOL_CLASS (klass); - GimpDrawToolClass *draw_tool_class = GIMP_DRAW_TOOL_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GimpToolClass *tool_class = GIMP_TOOL_CLASS (klass); object_class->dispose = gimp_vector_tool_dispose; @@ -198,8 +195,6 @@ gimp_vector_tool_class_init (GimpVectorToolClass *klass) tool_class->modifier_key = gimp_vector_tool_modifier_key; tool_class->oper_update = gimp_vector_tool_oper_update; tool_class->cursor_update = gimp_vector_tool_cursor_update; - - draw_tool_class->draw = gimp_vector_tool_draw; } static void @@ -430,19 +425,6 @@ gimp_vector_tool_cursor_update (GimpTool *tool, GIMP_TOOL_CLASS (parent_class)->cursor_update (tool, coords, state, display); } -static void -gimp_vector_tool_draw (GimpDrawTool *draw_tool) -{ - GimpVectorTool *vector_tool = GIMP_VECTOR_TOOL (draw_tool); - - if (vector_tool->path) - { - GimpCanvasItem *item = gimp_tool_widget_get_item (vector_tool->path); - - gimp_draw_tool_add_item (draw_tool, item); - } -} - static void gimp_vector_tool_start (GimpVectorTool *vector_tool, GimpDisplay *display) @@ -456,6 +438,8 @@ gimp_vector_tool_start (GimpVectorTool *vector_tool, vector_tool->path = widget = gimp_tool_path_new (shell); + gimp_draw_tool_set_widget (GIMP_DRAW_TOOL (tool), widget); + g_object_bind_property (G_OBJECT (options), "vectors-edit-mode", G_OBJECT (widget), "edit-mode", G_BINDING_SYNC_CREATE |