3131
3232/*
3333#define DEBUG_VERBOSE
34- #define DEBUG
3534 */
35+ #define DEBUG
36+
37+ typedef struct _ViewSettings {
38+ gboolean valid ;
39+
40+ TilesourceMode mode ;
41+ double scale ;
42+ double offset ;
43+ int page ;
44+ gboolean falsecolour ;
45+ gboolean log ;
46+ gboolean icc ;
47+ gboolean active ;
48+ TilecacheBackground background ;
49+ } ViewSettings ;
3650
3751struct _Displaybar {
3852 GtkWidget parent_instance ;
@@ -57,17 +71,96 @@ struct _Displaybar {
5771 guint changed_sid ;
5872 guint tiles_changed_sid ;
5973 guint page_changed_sid ;
74+
75+ /* Keep view settings on new image.
76+ */
77+ gboolean preserve ;
78+
79+ /* Save and restore view settings here.
80+ */
81+ ViewSettings view_settings ;
6082};
6183
6284G_DEFINE_TYPE (Displaybar , displaybar , GTK_TYPE_WIDGET );
6385
6486enum {
6587 PROP_IMAGEWINDOW = 1 ,
6688 PROP_REVEALED ,
89+ PROP_PRESERVE ,
6790
6891 SIG_LAST
6992};
7093
94+ /* Save and restore view settings.
95+ */
96+
97+ static void
98+ displaybar_save_view_settings (Displaybar * displaybar )
99+ {
100+ Tilesource * tilesource = displaybar -> tilesource ;
101+ Imageui * imageui = imagewindow_get_imageui (displaybar -> win );
102+ ViewSettings * view_settings = & displaybar -> view_settings ;
103+
104+ if (!tilesource ||
105+ !imageui ) {
106+ view_settings -> valid = FALSE;
107+ return ;
108+ }
109+
110+ #ifdef DEBUG
111+ printf ("displaybar_save_view_settings:\n" );
112+ #endif /*DEBUG*/
113+
114+ g_object_get (tilesource ,
115+ "mode" , & view_settings -> mode ,
116+ "scale" , & view_settings -> scale ,
117+ "offset" , & view_settings -> offset ,
118+ "page" , & view_settings -> page ,
119+ "falsecolour" , & view_settings -> falsecolour ,
120+ "log" , & view_settings -> log ,
121+ "icc" , & view_settings -> icc ,
122+ "active" , & view_settings -> active ,
123+ NULL );
124+
125+ g_object_get (imageui ,
126+ "background" , & view_settings -> background ,
127+ NULL );
128+
129+ view_settings -> valid = TRUE;
130+ }
131+
132+ static void
133+ displaybar_apply_view_settings (Displaybar * displaybar )
134+ {
135+ Tilesource * tilesource = displaybar -> tilesource ;
136+ Imageui * imageui = imagewindow_get_imageui (displaybar -> win );
137+ ViewSettings * view_settings = & displaybar -> view_settings ;
138+
139+ if (!view_settings -> valid )
140+ return ;
141+
142+ #ifdef DEBUG
143+ printf ("displaybar_apply_view_settings:\n" );
144+ #endif /*DEBUG*/
145+
146+ if (tilesource )
147+ g_object_set (tilesource ,
148+ "mode" , view_settings -> mode ,
149+ "scale" , view_settings -> scale ,
150+ "offset" , view_settings -> offset ,
151+ "page" , view_settings -> page ,
152+ "falsecolour" , view_settings -> falsecolour ,
153+ "log" , view_settings -> log ,
154+ "icc" , view_settings -> icc ,
155+ "active" , view_settings -> active ,
156+ NULL );
157+
158+ if (imageui )
159+ g_object_set (imageui ,
160+ "background" , view_settings -> background ,
161+ NULL );
162+ }
163+
71164static void
72165displaybar_tilesource_changed (Tilesource * tilesource , Displaybar * displaybar )
73166{
@@ -92,19 +185,23 @@ displaybar_tilesource_changed(Tilesource *tilesource, Displaybar *displaybar)
92185 gtk_widget_set_sensitive (displaybar -> page ,
93186 tilesource -> n_pages > 1 &&
94187 tilesource -> mode == TILESOURCE_MODE_MULTIPAGE );
188+
189+ displaybar_save_view_settings (displaybar );
95190}
96191
97192static void
98193displaybar_page_changed (Tilesource * tilesource , Displaybar * displaybar )
99194{
100195#ifdef DEBUG
101- printf ("displaybar_page_changed :\n" );
196+ printf ("dm1Gisplaybar_page_changed :\n" );
102197#endif /*DEBUG*/
103198
104199 g_assert (tilesource == displaybar -> tilesource );
105200
106201 gtk_spin_button_set_value (GTK_SPIN_BUTTON (displaybar -> page ),
107202 tilesource -> page );
203+
204+ displaybar_save_view_settings (displaybar );
108205}
109206
110207static void
@@ -119,7 +216,47 @@ displaybar_disconnect(Displaybar *displaybar)
119216 }
120217}
121218
122- /* Imagewindow has a new tilesource.
219+ /* Imagewindow has a new image, eg. after < > in titlebar.
220+ */
221+ static void
222+ displaybar_imagewindow_new_image (Imagewindow * win , Displaybar * displaybar )
223+ {
224+ #ifdef DEBUG
225+ printf ("displaybar_imagewindow_new_image:\n" );
226+ #endif /*DEBUG*/
227+
228+ displaybar_disconnect (displaybar );
229+
230+ Tilesource * new_tilesource = imagewindow_get_tilesource (win );
231+ if (new_tilesource ) {
232+ /* Set new source.
233+ */
234+ displaybar -> changed_sid = g_signal_connect (new_tilesource ,
235+ "changed" ,
236+ G_CALLBACK (displaybar_tilesource_changed ), displaybar );
237+ displaybar -> tiles_changed_sid = g_signal_connect (new_tilesource ,
238+ "tiles-changed" ,
239+ G_CALLBACK (displaybar_tilesource_changed ), displaybar );
240+ displaybar -> page_changed_sid = g_signal_connect (new_tilesource ,
241+ "page-changed" ,
242+ G_CALLBACK (displaybar_page_changed ), displaybar );
243+
244+ displaybar -> tilesource = new_tilesource ;
245+ g_object_ref (new_tilesource );
246+
247+ if (displaybar -> preserve )
248+ displaybar_apply_view_settings (displaybar );
249+ else {
250+ /* Init displaybar from new source.
251+ */
252+ displaybar_tilesource_changed (new_tilesource , displaybar );
253+ displaybar_page_changed (new_tilesource , displaybar );
254+ }
255+ }
256+ }
257+
258+ /* Imagewindow has changed the image eg. after a recalc. There's a new
259+ * tilesource.
123260 */
124261static void
125262displaybar_imagewindow_changed (Imagewindow * win , Displaybar * displaybar )
@@ -147,10 +284,7 @@ displaybar_imagewindow_changed(Imagewindow *win, Displaybar *displaybar)
147284 displaybar -> tilesource = new_tilesource ;
148285 g_object_ref (new_tilesource );
149286
150- /* Init from new source.
151- */
152- displaybar_tilesource_changed (new_tilesource , displaybar );
153- displaybar_page_changed (new_tilesource , displaybar );
287+ displaybar_apply_view_settings (displaybar );
154288 }
155289}
156290
@@ -162,10 +296,11 @@ displaybar_set_imagewindow(Displaybar *displaybar, Imagewindow *win)
162296 displaybar -> win = win ;
163297
164298 g_signal_connect_object (win , "changed" ,
165- G_CALLBACK (displaybar_imagewindow_changed ),
166- displaybar , 0 );
299+ G_CALLBACK (displaybar_imagewindow_changed ), displaybar , 0 );
300+ g_signal_connect_object (win , "new-image" ,
301+ G_CALLBACK (displaybar_imagewindow_new_image ), displaybar , 0 );
167302
168- displaybar_imagewindow_changed (win , displaybar );
303+ displaybar_imagewindow_new_image (win , displaybar );
169304}
170305
171306static void
@@ -184,6 +319,10 @@ displaybar_set_property(GObject *object,
184319 g_value_get_boolean (value ));
185320 break ;
186321
322+ case PROP_PRESERVE :
323+ displaybar -> preserve = g_value_get_boolean (value );
324+ break ;
325+
187326 default :
188327 G_OBJECT_WARN_INVALID_PROPERTY_ID (object , prop_id , pspec );
189328 break ;
@@ -206,6 +345,10 @@ displaybar_get_property(GObject *object,
206345 g_value_set_boolean (value , gtk_action_bar_get_revealed (action_bar ));
207346 break ;
208347
348+ case PROP_PRESERVE :
349+ g_value_set_boolean (value , displaybar -> preserve );
350+ break ;
351+
209352 default :
210353 G_OBJECT_WARN_INVALID_PROPERTY_ID (object , prop_id , pspec );
211354 break ;
@@ -350,6 +493,14 @@ displaybar_class_init(DisplaybarClass *class)
350493 _ ("Show the display control bar" ),
351494 FALSE,
352495 G_PARAM_READWRITE ));
496+
497+ g_object_class_install_property (gobject_class , PROP_PRESERVE ,
498+ g_param_spec_boolean ("preserve" ,
499+ _ ("preserve" ),
500+ _ ("Preserve view settings on new image" ),
501+ FALSE,
502+ G_PARAM_READWRITE ));
503+
353504}
354505
355506Displaybar *
0 commit comments