From e670f7283664840d0200df88df194da503b9b3ad Mon Sep 17 00:00:00 2001 From: Max Kunzelmann Date: Sat, 30 Jul 2022 00:38:34 +0200 Subject: [PATCH] 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 --- README.md | 1 + include/pixbuf.h | 1 + res/swappy.glade | 21 +++++++++++++++++++++ src/application.c | 35 +++++++++++++++++++++++++++++++++++ src/main.c | 10 ++++++++++ src/pixbuf.c | 25 +++++++++++++++++-------- src/po/POTFILES | 1 + src/po/de.po | 34 +++++++++++++++++++++++----------- src/po/en.po | 34 +++++++++++++++++++++++----------- src/po/fr.po | 35 ++++++++++++++++++++++++----------- src/po/meson.build | 9 ++++++++- src/po/pt_BR.po | 35 ++++++++++++++++++++++++----------- src/po/swappy.pot | 34 +++++++++++++++++++++++----------- src/po/tr.po | 35 ++++++++++++++++++++++++----------- 14 files changed, 235 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index cc8c7ea..09d4077 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,7 @@ fill_shape=false - `Ctrl+z`: Undo - `Ctrl+Shift+z` or `Ctrl+y`: Redo - `Ctrl+s`: Save to file (see man page) +- `Ctrl+Shift+s`: Open "Save As" dialog - `Ctrl+c`: Copy to clipboard - `Escape` or `q` or `Ctrl+w`: Quit swappy diff --git a/include/pixbuf.h b/include/pixbuf.h index 9449b53..b2b50a0 100644 --- a/include/pixbuf.h +++ b/include/pixbuf.h @@ -4,6 +4,7 @@ GdkPixbuf *pixbuf_init_from_file(struct swappy_state *state); GdkPixbuf *pixbuf_get_from_state(struct swappy_state *state); +char *format_filename(char *filename_format); void pixbuf_save_state_to_folder(GdkPixbuf *pixbuf, char *folder, char *filename_format); void pixbuf_save_to_file(GdkPixbuf *pixbuf, char *file); diff --git a/res/swappy.glade b/res/swappy.glade index 259d617..b31dc16 100644 --- a/res/swappy.glade +++ b/res/swappy.glade @@ -32,6 +32,11 @@ False document-properties-symbolic + + True + False + document-save-as + True False @@ -781,6 +786,22 @@ True + + False + True + 1 + + + + + True + False + True + Save Surface As + img-save-as-surface + True + + False True diff --git a/src/application.c b/src/application.c index 57d652f..9b2fb7f 100644 --- a/src/application.c +++ b/src/application.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -312,6 +313,37 @@ void save_clicked_handler(GtkWidget *widget, struct swappy_state *state) { save_state_to_file_or_folder(state, NULL); } +void save_as_clicked_handler(GtkWidget *widget, struct swappy_state *state) { + gchar *filename_suggestion; + GtkWidget *dialog; + GtkFileChooser *chooser; + GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE; + gint res; + + commit_state(state); + filename_suggestion = format_filename(state->config->save_filename_format); + + dialog = gtk_file_chooser_dialog_new(NULL, state->ui->window, action, + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_Save"), GTK_RESPONSE_ACCEPT, NULL); + chooser = GTK_FILE_CHOOSER(dialog); + gtk_file_chooser_set_do_overwrite_confirmation(chooser, TRUE); + gtk_file_chooser_set_current_folder(chooser, state->config->save_dir); + gtk_file_chooser_set_current_name(chooser, filename_suggestion); + g_free(filename_suggestion); + + res = gtk_dialog_run(GTK_DIALOG(dialog)); + if (res == GTK_RESPONSE_ACCEPT) { + gchar *filename; + + filename = gtk_file_chooser_get_filename(chooser); + save_state_to_file_or_folder(state, filename); + g_free(filename); + } + + gtk_widget_destroy(dialog); +} + void clear_clicked_handler(GtkWidget *widget, struct swappy_state *state) { action_clear(state); } @@ -353,6 +385,9 @@ void window_keypress_handler(GtkWidget *widget, GdkEventKey *event, case GDK_KEY_s: save_state_to_file_or_folder(state, NULL); break; + case GDK_KEY_S: + save_as_clicked_handler(NULL, state); + break; case GDK_KEY_b: action_toggle_painting_panel(state, NULL); break; diff --git a/src/main.c b/src/main.c index c04b96a..bb64671 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,8 @@ #define _POSIX_C_SOURCE 200809L +#include +#include + #include "application.h" #include "config.h" @@ -7,6 +10,13 @@ int main(int argc, char *argv[]) { struct swappy_state state = {0}; int status; + // set locales according to environment variables + setlocale(LC_ALL, ""); + // set base directory for translated messages + bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR); + // explicitly set encoding of message translations to UTF-8 + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); + state.argc = argc; state.argv = argv; state.mode = SWAPPY_PAINT_MODE_BRUSH; diff --git a/src/pixbuf.c b/src/pixbuf.c index 8a63671..b790f11 100644 --- a/src/pixbuf.c +++ b/src/pixbuf.c @@ -22,26 +22,35 @@ static void write_file(GdkPixbuf *pixbuf, char *path) { } } -void pixbuf_save_state_to_folder(GdkPixbuf *pixbuf, char *folder, - char *filename_format) { +char *format_filename(char *filename_format) { time_t current_time = time(NULL); char *c_time_string; char filename[255]; - char path[MAX_PATH]; - size_t bytes_formated; + size_t bytes_formatted; c_time_string = ctime(¤t_time); c_time_string[strlen(c_time_string) - 1] = '\0'; - bytes_formated = strftime(filename, sizeof(filename), filename_format, - localtime(¤t_time)); - if (!bytes_formated) { + bytes_formatted = strftime(filename, sizeof(filename), filename_format, + localtime(¤t_time)); + if (!bytes_formatted) { g_warning( "filename_format: %s overflows filename limit - file cannot be saved", filename_format); - return; + return NULL; } + return g_strdup(filename); +} + +void pixbuf_save_state_to_folder(GdkPixbuf *pixbuf, char *folder, + char *filename_format) { + char path[MAX_PATH]; + char *filename; + filename = format_filename(filename_format); + if (filename == NULL) return; + g_snprintf(path, MAX_PATH, "%s/%s", folder, filename); + g_free(filename); g_info("saving surface to path: %s", path); write_file(pixbuf, path); } diff --git a/src/po/POTFILES b/src/po/POTFILES index 9f2d6d6..d21f0e3 100644 --- a/src/po/POTFILES +++ b/src/po/POTFILES @@ -1 +1,2 @@ res/swappy.glade +src/application.c diff --git a/src/po/de.po b/src/po/de.po index b3e4439..36b3f02 100644 --- a/src/po/de.po +++ b/src/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: swappy\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-11-18 16:07-0500\n" +"POT-Creation-Date: 2022-12-04 22:52+0100\n" "PO-Revision-Date: 2020-11-19 18:03+0300\n" "Last-Translator: Brodi \n" "Language-Team: none\n" @@ -17,42 +17,54 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: res/swappy.glade:456 +#: res/swappy.glade:461 msgid "Line Width" msgstr "Linienstärke" -#: res/swappy.glade:526 +#: res/swappy.glade:531 msgid "Text Size" msgstr "Textgröße" -#: res/swappy.glade:592 +#: res/swappy.glade:597 msgid "Fill shape" msgstr "" -#: res/swappy.glade:597 +#: res/swappy.glade:602 msgid "Toggle shape filling" msgstr "" -#: res/swappy.glade:671 +#: res/swappy.glade:676 msgid "Toggle Paint Panel" msgstr "Farbtafel umschalten" -#: res/swappy.glade:697 +#: res/swappy.glade:702 msgid "Undo Last Paint" msgstr "Letzte Bemalung rückgängig machen" -#: res/swappy.glade:716 +#: res/swappy.glade:721 msgid "Redo Previous Paint" msgstr "Vorherige Bemalung wiederherstellen" -#: res/swappy.glade:735 +#: res/swappy.glade:740 msgid "Clear Paints" msgstr "Bemalung löschen" -#: res/swappy.glade:763 +#: res/swappy.glade:768 msgid "Copy Surface" msgstr "Fläche kopieren" -#: res/swappy.glade:779 +#: res/swappy.glade:784 msgid "Save Surface" msgstr "Fläche speichern" + +#: res/swappy.glade:800 +msgid "Save Surface As" +msgstr "Fläche speichern unter" + +#: src/application.c:327 +msgid "_Cancel" +msgstr "_Abbrechen" + +#: src/application.c:328 +msgid "_Save" +msgstr "_Speichern" diff --git a/src/po/en.po b/src/po/en.po index cf01b19..41cf5b8 100644 --- a/src/po/en.po +++ b/src/po/en.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: swappy\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-11-18 16:07-0500\n" +"POT-Creation-Date: 2022-12-04 22:52+0100\n" "PO-Revision-Date: 2020-06-21 21:57-0400\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -17,42 +17,54 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: res/swappy.glade:456 +#: res/swappy.glade:461 msgid "Line Width" msgstr "Line Width" -#: res/swappy.glade:526 +#: res/swappy.glade:531 msgid "Text Size" msgstr "Text Size" -#: res/swappy.glade:592 +#: res/swappy.glade:597 msgid "Fill shape" msgstr "Fill shape" -#: res/swappy.glade:597 +#: res/swappy.glade:602 msgid "Toggle shape filling" msgstr "Toggle shape filling" -#: res/swappy.glade:671 +#: res/swappy.glade:676 msgid "Toggle Paint Panel" msgstr "Toggle Paint Panel" -#: res/swappy.glade:697 +#: res/swappy.glade:702 msgid "Undo Last Paint" msgstr "Undo Last Paint" -#: res/swappy.glade:716 +#: res/swappy.glade:721 msgid "Redo Previous Paint" msgstr "Redo Previous Paint" -#: res/swappy.glade:735 +#: res/swappy.glade:740 msgid "Clear Paints" msgstr "Clear Paints" -#: res/swappy.glade:763 +#: res/swappy.glade:768 msgid "Copy Surface" msgstr "Copy Surface" -#: res/swappy.glade:779 +#: res/swappy.glade:784 msgid "Save Surface" msgstr "Save Surface" + +#: res/swappy.glade:800 +msgid "Save Surface As" +msgstr "Save Surface As" + +#: src/application.c:327 +msgid "_Cancel" +msgstr "_Cancel" + +#: src/application.c:328 +msgid "_Save" +msgstr "_Save" diff --git a/src/po/fr.po b/src/po/fr.po index 21aa351..2981ccf 100644 --- a/src/po/fr.po +++ b/src/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: swappy\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-11-18 16:07-0500\n" +"POT-Creation-Date: 2022-12-04 22:52+0100\n" "PO-Revision-Date: 2021-02-20 21:00-0500\n" "Last-Translator: Jeremy Attali \n" "Language-Team: none\n" @@ -17,42 +17,55 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: res/swappy.glade:456 +#: res/swappy.glade:461 msgid "Line Width" msgstr "Epaisseur de ligne" -#: res/swappy.glade:526 +#: res/swappy.glade:531 msgid "Text Size" msgstr "Taille du texte" -#: res/swappy.glade:592 +#: res/swappy.glade:597 msgid "Fill shape" msgstr "Remplir la forme" -#: res/swappy.glade:597 +#: res/swappy.glade:602 msgid "Toggle shape filling" msgstr "Activer/Désactiver le remplissage de forme" -#: res/swappy.glade:671 +#: res/swappy.glade:676 msgid "Toggle Paint Panel" msgstr "Afficher/Cacher le panneau de peinture" -#: res/swappy.glade:697 +#: res/swappy.glade:702 msgid "Undo Last Paint" msgstr "Annuler la dernière peinture" -#: res/swappy.glade:716 +#: res/swappy.glade:721 msgid "Redo Previous Paint" msgstr "Rétablir la dernière peinture" -#: res/swappy.glade:735 +#: res/swappy.glade:740 msgid "Clear Paints" msgstr "Supprimer les peintures" -#: res/swappy.glade:763 +#: res/swappy.glade:768 msgid "Copy Surface" msgstr "Copier la surface" -#: res/swappy.glade:779 +#: res/swappy.glade:784 msgid "Save Surface" msgstr "Sauvegarder la surface" + +#: res/swappy.glade:800 +#, fuzzy +msgid "Save Surface As" +msgstr "Sauvegarder la surface" + +#: src/application.c:327 +msgid "_Cancel" +msgstr "" + +#: src/application.c:328 +msgid "_Save" +msgstr "" diff --git a/src/po/meson.build b/src/po/meson.build index d8cd15b..c73d9b1 100644 --- a/src/po/meson.build +++ b/src/po/meson.build @@ -1,7 +1,14 @@ i18n = import('i18n') +conf = configuration_data() # define GETTEXT_PACKAGE -add_project_arguments('-DGETTEXT_PACKAGE="swappy"', language:'c') +conf.set_quoted('GETTEXT_PACKAGE', meson.project_name()) +conf.set_quoted('LOCALEDIR', join_paths(get_option('prefix'), get_option('localedir'))) + +config_h = configure_file( + output : 'generated_config.h', + configuration : conf) +add_project_arguments('-include', 'src/po/generated_config.h', language : 'c') i18n.gettext(meson.project_name(), args: '--directory=' + meson.source_root() diff --git a/src/po/pt_BR.po b/src/po/pt_BR.po index ec68154..402d50b 100644 --- a/src/po/pt_BR.po +++ b/src/po/pt_BR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: swappy\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-11-18 16:07-0500\n" +"POT-Creation-Date: 2022-12-04 22:52+0100\n" "PO-Revision-Date: 2021-02-14 20:38-0300\n" "Last-Translator: Gustavo Costa \n" "Language-Team: \n" @@ -18,42 +18,55 @@ msgstr "" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: res/swappy.glade:456 +#: res/swappy.glade:461 msgid "Line Width" msgstr "Espessura da linha" -#: res/swappy.glade:526 +#: res/swappy.glade:531 msgid "Text Size" msgstr "Tamanho do texto" -#: res/swappy.glade:592 +#: res/swappy.glade:597 msgid "Fill shape" msgstr "" -#: res/swappy.glade:597 +#: res/swappy.glade:602 msgid "Toggle shape filling" msgstr "" -#: res/swappy.glade:671 +#: res/swappy.glade:676 msgid "Toggle Paint Panel" msgstr "Alternar painel de pintura" -#: res/swappy.glade:697 +#: res/swappy.glade:702 msgid "Undo Last Paint" msgstr "Desfazer última pintura" -#: res/swappy.glade:716 +#: res/swappy.glade:721 msgid "Redo Previous Paint" msgstr "Refazer pintura anterior" -#: res/swappy.glade:735 +#: res/swappy.glade:740 msgid "Clear Paints" msgstr "Limpar pinturas" -#: res/swappy.glade:763 +#: res/swappy.glade:768 msgid "Copy Surface" msgstr "Copiar superfície" -#: res/swappy.glade:779 +#: res/swappy.glade:784 msgid "Save Surface" msgstr "Salvar superfície" + +#: res/swappy.glade:800 +#, fuzzy +msgid "Save Surface As" +msgstr "Salvar superfície" + +#: src/application.c:327 +msgid "_Cancel" +msgstr "" + +#: src/application.c:328 +msgid "_Save" +msgstr "" diff --git a/src/po/swappy.pot b/src/po/swappy.pot index 30f6b4d..66ed3ec 100644 --- a/src/po/swappy.pot +++ b/src/po/swappy.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: swappy\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-11-18 16:07-0500\n" +"POT-Creation-Date: 2022-12-04 22:52+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,42 +17,54 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: res/swappy.glade:456 +#: res/swappy.glade:461 msgid "Line Width" msgstr "" -#: res/swappy.glade:526 +#: res/swappy.glade:531 msgid "Text Size" msgstr "" -#: res/swappy.glade:592 +#: res/swappy.glade:597 msgid "Fill shape" msgstr "" -#: res/swappy.glade:597 +#: res/swappy.glade:602 msgid "Toggle shape filling" msgstr "" -#: res/swappy.glade:671 +#: res/swappy.glade:676 msgid "Toggle Paint Panel" msgstr "" -#: res/swappy.glade:697 +#: res/swappy.glade:702 msgid "Undo Last Paint" msgstr "" -#: res/swappy.glade:716 +#: res/swappy.glade:721 msgid "Redo Previous Paint" msgstr "" -#: res/swappy.glade:735 +#: res/swappy.glade:740 msgid "Clear Paints" msgstr "" -#: res/swappy.glade:763 +#: res/swappy.glade:768 msgid "Copy Surface" msgstr "" -#: res/swappy.glade:779 +#: res/swappy.glade:784 msgid "Save Surface" msgstr "" + +#: res/swappy.glade:800 +msgid "Save Surface As" +msgstr "" + +#: src/application.c:327 +msgid "_Cancel" +msgstr "" + +#: src/application.c:328 +msgid "_Save" +msgstr "" diff --git a/src/po/tr.po b/src/po/tr.po index bcc74a1..5c755d0 100644 --- a/src/po/tr.po +++ b/src/po/tr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: swappy\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-11-18 16:07-0500\n" +"POT-Creation-Date: 2022-12-04 22:52+0100\n" "PO-Revision-Date: 2022-11-25 10:36+0300\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" @@ -17,42 +17,55 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: res/swappy.glade:456 +#: res/swappy.glade:461 msgid "Line Width" msgstr "Çizgi Genişliği" -#: res/swappy.glade:526 +#: res/swappy.glade:531 msgid "Text Size" msgstr "Metin Boyutu" -#: res/swappy.glade:592 +#: res/swappy.glade:597 msgid "Fill shape" msgstr "Şekli Doldur" -#: res/swappy.glade:597 +#: res/swappy.glade:602 msgid "Toggle shape filling" msgstr "Şekil Doldurmayı Aç/Kapat" -#: res/swappy.glade:671 +#: res/swappy.glade:676 msgid "Toggle Paint Panel" msgstr "Boyama Panelini Aç/Kapat" -#: res/swappy.glade:697 +#: res/swappy.glade:702 msgid "Undo Last Paint" msgstr "Son Boyamayı Geri Al" -#: res/swappy.glade:716 +#: res/swappy.glade:721 msgid "Redo Previous Paint" msgstr "Önceki Boyamayı Tekrarla" -#: res/swappy.glade:735 +#: res/swappy.glade:740 msgid "Clear Paints" msgstr "Boyamaları Temizle" -#: res/swappy.glade:763 +#: res/swappy.glade:768 msgid "Copy Surface" msgstr "Yüzeyi Kopyala" -#: res/swappy.glade:779 +#: res/swappy.glade:784 msgid "Save Surface" msgstr "Yüzeyi Kaydet" + +#: res/swappy.glade:800 +#, fuzzy +msgid "Save Surface As" +msgstr "Yüzeyi Kaydet" + +#: src/application.c:327 +msgid "_Cancel" +msgstr "" + +#: src/application.c:328 +msgid "_Save" +msgstr ""