gimp r24931 - in trunk: . plug-ins/print



Author: neo
Date: Thu Feb 21 08:54:24 2008
New Revision: 24931
URL: http://svn.gnome.org/viewvc/gimp?rev=24931&view=rev

Log:
2008-02-21  Sven Neumann  <sven gimp org>

	* plug-ins/print/print-preview.c: provide feedback when hovering
	over the preview.



Modified:
   trunk/ChangeLog
   trunk/plug-ins/print/print-preview.c
   trunk/plug-ins/print/print-preview.h

Modified: trunk/plug-ins/print/print-preview.c
==============================================================================
--- trunk/plug-ins/print/print-preview.c	(original)
+++ trunk/plug-ins/print/print-preview.c	Thu Feb 21 08:54:24 2008
@@ -50,6 +50,9 @@
 
 static gdouble   gimp_print_preview_get_scale        (GimpPrintPreview *preview);
 
+static void      gimp_print_preview_get_page_size    (GimpPrintPreview *preview,
+                                                      gdouble          *paper_width,
+                                                      gdouble          *paper_height);
 static void      gimp_print_preview_get_page_margins (GimpPrintPreview *preview,
                                                       gdouble          *left_margin,
                                                       gdouble          *right_margin,
@@ -133,6 +136,7 @@
   preview->page               = NULL;
   preview->pixbuf             = NULL;
   preview->dragging           = FALSE;
+  preview->inside             = FALSE;
   preview->image_offset_x     = 0.0;
   preview->image_offset_y     = 0.0;
   preview->image_offset_x_max = 0.0;
@@ -145,7 +149,10 @@
   gtk_container_add (GTK_CONTAINER (preview), preview->area);
   gtk_widget_show (preview->area);
 
-  gtk_widget_add_events (GTK_WIDGET (preview->area), GDK_BUTTON_PRESS_MASK);
+  gtk_widget_add_events (GTK_WIDGET (preview->area),
+                         GDK_BUTTON_PRESS_MASK   |
+                         GDK_POINTER_MOTION_MASK |
+                         GDK_LEAVE_NOTIFY_MASK);
 
   g_signal_connect (preview->area, "size-allocate",
                     G_CALLBACK (gimp_print_preview_size_allocate),
@@ -350,6 +357,39 @@
 }
 
 static gboolean
+gimp_print_preview_is_inside (GimpPrintPreview *preview,
+                              gdouble           x,
+                              gdouble           y)
+{
+  gdouble  left_margin;
+  gdouble  right_margin;
+  gdouble  top_margin;
+  gdouble  bottom_margin;
+  gdouble  width;
+  gdouble  height;
+  gdouble  scale;
+
+  gimp_print_preview_get_page_margins (preview,
+                                       &left_margin,
+                                       &right_margin,
+                                       &top_margin,
+                                       &bottom_margin);
+
+  scale = gimp_print_preview_get_scale (preview);
+
+  x = x / scale - left_margin;
+  y = y / scale - top_margin;
+
+  width  = preview->drawable->width  * 72.0 / preview->image_xres;
+  height = preview->drawable->height * 72.0 / preview->image_yres;
+
+  return (x > preview->image_offset_x         &&
+          x < preview->image_offset_x + width &&
+          y > preview->image_offset_y         &&
+          y < preview->image_offset_y + height);
+}
+
+static gboolean
 gimp_print_preview_event (GtkWidget        *widget,
                           GdkEvent         *event,
                           GimpPrintPreview *preview)
@@ -359,10 +399,6 @@
   static gint    start_x       = 0;
   static gint    start_y       = 0;
 
-  gdouble        offset_x;
-  gdouble        offset_y;
-  gdouble        scale;
-
   switch (event->type)
     {
     case GDK_BUTTON_PRESS:
@@ -381,23 +417,44 @@
       break;
 
     case GDK_MOTION_NOTIFY:
-      scale = gimp_print_preview_get_scale (preview);
-
-      offset_x = (orig_offset_x + (event->motion.x - start_x) / scale);
-      offset_y = (orig_offset_y + (event->motion.y - start_y) / scale);
-
-      offset_x = CLAMP (offset_x, 0, preview->image_offset_x_max);
-      offset_y = CLAMP (offset_y, 0, preview->image_offset_y_max);
-
-      if (preview->image_offset_x != offset_x ||
-          preview->image_offset_y != offset_y)
-        {
-          gimp_print_preview_set_image_offsets (preview, offset_x, offset_y);
-
-          g_signal_emit (preview,
-                         gimp_print_preview_signals[OFFSETS_CHANGED], 0,
-                         preview->image_offset_x, preview->image_offset_y);
-        }
+      {
+        if (preview->dragging)
+          {
+            gdouble scale = gimp_print_preview_get_scale (preview);
+            gdouble offset_x;
+            gdouble offset_y;
+
+            offset_x = (orig_offset_x + (event->motion.x - start_x) / scale);
+            offset_y = (orig_offset_y + (event->motion.y - start_y) / scale);
+
+            offset_x = CLAMP (offset_x, 0, preview->image_offset_x_max);
+            offset_y = CLAMP (offset_y, 0, preview->image_offset_y_max);
+
+            if (preview->image_offset_x != offset_x ||
+                preview->image_offset_y != offset_y)
+              {
+                gimp_print_preview_set_image_offsets (preview,
+                                                      offset_x, offset_y);
+
+                g_signal_emit (preview,
+                               gimp_print_preview_signals[OFFSETS_CHANGED], 0,
+                               preview->image_offset_x,
+                               preview->image_offset_y);
+              }
+          }
+        else
+          {
+            gboolean inside = gimp_print_preview_is_inside (preview,
+                                                            event->motion.x,
+                                                            event->motion.y);
+
+            if (inside != preview->inside)
+              {
+                preview->inside = inside;
+                print_preview_queue_draw (preview);
+              }
+          }
+      }
       break;
 
     case GDK_BUTTON_RELEASE:
@@ -406,9 +463,20 @@
       start_x = start_y = 0;
       preview->dragging = FALSE;
 
+      preview->inside = gimp_print_preview_is_inside (preview,
+                                                      event->button.x,
+                                                      event->button.y);
       print_preview_queue_draw (preview);
       break;
 
+    case GDK_LEAVE_NOTIFY:
+      if (preview->inside)
+        {
+          preview->inside = FALSE;
+          print_preview_queue_draw (preview);
+        }
+      break;
+
     default:
       break;
     }
@@ -432,20 +500,19 @@
   gdouble  width;
   gdouble  height;
 
-  paper_width = gtk_page_setup_get_paper_width (preview->page,
-                                                GTK_UNIT_POINTS);
-  paper_height = gtk_page_setup_get_paper_height (preview->page,
-                                                  GTK_UNIT_POINTS);
+  gimp_print_preview_get_page_size (preview,
+                                    &paper_width,
+                                    &paper_height);
   gimp_print_preview_get_page_margins (preview,
                                        &left_margin,
                                        &right_margin,
                                        &top_margin,
                                        &bottom_margin);
 
-  cr = gdk_cairo_create (widget->window);
-
   scale = gimp_print_preview_get_scale (preview);
 
+  cr = gdk_cairo_create (widget->window);
+
   /* draw background */
   gdk_cairo_set_source_color (cr, &widget->style->white);
   cairo_paint (cr);
@@ -467,7 +534,7 @@
                    scale * (left_margin + preview->image_offset_x),
                    scale * (top_margin  + preview->image_offset_y));
 
