Author: abrander
Date: 2009-07-04 23:33:44 +0200 (Sat, 04 Jul 2009)
New Revision: 2540

Modified:
   trunk/src/rs-preview-widget.c
Log:
[271] Zoom to 100% now centers at cursor position.

Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c       2009-07-04 21:32:32 UTC (rev 2539)
+++ trunk/src/rs-preview-widget.c       2009-07-04 21:33:44 UTC (rev 2540)
@@ -210,6 +210,8 @@
 static gboolean leave(GtkWidget *widget, GdkEventCrossing *event, gpointer 
user_data);
 static void settings_changed(RS_PHOTO *photo, RSSettingsMask mask, 
RSPreviewWidget *preview);
 static void filter_changed(RSFilter *filter, RSFilterChangedMask mask, 
RSPreviewWidget *preview);
+static gboolean get_image_coord(RSPreviewWidget *preview, gint view, const 
gint x, const gint y, gint *scaled_x, gint *scaled_y, gint *real_x, gint 
*real_y, gint *max_w, gint *max_h);
+static gint get_view_from_coord(RSPreviewWidget *preview, const gint x, const 
gint y);
 static void crop_aspect_changed(gpointer active, gpointer user_data);
 static void crop_grid_changed(gpointer active, gpointer user_data);
 static void crop_apply_clicked(GtkButton *button, gpointer user_data);
@@ -404,9 +406,7 @@
        if (zoom_to_fit == preview->zoom_to_fit)
                return;
 
-       preview->zoom_to_fit = zoom_to_fit;
-
-       if (preview->zoom_to_fit)
+       if (zoom_to_fit)
        {
                gint max_width, max_height;
                get_max_size(preview, &max_width, &max_height);
@@ -431,6 +431,14 @@
        }
        else
        {
+               GdkWindow *window = GTK_WIDGET(preview->canvas)->window;
+               gint x, y;
+               GdkModifierType mask;
+               gint real_x, real_y;
+               gdk_window_get_pointer(window, &x, &y, &mask);
+               const gint view = get_view_from_coord(preview, preview->last_x, 
preview->last_y);
+               const gboolean inside_image = get_image_coord(preview, view, x, 
y, NULL, NULL, &real_x, &real_y, NULL, NULL);
+
                /* Unsplit if needed */
                if (preview->views > 1)
                        rs_core_action_group_activate("Split");
@@ -441,6 +449,28 @@
                /* Disable resample filter */
                rs_filter_set_enabled(preview->filter_resample[0], FALSE);
 
+               if (preview->photo)
+               {
+                       /* Update scrollbars to reflect the change */
+                       gdouble val;
+                       val = (gdouble) 
rs_filter_get_width(preview->filter_end[0]);
+                       g_object_set(G_OBJECT(preview->hadjustment), "upper", 
val, NULL);
+                       val = (gdouble) 
rs_filter_get_height(preview->filter_end[0]);
+                       g_object_set(G_OBJECT(preview->vadjustment), "upper", 
val, NULL);
+
+                       if (inside_image)
+                       {
+                               const gdouble hpage = 
gtk_adjustment_get_page_size(preview->hadjustment);
+                               const gdouble vpage = 
gtk_adjustment_get_page_size(preview->vadjustment);
+                               const gdouble hvalue = ((gdouble) real_x) - 
hpage/2.0;
+                               const gdouble vvalue = ((gdouble) real_y) - 
vpage/2.0;
+
+                               /* Modify adjusters */
+                               g_object_set(preview->hadjustment, "value", 
hvalue, NULL);
+                               g_object_set(preview->vadjustment, "value", 
vvalue, NULL);
+                       }
+               }
+
                gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window, 
NULL);
 
                gtk_widget_show(preview->vscrollbar);
@@ -452,15 +482,7 @@
                        NULL);
                gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window, 
NULL);
 
-               /* Update scrollbars to reflect the change */
-               gdouble val;
-               val = (gdouble) rs_filter_get_width(preview->filter_end[0]);
-               g_object_set(G_OBJECT(preview->hadjustment), "upper", val, 
NULL);
-               val = (gdouble) rs_filter_get_height(preview->filter_end[0]);
-               g_object_set(G_OBJECT(preview->vadjustment), "upper", val, 
NULL);
-
                /* Build navigator */
-               rs_filter_set_previous(preview->navigator_filter_scale, 
preview->filter_input);
                g_object_set(preview->navigator_filter_scale, "bounding-box", 
TRUE, "width", NAVIGATOR_WIDTH, "height", NAVIGATOR_HEIGHT, NULL);
                g_object_set(preview->navigator_filter_render, "settings", 
preview->photo->settings[preview->snapshot[0]], NULL);
 
@@ -472,6 +494,8 @@
                preview->navigator = rs_toolbox_add_widget(preview->toolbox, 
GTK_WIDGET(navigator), _("Display Navigation"));
                gtk_widget_show_all(GTK_WIDGET(preview->navigator));
        }
+
+       preview->zoom_to_fit = zoom_to_fit;
 }
 
 /**
@@ -569,6 +593,7 @@
        preview->filter_input = filter;
        rs_filter_set_previous(preview->filter_resample[0], 
preview->filter_input);
        rs_filter_set_previous(preview->filter_resample[1], 
preview->filter_input);
+       rs_filter_set_previous(preview->navigator_filter_scale, 
preview->filter_input);
 }
 
 /**


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to