[gtk+/wip/baedert/gtkimageview: 64/186] GtkImageView: Add initial gesture code
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/baedert/gtkimageview: 64/186] GtkImageView: Add initial gesture code
- Date: Mon, 21 Mar 2016 10:30:45 +0000 (UTC)
commit 6dd9a40aa9f2fb254912745897bc3e1c26b27059
Author: Timm Bäder <mail baedert org>
Date: Mon Jul 20 21:00:12 2015 +0200
GtkImageView: Add initial gesture code
And fix some other things.
demos/gtk-demo/image_view.c | 4 +++
demos/gtk-demo/image_view.ui | 2 +-
gtk/gtkimageview.c | 60 +++++++++++++++++++++++++++++++----------
3 files changed, 50 insertions(+), 16 deletions(-)
---
diff --git a/demos/gtk-demo/image_view.c b/demos/gtk-demo/image_view.c
index 3fbb18b..3c827c8 100644
--- a/demos/gtk-demo/image_view.c
+++ b/demos/gtk-demo/image_view.c
@@ -128,6 +128,8 @@ load_pixbuf_button_clicked_cb ()
g_assert (pixbuf != NULL);
gtk_image_view_set_pixbuf (GTK_IMAGE_VIEW (image_view), pixbuf, 1);
+
+ g_object_unref (G_OBJECT (pixbuf));
}
@@ -145,6 +147,8 @@ load_surface_button_clicked_cb ()
surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, 1, NULL);
+ g_object_unref (G_OBJECT (pixbuf));
+
gtk_image_view_set_surface (GTK_IMAGE_VIEW (image_view), surface);
}
diff --git a/demos/gtk-demo/image_view.ui b/demos/gtk-demo/image_view.ui
index fbbc87f..f87c520 100644
--- a/demos/gtk-demo/image_view.ui
+++ b/demos/gtk-demo/image_view.ui
@@ -68,7 +68,7 @@
<object class="GtkButton">
<property name="visible">true</property>
<property name="label" translatable="yes">Load Pixbuf</property>
- <signal name="clicked" handler="load_pixbuf_button_clicked_cb" />
+ <signal name="clicked" handler="load_pixbuf_button_clicked_cb" object="image_view"/>
</object>
<packing>
<property name="left_attach">0</property>
diff --git a/gtk/gtkimageview.c b/gtk/gtkimageview.c
index 6b9a533..bfb9ca1 100644
--- a/gtk/gtkimageview.c
+++ b/gtk/gtkimageview.c
@@ -58,8 +58,7 @@ struct _GtkImageViewPrivate
// XXX animate image size changes!
//
-// XXX Keep track of the inital width/height and use a non-image cairo surface
-// XXX Look for memory leaks
+// XXX Don't track the surface size
enum
{
@@ -97,7 +96,6 @@ G_DEFINE_TYPE_WITH_CODE (GtkImageView, gtk_image_view, GTK_TYPE_WIDGET,
typedef struct _LoadTaskData LoadTaskData;
-// @ask How to solve this more elegantly?
struct _LoadTaskData
{
int scale_factor;
@@ -110,6 +108,23 @@ free_load_task_data (LoadTaskData *data)
g_clear_object ((&data->source));
}
+static void
+gesture_angle_changed_cb (GtkGestureRotate *gesture,
+ double angle,
+ double delta,
+ GtkWidget *widget)
+{
+ g_message ("Angle changed. Angle: %f, delta: %f", angle, delta);
+}
+
+static void
+gesture_zoom_changed_cb (GtkGestureZoom *gesture,
+ double zoom,
+ GtkWidget *widget)
+{
+ g_message ("Zoom changed. Zoom: %f", zoom);
+}
+
static void
gtk_image_view_init (GtkImageView *image_view)
@@ -127,7 +142,9 @@ gtk_image_view_init (GtkImageView *image_view)
priv->rotate_gesture_enabled = TRUE;
priv->zoom_gesture_enabled = TRUE;
priv->rotate_gesture = gtk_gesture_rotate_new ((GtkWidget *)image_view);
+ g_signal_connect (priv->rotate_gesture, "angle-changed", (GCallback)gesture_angle_changed_cb, NULL);
priv->zoom_gesture = gtk_gesture_zoom_new ((GtkWidget *)image_view);
+ g_signal_connect (priv->zoom_gesture, "zoom-changed", (GCallback)gesture_zoom_changed_cb, NULL);
gtk_style_context_add_class (sc, GTK_STYLE_CLASS_BACKGROUND);
}
@@ -309,7 +326,6 @@ gtk_image_view_compute_bounding_box (GtkImageView *image_view,
upper_left_y = r * sin (upper_left_degrees);
- //
bb_width = MAX (fabs (upper_right_x), fabs (upper_left_x)) * 2;
bb_height = MAX (fabs (upper_right_y), fabs (upper_left_y)) * 2;
@@ -426,7 +442,7 @@ gtk_image_view_draw (GtkWidget *widget, cairo_t *ct)
draw_y = (alloc.height - draw_height) / 2;
-#if 1
+#if 0
{
cairo_save (ct);
cairo_set_source_rgba (ct, 0.7, 0.7, 0.7, 1);
@@ -572,9 +588,13 @@ gtk_image_view_set_scale (GtkImageView *image_view,
priv->scale = scale;
g_object_notify_by_pspec ((GObject *)image_view,
widget_props[PROP_SCALE]);
- priv->scale_set = TRUE;
- g_object_notify_by_pspec ((GObject *)image_view,
- widget_props[PROP_SCALE_SET]);
+
+ if (!priv->scale_set)
+ {
+ priv->scale_set = TRUE;
+ g_object_notify_by_pspec ((GObject *)image_view,
+ widget_props[PROP_SCALE_SET]);
+ }
if (priv->fit_allocation)
{
@@ -592,7 +612,7 @@ double
gtk_image_view_get_scale (GtkImageView *image_view)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
- g_return_if_fail (GTK_IS_IMAGE_VIEW (image_view));
+ g_return_val_if_fail (GTK_IS_IMAGE_VIEW (image_view), 0.0);
return priv->scale;
}
@@ -606,6 +626,9 @@ gtk_image_view_set_angle (GtkImageView *image_view,
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
g_return_if_fail (GTK_IS_IMAGE_VIEW (image_view));
+
+ g_message (__FUNCTION__);
+
if (priv->snap_angle)
gtk_image_view_do_snapping (image_view, angle);
else
@@ -627,7 +650,7 @@ double
gtk_image_view_get_angle (GtkImageView *image_view)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
- g_return_if_fail (GTK_IS_IMAGE_VIEW (image_view));
+ g_return_val_if_fail (GTK_IS_IMAGE_VIEW (image_view), 0.0);
return priv->angle;
}
@@ -668,7 +691,7 @@ gboolean
gtk_image_view_get_snap_angle (GtkImageView *image_view)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
- g_return_if_fail (GTK_IS_IMAGE_VIEW (image_view));
+ g_return_val_if_fail (GTK_IS_IMAGE_VIEW (image_view), FALSE);
return priv->snap_angle;
}
@@ -726,7 +749,7 @@ gboolean
gtk_image_view_get_fit_allocation (GtkImageView *image_view)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
- g_return_if_fail (GTK_IS_IMAGE_VIEW (image_view));
+ g_return_val_if_fail (GTK_IS_IMAGE_VIEW (image_view), FALSE);
return priv->fit_allocation;
}
@@ -751,7 +774,7 @@ gboolean
gtk_image_view_get_rotate_gesture_enabled (GtkImageView *image_view)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
- g_return_if_fail (GTK_IS_IMAGE_VIEW (image_view));
+ g_return_val_if_fail (GTK_IS_IMAGE_VIEW (image_view), FALSE);
return priv->rotate_gesture_enabled;
}
@@ -776,7 +799,7 @@ gboolean
gtk_image_view_get_zoom_gesture_enabled (GtkImageView *image_view)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
- g_return_if_fail (GTK_IS_IMAGE_VIEW (image_view));
+ g_return_val_if_fail (GTK_IS_IMAGE_VIEW (image_view), FALSE);
return priv->zoom_gesture_enabled;
}
@@ -878,7 +901,6 @@ gtk_image_view_get_preferred_height (GtkWidget *widget,
&height,
NULL);
-
if (priv->fit_allocation)
{
*minimal = 0;
@@ -1362,6 +1384,7 @@ gtk_image_view_set_pixbuf (GtkImageView *image_view,
{
g_clear_object (&priv->source_animation);
gtk_image_view_stop_animation (image_view);
+ priv->is_animation = FALSE;
}
gtk_image_view_update_surface (image_view, pixbuf, scale_factor);
@@ -1382,6 +1405,13 @@ gtk_image_view_set_surface (GtkImageView *image_view,
cairo_surface_get_device_scale (surface, &scale_x, &scale_y);
g_assert (scale_x == scale_y); /* XXX Legal? */
+ if (priv->is_animation)
+ {
+ g_clear_object (&priv->source_animation);
+ gtk_image_view_stop_animation (image_view);
+ priv->is_animation = FALSE;
+ }
+
gtk_image_view_replace_surface (image_view,
surface,
scale_x);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]