summaryrefslogtreecommitdiffstats
path: root/src/ui/tool/node.cpp
diff options
context:
space:
mode:
authorLiam P. White <inkscapebrony@gmail.com>2014-08-08 20:21:47 +0000
committerLiam P. White <inkscapebrony@gmail.com>2014-08-08 20:21:47 +0000
commit8efd3ec8b64beb8e86f77329d9f54a71eb8f660c (patch)
treea3c95ff4ba10f8bcc74c1b4654da9bd7ea328e70 /src/ui/tool/node.cpp
parentPonyscape feature: finish pen drawing on context switch (diff)
parentMassive performance improvment for basic node operations with thousands of nodes (diff)
downloadinkscape-8efd3ec8b64beb8e86f77329d9f54a71eb8f660c.tar.gz
inkscape-8efd3ec8b64beb8e86f77329d9f54a71eb8f660c.zip
Update to experimental r13465
(bzr r13090.1.102)
Diffstat (limited to 'src/ui/tool/node.cpp')
-rw-r--r--src/ui/tool/node.cpp32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/ui/tool/node.cpp b/src/ui/tool/node.cpp
index ed0843b65..e38f82673 100644
--- a/src/ui/tool/node.cpp
+++ b/src/ui/tool/node.cpp
@@ -1623,7 +1623,37 @@ void NodeList::reverse()
void NodeList::clear()
{
- for (iterator i = begin(); i != end();) erase (i++);
+ // ugly but more efficient clearing mechanism
+ std::vector<ControlPointSelection *> to_clear;
+ std::vector<std::pair<SelectableControlPoint *, long> > nodes;
+ long in = -1;
+ for (iterator i = begin(); i != end(); ++i) {
+ SelectableControlPoint *rm = static_cast<Node*>(i._node);
+ if (std::find(to_clear.begin(), to_clear.end(), &rm->_selection) == to_clear.end()) {
+ to_clear.push_back(&rm->_selection);
+ ++in;
+ }
+ nodes.push_back(std::make_pair(rm, in));
+ }
+ for (size_t i = 0, e = nodes.size(); i != e; ++i) {
+ to_clear[nodes[i].second]->erase(nodes[i].first, false);
+ }
+ std::vector<std::vector<SelectableControlPoint *> > emission;
+ for (long i = 0, e = to_clear.size(); i != e; ++i) {
+ emission.push_back(std::vector<SelectableControlPoint *>());
+ for (size_t j = 0, f = nodes.size(); j != f; ++j) {
+ if (nodes[j].second != i)
+ break;
+ emission[i].push_back(nodes[j].first);
+ }
+ }
+
+ for (size_t i = 0, e = emission.size(); i != e; ++i) {
+ to_clear[i]->signal_selection_changed.emit(emission[i], false);
+ }
+
+ for (iterator i = begin(); i != end();)
+ erase (i++);
}
NodeList::iterator NodeList::erase(iterator i)