app: add handle-clicked signal to GimpToolLine

... which is emitted when a handle is single/double/tripple clicked.

The signal handler returns a boolean value.  A return value of TRUE
stops further event processing, while a return value of FALSE allows
it.
This commit is contained in:
Ell
2017-07-23 19:49:15 -04:00
parent 50acb6690d
commit 9e26d7ea5f
3 changed files with 91 additions and 40 deletions

View File

@ -25,6 +25,7 @@
BOOLEAN: BOOLEAN
BOOLEAN: DOUBLE
BOOLEAN: ENUM, INT
BOOLEAN: INT, UINT, ENUM
BOOLEAN: OBJECT
BOOLEAN: OBJECT, POINTER
BOOLEAN: OBJECT, POINTER, STRING

View File

@ -88,6 +88,7 @@ enum
PREPARE_TO_REMOVE_SLIDER,
REMOVE_SLIDER,
SELECTION_CHANGED,
HANDLE_CLICKED,
LAST_SIGNAL
};
@ -273,6 +274,18 @@ gimp_tool_line_class_init (GimpToolLineClass *klass)
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
line_signals[HANDLE_CLICKED] =
g_signal_new ("handle-clicked",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GimpToolLineClass, handle_clicked),
NULL, NULL,
gimp_marshal_BOOLEAN__INT_UINT_ENUM,
G_TYPE_BOOLEAN, 3,
G_TYPE_INT,
G_TYPE_UINT,
GIMP_TYPE_BUTTON_PRESS_TYPE);
g_object_class_install_property (object_class, PROP_X1,
g_param_spec_double ("x1", NULL, NULL,
-GIMP_MAX_IMAGE_SIZE,
@ -602,6 +615,7 @@ gimp_tool_line_button_press (GimpToolWidget *widget,
{
GimpToolLine *line = GIMP_TOOL_LINE (widget);
GimpToolLinePrivate *private = line->private;
gboolean result = FALSE;
private->grab = GRAB_NONE;
private->remove_slider = FALSE;
@ -611,6 +625,24 @@ gimp_tool_line_button_press (GimpToolWidget *widget,
private->saved_x2 = private->x2;
private->saved_y2 = private->y2;
if (press_type != GIMP_BUTTON_PRESS_NORMAL &&
private->hover > GIMP_TOOL_LINE_HANDLE_NONE &&
private->selection > GIMP_TOOL_LINE_HANDLE_NONE)
{
g_signal_emit (line, line_signals[HANDLE_CLICKED], 0,
private->selection, state, press_type, &result);
if (! result)
gimp_tool_widget_hover (widget, coords, state, TRUE);
}
if (press_type == GIMP_BUTTON_PRESS_NORMAL || ! result)
{
private->saved_x1 = private->x1;
private->saved_y1 = private->y1;
private->saved_x2 = private->x2;
private->saved_y2 = private->y2;
if (GIMP_TOOL_LINE_HANDLE_IS_SLIDER (private->hover))
{
private->saved_slider_value =
@ -647,7 +679,10 @@ gimp_tool_line_button_press (GimpToolWidget *widget,
private->grab = GRAB_LINE;
}
if (grab == GRAB_NONE)
result = (private->grab != GRAB_NONE);
}
if (! result)
{
private->hover = GIMP_TOOL_LINE_HANDLE_NONE;
@ -657,7 +692,7 @@ gimp_tool_line_button_press (GimpToolWidget *widget,
gimp_tool_line_update_handles (line);
gimp_tool_line_update_status (line, state, TRUE);
return private->grab != GRAB_NONE;
return result;
}
void
@ -700,13 +735,24 @@ gimp_tool_line_button_release (GimpToolWidget *widget,
NULL);
}
}
else if (grab == GRAB_SELECTION && private->remove_slider)
else if (grab == GRAB_SELECTION)
{
if (private->remove_slider)
{
private->remove_slider = FALSE;
g_signal_emit (line, line_signals[REMOVE_SLIDER], 0,
private->selection);
}
else if (release_type == GIMP_BUTTON_RELEASE_CLICK)
{
gboolean result;
g_signal_emit (line, line_signals[HANDLE_CLICKED], 0,
private->selection, state, GIMP_BUTTON_PRESS_NORMAL,
&result);
}
}
}
void

View File

@ -70,6 +70,10 @@ struct _GimpToolLineClass
void (* remove_slider) (GimpToolLine *line,
gint slider);
void (* selection_changed) (GimpToolLine *line);
gboolean (* handle_clicked) (GimpToolLine *line,
gint handle,
GdkModifierType state,
GimpButtonPressType press_type);
};