[gtk+/wip/baedert/gtkimageview: 75/186] GtkImageView: Add _fix_point_rotate
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/baedert/gtkimageview: 75/186] GtkImageView: Add _fix_point_rotate
- Date: Mon, 21 Mar 2016 10:31:41 +0000 (UTC)
commit 48b69c9bf2fcfc23e2ccde7f6a3fe660c7998d80
Author: adsfasdf <mail baedert org>
Date: Wed Aug 12 13:19:59 2015 +0200
GtkImageView: Add _fix_point_rotate
We need to fix the point differently in the rotate case than in the zoom
case
gtk/gtkimageview.c | 71 ++++++++++++++++++++++++++++++++++++---------------
1 files changed, 50 insertions(+), 21 deletions(-)
---
diff --git a/gtk/gtkimageview.c b/gtk/gtkimageview.c
index 759b26b..0dcb0ae 100644
--- a/gtk/gtkimageview.c
+++ b/gtk/gtkimageview.c
@@ -130,20 +130,43 @@ free_load_task_data (LoadTaskData *data)
g_clear_object (&data->source);
}
+
+static void
+gtk_image_view_fix_point_rotate (GtkImageView *image_view,
+ double hupper_before,
+ double vupper_before,
+ int x_before,
+ int y_before)
+{
+ GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
+
+ /*
+ * XXX
+ * We should rotate around the bounding box center of the rotate gesture,
+ * but we currently only rotate around the image center!
+ */
+
+ double x_diff = gtk_adjustment_get_value (priv->hadjustment) - hupper_before;
+ double y_diff = gtk_adjustment_get_value (priv->vadjustment) - vupper_before;
+
+ if (x_diff == 0 && y_diff == 0)
+ {
+ g_message ("No difference!");
+ return;
+ }
+
+ gtk_adjustment_set_value (priv->hadjustment,
+ gtk_adjustment_get_value (priv->hadjustment) + x_diff);
+ gtk_adjustment_set_value (priv->vadjustment,
+ gtk_adjustment_get_value (priv->vadjustment) + y_diff);
+}
+
static void
gtk_image_view_fix_point (GtkImageView *image_view,
double scale_before,
int x_before,
int y_before)
{
-/* XXX
- * XXX
- * XXX we also need to call this when the angle changes
- * XXX
- * XXX
- * */
-
-
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
double x_after;
double y_after;
@@ -155,20 +178,17 @@ gtk_image_view_fix_point (GtkImageView *image_view,
x_value = gtk_adjustment_get_value (priv->hadjustment);
y_value = gtk_adjustment_get_value (priv->vadjustment);
- x_before += gtk_adjustment_get_value (priv->hadjustment);
- y_before += gtk_adjustment_get_value (priv->vadjustment);
+ x_before += x_value;
+ y_before += y_value;
x_after = x_before / scale_before * priv->scale;
y_after = y_before / scale_before * priv->scale;
- double x_diff = x_after - x_before;
- double y_diff = y_after - y_before;
-
gtk_adjustment_set_value (priv->hadjustment,
- x_value + x_diff);
+ x_value + x_after - x_before);
gtk_adjustment_set_value (priv->vadjustment,
- y_value + y_diff);
+ y_value + y_after - x_before);
}
static void
@@ -204,6 +224,8 @@ gesture_angle_changed_cb (GtkGestureRotate *gesture,
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private ((GtkImageView *)widget);
double new_angle;
+ double hupper_before;
+ double vupper_before;
double bb_x;
double bb_y;
@@ -219,6 +241,13 @@ gesture_angle_changed_cb (GtkGestureRotate *gesture,
priv->gesture_start_angle = priv->angle;
}
+ if (priv->hadjustment && priv->vadjustment)
+ {
+ hupper_before = gtk_adjustment_get_upper (priv->hadjustment);
+ vupper_before = gtk_adjustment_get_upper (priv->vadjustment);
+ }
+
+
new_angle = priv->gesture_start_angle + RAD_TO_DEG (delta);
/* Don't notify */
@@ -232,12 +261,12 @@ gesture_angle_changed_cb (GtkGestureRotate *gesture,
gtk_gesture_get_bounding_box_center ((GtkGesture *)gesture, &bb_x, &bb_y);
- // XXX Fix point here.
- /*if (priv->hadjustment || priv->vadjustment)*/
- /*gtk_image_view_fix_point ((GtkImageView *)widget,*/
- /*0.0,*/
- /*bb_x,*/
- /*bb_y);*/
+ if (priv->hadjustment && priv->vadjustment)
+ gtk_image_view_fix_point_rotate ((GtkImageView *)widget,
+ hupper_before,
+ vupper_before,
+ bb_x,
+ bb_y);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]