Skip to content

Commit e8be8d8

Browse files
committed
revise saveoptions
remove use of dialog still need to remove infobar
1 parent 84bc053 commit e8be8d8

File tree

9 files changed

+89
-117
lines changed

9 files changed

+89
-117
lines changed

TODO

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11

2-
- saveoptions.c should derive from GtkWindow, not GtkDialog
2+
- remove use of deprecated GtkInfoBar
33

4-
paste back into vipsdisp
5-
6-
other changes to go back?
7-
8-
use recover.c as a model
4+
use a revealer with a label and button
95

106
- try a flatpak build
117

src/gtk/nip4.css

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,3 @@
8080
margin-left: 4px;
8181
margin-right: 4px;
8282
}
83-

src/gtk/recover.ui

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<interface>
33
<template class="Recover" parent="GtkApplicationWindow">
4-
<property name="title" translatable="yes">Recover after crash</property>
54
<property name="modal">True</property>
65
<property name="default-widget">ok</property>
76

src/gtk/saveoptions.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
#saveoptions-label {
23
color: gray;
34
margin-top: 5px;

src/gtk/saveoptions.ui

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,46 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<interface>
33

4-
<template class="SaveOptions" parent="GtkDialog">
5-
<property name="title" translatable="yes">Save options</property>
4+
<template class="SaveOptions" parent="GtkApplicationWindow">
65
<property name="modal">True</property>
7-
<signal name="response" handler="save_options_response"/>
6+
<property name="default-widget">ok</property>
87

9-
<style>
10-
<class name="saveoptions"/>
11-
</style>
8+
<child type="titlebar">
9+
<object class="GtkHeaderBar" id="header">
10+
<property name="show-title-buttons">false</property>
1211

13-
<child internal-child="content_area">
12+
<child type="start">
13+
<object class="GtkButton">
14+
<property name="label" translatable="yes">Cancel</property>
15+
<property name="action-name">win.cancel</property>
16+
17+
</object>
18+
</child>
19+
20+
<child type="title">
21+
<object class="GtkLabel" id="title">
22+
<attributes>
23+
<attribute name="weight" value="bold"/>
24+
</attributes>
25+
26+
</object>
27+
</child>
28+
29+
<child type="end">
30+
<object class="GtkButton" id="ok">
31+
<property name="label" translatable="yes">Save</property>
32+
<property name="action-name">win.ok</property>
33+
<style>
34+
<class name="suggested-action"/>
35+
</style>
36+
37+
</object>
38+
</child>
39+
40+
</object>
41+
</child>
42+
43+
<child>
1444
<object class="GtkBox">
1545
<property name="orientation">1</property>
1646
<property name="spacing">2</property>
@@ -45,7 +75,6 @@
4575
<property name="message-type">error</property>
4676
<property name="show-close-button">true</property>
4777
<property name="revealed">false</property>
48-
<signal name="response" handler="save_options_error_response"/>
4978

5079
<child>
5180
<object class="GtkLabel" id="error_label">
@@ -79,27 +108,6 @@
79108
</object>
80109
</child>
81110

82-
<child type="action">
83-
<object class="GtkButton" id="cancel_button">
84-
<property name="use-underline">1</property>
85-
<property name="label" translatable="yes">_Cancel</property>
86-
</object>
87-
</child>
88-
89-
<child type="action">
90-
<object class="GtkButton" id="ok_button">
91-
<property name="can-focus">True</property>
92-
<property name="use-underline">1</property>
93-
<property name="label" translatable="yes">_Save</property>
94-
</object>
95-
</child>
96-
97-
<action-widgets>
98-
<action-widget response="cancel">cancel_button</action-widget>
99-
<action-widget response="ok" default="true">ok_button</action-widget>
100-
</action-widgets>
101-
102111
</template>
103-
104112
</interface>
105113

src/iimage.c

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -287,25 +287,13 @@ iimage_class_new(Classmodel *classmodel, PElement *fn, PElement *out)
287287
return TRUE;
288288
}
289289

290-
static void
291-
iimage_graphic_save_response(GtkDialog *dialog,
292-
gint response, gpointer user_data)
293-
{
294-
if (response == GTK_RESPONSE_ACCEPT ||
295-
response == GTK_RESPONSE_CANCEL)
296-
gtk_window_destroy(GTK_WINDOW(dialog));
297-
298-
// other return codes are intermediate stages of processing and we
299-
// should do nothing
300-
}
301-
302290
static gboolean
303291
iimage_graphic_save(Classmodel *classmodel,
304292
GtkWidget *parent, const char *filename)
305293
{
306294
iImage *iimage = IIMAGE(classmodel);
307295
VipsImage *image = iimage->value.ii->image;
308-
GtkWindow *window = GTK_WINDOW(gtk_widget_get_root(parent));
296+
GtkWindow *window = view_get_window(VIEW(parent));
309297

310298
if (image) {
311299
char buf[FILENAME_MAX];
@@ -320,10 +308,6 @@ iimage_graphic_save(Classmodel *classmodel,
320308
if (!options)
321309
return FALSE;
322310

323-
g_signal_connect_object(options, "response",
324-
G_CALLBACK(iimage_graphic_save_response),
325-
NULL, 0);
326-
327311
gtk_window_present(GTK_WINDOW(options));
328312
}
329313

src/recover.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -485,16 +485,6 @@ recover_ok_action(GSimpleAction *action,
485485
}
486486

487487
static GActionEntry recover_entries[] = {
488-
// FIXME ... ooof
489-
490-
// { "open", program_open_action },
491-
492-
// { "new-toolkit", program_new_toolkit_action },
493-
// { "new-tool", program_new_tool_action },
494-
495-
// { "save", program_saveas_action },
496-
// { "saveas", program_saveas_action },
497-
498488
{ "delete", recover_delete_action },
499489
{ "cancel", recover_cancel_action },
500490
{ "ok", recover_ok_action },

src/rowview.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -443,8 +443,6 @@ rowview_action(GSimpleAction *action, GVariant *parameter, View *view)
443443
Workspace *ws = row->ws;
444444
const char *name = g_action_get_name(G_ACTION(action));
445445

446-
printf("rowview_action: %s\n", name);
447-
448446
if (graphic &&
449447
g_str_equal(name, "row-edit"))
450448
model_edit(GTK_WIDGET(rview), MODEL(rhs));
@@ -477,8 +475,6 @@ rowview_paste_filename(const char *filename, void *user_data)
477475
Rowview *rview = ROWVIEW(user_data);
478476
Row *row = ROW(VOBJECT(rview)->iobject);
479477

480-
printf("rowview_paste_filename:\n");
481-
482478
// no rhs graphic? we can't paste into it
483479
if (!row->child_rhs ||
484480
!row->child_rhs->graphic)

src/saveoptions.c

Lines changed: 48 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
#include "nip4.h"
3535

3636
struct _SaveOptions {
37-
GtkDialog parent_instance;
37+
GtkApplicationWindow parent_instance;
3838

3939
VipsImage *image;
4040
VipsOperation *save_operation;
@@ -47,7 +47,7 @@ struct _SaveOptions {
4747
GtkWidget *progress;
4848
GtkWidget *error_bar;
4949
GtkWidget *error_label;
50-
GtkWidget *ok_button;
50+
GtkWidget *title;
5151

5252
// hash property names to the widget for that property ... we fetch
5353
// values from here when we make the saver
@@ -60,10 +60,10 @@ struct _SaveOptions {
6060
};
6161

6262
struct _SaveOptionsClass {
63-
GtkDialogClass parent_class;
63+
GtkApplicationWindowClass parent_class;
6464
};
6565

66-
G_DEFINE_TYPE(SaveOptions, save_options, GTK_TYPE_DIALOG);
66+
G_DEFINE_TYPE(SaveOptions, save_options, GTK_TYPE_APPLICATION_WINDOW);
6767

6868
static void
6969
save_options_dispose(GObject *object)
@@ -81,32 +81,17 @@ save_options_dispose(GObject *object)
8181
static void
8282
save_options_error(SaveOptions *options)
8383
{
84-
int i;
85-
8684
/* Remove any trailing \n.
8785
*/
8886
g_autofree char *err = vips_error_buffer_copy();
8987
vips_error_clear();
90-
for (i = strlen(err); i > 0 && err[i - 1] == '\n'; i--)
88+
for (int i = strlen(err); i > 0 && err[i - 1] == '\n'; i--)
9189
err[i - 1] = '\0';
9290
gtk_label_set_text(GTK_LABEL(options->error_label), err);
9391

9492
gtk_info_bar_set_revealed(GTK_INFO_BAR(options->error_bar), TRUE);
9593
}
9694

97-
static void
98-
save_options_error_hide(SaveOptions *options)
99-
{
100-
gtk_info_bar_set_revealed(GTK_INFO_BAR(options->error_bar), FALSE);
101-
}
102-
103-
static void
104-
save_options_error_response(GtkWidget *button, int response,
105-
SaveOptions *options)
106-
{
107-
save_options_error_hide(options);
108-
}
109-
11095
static void
11196
save_options_preeval(VipsImage *image,
11297
VipsProgress *progress, SaveOptions *options)
@@ -287,7 +272,7 @@ save_options_fetch_option(SaveOptions *options, GParamSpec *pspec)
287272
}
288273

289274
static void *
290-
save_options_response_map_fn(VipsObject *operation,
275+
save_options_set_argument(VipsObject *operation,
291276
GParamSpec *pspec, VipsArgumentClass *argument_class,
292277
VipsArgumentInstance *argument_instance, void *a, void *b)
293278
{
@@ -307,42 +292,61 @@ save_options_response_map_fn(VipsObject *operation,
307292
}
308293

309294
static void
310-
save_options_response(GtkWidget *dialog, int response, void *user_data)
295+
save_options_ok_action(GSimpleAction *action,
296+
GVariant *parameter, gpointer user_data)
311297
{
312-
SaveOptions *options = SAVE_OPTIONS(dialog);
298+
SaveOptions *options = SAVE_OPTIONS(user_data);
313299

314-
if (response == GTK_RESPONSE_OK) {
315-
vips_argument_map(VIPS_OBJECT(options->save_operation),
316-
save_options_response_map_fn, options, NULL);
317-
318-
// this will trigger the save and loop while we write ... the
319-
// UI will stay live thanks to event processing in the eval
320-
// handler
321-
if (vips_cache_operation_buildp(&options->save_operation))
322-
save_options_error(options);
323-
else
324-
// everything worked, we can post success back to
325-
// our caller
326-
gtk_dialog_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
327-
}
300+
vips_argument_map(VIPS_OBJECT(options->save_operation),
301+
save_options_set_argument, options, NULL);
302+
303+
// this will trigger the save and loop while we write ... the
304+
// UI will stay live thanks to event processing in the eval
305+
// handler
306+
if (vips_cache_operation_buildp(&options->save_operation))
307+
save_options_error(options);
308+
else
309+
// everything worked, we can post success back to
310+
// our caller
311+
gtk_window_destroy(GTK_WINDOW(options));
328312
}
329313

330314
static void
331-
save_options_cancel_clicked(GtkWidget *button, SaveOptions *options)
315+
save_options_cancel_action(GSimpleAction *action,
316+
GVariant *parameter, gpointer user_data)
332317
{
333-
vips_image_set_kill(options->image, TRUE);
318+
SaveOptions *options = SAVE_OPTIONS(user_data);
319+
320+
gtk_window_destroy(GTK_WINDOW(options));
334321
}
335322

323+
static GActionEntry save_options_entries[] = {
324+
{ "ok", save_options_ok_action },
325+
{ "cancel", save_options_cancel_action },
326+
};
327+
336328
static void
337329
save_options_init(SaveOptions *options)
338330
{
339331
gtk_widget_init_template(GTK_WIDGET(options));
340332

333+
g_action_map_add_action_entries(G_ACTION_MAP(options),
334+
save_options_entries, G_N_ELEMENTS(save_options_entries),
335+
options);
336+
341337
options->value_widgets = g_hash_table_new(g_str_hash, g_str_equal);
342338

343339
options->progress_timer = g_timer_new();
344340
}
345341

342+
static void
343+
save_options_cancel_clicked(GtkWidget *button, gpointer user_data)
344+
{
345+
SaveOptions *options = SAVE_OPTIONS(user_data);
346+
347+
vips_image_set_kill(options->image, TRUE);
348+
}
349+
346350
static void
347351
save_options_class_init(SaveOptionsClass *class)
348352
{
@@ -357,11 +361,9 @@ save_options_class_init(SaveOptionsClass *class)
357361
BIND_VARIABLE(SaveOptions, error_bar);
358362
BIND_VARIABLE(SaveOptions, error_label);
359363
BIND_VARIABLE(SaveOptions, options_grid);
360-
BIND_VARIABLE(SaveOptions, ok_button);
364+
BIND_VARIABLE(SaveOptions, title);
361365

362-
BIND_CALLBACK(save_options_response);
363366
BIND_CALLBACK(save_options_cancel_clicked);
364-
BIND_CALLBACK(save_options_error_response);
365367
}
366368

367369
/* This function is used by:
@@ -569,15 +571,14 @@ save_options_new(GtkWindow *parent_window,
569571
const char *saver;
570572
SaveOptions *options;
571573

572-
g_autofree char *base = g_path_get_basename(filename);
573-
g_autofree char *title = g_strdup_printf("Save image to \"%s\"", base);
574574
options = g_object_new(SAVE_OPTIONS_TYPE,
575-
// we have to set this here, not in the ui file, for some reason
576-
"use-header-bar", true,
577575
"transient-for", parent_window,
578-
"title", title,
576+
"application", gtk_window_get_application(parent_window),
579577
NULL);
580578

579+
g_autofree char *base = g_path_get_basename(filename);
580+
set_glabel(options->title, "Save image to \"%s\"", base);
581+
581582
options->image = image;
582583
g_object_ref(image);
583584

@@ -608,7 +609,5 @@ save_options_new(GtkWindow *parent_window,
608609
save_options_add_options_fn, options, &row);
609610
}
610611

611-
gtk_widget_grab_focus(options->ok_button);
612-
613612
return options;
614613
}

0 commit comments

Comments
 (0)