Skip to content

Commit d6d8157

Browse files
committed
restore view settings on imagewindow reopen
1 parent 10afd1a commit d6d8157

File tree

9 files changed

+110
-92
lines changed

9 files changed

+110
-92
lines changed

TODO

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
- background is not being applied to thumbnail on imagewindow close
2+
3+
not applied to imagerwindow on reopoen
4+
5+
16
- seeing unfixable dirty rows sometimes
27

38
happened in a row containing a region as a subobject

src/displaybar.c

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,6 @@
3434
#define DEBUG
3535
*/
3636

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;
50-
5137
struct _Displaybar {
5238
GtkWidget parent_instance;
5339

@@ -314,6 +300,10 @@ displaybar_imagewindow_changed(Imagewindow *win, Displaybar *displaybar)
314300
static void
315301
displaybar_set_imagewindow(Displaybar *displaybar, Imagewindow *win)
316302
{
303+
#ifdef DEBUG
304+
printf("displaybar_set_imagewindow:\n");
305+
#endif /*DEBUG*/
306+
317307
/* No need to ref ... win holds a ref to us.
318308
*/
319309
displaybar->win = win;
@@ -387,8 +377,7 @@ displaybar_dispose(GObject *object)
387377
printf("displaybar_dispose:\n");
388378
#endif /*DEBUG*/
389379

390-
displaybar_disconnect(displaybar);
391-
380+
VIPS_UNREF(displaybar->tilesource);
392381
VIPS_FREEF(gtk_widget_unparent, displaybar->action_bar);
393382

394383
G_OBJECT_CLASS(displaybar_parent_class)->dispose(object);
@@ -541,3 +530,19 @@ displaybar_new(Imagewindow *win)
541530

542531
return displaybar;
543532
}
533+
534+
ViewSettings *
535+
displaybar_get_view_settings(Displaybar *displaybar)
536+
{
537+
return &displaybar->view_settings;
538+
}
539+
540+
void
541+
displaybar_set_view_settings(Displaybar *displaybar,
542+
ViewSettings *view_settings)
543+
{
544+
displaybar->view_settings = *view_settings;
545+
displaybar_apply_view_settings(displaybar);
546+
}
547+
548+

src/displaybar.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,22 @@
3030
#ifndef __DISPLAYBAR_H
3131
#define __DISPLAYBAR_H
3232

33+
/* All the view settings we save and restore.
34+
*/
35+
typedef struct _ViewSettings {
36+
gboolean valid;
37+
38+
TilesourceMode mode;
39+
double scale;
40+
double offset;
41+
int page;
42+
gboolean falsecolour;
43+
gboolean log;
44+
gboolean icc;
45+
gboolean active;
46+
TilecacheBackground background;
47+
} ViewSettings;
48+
3349
#define DISPLAYBAR_TYPE (displaybar_get_type())
3450

3551
G_DECLARE_FINAL_TYPE(Displaybar, displaybar, NIP4, DISPLAYBAR, GtkWidget)
@@ -38,5 +54,8 @@ G_DECLARE_FINAL_TYPE(Displaybar, displaybar, NIP4, DISPLAYBAR, GtkWidget)
3854
(G_TYPE_CHECK_INSTANCE_CAST((obj), DISPLAYBAR_TYPE, Displaybar))
3955

4056
Displaybar *displaybar_new(Imagewindow *win);
57+
ViewSettings *displaybar_get_view_settings(Displaybar *displaybar);
58+
void displaybar_set_view_settings(Displaybar *displaybar,
59+
ViewSettings *view_settings);
4160

4261
#endif /* __DISPLAYBAR_H */

src/iimage.c

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -151,16 +151,17 @@ iimage_save(Model *model, xmlNode *xnode)
151151
!set_iprop(xthis, "image_top", iimage->image_top) ||
152152
!set_iprop(xthis, "image_mag", iimage->image_mag) ||
153153
!set_sprop(xthis, "show_status", bool_to_char(iimage->show_status)) ||
154-
!set_sprop(xthis, "show_convert", bool_to_char(iimage->show_convert)) ||
155-
!set_dprop(xthis, "scale", iimage->scale) ||
156-
!set_dprop(xthis, "offset", iimage->offset) ||
157-
!set_iprop(xthis, "page", iimage->page) ||
158-
!set_sprop(xthis, "falsecolour", bool_to_char(iimage->falsecolour)))
154+
!set_sprop(xthis, "show_convert", bool_to_char(iimage->show_convert)))
159155
return NULL;
160156

