Author: abrander
Date: 2009-07-04 20:33:53 +0200 (Sat, 04 Jul 2009)
New Revision: 2533
Modified:
trunk/src/application.c
trunk/src/rs-actions.c
trunk/src/rs-preview-widget.c
trunk/src/rs-preview-widget.h
trunk/src/ui.xml
Log:
Refactored zoom.
Modified: trunk/src/application.c
===================================================================
--- trunk/src/application.c 2009-07-04 17:44:01 UTC (rev 2532)
+++ trunk/src/application.c 2009-07-04 18:33:53 UTC (rev 2533)
@@ -198,6 +198,9 @@
rs->filter_crop = rs_filter_new("RSCrop", rs->filter_rotate);
cache = rs_filter_new("RSCache", rs->filter_crop);
+ /* We need this for 100% zoom */
+ g_object_set(cache, "ignore-roi", TRUE, NULL);
+
rs->filter_end = cache;
filename = rs_conf_get_cms_profile(CMS_PROFILE_INPUT);
Modified: trunk/src/rs-actions.c
===================================================================
--- trunk/src/rs-actions.c 2009-07-04 17:44:01 UTC (rev 2532)
+++ trunk/src/rs-actions.c 2009-07-04 18:33:53 UTC (rev 2533)
@@ -588,16 +588,11 @@
rs_store_select_prevnext(rs->store, current_filename, 2);
}
-ACTION(zoom_to_fit)
+TOGGLEACTION(zoom_to_fit)
{
- rs_preview_widget_set_zoom_to_fit(RS_PREVIEW_WIDGET(rs->preview));
+ rs_preview_widget_set_zoom_to_fit(RS_PREVIEW_WIDGET(rs->preview),
gtk_toggle_action_get_active(toggleaction));
}
-ACTION(zoom_to_100)
-{
- rs_preview_widget_set_zoom(RS_PREVIEW_WIDGET(rs->preview), 1.0);
-}
-
TOGGLEACTION(iconbox)
{
gui_widget_show(rs->iconbox,
gtk_toggle_action_get_active(toggleaction), CONF_SHOW_ICONBOX_FULLSCREEN,
CONF_SHOW_ICONBOX);
@@ -868,8 +863,6 @@
/* View menu */
{ "PreviousPhoto", GTK_STOCK_GO_BACK, _("_Previous photo"),
"<control>Left", NULL, ACTION_CB(previous_photo) },
{ "NextPhoto", GTK_STOCK_GO_FORWARD, _("_Next Photo"),
"<control>Right", NULL, ACTION_CB(next_photo) },
- { "ZommToFit", GTK_STOCK_ZOOM_FIT, _("_Zoom to fit"), "slash", NULL,
ACTION_CB(zoom_to_fit) },
- { "ZoomTo100", GTK_STOCK_ZOOM_100, _("_Zoom to 100%"), "asterisk",
NULL, ACTION_CB(zoom_to_100) },
/* Batch menu */
{ "AddToBatch", GTK_STOCK_ADD, _("_Add to batch queue"), "<control>B",
NULL, ACTION_CB(add_to_batch) },
@@ -883,6 +876,7 @@
static guint n_actionentries = G_N_ELEMENTS (actionentries);
GtkToggleActionEntry toggleentries[] = {
+ { "ZommToFit", GTK_STOCK_ZOOM_FIT, _("_Zoom to fit"), "asterisk", NULL,
ACTION_CB(zoom_to_fit), TRUE },
{ "Iconbox", NULL, _("_Iconbox"), "<control>I", NULL,
ACTION_CB(iconbox), TRUE },
{ "Toolbox", NULL, _("_Toolbox"), "<control>T", NULL,
ACTION_CB(toolbox), TRUE },
{ "Fullscreen", GTK_STOCK_FULLSCREEN, _("_Fullscreen"), "F11", NULL,
ACTION_CB(fullscreen), FALSE },
Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c 2009-07-04 17:44:01 UTC (rev 2532)
+++ trunk/src/rs-preview-widget.c 2009-07-04 18:33:53 UTC (rev 2533)
@@ -199,7 +199,6 @@
static guint signals[LAST_SIGNAL] = { 0 };
static void get_max_size(RSPreviewWidget *preview, gint *width, gint *height);
static gboolean get_placement(RSPreviewWidget *preview, const guint view,
GdkRectangle *placement);
-static void rescale(RSPreviewWidget *preview, const gint view);
static void redraw(RSPreviewWidget *preview, GdkRectangle *dirty_area);
static void realize(GtkWidget *widget, gpointer data);
static gboolean scroll (GtkWidget *widget, GdkEventScroll *event, gpointer
user_data);
@@ -340,6 +339,7 @@
preview->filter_end[i] = preview->filter_cache3[i];
g_signal_connect(preview->filter_end[i], "changed",
G_CALLBACK(filter_changed), preview);
+ g_object_set(preview->filter_resample[i], "bounding-box", TRUE,
NULL);
g_object_set(preview->filter_cache3[i], "latency", 1, NULL);
#if MAX_VIEWS > 3
#error Fix line below
@@ -394,72 +394,88 @@
}
/**
- * Sets the zoom level of a RSPreviewWidget
+ * Select zoom-to-fit of a RSPreviewWidget
* @param preview A RSPreviewWidget
- * @param zoom New zoom level (0.0 - 2.0)
+ * @param zoom_to_fit Set to TRUE to enable zoom-to-fit.
*/
void
-rs_preview_widget_set_zoom(RSPreviewWidget *preview, gdouble zoom)
+rs_preview_widget_set_zoom_to_fit(RSPreviewWidget *preview, gboolean
zoom_to_fit)
{
gint view;
- gint width = NAVIGATOR_WIDTH;
- gint height = NAVIGATOR_HEIGHT;
-
g_assert(RS_IS_PREVIEW_WIDGET(preview));
- if (preview->zoom_to_fit == FALSE)
+ if (zoom_to_fit == preview->zoom_to_fit)
return;
- preview->zoom_to_fit = FALSE;
+ preview->zoom_to_fit = zoom_to_fit;
- /* Unsplit if needed */
- if (preview->views > 1)
- rs_core_action_group_activate("Split");
- for(view=0;view<preview->views;view++)
- rescale(preview, view);
+ if (preview->zoom_to_fit)
+ {
+ gint max_width, max_height;
+ get_max_size(preview, &max_width, &max_height);
+ rs_filter_set_enabled(preview->filter_resample[0], TRUE);
+ for(view=0;view<preview->views;view++)
+ {
+ g_object_set(preview->filter_resample[view],
+ "width", max_width,
+ "height", max_height,
+ NULL);
+ }
- gtk_widget_show(preview->vscrollbar);
- gtk_widget_show(preview->hscrollbar);
+ /* FIXME: Update scale somehow! */
+ gtk_widget_hide(preview->vscrollbar);
+ gtk_widget_hide(preview->hscrollbar);
- width = rs_filter_get_width(preview->filter_end[0]);
- height = rs_filter_get_height(preview->filter_end[0]);
- rs_constrain_to_bounding_box(NAVIGATOR_WIDTH, NAVIGATOR_HEIGHT, &width,
&height);
+ if (preview->navigator)
+ {
+ gtk_widget_destroy(preview->navigator);
+ preview->navigator = NULL;
+ }
+ }
+ else
+ {
+ /* Unsplit if needed */
+ if (preview->views > 1)
+ rs_core_action_group_activate("Split");
- 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);
+ gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window,
cur_busy);
+ GUI_CATCHUP();
- 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);
+ /* Disable resample filter */
+ rs_filter_set_enabled(preview->filter_resample[0], FALSE);
- preview->navigator = rs_toolbox_add_widget(preview->toolbox,
GTK_WIDGET(navigator), _("Display Navigation"));
- gtk_widget_show_all(GTK_WIDGET(preview->navigator));
-}
+ preview->scale = 1.0;
+ gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window,
NULL);
-/**
- * Select zoom-to-fit of a RSPreviewWidget
- * @param preview A RSPreviewWidget
- */
-void
-rs_preview_widget_set_zoom_to_fit(RSPreviewWidget *preview)
-{
- gint view;
+ gtk_widget_show(preview->vscrollbar);
+ gtk_widget_show(preview->hscrollbar);
- g_assert(RS_IS_PREVIEW_WIDGET(preview));
+ g_object_set(preview->filter_resample[0],
+ "width", rs_filter_get_width(preview->filter_input),
+ "height", rs_filter_get_height(preview->filter_input),
+ NULL);
+ preview->scale = 1.0;
+ gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window,
NULL);
- preview->zoom_to_fit = TRUE;
- for(view=0;view<preview->views;view++)
- rescale(preview, view);
+ /* 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);
- gtk_widget_hide(preview->vscrollbar);
- gtk_widget_hide(preview->hscrollbar);
+ /* 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);
- if (preview->navigator)
- {
- gtk_widget_destroy(preview->navigator);
- preview->navigator = 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"));
+ gtk_widget_show_all(GTK_WIDGET(preview->navigator));
}
}
@@ -536,10 +552,7 @@
}
for(view=0;view<MAX_VIEWS;view++)
- {
g_object_set(preview->filter_denoise[view], "sharpen",
(gint) (preview->scale *
preview->photo->settings[preview->snapshot[view]]->sharpen), NULL);
- rescale(preview, view);
- }
}
}
@@ -557,8 +570,6 @@
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);
- rescale(preview, 0);
- rescale(preview, 1);
}
/**
@@ -614,7 +625,7 @@
void
rs_preview_widget_set_split(RSPreviewWidget *preview, gboolean split_screen)
{
- gint view;
+ gint view, max_width, max_height;
GdkRectangle rect;
g_assert(RS_IS_PREVIEW_WIDGET(preview));
@@ -623,7 +634,7 @@
{
preview->split = SPLIT_VERTICAL;
preview->views = 2;
- rs_preview_widget_set_zoom_to_fit(preview);
+ rs_preview_widget_set_zoom_to_fit(preview, TRUE);
}
else
{
@@ -631,14 +642,10 @@
preview->views = 1;
}
- for(view=0;view<preview->views;view++)
- rescale(preview, view);
+ get_max_size(preview, &max_width, &max_height);
- rect.x = 0;
- rect.y = 0;
- rect.width = GTK_WIDGET(preview)->allocation.width;
- rect.height = GTK_WIDGET(preview)->allocation.height;
- redraw(preview, &rect);
+ for(view=0;view<preview->views;view++)
+ g_object_set(preview->filter_resample[view], "width",
max_width, "height", max_height, NULL);
}
#if GTK_CHECK_VERSION(2,12,0)
@@ -851,23 +858,9 @@
rect.y = 0;
rect.width = GTK_WIDGET(preview->canvas)->allocation.width;
rect.height = GTK_WIDGET(preview->canvas)->allocation.height;
- if (preview->zoom_to_fit)
- {
- redraw(preview, &rect);
- for(view=0;view<preview->views;view++)
- UNDIRTY(preview->dirty[view], SCREEN);
- }
- else
- {
- /* Construct full rectangle */
- rect.x = 0;
- rect.y = 0;
- rect.width =
GTK_WIDGET(preview->canvas)->allocation.width;
- rect.height =
GTK_WIDGET(preview->canvas)->allocation.height;
- redraw(preview, &rect);
- for(view=0;view<preview->views;view++)
- UNDIRTY(preview->dirty[view], SCREEN);
- }
+ redraw(preview, &rect);
+ for(view=0;view<preview->views;view++)
+ UNDIRTY(preview->dirty[view], SCREEN);
}
else
{
@@ -1222,57 +1215,6 @@
return ret;
}
-static void
-rescale(RSPreviewWidget *preview, const gint view)
-{
- gint max_width, max_height;
- gint width, height;
-
- /* FIXME: This is outdated */
-
- g_return_if_fail(VIEW_IS_VALID(view));
- if (!GTK_WIDGET_REALIZED(GTK_WIDGET(preview)))
- return;
-
- get_max_size(preview, &max_width, &max_height);
- width = rs_filter_get_width(preview->filter_input);
- height = rs_filter_get_height(preview->filter_input);
-
- if (width < 0)
- return;
-
- width = MIN(width, max_width);
- height = MIN(height, max_height);
-
- preview->scale = ((gfloat) width) / ((gfloat)
rs_filter_get_width(preview->filter_input));
- preview->scale = MIN(preview->scale, ((gfloat) height) / ((gfloat)
rs_filter_get_height(preview->filter_input)));
- width = preview->scale * rs_filter_get_width(preview->filter_input);
- height = preview->scale * rs_filter_get_height(preview->filter_input);
- if (preview->zoom_to_fit)
- g_object_set(preview->filter_resample[view],
- "width", width,
- "height", height,
- NULL);
- else
- {
- gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window,
cur_busy);
- GUI_CATCHUP();
- gdouble upper;
- g_object_set(preview->filter_resample[view],
- "width", rs_filter_get_width(preview->filter_input),
- "height", rs_filter_get_height(preview->filter_input),
- NULL);
- preview->scale = 1.0;
- gdk_window_set_cursor(GTK_WIDGET(rawstudio_window)->window,
NULL);
-
- /* Update scrollbars to reflect the change */
- upper = (gdouble)
rs_filter_get_width(preview->filter_end[view]);
- g_object_set(G_OBJECT(preview->hadjustment), "upper", upper,
NULL);
- upper = (gdouble)
rs_filter_get_height(preview->filter_end[view]);
- g_object_set(G_OBJECT(preview->vadjustment), "upper", upper,
NULL);
- }
-}
-
static cairo_t *
redraw_cairo_init(GdkDrawable *drawable, GdkRectangle *dirty_area)
{
@@ -1680,16 +1622,17 @@
{
RSPreviewWidget *preview = RS_PREVIEW_WIDGET(user_data);
- gint view;
+ gint view, max_width, max_height;
const gdouble width = (gdouble) allocation->width;
const gdouble height = (gdouble) allocation->height;
g_object_set(G_OBJECT(preview->hadjustment), "page_size", width,
"page-increment", width/1.2, NULL);
g_object_set(G_OBJECT(preview->vadjustment), "page_size", height,
"page-increment", height/1.2, NULL);
- if (preview->zoom_to_fit)
- for(view=0;view<preview->views;view++)
- rescale(preview, view);
+ get_max_size(preview, &max_width, &max_height);
+
+ for(view=0;view<preview->views;view++)
+ g_object_set(preview->filter_resample[view], "width",
max_width, "height", max_height, NULL);
}
static gboolean
@@ -2199,7 +2142,6 @@
if (filter == preview->filter_end[view])
{
DIRTY(preview->dirty[view], SCREEN);
- rescale(preview, 0);
rs_preview_widget_update(preview, TRUE);
}
}
Modified: trunk/src/rs-preview-widget.h
===================================================================
--- trunk/src/rs-preview-widget.h 2009-07-04 17:44:01 UTC (rev 2532)
+++ trunk/src/rs-preview-widget.h 2009-07-04 18:33:53 UTC (rev 2533)
@@ -48,38 +48,13 @@
extern GtkWidget *rs_preview_widget_new(GtkWidget *toolbox);
/**
- * Sets the zoom level of a RSPreviewWidget
- * @param preview A RSPreviewWidget
- * @param zoom New zoom level (0.0 - 2.0)
- */
-extern void rs_preview_widget_set_zoom(RSPreviewWidget *preview, gdouble zoom);
-
-/**
- * gets the zoom level of a RSPreviewWidget
- * @param preview A RSPreviewWidget
- * @return Current zoom level
- */
-extern gdouble rs_preview_widget_get_zoom(RSPreviewWidget *preview);
-
-/**
* Select zoom-to-fit of a RSPreviewWidget
* @param preview A RSPreviewWidget
+ * @param zoom_to_fit Set to TRUE to enable zoom-to-fit.
*/
-extern void rs_preview_widget_set_zoom_to_fit(RSPreviewWidget *preview);
+extern void rs_preview_widget_set_zoom_to_fit(RSPreviewWidget *preview,
gboolean zoom_to_fit);
/**
- * Increases the zoom of a RSPreviewWidget by 0.1
- * @param preview A RSPreviewWidget
- */
-extern void rs_preview_widget_zoom_in(RSPreviewWidget *preview);
-
-/**
- * Decreases the zoom of a RSPreviewWidget by 0.1
- * @param preview A RSPreviewWidget
- */
-extern void rs_preview_widget_zoom_out(RSPreviewWidget *preview);
-
-/**
* Sets active photo of a RSPreviewWidget
* @param preview A RSPreviewWidget
* @param photo A RS_PHOTO
Modified: trunk/src/ui.xml
===================================================================
--- trunk/src/ui.xml 2009-07-04 17:44:01 UTC (rev 2532)
+++ trunk/src/ui.xml 2009-07-04 18:33:53 UTC (rev 2533)
@@ -54,7 +54,6 @@
</menu>
<separator />
<menuitem action="ZommToFit" />
- <menuitem action="ZoomTo100" />
<separator />
<menuitem action="Iconbox" />
<menuitem action="Toolbox" />
@@ -76,7 +75,6 @@
</menubar>
<popup name="PreviewPopup" action="PreviewPopup">
<menuitem action="ZommToFit" />
- <menuitem action="ZoomTo100" />
<separator />
<menuitem action="Crop" />
<menuitem action="Uncrop" />
@@ -93,7 +91,6 @@
<menuitem action="RightC" />
<separator />
<menuitem action="ZommToFit" />
- <menuitem action="ZoomTo100" />
<separator />
<menuitem action="Crop" />
<menuitem action="Uncrop" />
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit