Author: post
Date: 2012-10-12 19:45:50 +0200 (Fri, 12 Oct 2012)
New Revision: 4287
Modified:
trunk/src/rs-preview-widget.c
Log:
Update preview scrollbars and navigator if changing images while zoomed in.
Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c 2012-10-12 17:44:55 UTC (rev 4286)
+++ trunk/src/rs-preview-widget.c 2012-10-12 17:45:50 UTC (rev 4287)
@@ -219,6 +219,7 @@
RSFilter *navigator_transform_display;
RSFilter *navigator_filter_end;
GtkWidget *navigator;
+ RSNavigator *rs_navigator;
RSColorSpace *display_color_space;
RSColorSpace *exposure_color_space;
@@ -586,6 +587,48 @@
}
gdk_threads_leave();
}
+
+static void
+rs_preview_widget_set_scrollbars(RSPreviewWidget *preview, int width, int
height, int real_x, int real_y, gboolean force_pos)
+{
+ g_assert(RS_IS_PREVIEW_WIDGET(preview));
+ gdouble v_val, h_val, v_val_new, h_val_new;
+
+ g_object_get(G_OBJECT(preview->hadjustment), "upper", &h_val, NULL);
+ g_object_get(G_OBJECT(preview->vadjustment), "upper", &v_val, NULL);
+
+ /* Update scrollbars to reflect the change */
+ h_val_new = (gdouble) width;
+ g_object_set(G_OBJECT(preview->hadjustment), "upper", h_val_new, NULL);
+ v_val_new = (gdouble) height;
+ g_object_set(G_OBJECT(preview->vadjustment), "upper", v_val_new, NULL);
+
+ /* Modify adjusters, if size changed */
+ if (force_pos || fabs(v_val_new-v_val) > 1.0 || fabs(h_val_new-h_val) >
1.0)
+ {
+ const gdouble hpage =
gtk_adjustment_get_page_size(preview->hadjustment);
+ const gdouble vpage =
gtk_adjustment_get_page_size(preview->vadjustment);
+ gdouble hvalue = MIN((double)width-hpage+10,((gdouble) real_x)
- hpage/2.0);
+ gdouble vvalue = MIN((double)height-vpage+10,((gdouble) real_y)
- vpage/2.0);
+
+ g_object_set(preview->hadjustment, "value", hvalue, NULL);
+ g_object_set(preview->vadjustment, "value", vvalue, NULL);
+ }
+
+ if (preview->navigator)
+ {
+ /* Build navigator */
+ rs_navigator_set_adjustments(preview->rs_navigator,
preview->vadjustment, preview->hadjustment);
+ rs_navigator_set_source_filter(preview->rs_navigator,
preview->navigator_filter_end);
+ }
+ rs_filter_set_recursive(preview->navigator_filter_end,
+ "orientation", preview->photo->orientation,
+ "rectangle", rs_photo_get_crop(preview->photo),
+ "angle", rs_photo_get_angle(preview->photo),
+ "settings",
preview->photo->settings[preview->snapshot[0]],
+ NULL);
+}
+
/**
* Select zoom-to-fit of a RSPreviewWidget
* @param preview A RSPreviewWidget
@@ -642,55 +685,30 @@
/* Disable resample filter */
rs_filter_set_enabled(preview->filter_resample[0], FALSE);
+ gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window,
NULL);
+
+ gtk_widget_show(preview->vscrollbar);
+ gtk_widget_show(preview->hscrollbar);
+
+ gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window,
NULL);
+
+ preview->rs_navigator = rs_navigator_new();
+ gtk_widget_set_size_request(GTK_WIDGET(preview->rs_navigator),
NAVIGATOR_WIDTH, NAVIGATOR_HEIGHT);
+
+ preview->navigator = rs_toolbox_add_widget(preview->toolbox,
GTK_WIDGET(preview->rs_navigator), _("Display Navigation"));
+ rs_navigator_set_preview_widget(preview->rs_navigator, preview);
+ rs_navigator_set_colorspace(preview->rs_navigator,
preview->display_color_space);
+ gtk_widget_show_all(GTK_WIDGET(preview->navigator));
if (preview->photo)
{
rs_filter_get_size_simple(preview->filter_end[0],
preview->request[0], &width, &height);
- /* Update scrollbars to reflect the change */
- gdouble val;
- val = (gdouble) width;
- g_object_set(G_OBJECT(preview->hadjustment), "upper",
val, NULL);
- val = (gdouble) height;
- g_object_set(G_OBJECT(preview->vadjustment), "upper",
val, NULL);
-
- const gdouble hpage =
gtk_adjustment_get_page_size(preview->hadjustment);
- const gdouble vpage =
gtk_adjustment_get_page_size(preview->vadjustment);
if (!inside_image)
{
real_x = 0.5 * width;
real_y = 0.5 * height;
}
- gdouble hvalue = MIN((double)width-hpage+10,((gdouble)
real_x) - hpage/2.0);
- gdouble vvalue = MIN((double)height-vpage+10,((gdouble)
real_y) - vpage/2.0);
-
- /* Modify adjusters */
- g_object_set(preview->hadjustment, "value", hvalue,
NULL);
- g_object_set(preview->vadjustment, "value", vvalue,
NULL);
-
- /* Build navigator */
- rs_filter_set_recursive(preview->navigator_filter_end,
- "orientation", preview->photo->orientation,
- "rectangle", rs_photo_get_crop(preview->photo),
- "angle", rs_photo_get_angle(preview->photo),
- "settings",
preview->photo->settings[preview->snapshot[0]],
- NULL);
+ rs_preview_widget_set_scrollbars(preview, width,
height, real_x, real_y, inside_image);
}
-
- gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window,
NULL);
-
- gtk_widget_show(preview->vscrollbar);
- gtk_widget_show(preview->hscrollbar);
-
- gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window,
NULL);
-
- RSNavigator *navigator = rs_navigator_new();
- rs_navigator_set_adjustments(navigator, preview->vadjustment,
preview->hadjustment);
- rs_navigator_set_source_filter(navigator,
preview->navigator_filter_end);
- gtk_widget_set_size_request(GTK_WIDGET(navigator),
NAVIGATOR_WIDTH, NAVIGATOR_HEIGHT);
-
- preview->navigator = rs_toolbox_add_widget(preview->toolbox,
GTK_WIDGET(navigator), _("Display Navigation"));
- rs_navigator_set_preview_widget(navigator, preview);
- rs_navigator_set_colorspace(navigator,
preview->display_color_space);
- gtk_widget_show_all(GTK_WIDGET(preview->navigator));
}
preview->zoom_to_fit = zoom_to_fit;
@@ -818,8 +836,18 @@
NULL);
if (preview->photo)
+ {
g_signal_connect(G_OBJECT(preview->photo), "settings-changed",
G_CALLBACK(settings_changed), preview);
+ /* Update scrollbars */
+ if (!preview->zoom_to_fit)
+ {
+ gint width, height;
+ rs_filter_get_size_simple(preview->filter_end[0],
preview->request[0], &width, &height);
+ rs_preview_widget_set_scrollbars(preview, width,
height, 0.5*width, 0.5*height, FALSE);
+ }
+ }
+
/* Mark everything as dirty */
for(view=0;view<preview->views;view++)
DIRTY(preview->dirty[view], ALL);
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit