app: update tool widgets on display-shell changes more granularly

Partially revert commit c73710e410,
avoiding updating tool widgets unconditionally on tool resume in
GimpDrawTool -- it's too expensive in general.

Instead, handle display-shell changes in GimpToolWidget, by adding
GimpToolWidget::update_on_{scale,scroll,rotate} flags, which
subclasses can use to request an update on any of these events.

Set the flags as necessary for the affected widgets.

(cherry picked from commit afda774f44)
This commit is contained in:
Ell
2020-05-26 10:36:58 +03:00
parent cf80b43b03
commit 0c4e6f1ef3
7 changed files with 49 additions and 16 deletions

View File

@ -185,19 +185,21 @@ gimp_tool_compass_class_init (GimpToolCompassClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
GimpToolWidgetClass *widget_class = GIMP_TOOL_WIDGET_CLASS (klass); GimpToolWidgetClass *widget_class = GIMP_TOOL_WIDGET_CLASS (klass);
object_class->constructed = gimp_tool_compass_constructed; object_class->constructed = gimp_tool_compass_constructed;
object_class->set_property = gimp_tool_compass_set_property; object_class->set_property = gimp_tool_compass_set_property;
object_class->get_property = gimp_tool_compass_get_property; object_class->get_property = gimp_tool_compass_get_property;
widget_class->changed = gimp_tool_compass_changed; widget_class->changed = gimp_tool_compass_changed;
widget_class->button_press = gimp_tool_compass_button_press; widget_class->button_press = gimp_tool_compass_button_press;
widget_class->button_release = gimp_tool_compass_button_release; widget_class->button_release = gimp_tool_compass_button_release;
widget_class->motion = gimp_tool_compass_motion; widget_class->motion = gimp_tool_compass_motion;
widget_class->hit = gimp_tool_compass_hit; widget_class->hit = gimp_tool_compass_hit;
widget_class->hover = gimp_tool_compass_hover; widget_class->hover = gimp_tool_compass_hover;
widget_class->leave_notify = gimp_tool_compass_leave_notify; widget_class->leave_notify = gimp_tool_compass_leave_notify;
widget_class->motion_modifier = gimp_tool_compass_motion_modifier; widget_class->motion_modifier = gimp_tool_compass_motion_modifier;
widget_class->get_cursor = gimp_tool_compass_get_cursor; widget_class->get_cursor = gimp_tool_compass_get_cursor;
widget_class->update_on_scale = TRUE;
widget_class->update_on_rotate = TRUE;
compass_signals[CREATE_GUIDES] = compass_signals[CREATE_GUIDES] =
g_signal_new ("create-guides", g_signal_new ("create-guides",

View File

@ -224,6 +224,7 @@ gimp_tool_focus_class_init (GimpToolFocusClass *klass)
widget_class->motion_modifier = gimp_tool_focus_motion_modifier; widget_class->motion_modifier = gimp_tool_focus_motion_modifier;
widget_class->hover_modifier = gimp_tool_focus_hover_modifier; widget_class->hover_modifier = gimp_tool_focus_hover_modifier;
widget_class->get_cursor = gimp_tool_focus_get_cursor; widget_class->get_cursor = gimp_tool_focus_get_cursor;
widget_class->update_on_scale = TRUE;
g_object_class_install_property (object_class, PROP_TYPE, g_object_class_install_property (object_class, PROP_TYPE,
g_param_spec_enum ("type", NULL, NULL, g_param_spec_enum ("type", NULL, NULL,

View File

@ -463,6 +463,7 @@ gimp_tool_rectangle_class_init (GimpToolRectangleClass *klass)
widget_class->key_press = gimp_tool_rectangle_key_press; widget_class->key_press = gimp_tool_rectangle_key_press;
widget_class->motion_modifier = gimp_tool_rectangle_motion_modifier; widget_class->motion_modifier = gimp_tool_rectangle_motion_modifier;
widget_class->get_cursor = gimp_tool_rectangle_get_cursor; widget_class->get_cursor = gimp_tool_rectangle_get_cursor;
widget_class->update_on_scale = TRUE;
rectangle_signals[CHANGE_COMPLETE] = rectangle_signals[CHANGE_COMPLETE] =
g_signal_new ("change-complete", g_signal_new ("change-complete",

View File

@ -232,6 +232,7 @@ gimp_tool_transform_grid_class_init (GimpToolTransformGridClass *klass)
widget_class->leave_notify = gimp_tool_transform_grid_leave_notify; widget_class->leave_notify = gimp_tool_transform_grid_leave_notify;
widget_class->hover_modifier = gimp_tool_transform_grid_hover_modifier; widget_class->hover_modifier = gimp_tool_transform_grid_hover_modifier;
widget_class->get_cursor = gimp_tool_transform_grid_get_cursor; widget_class->get_cursor = gimp_tool_transform_grid_get_cursor;
widget_class->update_on_scale = TRUE;
g_object_class_install_property (object_class, PROP_TRANSFORM, g_object_class_install_property (object_class, PROP_TRANSFORM,
gimp_param_spec_matrix3 ("transform", gimp_param_spec_matrix3 ("transform",

View File

@ -224,6 +224,7 @@ gimp_tool_widget_constructed (GObject *object)
{ {
GimpToolWidget *widget = GIMP_TOOL_WIDGET (object); GimpToolWidget *widget = GIMP_TOOL_WIDGET (object);
GimpToolWidgetPrivate *private = widget->private; GimpToolWidgetPrivate *private = widget->private;
GimpToolWidgetClass *klass = GIMP_TOOL_WIDGET_GET_CLASS (widget);
G_OBJECT_CLASS (parent_class)->constructed (object); G_OBJECT_CLASS (parent_class)->constructed (object);
@ -232,6 +233,33 @@ gimp_tool_widget_constructed (GObject *object)
private->item = gimp_canvas_group_new (private->shell); private->item = gimp_canvas_group_new (private->shell);
gimp_canvas_item_set_visible (private->item, private->visible); gimp_canvas_item_set_visible (private->item, private->visible);
if (klass->changed)
{
if (klass->update_on_scale)
{
g_signal_connect_object (private->shell, "scaled",
G_CALLBACK (klass->changed),
widget,
G_CONNECT_SWAPPED);
}
if (klass->update_on_scroll)
{
g_signal_connect_object (private->shell, "scrolled",
G_CALLBACK (klass->changed),
widget,
G_CONNECT_SWAPPED);
}
if (klass->update_on_rotate)
{
g_signal_connect_object (private->shell, "rotated",
G_CALLBACK (klass->changed),
widget,
G_CONNECT_SWAPPED);
}
}
} }
static void static void

View File

@ -119,6 +119,10 @@ struct _GimpToolWidgetClass
GimpCursorType *cursor, GimpCursorType *cursor,
GimpToolCursorType *tool_cursor, GimpToolCursorType *tool_cursor,
GimpCursorModifier *modifier); GimpCursorModifier *modifier);
gboolean update_on_scale;
gboolean update_on_scroll;
gboolean update_on_rotate;
}; };

View File

@ -217,11 +217,7 @@ gimp_draw_tool_control (GimpTool *tool,
switch (action) switch (action)
{ {
case GIMP_TOOL_ACTION_PAUSE: case GIMP_TOOL_ACTION_PAUSE:
break;
case GIMP_TOOL_ACTION_RESUME: case GIMP_TOOL_ACTION_RESUME:
if (draw_tool->widget)
gimp_tool_widget_changed (draw_tool->widget);
break; break;
case GIMP_TOOL_ACTION_HALT: case GIMP_TOOL_ACTION_HALT: