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