161-
if (iimage->mode != TILESOURCE_MODE_UNSET &&
162-
!set_sprop(xthis, "mode",
163-
vips_enum_nick(TILESOURCE_MODE_TYPE, iimage->mode)))
157+
if (iimage->view_settings.valid &&
158+
(!set_dprop(xthis, "scale", iimage->view_settings.scale) ||
159+
!set_dprop(xthis, "offset", iimage->view_settings.offset) ||
160+
!set_iprop(xthis, "page", iimage->view_settings.page) ||
161+
!set_sprop(xthis, "falsecolour",
162+
bool_to_char(iimage->view_settings.falsecolour)) ||
163+
!set_sprop(xthis, "mode",
164+
vips_enum_nick(TILESOURCE_MODE_TYPE, iimage->view_settings.mode))))
164165
return NULL;
165166

166167
return xthis;
@@ -180,14 +181,17 @@ iimage_load(Model *model,
180181
(void) get_bprop(xnode, "show_status", &iimage->show_status);
181182
(void) get_bprop(xnode, "show_paintbox", &iimage->show_paintbox);
182183
(void) get_bprop(xnode, "show_convert", &iimage->show_convert);
183-
(void) get_dprop(xnode, "scale", &iimage->scale);
184-
(void) get_dprop(xnode, "offset", &iimage->offset);
185-
(void) get_iprop(xnode, "page", &iimage->page);
186-
(void) get_bprop(xnode, "falsecolour", &iimage->falsecolour);
187184

188185
char mode[64];
189-
if (get_sprop(xnode, "mode", mode, sizeof(mode)))
190-
iimage->mode = vips_enum_from_nick("nip4", TILESOURCE_MODE_TYPE, mode);
186+
if (get_dprop(xnode, "scale", &iimage->view_settings.scale) &&
187+
get_dprop(xnode, "offset", &iimage->view_settings.offset) &&
188+
get_iprop(xnode, "page", &iimage->view_settings.page) &&
189+
get_bprop(xnode, "falsecolour", &iimage->view_settings.falsecolour) &&
190+
get_sprop(xnode, "mode", mode, sizeof(mode))) {
191+
iimage->view_settings.mode =
192+
vips_enum_from_nick("nip4", TILESOURCE_MODE_TYPE, mode);
193+
iimage->view_settings.valid = TRUE;
194+
}
191195

192196
return MODEL_CLASS(iimage_parent_class)->load(model, state, parent, xnode);
193197
}
@@ -411,27 +415,14 @@ iimage_init(iImage *iimage)
411415
iimage->show_paintbox = FALSE;
412416
iimage->show_convert = FALSE;
413417

414-
iimage->mode = TILESOURCE_MODE_UNSET;
415-
iimage->scale = 0.0;
416-
iimage->offset = 0.0;
417-
iimage->falsecolour = FALSE;
418-
iimage->log = FALSE;
419-
iimage->icc = FALSE;
420-
iimage->page = 0;
421-
422418
vips_buf_init_dynamic(&iimage->caption_buffer, MAX_LINELENGTH);
423419

424420
iobject_set(IOBJECT(iimage), CLASS_IMAGE, NULL);
425421
}
426422

427423
void
428-
iimage_update_from_tilesource(iImage *iimage, Tilesource *tilesource)
424+
iimage_update_view_settings(iImage *iimage, ViewSettings *view_settings)
429425
{
430-
iimage->scale = tilesource->scale;
431-
iimage->offset = tilesource->offset;
432-
iimage->falsecolour = tilesource->falsecolour;
433-
iimage->page = tilesource->page;
434-
iimage->mode = tilesource->mode;
435-
426+
iimage->view_settings = *view_settings;
436427
iobject_changed(IOBJECT(iimage));
437428
}

