diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2018-05-09 19:47:33 +0000 |
|---|---|---|
| committer | Jabier Arraiza <jabier.arraiza@marker.es> | 2018-05-09 19:47:33 +0000 |
| commit | e312c345ba946b59dcd228d1e4d382b51aa37e9d (patch) | |
| tree | 4291cf591ca52682a00bc72341dc1d626058c6d0 /src/selection.cpp | |
| parent | Reset code to reaply (diff) | |
| download | inkscape-e312c345ba946b59dcd228d1e4d382b51aa37e9d.tar.gz inkscape-e312c345ba946b59dcd228d1e4d382b51aa37e9d.zip | |
Apply fixed
Diffstat (limited to 'src/selection.cpp')
| -rw-r--r-- | src/selection.cpp | 130 |
1 files changed, 127 insertions, 3 deletions
diff --git a/src/selection.cpp b/src/selection.cpp index b8dffb4ae..f17b2efb1 100644 --- a/src/selection.cpp +++ b/src/selection.cpp @@ -25,10 +25,13 @@ #include "preferences.h" #include "desktop.h" #include "document.h" - -#include "object/sp-shape.h" +#include "ui/tools/node-tool.h" +#include "ui/tool/multi-path-manipulator.h" +#include "ui/tool/path-manipulator.h" +#include "ui/tool/control-point-selection.h" #include "object/sp-path.h" - +#include "object/sp-defs.h" +#include "object/sp-shape.h" #include "xml/repr.h" #define SP_SELECTION_UPDATE_PRIORITY (G_PRIORITY_HIGH_IDLE + 1) @@ -179,6 +182,127 @@ void Selection::_releaseSignals(SPObject *object) { _modified_connections.erase(object); } +void +Selection::emptyBackup(){ + _selected_ids.clear(); + _seldata.clear(); + params.clear(); +} + +void +Selection::setBackup () +{ + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + SPDocument *document = SP_ACTIVE_DOCUMENT; + Inkscape::UI::Tools::NodeTool *tool = 0; + if (desktop) { + Inkscape::UI::Tools::ToolBase *ec = desktop->event_context; + if (INK_IS_NODE_TOOL(ec)) { + tool = static_cast<Inkscape::UI::Tools::NodeTool*>(ec); + } + } + _selected_ids.clear(); + _seldata.clear(); + params.clear(); + auto items = const_cast<Selection *>(this)->items(); + for (auto iter = items.begin(); iter != items.end(); ++iter) { + SPItem *item = *iter; + std::string selected_id; + selected_id += "--id="; + selected_id += item->getId(); + params.push_back(selected_id); + _selected_ids.push_back(item->getId()); + } + if(tool){ + Inkscape::UI::ControlPointSelection *cps = tool->_selected_nodes; + std::list<Inkscape::UI::SelectableControlPoint *> points_list = cps->_points_list; + for (std::list<Inkscape::UI::SelectableControlPoint *>::iterator i = points_list.begin(); i != points_list.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_nodes = ss.str(); + + if(found_nl && found_sp) { + _seldata.push_back(std::make_pair(id,std::make_pair(sp,nl))); + params.push_back(selected_nodes); + } else { + g_warning("Something went wrong while trying to pass selected nodes to extension. Please report a bug."); + } + } + } + }//end add selected nodes +} + +void +Selection::restoreBackup() +{ + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + SPDocument *document = SP_ACTIVE_DOCUMENT; + Inkscape::UI::Tools::NodeTool *tool = 0; + if (desktop) { + Inkscape::UI::Tools::ToolBase *ec = desktop->event_context; + if (INK_IS_NODE_TOOL(ec)) { + tool = static_cast<Inkscape::UI::Tools::NodeTool*>(ec); + } + } + clear(); + std::vector<std::string>::iterator it = _selected_ids.begin(); + for (; it!= _selected_ids.end(); ++it){ + SPItem * item = dynamic_cast<SPItem *>(document->getObjectById(it->c_str())); + SPDefs * defs = document->getDefs(); + if (item && !defs->isAncestorOf(item)) { + add(item); + } + } + if (tool) { + Inkscape::UI::ControlPointSelection *cps = tool->_selected_nodes; + cps->selectAll(); + std::list<Inkscape::UI::SelectableControlPoint *> points_list = cps->_points_list; + cps->clear(); + Inkscape::UI::Node * node = dynamic_cast<Inkscape::UI::Node*>(*points_list.begin()); + if (node) { + Inkscape::UI::SubpathList sp = node->nodeList().subpathList(); + for (std::vector<std::pair<std::string, std::pair<int, int> > >::iterator l = _seldata.begin(); l != _seldata.end(); ++l) { + SPPath * path = dynamic_cast<SPPath *>(document->getObjectById(l->first)); + gint sp_count = 0; + for (Inkscape::UI::SubpathList::iterator j = sp.begin(); j != sp.end(); ++j, ++sp_count) { + if(sp_count == l->second.first) { + gint nt_count = 0; + for (Inkscape::UI::NodeList::iterator k = (*j)->begin(); k != (*j)->end(); ++k, ++nt_count) { + if(nt_count == l->second.second) { + cps->insert(k.ptr()); + break; + } + } + break; + } + } + } + } + points_list.clear(); + } +} + + } /* |
