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

Reply via email to