src/iimage.h

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,9 @@ struct _iImage {
6666
gboolean show_paintbox;
6767
gboolean show_convert;
6868

69-
/* Bar settings we remember.
69+
/* Bar settings we apply.
7070
*/
71-
TilesourceMode mode;
72-
double scale;
73-
double offset;
74-
gboolean falsecolour;
75-
gboolean log;
76-
gboolean icc;
77-
int page;
71+
ViewSettings view_settings;
7872

7973
/* Private ... build iobject caption here.
8074
*/
@@ -91,4 +85,4 @@ typedef struct _iImageClass {
9185
GType iimage_get_type(void);
9286
gboolean iimage_replace(iImage *iimage, const char *filename);
9387
gboolean iimage_replace_imageinfo(iImage *iimage, Imageinfo *ii);
94-
void iimage_update_from_tilesource(iImage *iimage, Tilesource *tilesource);
88+
void iimage_update_view_settings(iImage *iimage, ViewSettings *view_settings);

src/iimageview.c

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,33 @@ iimageview_dispose(GObject *object)
5757
G_OBJECT_CLASS(iimageview_parent_class)->dispose(object);
5858
}
5959

60+
static void
61+
iimageview_apply_view_settings(iImageview *iimageview)
62+
{
63+
iImage *iimage = IIMAGE(VOBJECT(iimageview)->iobject);
64+
ViewSettings *view_settings = &iimage->view_settings;
65+
66+
if (view_settings->valid) {
67+
Tilesource *tilesource;
68+
g_object_get(iimageview->imagedisplay,
69+
"tilesource", &tilesource,
70+
NULL);
71+
72+
if (tilesource)
73+
g_object_set(tilesource,
74+
"mode", view_settings->mode,
75+
"scale", view_settings->scale,
76+
"offset", view_settings->offset,
77+
"falsecolour", view_settings->falsecolour,
78+
"page", view_settings->page,
79+
"log", view_settings->log,
80+
"icc", view_settings->icc,
81+
NULL);
82+
83+
VIPS_UNREF(tilesource);
84+
}
85+
}
86+
6087
void
6188
iimageview_compute_visibility(iImageview *iimageview)
6289
{
@@ -175,26 +202,8 @@ iimageview_refresh(vObject *vobject)
175202
VIPS_UNREF(tilesource);
176203
}
177204

178-
g_object_get(iimageview->imagedisplay,
179-
"tilesource", &tilesource,
180-
NULL);
181-
if (tilesource) {
182-
// we can have an unset mode
183-
if (iimage->mode != TILESOURCE_MODE_UNSET)
184-
g_object_set(tilesource,
185-
"mode", iimage->mode,
186-
NULL);
187-
188-
g_object_set(tilesource,
189-
"scale", iimage->scale,
190-
"offset", iimage->offset,
191-
"falsecolour", iimage->falsecolour,
192-
"page", iimage->page,
193-
"log", iimage->log,
194-
"icc", iimage->icc,
195-
NULL);
196-
VIPS_UNREF(tilesource);
197-
}
205+
// apply view settings from iimage
206+
iimageview_apply_view_settings(iimageview);
198207

199208
if (iimageview->label)
200209
set_glabel(iimageview->label, "%s", IOBJECT(iimage)->caption);

src/imageui.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,6 @@ static void
194194
imageui_set_iimage(Imageui *imageui, iImage *iimage)
195195
{
196196
if (imageui->iimage) {
197-
// update thumbnail from our sliders
198-
if (imageui->tilesource)
199-
iimage_update_from_tilesource(imageui->iimage, imageui->tilesource);
200-
201197
imageui->iimage->views =
202198
g_slist_remove(imageui->iimage->views, imageui);
203199
imageui->iimage = NULL;

src/imagewindow.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -642,12 +642,8 @@ imagewindow_dispose(GObject *object)
642642
FREESID(win->iimage_destroy_sid, win->iimage);
643643
VIPS_FREEF(gtk_widget_unparent, win->right_click_menu);
644644

645-
/* Sendn our settings back to the iimage we came from.
646-
*/
647-
if (win->imageui) {
648-
Tilesource *tilesource = imageui_get_tilesource(win->imageui);
649-
iimage_update_from_tilesource(win->iimage, tilesource);
650-
}
645+
iimage_update_view_settings(win->iimage,
646+
displaybar_get_view_settings(DISPLAYBAR(win->displaybar)));
651647

652648
while (win->active) {
653649
Active *active = (Active *) win->active->data;
@@ -1582,4 +1578,7 @@ imagewindow_set_iimage(Imagewindow *win, iImage *iimage)
15821578
G_CALLBACK(imagewindow_iimage_destroy), win);
15831579

15841580
iobject_changed(IOBJECT(iimage));
1581+
1582+
displaybar_set_view_settings(DISPLAYBAR(win->displaybar),
1583+
&iimage->view_settings);
15851584
}

src/tilesource.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,18 +1543,18 @@ tilesource_new_from_iimage(iImage *iimage, int priority)
15431543

15441544
g_object_set(tilesource,
15451545
"active", TRUE,
1546-
"scale", iimage->scale,
1547-
"offset", iimage->offset,
1548-
"falsecolour", iimage->falsecolour,
1549-
"log", iimage->log,
1550-
"icc", iimage->icc,
1551-
"page", iimage->page,
1546+
"scale", iimage->view_settings.scale,
1547+
"offset", iimage->view_settings.offset,
1548+
"falsecolour", iimage->view_settings.falsecolour,
1549+
"log", iimage->view_settings.log,
1550+
"icc", iimage->view_settings.icc,
1551+
"page", iimage->view_settings.page,
15521552
"priority", priority,
15531553
NULL);
15541554

1555-
if (iimage->mode != TILESOURCE_MODE_UNSET)
1555+
if (iimage->view_settings.mode != TILESOURCE_MODE_UNSET)
15561556
g_object_set(tilesource,
1557-
"mode", iimage->mode,
1557+
"mode", iimage->view_settings.mode,
15581558
NULL);
15591559

15601560
return tilesource;

0 commit comments

Comments
 (0)