From b79ccd5c01edd0152a90f54acb98e58cba3feaa2 Mon Sep 17 00:00:00 2001 From: Felipe Escoto Date: Sun, 10 Feb 2019 21:17:51 -0600 Subject: [PATCH] Save thumbnails in archive at /Thumnails --- src/Services/Clipboard.vala | 2 +- .../FileFormat/ZipArchiveHandler.vala | 5 ++ src/Services/Slide.vala | 49 ++++++++++++++++--- src/Services/SlideManager.vala | 2 +- src/Services/Utils.vala | 8 ++- 5 files changed, 56 insertions(+), 10 deletions(-) diff --git a/src/Services/Clipboard.vala b/src/Services/Clipboard.vala index a5fe11e..65fd4f6 100644 --- a/src/Services/Clipboard.vala +++ b/src/Services/Clipboard.vala @@ -154,7 +154,7 @@ public class Spice.Clipboard { var root_object = Utils.get_json_object (data); if (root_object == null) return; - if (root_object.has_member ("preview")) { + if (root_object.has_member ("items")) { manager.new_slide (root_object, true); } else { var item = Utils.canvas_item_from_data (root_object, manager.current_slide.canvas); diff --git a/src/Services/FileFormat/ZipArchiveHandler.vala b/src/Services/FileFormat/ZipArchiveHandler.vala index 194f18e..16a9439 100644 --- a/src/Services/FileFormat/ZipArchiveHandler.vala +++ b/src/Services/FileFormat/ZipArchiveHandler.vala @@ -123,6 +123,11 @@ public class Spice.Services.ZipArchiveHandler : GLib.Object { } } + public File get_file_from_basename (File location, string basename) { + var path = Path.build_filename (location.get_path (), basename); + return File.new_for_path (path); + } + /** * Get's a random file inside the archive at the location specified * using a guid-like name. diff --git a/src/Services/Slide.vala b/src/Services/Slide.vala index 5404568..45dc608 100644 --- a/src/Services/Slide.vala +++ b/src/Services/Slide.vala @@ -27,6 +27,7 @@ public class Spice.Slide : Object { public Canvas canvas; public Gtk.Image preview; + private File? thumbnail_file = null; public string preview_data { get; private set; default = ""; } public string notes { get; set; default = ""; } public Gtk.StackTransitionType transition { get; set; default = Gtk.StackTransitionType.NONE; } @@ -46,8 +47,11 @@ public class Spice.Slide : Object { item.visible = true; } + canvas.window.current_file.file_collector.ref_file (thumbnail_file); to_be_deleted.clear (); } else { + canvas.window.current_file.file_collector.unref_file (thumbnail_file); + foreach (var widget in canvas.get_children ()) { if (widget is CanvasItem && widget.visible) { CanvasItem item = (CanvasItem) widget; @@ -103,11 +107,33 @@ public class Spice.Slide : Object { private void load_data () { if (save_data == null) return; - preview_data = save_data.get_string_member ("preview"); - if (preview_data != null && preview_data != "") { - var pixbuf = Utils.base64_to_pixbuf (preview_data); + if (save_data.has_member ("preview")) { + preview_data = save_data.get_string_member ("preview"); + + if (preview_data != null && preview_data != "") { + var pixbuf = Utils.base64_to_pixbuf (preview_data); + + preview.set_from_pixbuf (pixbuf.scale_simple (SlideList.WIDTH, SlideList.HEIGHT, Gdk.InterpType.BILINEAR)); + } + } else if (save_data.has_member ("thumbnail")) { + print ("Loading thumbnail file...\n"); + var thumbnail_basename = save_data.get_string_member ("thumbnail"); + if (canvas != null && thumbnail_basename != "") { + var current_file = canvas.window.current_file; + thumbnail_file = current_file.get_file_from_basename (current_file.thumbnails_folder, thumbnail_basename); + + var pixbuf = new Gdk.Pixbuf.from_file (thumbnail_file.get_path ()); + preview.set_from_pixbuf (pixbuf); + } + } - preview.set_from_pixbuf (pixbuf.scale_simple (SlideList.WIDTH, SlideList.HEIGHT, Gdk.InterpType.BILINEAR)); + if (thumbnail_file == null && canvas != null) { + var current_file = canvas.window.current_file; + thumbnail_file = current_file.get_random_file_name (current_file.thumbnails_folder, "jpg"); + } + + if (canvas != null) { + canvas.window.current_file.file_collector.ref_file (thumbnail_file); } if (save_data.has_member ("transition")) { @@ -143,7 +169,7 @@ public class Spice.Slide : Object { }); } - public string serialise () { + public string serialise (bool save_preview = false) { if (this.save_data != null) { var root = new Json.Node (Json.NodeType.OBJECT); root.set_object (save_data); @@ -164,8 +190,19 @@ public class Spice.Slide : Object { } } + if (save_preview && thumbnail_file != null) { + print ("Saving thumbnail at %s\n", thumbnail_file.get_path ()); + try { + preview.pixbuf.save (thumbnail_file.get_path (), "jpeg"); + } catch (Error e) { + warning (e.message); + } + } + + string preview_name = save_preview && thumbnail_file != null ? thumbnail_file.get_basename () : ""; var raw_notes = (string) GLib.Base64.encode (notes.data); - return "{%s, \"transition\": %d, \"items\": [%s], \"notes\": \"%s\", \"preview\": \"%s\"}\n".printf (canvas.serialise (), (int) transition, data, raw_notes, preview_data); + + return "{%s, \"transition\": %d, \"items\": [%s], \"notes\": \"%s\", \"thumbnail\": \"%s\" }\n".printf (canvas.serialise (), (int) transition, data, raw_notes, preview_name); } public void delete () { diff --git a/src/Services/SlideManager.vala b/src/Services/SlideManager.vala index 9b43385..337aab5 100644 --- a/src/Services/SlideManager.vala +++ b/src/Services/SlideManager.vala @@ -150,7 +150,7 @@ public class Spice.SlideManager : Object { foreach (var slide in slides) { if (slide.visible) { - data = data + (data != "" ? "," + slide.serialise () : slide.serialise ()); + data = data + (data != "" ? "," + slide.serialise (true) : slide.serialise (true)); } } diff --git a/src/Services/Utils.vala b/src/Services/Utils.vala index 718f33a..0e11e95 100644 --- a/src/Services/Utils.vala +++ b/src/Services/Utils.vala @@ -158,9 +158,13 @@ public class Spice.Utils { } public static Spice.CanvasItem? canvas_item_from_data (Json.Object data, Spice.Canvas? canvas) { - string type = data.get_string_member ("type"); - CanvasItem? item = null; + string type = ""; + + if (data.has_member ("type")) { + type = data.get_string_member ("type"); + } + CanvasItem? item = null; switch (type) { case "text": item = new TextItem (canvas, data);