Skip to content

Commit cc173c2

Browse files
committed
feat(save_as): Add save_as button for snapshots.
Allow to save snapshots with a different name and under a different location than specified in the configuration as default. Signed-off-by: Max Kunzelmann <[email protected]>
1 parent 0355760 commit cc173c2

File tree

11 files changed

+159
-64
lines changed

11 files changed

+159
-64
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ paint_mode=brush
9292
- `Ctrl+z`: Undo
9393
- `Ctrl+Shift+z` or `Ctrl+y`: Redo
9494
- `Ctrl+s`: Save to file (see man page)
95+
- `Ctrl+Shift+s`: Open "Save As" dialog
9596
- `Ctrl+c`: Copy to clipboard
9697
- `Escape` or `q` or `Ctrl+w`: Quit swappy
9798

include/pixbuf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
GdkPixbuf *pixbuf_init_from_file(struct swappy_state *state);
66
GdkPixbuf *pixbuf_get_from_state(struct swappy_state *state);
7+
char *format_filename(char *filename_format);
78
void pixbuf_save_state_to_folder(GdkPixbuf *pixbuf, char *folder,
89
char *filename_format);
910
void pixbuf_save_to_file(GdkPixbuf *pixbuf, char *file);

res/swappy.glade

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@
3232
<property name="can_focus">False</property>
3333
<property name="icon_name">document-properties</property>
3434
</object>
35+
<object class="GtkImage" id="img-save-as-surface">
36+
<property name="visible">True</property>
37+
<property name="can-focus">False</property>
38+
<property name="icon-name">document-save-as</property>
39+
</object>
3540
<object class="GtkImage" id="zoom-in">
3641
<property name="visible">True</property>
3742
<property name="can_focus">False</property>
@@ -752,6 +757,22 @@
752757
<property name="always_show_image">True</property>
753758
<signal name="clicked" handler="save_clicked_handler" swapped="no"/>
754759
</object>
760+
<packing>
761+
<property name="expand">False</property>
762+
<property name="fill">True</property>
763+
<property name="position">1</property>
764+
</packing>
765+
</child>
766+
<child>
767+
<object class="GtkButton" id="save-as">
768+
<property name="visible">True</property>
769+
<property name="can-focus">False</property>
770+
<property name="receives-default">True</property>
771+
<property name="tooltip-text" translatable="yes">Save Surface As</property>
772+
<property name="image">img-save-as-surface</property>
773+
<property name="always-show-image">True</property>
774+
<signal name="clicked" handler="save_as_clicked_handler" swapped="no"/>
775+
</object>
755776
<packing>
756777
<property name="expand">False</property>
757778
<property name="fill">True</property>

src/application.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,37 @@ void save_clicked_handler(GtkWidget *widget, struct swappy_state *state) {
282282
save_state_to_file_or_folder(state, NULL);
283283
}
284284

285+
void save_as_clicked_handler(GtkWidget *widget, struct swappy_state *state) {
286+
gchar *filename_suggestion;
287+
GtkWidget *dialog;
288+
GtkFileChooser *chooser;
289+
GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE;
290+
gint res;
291+
292+
commit_state(state);
293+
filename_suggestion = format_filename(state->config->save_filename_format);
294+
295+
dialog = gtk_file_chooser_dialog_new(NULL, state->ui->window, action,
296+
("_Cancel"), GTK_RESPONSE_CANCEL,
297+
("_Save"), GTK_RESPONSE_ACCEPT, NULL);
298+
chooser = GTK_FILE_CHOOSER(dialog);
299+
gtk_file_chooser_set_do_overwrite_confirmation(chooser, TRUE);
300+
gtk_file_chooser_set_current_folder(chooser, state->config->save_dir);
301+
gtk_file_chooser_set_current_name(chooser, filename_suggestion);
302+
303+
res = gtk_dialog_run(GTK_DIALOG(dialog));
304+
if (res == GTK_RESPONSE_ACCEPT) {
305+
gchar *filename;
306+
307+
filename = gtk_file_chooser_get_filename(chooser);
308+
save_state_to_file_or_folder(state, filename);
309+
g_free(filename);
310+
}
311+
312+
g_free(filename_suggestion);
313+
gtk_widget_destroy(dialog);
314+
}
315+
285316
void clear_clicked_handler(GtkWidget *widget, struct swappy_state *state) {
286317
action_clear(state);
287318
}
@@ -323,6 +354,9 @@ void window_keypress_handler(GtkWidget *widget, GdkEventKey *event,
323354
case GDK_KEY_s:
324355
save_state_to_file_or_folder(state, NULL);
325356
break;
357+
case GDK_KEY_S:
358+
save_as_clicked_handler(NULL, state);
359+
break;
326360
case GDK_KEY_b:
327361
action_toggle_painting_panel(state, NULL);
328362
break;

src/pixbuf.c

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,35 @@ static void write_file(GdkPixbuf *pixbuf, char *path) {
2222
}
2323
}
2424

25-
void pixbuf_save_state_to_folder(GdkPixbuf *pixbuf, char *folder,
26-
char *filename_format) {
25+
char *format_filename(char *filename_format) {
2726
time_t current_time = time(NULL);
2827
char *c_time_string;
2928
char filename[255];
30-
char path[MAX_PATH];
31-
size_t bytes_formated;
29+
size_t bytes_formatted;
3230

3331
c_time_string = ctime(&current_time);
3432
c_time_string[strlen(c_time_string) - 1] = '\0';
35-
bytes_formated = strftime(filename, sizeof(filename), filename_format,
36-
localtime(&current_time));
37-
if (!bytes_formated) {
33+
bytes_formatted = strftime(filename, sizeof(filename), filename_format,
34+
localtime(&current_time));
35+
if (!bytes_formatted) {
3836
g_warning(
3937
"filename_format: %s overflows filename limit - file cannot be saved",
4038
filename_format);
41-
return;
39+
return NULL;
4240
}
4341

42+
return g_strdup(filename);
43+
}
44+
45+
void pixbuf_save_state_to_folder(GdkPixbuf *pixbuf, char *folder,
46+
char *filename_format) {
47+
char path[MAX_PATH];
48+
char *filename;
49+
filename = format_filename(filename_format);
50+
if (filename == NULL) return;
51+
4452
g_snprintf(path, MAX_PATH, "%s/%s", folder, filename);
53+
g_free(filename);
4554
g_info("saving surface to path: %s", path);
4655
write_file(pixbuf, path);
4756
}

src/po/de.po

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ msgid ""
77
msgstr ""
88
"Project-Id-Version: swappy\n"
99
"Report-Msgid-Bugs-To: \n"
10-
"POT-Creation-Date: 2020-06-21 21:57-0400\n"
10+
"POT-Creation-Date: 2022-08-01 15:29+0200\n"
1111
"PO-Revision-Date: 2020-11-19 18:03+0300\n"
1212
"Last-Translator: Brodi <[email protected]>\n"
1313
"Language-Team: none\n"
@@ -17,34 +17,39 @@ msgstr ""
1717
"Content-Transfer-Encoding: 8bit\n"
1818
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
1919

20-
#: res/swappy.glade:455
20+
#: res/swappy.glade:461
2121
msgid "Line Width"
2222
msgstr "Linienstärke"
2323

24-
#: res/swappy.glade:525
24+
#: res/swappy.glade:531
2525
msgid "Text Size"
2626
msgstr "Textgröße"
2727

28-
#: res/swappy.glade:641
28+
#: res/swappy.glade:647
2929
msgid "Toggle Paint Panel"
3030
msgstr "Farbtafel umschalten"
3131

32-
#: res/swappy.glade:667
32+
#: res/swappy.glade:673
3333
msgid "Undo Last Paint"
3434
msgstr "Letzte Bemalung rückgängig machen"
3535

36-
#: res/swappy.glade:686
36+
#: res/swappy.glade:692
3737
msgid "Redo Previous Paint"
3838
msgstr "Vorherige Bemalung wiederherstellen"
3939

40-
#: res/swappy.glade:705
40+
#: res/swappy.glade:711
4141
msgid "Clear Paints"
4242
msgstr "Bemalung löschen"
4343

44-
#: res/swappy.glade:733
44+
#: res/swappy.glade:739
4545
msgid "Copy Surface"
4646
msgstr "Fläche kopieren"
4747

48-
#: res/swappy.glade:749
48+
#: res/swappy.glade:755
4949
msgid "Save Surface"
5050
msgstr "Fläche speichern"
51+
52+
#: res/swappy.glade:771
53+
#, fuzzy
54+
msgid "Save Surface As"
55+
msgstr "Fläche speichern"

src/po/en.po

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ msgid ""
77
msgstr ""
88
"Project-Id-Version: swappy\n"
99
"Report-Msgid-Bugs-To: \n"
10-
"POT-Creation-Date: 2020-06-21 21:57-0400\n"
10+
"POT-Creation-Date: 2022-08-01 15:29+0200\n"
1111
"PO-Revision-Date: 2020-06-21 21:57-0400\n"
1212
"Last-Translator: Automatically generated\n"
1313
"Language-Team: none\n"
@@ -17,34 +17,39 @@ msgstr ""
1717
"Content-Transfer-Encoding: 8bit\n"
1818
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
1919

20-
#: res/swappy.glade:455
20+
#: res/swappy.glade:461
2121
msgid "Line Width"
2222
msgstr "Line Width"
2323

24-
#: res/swappy.glade:525
24+
#: res/swappy.glade:531
2525
msgid "Text Size"
2626
msgstr "Text Size"
2727

28-
#: res/swappy.glade:641
28+
#: res/swappy.glade:647
2929
msgid "Toggle Paint Panel"
3030
msgstr "Toggle Paint Panel"
3131

32-
#: res/swappy.glade:667
32+
#: res/swappy.glade:673
3333
msgid "Undo Last Paint"
3434
msgstr "Undo Last Paint"
3535

36-
#: res/swappy.glade:686
36+
#: res/swappy.glade:692
3737
msgid "Redo Previous Paint"
3838
msgstr "Redo Previous Paint"
3939

40-
#: res/swappy.glade:705
40+
#: res/swappy.glade:711
4141
msgid "Clear Paints"
4242
msgstr "Clear Paints"
4343

44-
#: res/swappy.glade:733
44+
#: res/swappy.glade:739
4545
msgid "Copy Surface"
4646
msgstr "Copy Surface"
4747

48-
#: res/swappy.glade:749
48+
#: res/swappy.glade:755
4949
msgid "Save Surface"
5050
msgstr "Save Surface"
51+
52+
#: res/swappy.glade:771
53+
#, fuzzy
54+
msgid "Save Surface As"
55+
msgstr "Save Surface"

src/po/fr.po

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ msgid ""
77
msgstr ""
88
"Project-Id-Version: swappy\n"
99
"Report-Msgid-Bugs-To: \n"
10-
"POT-Creation-Date: 2021-02-20 21:17-0500\n"
10+
"POT-Creation-Date: 2022-08-01 15:29+0200\n"
1111
"PO-Revision-Date: 2021-02-20 21:00-0500\n"
1212
"Last-Translator: Jeremy Attali <[email protected]>\n"
1313
"Language-Team: none\n"
@@ -17,34 +17,39 @@ msgstr ""
1717
"Content-Transfer-Encoding: 8bit\n"
1818
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
1919

20-
#: res/swappy.glade:455
20+
#: res/swappy.glade:461
2121
msgid "Line Width"
2222
msgstr "Epaisseur de ligne"
2323

24-
#: res/swappy.glade:525
24+
#: res/swappy.glade:531
2525
msgid "Text Size"
2626
msgstr "Taille du texte"
2727

28-
#: res/swappy.glade:641
28+
#: res/swappy.glade:647
2929
msgid "Toggle Paint Panel"
3030
msgstr "Afficher/Cacher le panneau de peinture"
3131

32-
#: res/swappy.glade:667
32+
#: res/swappy.glade:673
3333
msgid "Undo Last Paint"
3434
msgstr "Annuler la dernière peinture"
3535

36-
#: res/swappy.glade:686
36+
#: res/swappy.glade:692
3737
msgid "Redo Previous Paint"
3838
msgstr "Rétablir la dernière peinture"
3939

40-
#: res/swappy.glade:705
40+
#: res/swappy.glade:711
4141
msgid "Clear Paints"
4242
msgstr "Supprimer les peintures"
4343

44-
#: res/swappy.glade:733
44+
#: res/swappy.glade:739
4545
msgid "Copy Surface"
4646
msgstr "Copier la surface"
4747

48-
#: res/swappy.glade:749
48+
#: res/swappy.glade:755
4949
msgid "Save Surface"
5050
msgstr "Sauvegarder la surface"
51+
52+
#: res/swappy.glade:771
53+
#, fuzzy
54+
msgid "Save Surface As"
55+
msgstr "Sauvegarder la surface"

src/po/pt_BR.po

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,45 +7,50 @@ msgid ""
77
msgstr ""
88
"Project-Id-Version: swappy\n"
99
"Report-Msgid-Bugs-To: \n"
10-
"POT-Creation-Date: 2020-06-21 21:57-0400\n"
10+
"POT-Creation-Date: 2022-08-01 15:29+0200\n"
1111
"PO-Revision-Date: 2021-02-14 20:38-0300\n"
12+
"Last-Translator: Gustavo Costa <[email protected]>\n"
1213
"Language-Team: \n"
14+
"Language: pt_BR\n"
1315
"MIME-Version: 1.0\n"
1416
"Content-Type: text/plain; charset=UTF-8\n"
1517
"Content-Transfer-Encoding: 8bit\n"
1618
"X-Generator: Poedit 2.4.2\n"
17-
"Last-Translator: Gustavo Costa <[email protected]>\n"
1819
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
19-
"Language: pt_BR\n"
2020

21-
#: res/swappy.glade:455
21+
#: res/swappy.glade:461
2222
msgid "Line Width"
2323
msgstr "Espessura da linha"
2424

25-
#: res/swappy.glade:525
25+
#: res/swappy.glade:531
2626
msgid "Text Size"
2727
msgstr "Tamanho do texto"
2828

29-
#: res/swappy.glade:641
29+
#: res/swappy.glade:647
3030
msgid "Toggle Paint Panel"
3131
msgstr "Alternar painel de pintura"
3232

33-
#: res/swappy.glade:667
33+
#: res/swappy.glade:673
3434
msgid "Undo Last Paint"
3535
msgstr "Desfazer última pintura"
3636

37-
#: res/swappy.glade:686
37+
#: res/swappy.glade:692
3838
msgid "Redo Previous Paint"
3939
msgstr "Refazer pintura anterior"
4040

41-
#: res/swappy.glade:705
41+
#: res/swappy.glade:711
4242
msgid "Clear Paints"
4343
msgstr "Limpar pinturas"
4444

45-
#: res/swappy.glade:733
45+
#: res/swappy.glade:739
4646
msgid "Copy Surface"
4747
msgstr "Copiar superfície"
4848

49-
#: res/swappy.glade:749
49+
#: res/swappy.glade:755
5050
msgid "Save Surface"
5151
msgstr "Salvar superfície"
52+
53+
#: res/swappy.glade:771
54+
#, fuzzy
55+
msgid "Save Surface As"
56+
msgstr "Salvar superfície"

0 commit comments

Comments
 (0)