-  if (preview->dragging)
+  if (preview->dragging || preview->inside)
     {
       cairo_rectangle (cr,
                        0, 0,
@@ -509,14 +576,15 @@
 static gdouble
 gimp_print_preview_get_scale (GimpPrintPreview* preview)
 {
+  gdouble paper_width;
+  gdouble paper_height;
   gdouble scale_x;
   gdouble scale_y;
 
-  scale_x = ((gdouble) preview->area->allocation.width /
-             gtk_page_setup_get_paper_width (preview->page, GTK_UNIT_POINTS));
+  gimp_print_preview_get_page_size (preview, &paper_width, &paper_height);
 
-  scale_y = ((gdouble) preview->area->allocation.height /
-             gtk_page_setup_get_paper_height (preview->page, GTK_UNIT_POINTS));
+  scale_x = ((gdouble) preview->area->allocation.width  / paper_width);
+  scale_y = ((gdouble) preview->area->allocation.height / paper_height);
 
   return MIN (scale_x, scale_y);
 }
@@ -534,6 +602,17 @@
 }
 
 static void
+gimp_print_preview_get_page_size (GimpPrintPreview *preview,
+                                  gdouble          *paper_width,
+                                  gdouble          *paper_height)
+{
+  *paper_width = gtk_page_setup_get_paper_width (preview->page,
+                                                 GTK_UNIT_POINTS);
+  *paper_height = gtk_page_setup_get_paper_height (preview->page,
+                                                   GTK_UNIT_POINTS);
+}
+
+static void
 gimp_print_preview_get_page_margins (GimpPrintPreview *preview,
                                      gdouble          *left_margin,
                                      gdouble          *right_margin,

Modified: trunk/plug-ins/print/print-preview.h
==============================================================================
--- trunk/plug-ins/print/print-preview.h	(original)
+++ trunk/plug-ins/print/print-preview.h	Thu Feb 21 08:54:24 2008
@@ -40,6 +40,7 @@
   GtkPageSetup   *page;
   GdkPixbuf      *pixbuf;
   gboolean        dragging;
+  gboolean        inside;
 
   GimpDrawable   *drawable;
 



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