summaryrefslogtreecommitdiffstats
path: root/src/extension/internal/template-from-file.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 11:50:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 11:50:49 +0000
commitc853ffb5b2f75f5a889ed2e3ef89b818a736e87a (patch)
tree7d13a0883bb7936b84d6ecdd7bc332b41ed04bee /src/extension/internal/template-from-file.cpp
parentInitial commit. (diff)
downloadinkscape-c853ffb5b2f75f5a889ed2e3ef89b818a736e87a.tar.xz
inkscape-c853ffb5b2f75f5a889ed2e3ef89b818a736e87a.zip
Adding upstream version 1.3+ds.upstream/1.3+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/extension/internal/template-from-file.cpp')
-rw-r--r--src/extension/internal/template-from-file.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/extension/internal/template-from-file.cpp b/src/extension/internal/template-from-file.cpp
new file mode 100644
index 0000000..9cabdd4
--- /dev/null
+++ b/src/extension/internal/template-from-file.cpp
@@ -0,0 +1,131 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Authors:
+ * Martin Owens <doctormo@geek-2.com>
+ *
+ * Copyright (C) 2022 Authors
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "document.h"
+#include "extension/prefdialog/parameter.h"
+#include "io/file.h"
+#include "io/resource.h"
+#include "io/sys.h"
+#include "page-manager.h"
+#include "template-from-file.h"
+
+#include "clear-n_.h"
+
+using namespace Inkscape::IO::Resource;
+
+namespace Inkscape {
+namespace Extension {
+namespace Internal {
+
+/**
+ * A file based template preset.
+ */
+TemplatePresetFile::TemplatePresetFile(Template *mod, const std::string &filename)
+ : TemplatePreset(mod, nullptr)
+{
+ _visibility = TEMPLATE_NEW_ICON; // No searching
+
+ // TODO: Add cache here.
+ _prefs["filename"] = filename;
+ _name = Glib::path_get_basename(filename);
+ std::replace(_name.begin(), _name.end(), '_', '-');
+ _name.replace(_name.rfind(".svg"), 4, 1, ' ');
+
+ Inkscape::XML::Document *rdoc = sp_repr_read_file(filename.c_str(), SP_SVG_NS_URI);
+ if (rdoc){
+ Inkscape::XML::Node *root = rdoc->root();
+ if (!strcmp(root->name(), "svg:svg")) {
+ Inkscape::XML::Node *templateinfo = sp_repr_lookup_name(root, "inkscape:templateinfo");
+ if (!templateinfo) {
+ templateinfo = sp_repr_lookup_name(root, "inkscape:_templateinfo"); // backwards-compatibility
+ }
+ if (templateinfo) {
+ _load_data(templateinfo);
+ }
+ }
+ }
+
+ // Key is just the whole filename, it's unique enough.
+ _key = filename;
+ std::replace(_key.begin(), _key.end(), '/', '.');
+ std::replace(_key.begin(), _key.end(), '\\', '.');
+}
+
+void TemplatePresetFile::_load_data(const Inkscape::XML::Node *root)
+{
+ _name = sp_repr_lookup_content(root, "inkscape:name", _name);
+ _name = sp_repr_lookup_content(root, "inkscape:_name", _name); // backwards-compatibility
+ _label = sp_repr_lookup_content(root, "inkscape:shortdesc", N_("Custom Template"));
+ _label = sp_repr_lookup_content(root, "inkscape:shortdesc", _label); // backwards-compatibility
+
+ _icon = sp_repr_lookup_content(root, "inkscape:icon", _icon);
+ // Original functionality not yet used...
+ // _author = sp_repr_lookup_content(root, "inkscape:author");
+ // _preview = sp_repr_lookup_content(root, "inkscape:preview");
+ // _date = sp_repr_lookup_name(root, "inkscape:date");
+ // _keywords = sp_repr_lookup_name(root, "inkscape:_keywords");
+}
+
+
+SPDocument *TemplateFromFile::new_from_template(Inkscape::Extension::Template *tmod)
+{
+ auto filename = tmod->get_param_string("filename", "");
+ if (Inkscape::IO::file_test(filename, (GFileTest)(G_FILE_TEST_EXISTS))) {
+ return ink_file_new(filename);
+ }
+ // Default template
+ g_error("Couldn't load filename I expected to exist.");
+ return tmod->get_template_document();
+}
+
+void TemplateFromFile::init()
+{
+ // clang-format off
+ Inkscape::Extension::build_from_mem(
+ "<inkscape-extension xmlns=\"" INKSCAPE_EXTENSION_URI "\">"
+ "<id>org.inkscape.template.from-file</id>"
+ "<name>" N_("Load from User File") "</name>"
+ "<description>" N_("Custom list of templates for a folder") "</description>"
+ "<category>" NC_("TemplateCategory", "Custom") "</category>"
+
+ "<param name='filename' gui-text='" N_("Filename") "' type='string'></param>"
+ "<template icon='custom' priority='-1' visibility='both'>"
+ // Auto & lazy generated content (see function)
+ "</template>"
+ "</inkscape-extension>",
+ new TemplateFromFile());
+}
+
+/**
+ * Generate a list of available files as selectable presets.
+ */
+void TemplateFromFile::get_template_presets(const Template *tmod, TemplatePresets &presets) const
+{
+ for(auto &filename: get_filenames(TEMPLATES, {".svg"}, {"default"})) {
+ if (filename.find("icons") != Glib::ustring::npos) continue;
+ presets.emplace_back(new TemplatePresetFile(const_cast<Template *>(tmod), filename));
+ }
+}
+
+
+} // namespace Internal
+} // namespace Extension
+} // namespace Inkscape
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :