mirror of https://github.com/GNOME/gimp.git
app: add prepare-to-remove-slider signal to GimpToolLine
The signal is emitted when a slider is dragged away from the line, and will be removed when the button is released, and when the slider is dragged back to the vicinity of the line, and won't be removed. The last parameter of the signal is a boolean flag differentiating between the two cases. Note that a remove-slider signal may be emitted without a preceeding prepare-to-remove-slider signal, however, is a prepare-to-remove- slider signal is emitted with a TRUE last parameter, it must be eventually followed by a remove-slider signal, or by another prepare-to-remove-slider signal with a FALSE last parameter.
This commit is contained in:
parent
bac7dac4ba
commit
50acb6690d
|
@ -47,6 +47,7 @@ VOID: ENUM, OBJECT
|
|||
VOID: ENUM, POINTER
|
||||
VOID: FLAGS
|
||||
VOID: INT
|
||||
VOID: INT, BOOLEAN
|
||||
VOID: INT, INT
|
||||
VOID: INT, INT, INT, INT
|
||||
VOID: INT, INT, BOOLEAN, BOOLEAN
|
||||
|
|
|
@ -85,6 +85,7 @@ enum
|
|||
{
|
||||
CAN_ADD_SLIDER,
|
||||
ADD_SLIDER,
|
||||
PREPARE_TO_REMOVE_SLIDER,
|
||||
REMOVE_SLIDER,
|
||||
SELECTION_CHANGED,
|
||||
LAST_SIGNAL
|
||||
|
@ -242,6 +243,17 @@ gimp_tool_line_class_init (GimpToolLineClass *klass)
|
|||
G_TYPE_INT, 1,
|
||||
G_TYPE_DOUBLE);
|
||||
|
||||
line_signals[PREPARE_TO_REMOVE_SLIDER] =
|
||||
g_signal_new ("prepare-to-remove-slider",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
G_STRUCT_OFFSET (GimpToolLineClass, prepare_to_remove_slider),
|
||||
NULL, NULL,
|
||||
gimp_marshal_VOID__INT_BOOLEAN,
|
||||
G_TYPE_NONE, 2,
|
||||
G_TYPE_INT,
|
||||
G_TYPE_BOOLEAN);
|
||||
|
||||
line_signals[REMOVE_SLIDER] =
|
||||
g_signal_new ("remove-slider",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
|
@ -670,6 +682,14 @@ gimp_tool_line_button_release (GimpToolWidget *widget,
|
|||
{
|
||||
gimp_tool_line_get_slider (line, private->selection)->value =
|
||||
private->saved_slider_value;
|
||||
|
||||
if (private->remove_slider)
|
||||
{
|
||||
private->remove_slider = FALSE;
|
||||
|
||||
g_signal_emit (line, line_signals[PREPARE_TO_REMOVE_SLIDER], 0,
|
||||
private->selection, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
g_object_set (line,
|
||||
|
@ -682,6 +702,8 @@ gimp_tool_line_button_release (GimpToolWidget *widget,
|
|||
}
|
||||
else if (grab == GRAB_SELECTION && private->remove_slider)
|
||||
{
|
||||
private->remove_slider = FALSE;
|
||||
|
||||
g_signal_emit (line, line_signals[REMOVE_SLIDER], 0,
|
||||
private->selection);
|
||||
}
|
||||
|
@ -1124,6 +1146,7 @@ gimp_tool_line_selection_motion (GimpToolLine *line,
|
|||
GimpControllerSlider *slider;
|
||||
gdouble value;
|
||||
gdouble dist;
|
||||
gboolean remove_slider;
|
||||
|
||||
shell = gimp_tool_widget_get_shell (GIMP_TOOL_WIDGET (line));
|
||||
|
||||
|
@ -1144,25 +1167,36 @@ gimp_tool_line_selection_motion (GimpToolLine *line,
|
|||
NULL);
|
||||
|
||||
/* slider tearing */
|
||||
private->remove_slider = dist > SLIDER_TEAR_DISTANCE;
|
||||
remove_slider = dist > SLIDER_TEAR_DISTANCE;
|
||||
|
||||
/* eek! */
|
||||
{
|
||||
GimpCursorType cursor;
|
||||
GimpToolCursorType tool_cursor;
|
||||
GimpCursorModifier modifier;
|
||||
if (remove_slider != private->remove_slider)
|
||||
{
|
||||
private->remove_slider = remove_slider;
|
||||
|
||||
cursor = shell->current_cursor;
|
||||
tool_cursor = shell->tool_cursor;
|
||||
modifier = GIMP_CURSOR_MODIFIER_NONE;
|
||||
g_signal_emit (line, line_signals[PREPARE_TO_REMOVE_SLIDER], 0,
|
||||
private->selection, remove_slider);
|
||||
|
||||
gimp_tool_line_get_cursor (GIMP_TOOL_WIDGET (line), NULL, 0,
|
||||
&cursor, &tool_cursor, &modifier);
|
||||
/* set the cursor modifier to a minus by talking to the shell
|
||||
* directly -- eek!
|
||||
*/
|
||||
{
|
||||
GimpCursorType cursor;
|
||||
GimpToolCursorType tool_cursor;
|
||||
GimpCursorModifier modifier;
|
||||
|
||||
gimp_display_shell_set_cursor (shell, cursor, tool_cursor, modifier);
|
||||
}
|
||||
cursor = shell->current_cursor;
|
||||
tool_cursor = shell->tool_cursor;
|
||||
modifier = GIMP_CURSOR_MODIFIER_NONE;
|
||||
|
||||
gimp_tool_line_update_handles (line);
|
||||
gimp_tool_line_get_cursor (GIMP_TOOL_WIDGET (line), NULL, 0,
|
||||
&cursor, &tool_cursor, &modifier);
|
||||
|
||||
gimp_display_shell_set_cursor (shell, cursor, tool_cursor, modifier);
|
||||
}
|
||||
|
||||
gimp_tool_line_update_handles (line);
|
||||
gimp_tool_line_update_circle (line);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
@ -60,13 +60,16 @@ struct _GimpToolLineClass
|
|||
GimpToolWidgetClass parent_class;
|
||||
|
||||
/* signals */
|
||||
gboolean (* can_add_slider) (GimpToolLine *line,
|
||||
gdouble value);
|
||||
gint (* add_slider) (GimpToolLine *line,
|
||||
gdouble value);
|
||||
void (* remove_slider) (GimpToolLine *line,
|
||||
gint slider);
|
||||
void (* selection_changed) (GimpToolLine *line);
|
||||
gboolean (* can_add_slider) (GimpToolLine *line,
|
||||
gdouble value);
|
||||
gint (* add_slider) (GimpToolLine *line,
|
||||
gdouble value);
|
||||
void (* prepare_to_remove_slider) (GimpToolLine *line,
|
||||
gint slider,
|
||||
gboolean remove);
|
||||
void (* remove_slider) (GimpToolLine *line,
|
||||
gint slider);
|
||||
void (* selection_changed) (GimpToolLine *line);
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue