diff --git a/photocollage/gtkgui.py b/photocollage/gtkgui.py index fa0b198..2fc4d1c 100644 --- a/photocollage/gtkgui.py +++ b/photocollage/gtkgui.py @@ -17,6 +17,7 @@ import copy import gettext from io import BytesIO +import json import math import os.path import random @@ -50,6 +51,71 @@ # done +def settings_folder_check(): + app_folder = os.path.expanduser("~") + "/.local/share/PhotoCollage" + if not os.path.lexists(app_folder): + os.makedirs(app_folder) + return app_folder + + +def settings_load_lastsettings(): + app_folder = settings_folder_check() + settings_file = app_folder + "/lastsettings.json" + if os.path.isfile(settings_file): + with open(settings_file, "r") as openfile: + json_object = json.load(openfile) + else: + dictionary = { + "border_w": 0.01, + "border_c": "black", + "out_w": 800, + "out_h": 600 + } + with open(settings_file, "w") as openfile: + json.dump(dictionary, openfile) + with open(settings_file, "r") as openfile: + json_object = json.load(openfile) + return json_object + + +def settings_store_lastsettings(settings): + app_folder = settings_folder_check() + settings_file = app_folder + "/lastsettings.json" + dictionary = { + "border_w": settings.border_w, + "border_c": settings.border_c, + "out_w": settings.out_w, + "out_h": settings.out_h + } + with open(settings_file, "w") as openfile: + json.dump(dictionary, openfile, indent=4) + + +def templates_load_presets(): + app_folder = settings_folder_check() + templates_file = app_folder + "/templates.json" + if os.path.isfile(templates_file): + with open(templates_file, "r") as openfile: + json_object = json.load(openfile) + else: + dictionary = { + "": None, + "800 × 600": (800, 600), + "1600 × 1200": (1600, 1200), + "A4 landscape (300ppi)": (3508, 2480), + "A4 portrait (300ppi)": (2480, 3508), + "A3 landscape (300ppi)": (4960, 3508), + "A3 portrait (300ppi)": (3508, 4960), + "US-Letter landscape (300ppi)": (3300, 2550), + "US-Letter portrait (300ppi)": (2550, 3300) + } + with open(templates_file, "w") as openfile: + json.dump(dictionary, openfile, indent=4) + with open(templates_file, "r") as openfile: + json_object = json.load(openfile) + return json_object + + def pil_image_to_cairo_surface(src): # TODO: cairo.ImageSurface.create_for_data() is not yet available in # Python 3, so we use PNG as an intermediate. @@ -173,10 +239,11 @@ def __init__(self): class Options: def __init__(self): - self.border_w = 0.01 - self.border_c = "black" - self.out_w = 800 - self.out_h = 600 + json_object = settings_load_lastsettings() + self.border_w = json_object['border_w'] + self.border_c = json_object['border_c'] + self.out_w = json_object['out_w'] + self.out_h = json_object['out_h'] self.opts = Options() @@ -209,6 +276,13 @@ def make_window(self): self.btn_save.connect("clicked", self.save_poster) box.pack_start(self.btn_save, False, False, 0) + self.btn_reset = Gtk.Button(label=_("Reset")) + self.btn_reset.set_image(Gtk.Image.new_from_stock( + Gtk.STOCK_REMOVE, Gtk.IconSize.LARGE_TOOLBAR)) + self.btn_reset.set_always_show_image(True) + self.btn_reset.connect("clicked", self.reset) + box.pack_start(self.btn_reset, False, False, 0) + # ----------------------- # Tools pan # ----------------------- @@ -263,6 +337,7 @@ def make_window(self): box.pack_start(self.img_preview, True, True, 0) self.btn_save.set_sensitive(False) + self.btn_reset.set_sensitive(False) self.btn_undo.set_sensitive(False) self.btn_redo.set_sensitive(False) @@ -339,6 +414,7 @@ def on_complete(img): self.img_preview.set_collage(img, collage) compdialog.destroy() self.btn_save.set_sensitive(True) + self.btn_reset.set_sensitive(True) def on_fail(exception): dialog = ErrorDialog(self, "{}:\n\n{}".format( @@ -347,6 +423,7 @@ def on_fail(exception): dialog.run() dialog.destroy() self.btn_save.set_sensitive(False) + self.btn_reset.set_sensitive(False) t = render.RenderingTask( collage.page, @@ -363,6 +440,22 @@ def on_fail(exception): t.abort() compdialog.destroy() + def reset(self, button): + dialog = Gtk.MessageDialog( + win, Gtk.DialogFlags.DESTROY_WITH_PARENT, + Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, + _("Reset")) + dialog.format_secondary_text(_("Do you really want to reset ?")) + response = dialog.run() + dialog.destroy() + if response == Gtk.ResponseType.YES: + win.img_preview.collage.photolist = None + win.img_preview.image = None + win.img_preview.mode = win.img_preview.INSENSITIVE + win.img_preview.parent.history_index = \ + len(win.img_preview.parent.history) + win.img_preview.parent.update_tool_buttons() + def render_from_new_collage(self, collage): self.history.append(collage) self.history_index = len(self.history) - 1 @@ -456,6 +549,8 @@ def update_tool_buttons(self): self.lbl_history_index.set_label(" ") self.btn_save.set_sensitive( self.history_index < len(self.history)) + self.btn_reset.set_sensitive( + self.history_index < len(self.history)) self.btn_new_layout.set_sensitive( self.history_index < len(self.history)) @@ -661,18 +756,8 @@ def __init__(self, parent): box.pack_start(self.etr_outh, False, False, 0) box.pack_end(Gtk.Label(_("pixels"), xalign=0), False, False, 0) - - templates = ( - ("", None), - ("800 × 600", (800, 600)), - ("1600 × 1200", (1600, 1200)), - ("A4 landscape (300ppi)", (3508, 2480)), - ("A4 portrait (300ppi)", (2480, 3508)), - ("A3 landscape (300ppi)", (4960, 3508)), - ("A3 portrait (300ppi)", (3508, 4960)), - ("US-Letter landscape (300ppi)", (3300, 2550)), - ("US-Letter portrait (300ppi)", (2550, 3300)), - ) + json_object = templates_load_presets() + templates = json_object.items() def apply_template(combo): t = combo.get_model()[combo.get_active_iter()][1] @@ -746,6 +831,7 @@ def apply_opts(self, opts): opts.out_h = int(self.etr_outh.get_text() or '1') opts.border_w = float(self.etr_border.get_text() or '0') / 100.0 opts.border_c = self.colorbutton.get_rgba().to_string() + settings_store_lastsettings(opts) class ComputingDialog(Gtk.Dialog): @@ -826,6 +912,7 @@ def main(): # Enable threading. Without that, threads hang! GObject.threads_init() + global win win = PhotoCollageWindow() win.connect("delete-event", Gtk.main_quit) win.show_all() diff --git a/photocollage/locale/de/LC_MESSAGES/photocollage.po b/photocollage/locale/de/LC_MESSAGES/photocollage.po index 117e8c6..f138902 100644 --- a/photocollage/locale/de/LC_MESSAGES/photocollage.po +++ b/photocollage/locale/de/LC_MESSAGES/photocollage.po @@ -8,44 +8,48 @@ msgid "" msgstr "" "Project-Id-Version: PhotoCollage 1.4.2\n" -"Report-Msgid-Bugs-To: https://github.com/adrienverge/PhotoCollage/issues\n" -"POT-Creation-Date: 2016-04-11 22:51+0200\n" -"PO-Revision-Date: 2016-04-11 23:13+0200\n" -"Last-Translator: Vincent Bermel \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-06-12 01:17+0200\n" +"PO-Revision-Date: 2024-06-12 01:19+0200\n" +"Last-Translator: Christian Lauinger \n" "Language-Team: none \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Gtranslator 2.91.7\n" +"X-Generator: Poedit 3.4.4\n" -#: photocollage/gtkgui.py:72 photocollage/gtkgui.py:94 +#: photocollage/gtkgui.py:138 photocollage/gtkgui.py:160 msgid "All supported image formats" msgstr "Alle unterstützten Bildformate" -#: photocollage/gtkgui.py:104 +#: photocollage/gtkgui.py:170 #, python-format msgid "%s image" msgstr "Bild %s" -#: photocollage/gtkgui.py:161 +#: photocollage/gtkgui.py:227 msgid "PhotoCollage" msgstr "PhotoCollage" -#: photocollage/gtkgui.py:189 +#: photocollage/gtkgui.py:256 msgid "Add images..." -msgstr "Bilder hinzufügen" +msgstr "Bilder hinzufügen..." -#: photocollage/gtkgui.py:196 +#: photocollage/gtkgui.py:263 msgid "Save poster..." -msgstr "Poster abspeichern" +msgstr "Poster abspeichern..." -#: photocollage/gtkgui.py:221 +#: photocollage/gtkgui.py:270 photocollage/gtkgui.py:438 +msgid "Reset" +msgstr "Zurücksetzen" + +#: photocollage/gtkgui.py:295 msgid "Regenerate" msgstr "Neue Anordnung" -#: photocollage/gtkgui.py:279 +#: photocollage/gtkgui.py:354 #, python-format msgid "" "This image could not be opened:\n" @@ -54,54 +58,58 @@ msgstr "" "Dieses Bild kann nicht geöffnet werden:\n" "\"%(imgname)s\"." -#: photocollage/gtkgui.py:285 +#: photocollage/gtkgui.py:360 msgid "Choose images" msgstr "Bilder auswählen" -#: photocollage/gtkgui.py:339 photocollage/gtkgui.py:424 +#: photocollage/gtkgui.py:412 photocollage/gtkgui.py:514 msgid "An error occurred while rendering image:" msgstr "Beim Berechnen des Posters ist ein Fehler aufgetreten:" -#: photocollage/gtkgui.py:398 +#: photocollage/gtkgui.py:439 +msgid "Do you really want to reset ?" +msgstr "Wollen Sie wirklich zurücksetzen ?" + +#: photocollage/gtkgui.py:488 msgid "Save image" msgstr "Poster speichern" -#: photocollage/gtkgui.py:622 +#: photocollage/gtkgui.py:722 msgid "Settings" msgstr "Einstellungen" -#: photocollage/gtkgui.py:634 +#: photocollage/gtkgui.py:734 msgid "Output image size" msgstr "Ausgabebildgröße" -#: photocollage/gtkgui.py:649 +#: photocollage/gtkgui.py:749 msgid "pixels" msgstr "Pixel" -#: photocollage/gtkgui.py:673 +#: photocollage/gtkgui.py:763 msgid "Apply a template:" msgstr "Formatvorlage:" -#: photocollage/gtkgui.py:686 +#: photocollage/gtkgui.py:776 msgid "Border" msgstr "Rahmen" -#: photocollage/gtkgui.py:691 +#: photocollage/gtkgui.py:781 msgid "Thickness:" msgstr "Breite:" -#: photocollage/gtkgui.py:701 +#: photocollage/gtkgui.py:792 msgid "Color:" msgstr "Farbe:" -#: photocollage/gtkgui.py:740 +#: photocollage/gtkgui.py:832 msgid "Please wait" msgstr "Bitte warten" -#: photocollage/gtkgui.py:749 +#: photocollage/gtkgui.py:841 msgid "Performing image computation..." msgstr "Poster wird berechnet..." -#: photocollage/gtkgui.py:764 +#: photocollage/gtkgui.py:856 msgid "Error" msgstr "Fehler"