Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 103 additions & 16 deletions photocollage/gtkgui.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import copy
import gettext
from io import BytesIO
import json
import math
import os.path
import random
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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()

Expand Down Expand Up @@ -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
# -----------------------
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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(
Expand All @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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))

Expand Down Expand Up @@ -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]
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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()
Expand Down
62 changes: 35 additions & 27 deletions photocollage/locale/de/LC_MESSAGES/photocollage.po
Original file line number Diff line number Diff line change
Expand Up @@ -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 <willovince@openmailbox.org>\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 <christian@lauinger-clan.de>\n"
"Language-Team: none <none@none.com>\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"
Expand All @@ -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"