[eog] Make it possible to scale the print preview using the scrollwheel



commit a7a1cde3fb2d13214b0dd30595d652868ff118af
Author: Claudio Saavedra <csaavedra igalia com>
Date:   Wed Jan 4 17:40:41 2012 +0100

    Make it possible to scale the print preview using the scrollwheel
    
    https://bugzilla.gnome.org/show_bug.cgi?id=495716

 src/eog-print-image-setup.c |   14 ++++++++
 src/eog-print-preview.c     |   79 +++++++++++++++++++++++++++++++++++++++++++
 src/eog-print-preview.h     |    2 +
 3 files changed, 95 insertions(+), 0 deletions(-)
---
diff --git a/src/eog-print-image-setup.c b/src/eog-print-image-setup.c
index cc84974..c3f38cb 100644
--- a/src/eog-print-image-setup.c
+++ b/src/eog-print-image-setup.c
@@ -634,6 +634,18 @@ on_preview_image_moved (EogPrintPreview *preview,
 	gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->top), y);
 }
 
+static void
+on_preview_image_scaled (EogPrintPreview *preview,
+			 gpointer user_data)
+{
+	EogPrintImageSetupPrivate *priv = EOG_PRINT_IMAGE_SETUP (user_data)->priv;
+	gfloat scale;
+
+	scale = eog_print_preview_get_scale (preview);
+
+	gtk_range_set_value (GTK_RANGE (priv->scaling), 100*scale);
+}
+
 /* Function taken from gtkprintunixdialog.c */
 static GtkWidget *
 wrap_in_frame (const gchar *label,
@@ -819,6 +831,8 @@ connect_signals (EogPrintImageSetup *setup)
 			  G_CALLBACK (on_scale_format_value), NULL);
 	g_signal_connect (G_OBJECT (priv->preview), "image-moved",
 			  G_CALLBACK (on_preview_image_moved), setup);
+	g_signal_connect (G_OBJECT (priv->preview), "image-scaled",
+			  G_CALLBACK (on_preview_image_scaled), setup);
 }
 
 static void
diff --git a/src/eog-print-preview.c b/src/eog-print-preview.c
index 2265b5d..4fed6c7 100644
--- a/src/eog-print-preview.c
+++ b/src/eog-print-preview.c
@@ -77,6 +77,7 @@ struct _EogPrintPreviewPrivate {
 /* Signal IDs */
 enum {
 	SIGNAL_IMAGE_MOVED,
+	SIGNAL_IMAGE_SCALED,
 	SIGNAL_LAST
 };
 static gint preview_signals [SIGNAL_LAST];
@@ -388,6 +389,19 @@ eog_print_preview_class_init (EogPrintPreviewClass *klass)
 			      g_cclosure_marshal_VOID__VOID, G_TYPE_NONE,
 			      0, NULL);
 
+/**
+ * EogPrintPreview::image-scaled:
+ * @preview: the object which received the signal
+ *
+ * The ::image-scaled signal is emmited when the scale of the image is changed.
+ */
+	preview_signals [SIGNAL_IMAGE_SCALED] =
+		g_signal_new ("image_scaled",
+			      G_TYPE_FROM_CLASS (gobject_class),
+			      G_SIGNAL_RUN_FIRST, 0, NULL, NULL,
+			      g_cclosure_marshal_VOID__VOID, G_TYPE_NONE,
+			      0, NULL);
+
 	g_type_class_add_private (klass, sizeof (EogPrintPreviewPrivate));
 }
 
