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:
@ -25,6 +25,7 @@
|
||||
BOOLEAN: BOOLEAN
|
||||
BOOLEAN: DOUBLE
|
||||
BOOLEAN: ENUM, INT
|
||||
BOOLEAN: INT, UINT, ENUM
|
||||
BOOLEAN: OBJECT
|
||||
BOOLEAN: OBJECT, POINTER
|
||||
BOOLEAN: OBJECT, POINTER, STRING
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user