From cf457eea72b81850da5503d0091952871135c1fd Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Wed, 28 Jun 2017 09:04:16 +0200 Subject: Refactor profile directory use and promote IO::Resource get_path and get_filename methods --- src/file.cpp | 45 +++------------------------------------------ 1 file changed, 3 insertions(+), 42 deletions(-) (limited to 'src/file.cpp') diff --git a/src/file.cpp b/src/file.cpp index 43a9c6f5b..b9d896de0 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -50,6 +50,7 @@ #include "inkscape-version.h" #include "ui/interface.h" #include "io/sys.h" +#include "io/resource.h" #include "message-stack.h" #include "path-prefix.h" #include "print.h" @@ -67,6 +68,7 @@ using Inkscape::DocumentUndo; +using Inkscape::IO::Resource::TEMPLATES; #ifdef WITH_GNOME_VFS # include @@ -159,48 +161,7 @@ SPDesktop *sp_file_new(const std::string &templ) Glib::ustring sp_file_default_template_uri() { - std::list sources; - sources.push_back( Inkscape::Application::profile_path("templates") ); // first try user's local dir - sources.push_back( g_strdup(INKSCAPE_TEMPLATESDIR) ); // then the system templates dir - std::list baseNames; - gchar const* localized = _("default.svg"); - if (strcmp("default.svg", localized) != 0) { - baseNames.push_back(localized); - } - baseNames.push_back("default.svg"); - gchar *foundTemplate = 0; - - for (std::list::iterator it = sources.begin(); (it != sources.end()) && !foundTemplate; ++it) { - for (std::list::iterator nameIt = baseNames.begin(); (nameIt != baseNames.end()) && !foundTemplate; ++nameIt) { - gchar *dirname = *it; - if ( Inkscape::IO::file_test( dirname, (GFileTest)(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR) ) ) { - - // TRANSLATORS: default.svg is localizable - this is the name of the default document - // template. This way you can localize the default pagesize, translate the name of - // the default layer, etc. If you wish to localize this file, please create a - // localized share/templates/default.xx.svg file, where xx is your language code. - char *tmp = g_build_filename(dirname, *nameIt, NULL); - if (Inkscape::IO::file_test(tmp, G_FILE_TEST_IS_REGULAR)) { - foundTemplate = tmp; - } else { - g_free(tmp); - } - } - } - } - - for (std::list::iterator it = sources.begin(); it != sources.end(); ++it) { - g_free(*it); - } - - Glib::ustring templateUri = foundTemplate ? foundTemplate : ""; - - if (foundTemplate) { - g_free(foundTemplate); - foundTemplate = 0; - } - - return templateUri; + return Inkscape::IO::Resource::get_filename(TEMPLATES, "default.svg", _("default.svg")); } SPDesktop* sp_file_new_default() -- cgit v1.2.3 From b3419faaf2252a4e031db217f50edaf0531641ab Mon Sep 17 00:00:00 2001 From: Christophe Lebras Date: Sat, 1 Jul 2017 17:58:21 +0000 Subject: Add function to save template Saves template as default. Does not save template informations yet. --- src/file.cpp | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) (limited to 'src/file.cpp') diff --git a/src/file.cpp b/src/file.cpp index b9d896de0..958d2b620 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -69,6 +69,7 @@ using Inkscape::DocumentUndo; using Inkscape::IO::Resource::TEMPLATES; +using Inkscape::IO::Resource::USER; #ifdef WITH_GNOME_VFS # include @@ -122,7 +123,7 @@ SPDesktop *sp_file_new(const std::string &templ) { SPDocument *doc = SPDocument::createNewDoc( !templ.empty() ? templ.c_str() : 0 , TRUE, true ); g_return_val_if_fail(doc != NULL, NULL); - + // Remove all the template info from xml tree Inkscape::XML::Node *myRoot = doc->getReprRoot(); Inkscape::XML::Node *nodeToRemove = sp_repr_lookup_name(myRoot, "inkscape:_templateinfo"); @@ -132,11 +133,11 @@ SPDesktop *sp_file_new(const std::string &templ) delete nodeToRemove; DocumentUndo::setUndoSensitive(doc, true); } - + SPDesktop *olddesktop = SP_ACTIVE_DESKTOP; if (olddesktop) olddesktop->setWaitingCursor(); - + SPViewWidget *dtw = sp_desktop_widget_new(sp_document_namedview(doc, NULL)); // TODO this will trigger broken link warnings, etc. g_return_val_if_fail(dtw != NULL, NULL); sp_create_window(dtw, TRUE); @@ -145,12 +146,12 @@ SPDesktop *sp_file_new(const std::string &templ) doc->doUnref(); sp_namedview_window_from_document(desktop); - sp_namedview_update_layers_from_document(desktop); + sp_namedview_update_layers_from_document(desktop); #ifdef WITH_DBUS Inkscape::Extension::Dbus::dbus_init_desktop_interface(desktop); #endif - + if (olddesktop) olddesktop->clearWaitingCursor(); if (desktop) @@ -1006,6 +1007,21 @@ sp_file_save_a_copy(Gtk::Window &parentWindow, gpointer /*object*/, gpointer /*d return sp_file_save_dialog(parentWindow, SP_ACTIVE_DOCUMENT, Inkscape::Extension::FILE_SAVE_METHOD_SAVE_COPY); } +/** + * Save a copy of a document as template. + */ +void +sp_file_save_template(Gtk::Window &parentWindow) +{ + if (!SP_ACTIVE_DOCUMENT) + return; + + ///auto filename = Inkscape::IO::Resource::get_filename(TEMPLATES, "default.svg"); + auto filename = Inkscape::IO::Resource::get_path_ustring(USER, TEMPLATES, "default.svg"); + file_save(parentWindow, SP_ACTIVE_DOCUMENT, filename, Inkscape::Extension::db.get(".svg"), false, false, Inkscape::Extension::FILE_SAVE_METHOD_INKSCAPE_SVG); +} + + /*###################### ## I M P O R T @@ -1069,7 +1085,7 @@ void sp_import_document(SPDesktop *desktop, SPDocument *clipdoc, bool in_place) SPLPEItem * pasted_lpe_item = dynamic_cast(pasted); if (pasted_lpe_item){ pasted_lpe_item->forkPathEffectsIfNecessary(1); - } + } pasted_objects_not.push_back(obj_copy); } Inkscape::Selection *selection = desktop->getSelection(); @@ -1127,7 +1143,7 @@ file_import(SPDocument *in_doc, const Glib::ustring &uri, { SPDesktop *desktop = SP_ACTIVE_DESKTOP; bool cancelled = false; - + //DEBUG_MESSAGE( fileImport, "file_import( in_doc:%p uri:[%s], key:%p", in_doc, uri, key ); SPDocument *doc; try { @@ -1660,7 +1676,7 @@ Inkscape::UI::Dialog::OCAL::ImportDialog* import_ocal_dialog = NULL; void on_import_from_ocal_response(Glib::ustring filename) { SPDocument *doc = SP_ACTIVE_DOCUMENT; - + if (!filename.empty()) { Inkscape::Extension::Extension *selection = import_ocal_dialog->get_selection_type(); file_import(doc, filename, selection); @@ -1686,7 +1702,7 @@ sp_file_import_from_ocal(Gtk::Window &parent_window) import_ocal_dialog->signal_response().connect( sigc::ptr_fun(&on_import_from_ocal_response)); } - + import_ocal_dialog->show_all(); } -- cgit v1.2.3 From 8f96d83587c2409c431754a08fb4b79cc19fc8c2 Mon Sep 17 00:00:00 2001 From: Christophe Lebras Date: Sun, 2 Jul 2017 03:50:06 +0100 Subject: Manage template informations Template informations are added to the saved file. File name is is the same as template name Template is saved as default.svg only if requested by user. --- src/file.cpp | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 4 deletions(-) (limited to 'src/file.cpp') diff --git a/src/file.cpp b/src/file.cpp index 958d2b620..47385c53e 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -1011,14 +1011,83 @@ sp_file_save_a_copy(Gtk::Window &parentWindow, gpointer /*object*/, gpointer /*d * Save a copy of a document as template. */ void -sp_file_save_template(Gtk::Window &parentWindow) +sp_file_save_template(Gtk::Window &parentWindow, Glib::ustring name, + Glib::ustring author, Glib::ustring description, Glib::ustring keywords, + bool isDefault) { + if (!SP_ACTIVE_DOCUMENT) return; - ///auto filename = Inkscape::IO::Resource::get_filename(TEMPLATES, "default.svg"); - auto filename = Inkscape::IO::Resource::get_path_ustring(USER, TEMPLATES, "default.svg"); - file_save(parentWindow, SP_ACTIVE_DOCUMENT, filename, Inkscape::Extension::db.get(".svg"), false, false, Inkscape::Extension::FILE_SAVE_METHOD_INKSCAPE_SVG); + auto document = SP_ACTIVE_DOCUMENT; + + DocumentUndo::setUndoSensitive(document, false); + + auto root = document->getReprRoot(); + auto xml_doc = document->getReprDoc(); + + auto templateinfo_node = xml_doc->createElement("inkscape:_templateinfo"); + Inkscape::GC::release(templateinfo_node); + + auto element_node = xml_doc->createElement("inkscape:_name"); + Inkscape::GC::release(element_node); + + element_node->appendChild(xml_doc->createTextNode(name.c_str())); + templateinfo_node->appendChild(element_node); + + element_node = xml_doc->createElement("inkscape:author"); + Inkscape::GC::release(element_node); + + element_node->appendChild(xml_doc->createTextNode(author.c_str())); + templateinfo_node->appendChild(element_node); + + element_node = xml_doc->createElement("inkscape:_shortdesc"); + Inkscape::GC::release(element_node); + + element_node->appendChild(xml_doc->createTextNode(description.c_str())); + templateinfo_node->appendChild(element_node); + + element_node = xml_doc->createElement("inkscape:date"); + Inkscape::GC::release(element_node); + + element_node->appendChild(xml_doc->createTextNode( + Glib::DateTime::create_now_local().format("%F").c_str())); + templateinfo_node->appendChild(element_node); + + element_node = xml_doc->createElement("inkscape:_keywords"); + Inkscape::GC::release(element_node); + + element_node->appendChild(xml_doc->createTextNode(keywords.c_str())); + templateinfo_node->appendChild(element_node); + + root->appendChild(templateinfo_node); + + if (isDefault) { + + auto filename = Inkscape::IO::Resource::get_path_ustring(USER, + TEMPLATES, "default.svg"); + file_save(parentWindow, document, filename, + Inkscape::Extension::db.get(".svg"), false, false, + Inkscape::Extension::FILE_SAVE_METHOD_INKSCAPE_SVG); + } + + name += ".svg"; + + auto filename = Inkscape::IO::Resource::get_path_ustring(USER, TEMPLATES, + name.c_str()); + file_save(parentWindow, document, filename, + Inkscape::Extension::db.get(".svg"), false, false, + Inkscape::Extension::FILE_SAVE_METHOD_INKSCAPE_SVG); + + auto nodeToRemove = sp_repr_lookup_name(root, "inkscape:_templateinfo"); + + if (nodeToRemove != NULL){ + + sp_repr_unparent(nodeToRemove); + delete nodeToRemove; + } + + DocumentUndo::setUndoSensitive(document, true); } -- cgit v1.2.3 From 39b41c925b4be0944724a5a9332a9a6d80faf86d Mon Sep 17 00:00:00 2001 From: Christophe Lebras Date: Sun, 2 Jul 2017 14:29:50 +0100 Subject: Skip empty template information --- src/file.cpp | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) (limited to 'src/file.cpp') diff --git a/src/file.cpp b/src/file.cpp index 47385c53e..549ed7d6e 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -1016,7 +1016,7 @@ sp_file_save_template(Gtk::Window &parentWindow, Glib::ustring name, bool isDefault) { - if (!SP_ACTIVE_DOCUMENT) + if (!SP_ACTIVE_DOCUMENT || name.length() == 0) return; auto document = SP_ACTIVE_DOCUMENT; @@ -1035,17 +1035,24 @@ sp_file_save_template(Gtk::Window &parentWindow, Glib::ustring name, element_node->appendChild(xml_doc->createTextNode(name.c_str())); templateinfo_node->appendChild(element_node); - element_node = xml_doc->createElement("inkscape:author"); - Inkscape::GC::release(element_node); + if (author.length() != 0) { - element_node->appendChild(xml_doc->createTextNode(author.c_str())); - templateinfo_node->appendChild(element_node); + element_node = xml_doc->createElement("inkscape:author"); + Inkscape::GC::release(element_node); - element_node = xml_doc->createElement("inkscape:_shortdesc"); - Inkscape::GC::release(element_node); + element_node->appendChild(xml_doc->createTextNode(author.c_str())); + templateinfo_node->appendChild(element_node); + } - element_node->appendChild(xml_doc->createTextNode(description.c_str())); - templateinfo_node->appendChild(element_node); + if (description.length() != 0) { + + element_node = xml_doc->createElement("inkscape:_shortdesc"); + Inkscape::GC::release(element_node); + + element_node->appendChild(xml_doc->createTextNode(description.c_str())); + templateinfo_node->appendChild(element_node); + + } element_node = xml_doc->createElement("inkscape:date"); Inkscape::GC::release(element_node); @@ -1054,11 +1061,15 @@ sp_file_save_template(Gtk::Window &parentWindow, Glib::ustring name, Glib::DateTime::create_now_local().format("%F").c_str())); templateinfo_node->appendChild(element_node); - element_node = xml_doc->createElement("inkscape:_keywords"); - Inkscape::GC::release(element_node); + if (keywords.length() != 0) { - element_node->appendChild(xml_doc->createTextNode(keywords.c_str())); - templateinfo_node->appendChild(element_node); + element_node = xml_doc->createElement("inkscape:_keywords"); + Inkscape::GC::release(element_node); + + element_node->appendChild(xml_doc->createTextNode(keywords.c_str())); + templateinfo_node->appendChild(element_node); + + } root->appendChild(templateinfo_node); @@ -1071,7 +1082,7 @@ sp_file_save_template(Gtk::Window &parentWindow, Glib::ustring name, Inkscape::Extension::FILE_SAVE_METHOD_INKSCAPE_SVG); } - name += ".svg"; + name.append(".svg"); auto filename = Inkscape::IO::Resource::get_path_ustring(USER, TEMPLATES, name.c_str()); -- cgit v1.2.3