@@ -463,6 +477,7 @@ static gboolean button_press_event_cb   (GtkWidget *widget, GdkEventButton *bev,
 static gboolean button_release_event_cb (GtkWidget *widget, GdkEventButton *bev, gpointer user_data);
 static gboolean motion_notify_event_cb  (GtkWidget *widget, GdkEventMotion *mev, gpointer user_data);
 static gboolean key_press_event_cb      (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
+static gboolean scroll_event_cb         (GtkWidget *widget, GdkEventScroll *event, gpointer user_data);
 
 static gboolean draw_cb (GtkDrawingArea *drawing_area, cairo_t *cr, gpointer  user_data);
 static void size_allocate_cb (GtkWidget *widget, GtkAllocation *allocation, gpointer user_data);
@@ -516,6 +531,7 @@ eog_print_preview_new (void)
 			       GDK_POINTER_MOTION_MASK      |
 			       GDK_BUTTON_PRESS_MASK        |
 			       GDK_BUTTON_RELEASE_MASK      |
+			       GDK_SCROLL_MASK              |
 			       GDK_KEY_PRESS_MASK);
 
 	g_object_set (G_OBJECT (area),
@@ -542,6 +558,9 @@ eog_print_preview_new (void)
 	g_signal_connect (area, "size-allocate",
 			  G_CALLBACK (size_allocate_cb), preview);
 
+	g_signal_connect (G_OBJECT (area), "scroll-event",
+			  G_CALLBACK (scroll_event_cb), preview);
+
 	return GTK_WIDGET (preview);
 }
 
@@ -957,6 +976,39 @@ motion_notify_event_cb (GtkWidget      *widget,
 	return FALSE;
 }
 
+static gboolean
+scroll_event_cb (GtkWidget *widget,
+		 GdkEventScroll *event,
+		 gpointer user_data)
+{
+	g_assert (EOG_IS_PRINT_PREVIEW (user_data));
+
+	EogPrintPreview *preview = EOG_PRINT_PREVIEW (user_data);
+
+	if (press_inside_image_area (EOG_PRINT_PREVIEW (user_data),
+				     event->x, event->y))
+	{
+		gfloat scale;
+		gfloat multiplier;
+
+		g_object_get (preview, "image-scale", &scale, NULL);
+
+		switch (event->direction) {
+		case GDK_SCROLL_UP:
+			/* scale up */
+			multiplier = 1.1;
+			break;
+		case GDK_SCROLL_DOWN:
+			/* scale down */
+			multiplier = 0.9;
+
+		}
+		eog_print_preview_set_scale (preview, CLAMP (scale * multiplier, 0., 1.));
+	}
+	return TRUE;
+}
+
+
 static void
 size_allocate_cb (GtkWidget *widget,
 		  GtkAllocation *allocation,
@@ -1214,4 +1266,31 @@ eog_print_preview_set_scale (EogPrintPreview *preview,
 	g_object_set (preview,
 		      "image-scale", scale,
 		      NULL);
+
+	g_signal_emit (G_OBJECT (preview),
+		       preview_signals
+		       [SIGNAL_IMAGE_SCALED], 0);
+
+}
+
+/**
+ * eog_print_preview_get_scale:
+ * @preview: A #EogPrintPreview.
+ *
+ * Gets the scale for the image.
+ *
+ * Returns: The scale for the image.
+ **/
+gfloat
+eog_print_preview_get_scale (EogPrintPreview *preview)
+{
+	gfloat scale;
+
+	g_return_val_if_fail (EOG_IS_PRINT_PREVIEW (preview), 0);
+
+	g_object_get (preview,
+		      "image-scale", &scale,
+		      NULL);
+
+	return scale;
 }
diff --git a/src/eog-print-preview.h b/src/eog-print-preview.h
index d145dd2..4395400 100644
--- a/src/eog-print-preview.h
+++ b/src/eog-print-preview.h
@@ -79,6 +79,8 @@ G_GNUC_INTERNAL
 void         eog_print_preview_set_scale           (EogPrintPreview *preview,
 						    gfloat           scale);
 
+gfloat       eog_print_preview_get_scale           (EogPrintPreview *preview);
+
 G_END_DECLS
 
 #endif /* _EOG_PRINT_PREVIEW_H_ */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]