widgets: Implement support for zoom by pitch in gradient editor

This commit is contained in:
Povilas Kanapickas 2022-04-06 18:47:13 +03:00 committed by Jehan
parent 62490218ee
commit ecb2009960
2 changed files with 67 additions and 2 deletions

View File

@ -96,7 +96,8 @@
GDK_BUTTON_PRESS_MASK | \
GDK_BUTTON_RELEASE_MASK | \
GDK_SCROLL_MASK | \
GDK_SMOOTH_SCROLL_MASK)
GDK_SMOOTH_SCROLL_MASK | \
GDK_TOUCHPAD_GESTURE_MASK)
#define GRAD_CONTROL_EVENT_MASK (GDK_EXPOSURE_MASK | \
GDK_LEAVE_NOTIFY_MASK | \
@ -178,6 +179,14 @@ static void view_pick_color (GimpGradientEditor *editor,
GimpColorPickState pick_state,
gint x);
static void view_zoom_gesture_begin (GtkGestureZoom *gesture,
GdkEventSequence *sequence,
GimpGradientEditor *editor);
static void view_zoom_gesture_update (GtkGestureZoom *gesture,
GdkEventSequence *sequence,
GimpGradientEditor *editor);
/* Gradient control functions */
static gboolean control_events (GtkWidget *widget,
@ -340,6 +349,18 @@ gimp_gradient_editor_init (GimpGradientEditor *editor)
gradient_editor_drop_color,
editor);
editor->zoom_gesture = gtk_gesture_zoom_new (GTK_WIDGET (data_editor->view));
gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (editor->zoom_gesture),
GTK_PHASE_CAPTURE);
g_signal_connect (editor->zoom_gesture, "begin",
G_CALLBACK (view_zoom_gesture_begin),
editor);
g_signal_connect (editor->zoom_gesture, "update",
G_CALLBACK (view_zoom_gesture_update),
editor);
/* Gradient control */
editor->control = gtk_drawing_area_new ();
gtk_widget_set_size_request (editor->control, -1, GRAD_CONTROL_HEIGHT);
@ -450,6 +471,8 @@ gimp_gradient_editor_dispose (GObject *object)
gtk_dialog_response (GTK_DIALOG (editor->color_dialog),
GTK_RESPONSE_CANCEL);
g_clear_object (&editor->zoom_gesture);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
@ -672,7 +695,7 @@ gimp_gradient_editor_zoom (GimpGradientEditor *editor,
delta = ABS (delta);
}
else
else if (zoom_type != GIMP_ZOOM_PINCH)
{
delta = 1.0;
}
@ -717,6 +740,26 @@ gimp_gradient_editor_zoom (GimpGradientEditor *editor,
page_size = 1.0;
break;
case GIMP_ZOOM_PINCH:
if (delta > 0.0)
editor->zoom_factor = editor->zoom_factor * (1.0 + delta);
else if (delta < 0.0)
editor->zoom_factor = editor->zoom_factor / (1.0 + -delta);
else
return;
if (editor->zoom_factor < 1)
editor->zoom_factor = 1;
page_size = 1.0 / editor->zoom_factor;
value = old_value + (old_page_size - page_size) / 2.0;
if (value < 0.0)
value = 0.0;
else if ((value + page_size) > 1.0)
value = 1.0 - page_size;
break;
case GIMP_ZOOM_SMOOTH: /* can't happen, see above switch() */
break;
}
@ -1306,6 +1349,26 @@ view_pick_color (GimpGradientEditor *editor,
g_free (str3);
}
static void
view_zoom_gesture_begin (GtkGestureZoom *gesture,
GdkEventSequence *sequence,
GimpGradientEditor *editor)
{
editor->last_zoom_scale = gtk_gesture_zoom_get_scale_delta (gesture);
}
static void
view_zoom_gesture_update (GtkGestureZoom *gesture,
GdkEventSequence *sequence,
GimpGradientEditor *editor)
{
gdouble current_scale = gtk_gesture_zoom_get_scale_delta (gesture);
gdouble delta = (current_scale - editor->last_zoom_scale) / editor->last_zoom_scale;
editor->last_zoom_scale = current_scale;
gimp_gradient_editor_zoom (editor, GIMP_ZOOM_PINCH, delta);
}
/***** Gradient control functions *****/
static gboolean

View File

@ -62,6 +62,8 @@ struct _GimpGradientEditor
/* Zoom and scrollbar */
gdouble zoom_factor;
GtkAdjustment *scroll_data;
GtkGesture *zoom_gesture;
gdouble last_zoom_scale;
/* Gradient view */
gint view_last_x;