diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2018-05-09 19:38:45 +0000 |
|---|---|---|
| committer | Jabier Arraiza <jabier.arraiza@marker.es> | 2018-05-09 19:43:04 +0000 |
| commit | b85b43a64e3d3d7e623b4bcd99b08ef8f6fc7a43 (patch) | |
| tree | 58d4726a94512ba16e15d535b40795ef65cde0c0 /src/extension | |
| parent | fix bug compiling (diff) | |
| download | inkscape-b85b43a64e3d3d7e623b4bcd99b08ef8f6fc7a43.tar.gz inkscape-b85b43a64e3d3d7e623b4bcd99b08ef8f6fc7a43.zip | |
Reset old code to reaply fixed
Diffstat (limited to 'src/extension')
| -rw-r--r-- | src/extension/execution-env.cpp | 37 | ||||
| -rw-r--r-- | src/extension/execution-env.h | 3 | ||||
| -rw-r--r-- | src/extension/implementation/implementation.cpp | 17 | ||||
| -rw-r--r-- | src/extension/implementation/implementation.h | 7 | ||||
| -rw-r--r-- | src/extension/implementation/script.cpp | 122 | ||||
| -rw-r--r-- | src/extension/internal/bluredge.cpp | 1 | ||||
| -rw-r--r-- | src/extension/internal/filter/filter.cpp | 1 | ||||
| -rw-r--r-- | src/extension/prefdialog.cpp | 33 |
8 files changed, 141 insertions, 80 deletions
diff --git a/src/extension/execution-env.cpp b/src/extension/execution-env.cpp index bde04d924..7e233d215 100644 --- a/src/extension/execution-env.cpp +++ b/src/extension/execution-env.cpp @@ -22,8 +22,6 @@ #include "selection.h" #include "effect.h" #include "document.h" -#include "desktop.h" -#include "inkscape.h" #include "document-undo.h" #include "desktop.h" #include "object/sp-namedview.h" @@ -54,6 +52,19 @@ ExecutionEnv::ExecutionEnv (Effect * effect, Inkscape::UI::View::View * doc, Imp _show_working(show_working), _show_errors(show_errors) { + SPDesktop *desktop = (SPDesktop *)_doc; + sp_namedview_document_from_window(desktop); + + if (desktop != NULL) { + auto selected = desktop->getSelection()->items(); + for(auto x = selected.begin(); x != selected.end(); ++x){ + Glib::ustring selected_id; + selected_id = (*x)->getId(); + _selected.insert(_selected.end(), selected_id); + //std::cout << "Selected: " << selected_id << std::endl; + } + } + genDocCache(); return; @@ -178,14 +189,24 @@ ExecutionEnv::commit (void) { void ExecutionEnv::reselect (void) { - SPDesktop *desktop = SP_ACTIVE_DESKTOP; - Inkscape::Selection * selection = NULL; - if(desktop) { - selection = desktop->getSelection(); - if (!desktop->on_live_extension) { - selection->restoreBackup(); + if (_doc == NULL) { return; } + SPDocument * doc = _doc->doc(); + if (doc == NULL) { return; } + + SPDesktop *desktop = (SPDesktop *)_doc; + sp_namedview_document_from_window(desktop); + + if (desktop == NULL) { return; } + + Inkscape::Selection * selection = desktop->getSelection(); + + for (std::list<Glib::ustring>::iterator i = _selected.begin(); i != _selected.end(); ++i) { + SPObject * obj = doc->getObjectById(i->c_str()); + if (obj != NULL) { + selection->add(obj); } } + return; } diff --git a/src/extension/execution-env.h b/src/extension/execution-env.h index 8af97cd92..b1a3a8ea2 100644 --- a/src/extension/execution-env.h +++ b/src/extension/execution-env.h @@ -54,6 +54,9 @@ private: Glib::RefPtr<Glib::MainLoop> _mainloop; /** \brief The document that we're working on. */ Inkscape::UI::View::View * _doc; + /** \brief A list of the IDs of all the selected objects before + we started to work on this document. */ + std::list<Glib::ustring> _selected; /** \brief A document cache if we were passed one. */ Implementation::ImplementationDocumentCache * _docCache; diff --git a/src/extension/implementation/implementation.cpp b/src/extension/implementation/implementation.cpp index e05dbf3c4..6e6100d2b 100644 --- a/src/extension/implementation/implementation.cpp +++ b/src/extension/implementation/implementation.cpp @@ -27,23 +27,6 @@ namespace Inkscape { namespace Extension { namespace Implementation { -ImplementationDocumentCache::ImplementationDocumentCache (Inkscape::UI::View::View * view) - : _view(view) -{ - SPDesktop *desktop = (SPDesktop*)view; - Inkscape::Selection * selection = NULL; - if (desktop) { - selection = desktop->getSelection(); - if (selection && !selection->params.empty()) { - selection->restoreBackup(); - if (!desktop->on_live_extension) { - selection->emptyBackup(); - } - } - } - return; -} - Gtk::Widget * Implementation::prefs_input(Inkscape::Extension::Input *module, gchar const */*filename*/) { return module->autogui(NULL, NULL); diff --git a/src/extension/implementation/implementation.h b/src/extension/implementation/implementation.h index 5bb909ef2..1232ae0c8 100644 --- a/src/extension/implementation/implementation.h +++ b/src/extension/implementation/implementation.h @@ -56,8 +56,11 @@ class ImplementationDocumentCache { */ Inkscape::UI::View::View * _view; public: - ImplementationDocumentCache (Inkscape::UI::View::View * view); - + ImplementationDocumentCache (Inkscape::UI::View::View * view) : + _view(view) + { + return; + }; virtual ~ImplementationDocumentCache ( ) { return; }; Inkscape::UI::View::View const * view ( ) { return _view; }; }; diff --git a/src/extension/implementation/script.cpp b/src/extension/implementation/script.cpp index f1b46e8ac..f25c8a5d6 100644 --- a/src/extension/implementation/script.cpp +++ b/src/extension/implementation/script.cpp @@ -417,12 +417,11 @@ ScriptDocCache::ScriptDocCache (Inkscape::UI::View::View * view) : SPDesktop *desktop = (SPDesktop *) view; sp_namedview_document_from_window(desktop); - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setBool("/options/svgoutput/disable_optimizations", true); + Inkscape::Extension::save( Inkscape::Extension::db.get(SP_MODULE_KEY_OUTPUT_SVG_INKSCAPE), view->doc(), _filename.c_str(), false, false, false, Inkscape::Extension::FILE_SAVE_METHOD_TEMPORARY); - prefs->setBool("/options/svgoutput/disable_optimizations", false); + return; } @@ -687,14 +686,57 @@ void Script::effect(Inkscape::Extension::Effect *module, return; } - if (desktop) { - Inkscape::Selection * selection = desktop->getSelection(); - if (!selection->isEmpty()) { - selection->setBackup(); + auto selected = + desktop->getSelection()->items(); //desktop should not be NULL since doc was checked and desktop is a casted pointer + for(auto x = selected.begin(); x != selected.end(); ++x){ + Glib::ustring selected_id; + selected_id += "--id="; + selected_id += (*x)->getId(); + params.push_front(selected_id); + } + + {//add selected nodes + Inkscape::UI::Tools::NodeTool *tool = 0; + if (SP_ACTIVE_DESKTOP ) { + Inkscape::UI::Tools::ToolBase *ec = SP_ACTIVE_DESKTOP->event_context; + if (INK_IS_NODE_TOOL(ec)) { + tool = static_cast<Inkscape::UI::Tools::NodeTool*>(ec); + } + } + + if(tool){ + Inkscape::UI::ControlPointSelection *cps = tool->_selected_nodes; + for (Inkscape::UI::ControlPointSelection::iterator i = cps->begin(); i != cps->end(); ++i) { + Inkscape::UI::Node *node = dynamic_cast<Inkscape::UI::Node*>(*i); + if (node) { + std::string id = node->nodeList().subpathList().pm().item()->getId(); + + int sp = 0; + bool found_sp = false; + for(Inkscape::UI::SubpathList::iterator i = node->nodeList().subpathList().begin(); i != node->nodeList().subpathList().end(); ++i,++sp){ + if(&**i == &(node->nodeList())){ + found_sp = true; + break; + } + } + int nl=0; + bool found_nl = false; + for (Inkscape::UI::NodeList::iterator j = node->nodeList().begin(); j != node->nodeList().end(); ++j, ++nl){ + if(&*j==node){ + found_nl = true; + break; + } + } + std::ostringstream ss; + ss<< "--selected-nodes=" << id << ":" << sp << ":" << nl; + Glib::ustring selected = ss.str(); + + if(found_nl && found_sp)params.push_front(selected); + else g_warning("Something went wrong while trying to pass selected nodes to extension. Please report a bug."); + } } - params = selection->params; - module->paramListString(params); } + }//end add selected nodes file_listener fileout; int data_read = execute(command, params, dc->_filename, fileout); @@ -748,7 +790,6 @@ void Script::effect(Inkscape::Extension::Effect *module, layer = document->getObjectById(g_quark_to_string(nv->default_layer_id)); } } - desktop->showGrids(nv->grids_visible); } sp_namedview_update_layers_from_document(desktop); @@ -757,14 +798,6 @@ void Script::effect(Inkscape::Extension::Effect *module, //set the current layer desktop->setCurrentLayer(layer); } - SPDesktop *desktop = SP_ACTIVE_DESKTOP; - if (desktop) { - Inkscape::Selection * selection = desktop->getSelection(); - if (selection && selection->isEmpty() && !desktop->on_live_extension) { - selection->restoreBackup(); - selection->emptyBackup(); - } - } } mydoc->release(); } @@ -800,10 +833,12 @@ void Script::copy_doc (Inkscape::XML::Node * oldroot, Inkscape::XML::Node * newr g_warning("Error on copy_doc: NULL pointer input."); return; } + // For copying attributes in root and in namedview using Inkscape::Util::List; using Inkscape::XML::AttributeRecord; std::vector<gchar const *> attribs; + // Must explicitly copy root attributes. This must be done first since // copying grid lines calls "SPGuide::set()" which needs to know the // width, height, and viewBox of the root element. @@ -824,33 +859,80 @@ void Script::copy_doc (Inkscape::XML::Node * oldroot, Inkscape::XML::Node * newr oldroot->setAttribute(name, newroot->attribute(name)); } + // Question: Why is the "sodipodi:namedview" special? Treating it as a normal // elmement results in crashes. // Seems to be a bug: // http://inkscape.13.x6.nabble.com/Effect-that-modifies-the-document-properties-tt2822126.html std::vector<Inkscape::XML::Node *> delete_list; + Inkscape::XML::Node * oldroot_namedview = NULL; + Inkscape::XML::Node * newroot_namedview = NULL; // Make list for (Inkscape::XML::Node * child = oldroot->firstChild(); child != NULL; child = child->next()) { if (!strcmp("sodipodi:namedview", child->name())) { + oldroot_namedview = child; for (Inkscape::XML::Node * oldroot_namedview_child = child->firstChild(); oldroot_namedview_child != NULL; oldroot_namedview_child = oldroot_namedview_child->next()) { delete_list.push_back(oldroot_namedview_child); } - break; + } else { + delete_list.push_back(child); } } + if(!oldroot_namedview) + { + g_warning("Error on copy_doc: No namedview on destination document."); + return; + } + // Unparent (delete) for (unsigned int i = 0; i < delete_list.size(); i++) { sp_repr_unparent(delete_list[i]); } + + // Copy + for (Inkscape::XML::Node * child = newroot->firstChild(); + child != NULL; + child = child->next()) { + if (!strcmp("sodipodi:namedview", child->name())) { + newroot_namedview = child; + for (Inkscape::XML::Node * newroot_namedview_child = child->firstChild(); + newroot_namedview_child != NULL; + newroot_namedview_child = newroot_namedview_child->next()) { + oldroot_namedview->appendChild(newroot_namedview_child->duplicate(oldroot->document())); + } + } else { + oldroot->appendChild(child->duplicate(oldroot->document())); + } + } + attribs.clear(); - oldroot->mergeFrom(newroot, "id", true, true); + + // Must explicitly copy namedview attributes. + // Make a list of all attributes of the old namedview node. + for (List<AttributeRecord const> iter = oldroot_namedview->attributeList(); iter; ++iter) { + attribs.push_back(g_quark_to_string(iter->key)); + } + + // Delete the attributes of the old namedview node. + for (std::vector<gchar const *>::const_iterator it = attribs.begin(); it != attribs.end(); ++it) { + oldroot_namedview->setAttribute(*it, NULL); + } + + // Set the new attributes. + for (List<AttributeRecord const> iter = newroot_namedview->attributeList(); iter; ++iter) { + gchar const *name = g_quark_to_string(iter->key); + oldroot_namedview->setAttribute(name, newroot_namedview->attribute(name)); + } + + /** \todo Restore correct layer */ + /** \todo Restore correct selection */ } /** \brief This function checks the stderr file, and if it has data, diff --git a/src/extension/internal/bluredge.cpp b/src/extension/internal/bluredge.cpp index 4bcc5d715..f04007d00 100644 --- a/src/extension/internal/bluredge.cpp +++ b/src/extension/internal/bluredge.cpp @@ -53,7 +53,6 @@ BlurEdge::load (Inkscape::Extension::Extension */*module*/) void BlurEdge::effect (Inkscape::Extension::Effect *module, Inkscape::UI::View::View *desktop, Inkscape::Extension::Implementation::ImplementationDocumentCache * /*docCache*/) { - Inkscape::Selection * selection = static_cast<SPDesktop *>(desktop)->selection; float width = module->get_param_float("blur-width"); diff --git a/src/extension/internal/filter/filter.cpp b/src/extension/internal/filter/filter.cpp index 69aec1595..166e5406f 100644 --- a/src/extension/internal/filter/filter.cpp +++ b/src/extension/internal/filter/filter.cpp @@ -120,6 +120,7 @@ void Filter::effect(Inkscape::Extension::Effect *module, Inkscape::UI::View::Vie if (filterdoc == NULL) { return; // could not parse the XML source of the filter; typically parser will stderr a warning } + //printf("Calling filter effect\n"); Inkscape::Selection * selection = ((SPDesktop *)document)->selection; diff --git a/src/extension/prefdialog.cpp b/src/extension/prefdialog.cpp index 0861f1dc3..0247e18e9 100644 --- a/src/extension/prefdialog.cpp +++ b/src/extension/prefdialog.cpp @@ -18,8 +18,6 @@ // Used to get SP_ACTIVE_DESKTOP #include "inkscape.h" #include "desktop.h" -#include "document.h" -#include "document-undo.h" #include "effect.h" #include "implementation/implementation.h" @@ -63,13 +61,6 @@ PrefDialog::PrefDialog (Glib::ustring name, gchar const * help, Gtk::Widget * co controls = _effect->get_imp()->prefs_effect(_effect, SP_ACTIVE_DESKTOP, &_signal_param_change, NULL); _signal_param_change.connect(sigc::mem_fun(this, &PrefDialog::param_change)); } - SPDesktop *desktop = SP_ACTIVE_DESKTOP; - if (desktop) { - Inkscape::Selection * selection = desktop->getSelection(); - if (selection) { - selection->emptyBackup(); - } - } hbox->pack_start(*controls, true, true, 0); hbox->show(); @@ -179,29 +170,12 @@ PrefDialog::run (void) { void PrefDialog::preview_toggle (void) { - SPDesktop *desktop = SP_ACTIVE_DESKTOP; - SPDocument *document = SP_ACTIVE_DOCUMENT; - Inkscape::Selection * selection = NULL; - bool modified = document->isModifiedSinceSave(); - if(desktop) { - selection = desktop->getSelection(); - if (!selection->isEmpty()) { - selection->setBackup(); - } - } if(_param_preview->get_bool(NULL, NULL)) { + set_modal(true); if (_exEnv == NULL) { - set_modal(true); - if (desktop && selection) { - desktop->on_live_extension = true; - - } _exEnv = new ExecutionEnv(_effect, SP_ACTIVE_DESKTOP, NULL, false, false); _effect->set_execution_env(_exEnv); _exEnv->run(); - if (desktop && selection) { - selection->clear(); - } } } else { set_modal(false); @@ -211,13 +185,8 @@ PrefDialog::preview_toggle (void) { delete _exEnv; _exEnv = NULL; _effect->set_execution_env(_exEnv); - if (desktop && selection) { - selection->restoreBackup(); - desktop->on_live_extension = false; - } } } - document->setModifiedSinceSave(modified); } void |
