Skip to content

Commit c51d0fd

Browse files
committed
fix up save/restore of view settings
move into displaybar
1 parent 26fccf5 commit c51d0fd

File tree

5 files changed

+232
-139
lines changed

5 files changed

+232
-139
lines changed

TODO

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
- test save / restore of "background"
2+
3+
4+
5+
6+
7+
8+
- seeing unfixable dirty rows sometimes
9+
10+
happened in a row containing a region as a subobject
11+
12+
are we updating a row while it's also being computed? can this race?
13+
114
- get judder with rotate and images smaller than the window
215

316
draw on update, then draw again on relayout

src/displaybar.c

Lines changed: 161 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,22 @@
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

3751
struct _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

6284
G_DEFINE_TYPE(Displaybar, displaybar, GTK_TYPE_WIDGET);
6385

6486
enum {
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+
71164
static void
72165
displaybar_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

97192
static void
98193
displaybar_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

110207
static 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
*/
124261
static void
125262
displaybar_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

171306
static 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

355506
Displaybar *

src/gtk/imagewindow.ui

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@
294294
</child>
295295

296296
<child>
297-
<object class="Displaybar" id="display_bar">
297+
<object class="Displaybar" id="displaybar">
298298
</object>
299299
</child>
300300

0 commit comments

Comments
 (0)