Author: abrander
Date: 2009-07-04 16:23:58 +0200 (Sat, 04 Jul 2009)
New Revision: 2530
Modified:
trunk/src/rs-preview-widget.c
Log:
Implemented RSNavigator usage in RSPreviewWidget.
Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c 2009-07-04 14:23:21 UTC (rev 2529)
+++ trunk/src/rs-preview-widget.c 2009-07-04 14:23:58 UTC (rev 2530)
@@ -28,6 +28,7 @@
#include "rs-actions.h"
#include "rs-toolbox.h"
#include "rs-loupe.h"
+#include "rs-navigator.h"
#include <gettext.h>
enum {
@@ -73,6 +74,9 @@
CROP_NEAR_NOTHING = CROP_NEAR_INSIDE | CROP_NEAR_OUTSIDE,
} CROP_NEAR;
+#define NAVIGATOR_WIDTH (170)
+#define NAVIGATOR_HEIGHT (128)
+
typedef struct {
gint x;
gint y;
@@ -111,6 +115,7 @@
GtkWidget *hscrollbar;
GtkDrawingArea *canvas;
+ guint adjustment_changed_helper_timeout;
RSToolbox *toolbox;
gboolean zoom_to_fit;
@@ -167,6 +172,12 @@
RSFilter *loupe_filter_denoise;
RSFilter *loupe_filter_render;
RSFilter *loupe_filter_end;
+
+ RSFilter *navigator_filter_scale;
+ RSFilter *navigator_filter_cache;
+ RSFilter *navigator_filter_render;
+ RSFilter *navigator_filter_end;
+ GtkWidget *navigator;
};
/* Define the boiler plate stuff using the predefined macro */
@@ -346,6 +357,11 @@
preview->photo = NULL;
preview->scale = 1.0;
+ preview->navigator_filter_scale = rs_filter_new("RSResample", NULL);
+ preview->navigator_filter_cache = rs_filter_new("RSCache",
preview->navigator_filter_scale);
+ preview->navigator_filter_render = rs_filter_new("RSBasicRender",
preview->navigator_filter_cache);
+ preview->navigator_filter_end = preview->navigator_filter_render;
+
/* We'll take care of double buffering ourself */
gtk_widget_set_double_buffered(GTK_WIDGET(preview), TRUE);
@@ -386,6 +402,8 @@
rs_preview_widget_set_zoom(RSPreviewWidget *preview, gdouble zoom)
{
gint view;
+ gint width = NAVIGATOR_WIDTH;
+ gint height = NAVIGATOR_HEIGHT;
g_assert(RS_IS_PREVIEW_WIDGET(preview));
@@ -402,6 +420,22 @@
gtk_widget_show(preview->vscrollbar);
gtk_widget_show(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);
+
+ 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);
+
+ 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));
}
/**
@@ -421,6 +455,12 @@
gtk_widget_hide(preview->vscrollbar);
gtk_widget_hide(preview->hscrollbar);
+
+ if (preview->navigator)
+ {
+ gtk_widget_destroy(preview->navigator);
+ preview->navigator = NULL;
+ }
}
/**
@@ -538,6 +578,7 @@
g_object_set(preview->filter_render[view], "icc-profile",
profile, NULL);
g_object_set(preview->loupe_filter_render, "icc-profile", profile,
NULL);
+ g_object_set(preview->navigator_filter_render, "icc-profile", profile,
NULL);
}
/**
@@ -1678,6 +1719,18 @@
return FALSE;
}
+static gboolean
+adjustment_changed_helper(gpointer data)
+{
+ RSPreviewWidget *preview = RS_PREVIEW_WIDGET(data);
+
+ rs_preview_widget_update(preview, FALSE);
+
+ preview->adjustment_changed_helper_timeout = 0;
+
+ return FALSE;
+}
+
static void
adjustment_changed(GtkAdjustment *adjustment, gpointer user_data)
{
@@ -1686,7 +1739,8 @@
if (!preview->zoom_to_fit)
{
DIRTY(preview->dirty[0], SCREEN);
- rs_preview_widget_update(preview, FALSE);
+ if (preview->adjustment_changed_helper_timeout == 0)
+ preview->adjustment_changed_helper_timeout =
g_timeout_add(1, adjustment_changed_helper, preview);
}
}
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit