diff options
author | Jörg Frings-Fürst <debian@jff.email> | 2023-06-14 20:35:58 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff.email> | 2023-06-14 20:35:58 +0200 |
commit | d443a3c2509889533ca812c163056bace396b586 (patch) | |
tree | e94ffc0d9c054ca4efb8fb327e18dfac88e15dc7 /src/Exporter.vala | |
parent | bb9797c14470641b082ebf635e2ae3cfd5f27a3b (diff) |
New upstream version 0.32.1upstream/0.32.1
Diffstat (limited to 'src/Exporter.vala')
-rw-r--r-- | src/Exporter.vala | 75 |
1 files changed, 55 insertions, 20 deletions
diff --git a/src/Exporter.vala b/src/Exporter.vala index b9596f5..a7f7b6b 100644 --- a/src/Exporter.vala +++ b/src/Exporter.vala @@ -55,7 +55,9 @@ public class Exporter : Object { YES, NO, CANCEL, - REPLACE_ALL + REPLACE_ALL, + RENAME, + RENAME_ALL, } public delegate void CompletionCallback(Exporter exporter, bool is_cancelled); @@ -116,8 +118,10 @@ public class Exporter : Object { private unowned ProgressMonitor? monitor = null; private Cancellable cancellable; private bool replace_all = false; + private bool rename_all = false; private bool aborted = false; private ExportFormatParameters export_params; + private static File? USE_TEMPORARY_EXPORT_FOLDER = null; public Exporter(Gee.Collection<MediaSource> to_export, File? dir, Scaling scaling, ExportFormatParameters export_params, bool auto_replace_all = false) { @@ -131,7 +135,7 @@ public class Exporter : Object { public Exporter.for_temp_file(Gee.Collection<MediaSource> to_export, Scaling scaling, ExportFormatParameters export_params) { this.to_export.add_all(to_export); - this.dir = null; + this.dir = USE_TEMPORARY_EXPORT_FOLDER; this.scaling = scaling; this.export_params = export_params; } @@ -193,6 +197,7 @@ public class Exporter : Object { private bool process_queue() { int submitted = 0; + Gee.HashSet<string> used = new Gee.HashSet<string>(); foreach (MediaSource source in to_export) { File? use_source_file = null; PhotoFileFormat real_export_format = PhotoFileFormat.get_system_default_format(); @@ -227,7 +232,7 @@ public class Exporter : Object { if (export_dir == null) { try { bool collision; - dest = generate_unique_file(AppDirs.get_temp_dir(), basename, out collision); + dest = generate_unique_file(AppDirs.get_temp_dir(), basename, out collision, used); } catch (Error err) { AppWindow.error_message(_("Unable to generate a temporary file for %s: %s").printf( source.get_file().get_basename(), err.message)); @@ -236,17 +241,30 @@ public class Exporter : Object { } } else { dest = dir.get_child(basename); + bool rename = false; - if (!replace_all && dest.query_exists(null)) { - switch (overwrite_callback(this, dest)) { + if (!replace_all && (dest.query_exists(null) || used.contains(basename))) { + if (rename_all) { + rename = true; + } else { + switch (overwrite_callback(this, dest)) { case Overwrite.YES: // continue - break; + break; case Overwrite.REPLACE_ALL: replace_all = true; - break; - + break; + + case Overwrite.RENAME: + rename = true; + break; + + case Overwrite.RENAME_ALL: + rename = true; + rename_all = true; + break; + case Overwrite.CANCEL: cancellable.cancel(); @@ -264,10 +282,22 @@ public class Exporter : Object { } continue; + } + } + if (rename) { + try { + bool collision; + dest = generate_unique_file(dir, basename, out collision, used); + } catch (Error err) { + AppWindow.error_message(_("Unable to generate a temporary file for %s: %s").printf( + source.get_file().get_basename(), err.message)); + break; + } } } } + used.add(dest.get_basename()); workers.enqueue(new ExportJob(this, source, dest, scaling, export_params.quality, real_export_format, cancellable, export_params.mode == ExportFormatMode.UNMODIFIED, export_params.export_metadata)); submitted++; @@ -315,24 +345,30 @@ public class ExporterUI { private Exporter.Overwrite on_export_overwrite(Exporter exporter, File file) { progress_dialog.set_modal(false); string question = _("File %s already exists. Replace?").printf(file.get_basename()); - Gtk.ResponseType response = AppWindow.negate_affirm_all_cancel_question(question, - _("_Skip"), _("_Replace"), _("Replace _All"), _("Export")); + int response = AppWindow.export_overwrite_or_replace_question(question, + _("_Skip"), _("Rename"), _("Rename All"),_("_Replace"), _("Replace _All"), _("_Cancel"), _("Export")); progress_dialog.set_modal(true); switch (response) { - case Gtk.ResponseType.APPLY: - return Exporter.Overwrite.REPLACE_ALL; + case 2: + return Exporter.Overwrite.RENAME; + + case 3: + return Exporter.Overwrite.RENAME_ALL; - case Gtk.ResponseType.YES: - return Exporter.Overwrite.YES; + case 4: + return Exporter.Overwrite.YES; - case Gtk.ResponseType.CANCEL: - return Exporter.Overwrite.CANCEL; + case 5: + return Exporter.Overwrite.REPLACE_ALL; - case Gtk.ResponseType.NO: - default: - return Exporter.Overwrite.NO; + case 6: + return Exporter.Overwrite.CANCEL; + + case 1: + default: + return Exporter.Overwrite.NO; } } @@ -340,4 +376,3 @@ public class ExporterUI { return export_error_dialog(file, remaining > 0) != Gtk.ResponseType.CANCEL; } } - |