summaryrefslogtreecommitdiffstats
path: root/src/ui/tool/control-point-selection.cpp
diff options
context:
space:
mode:
authorNathan Lee <2431820-nathanal@users.noreply.gitlab.com>2019-10-08 14:36:08 +0000
committerMarc Jeanmougin <marcjeanmougin@free.fr>2019-10-09 22:28:43 +0000
commitda553628b2e496c0153c06913382092b951b686a (patch)
tree6b57599983ae1b75a2d724132949a603498bbaf0 /src/ui/tool/control-point-selection.cpp
parentupdate inkscape.pot (diff)
downloadinkscape-da553628b2e496c0153c06913382092b951b686a.tar.gz
inkscape-da553628b2e496c0153c06913382092b951b686a.zip
Speed up multi-node (de)selection
Delay operations till all nodes are added. Deselection improvements thanks to Jabier. Refactor to reflect changes.
Diffstat (limited to 'src/ui/tool/control-point-selection.cpp')
-rw-r--r--src/ui/tool/control-point-selection.cpp52
1 files changed, 33 insertions, 19 deletions
diff --git a/src/ui/tool/control-point-selection.cpp b/src/ui/tool/control-point-selection.cpp
index fc069e5bf..ca81a75a0 100644
--- a/src/ui/tool/control-point-selection.cpp
+++ b/src/ui/tool/control-point-selection.cpp
@@ -87,9 +87,9 @@ std::pair<ControlPointSelection::iterator, bool> ControlPointSelection::insert(c
_points_list.push_back(x);
x->updateState();
- _pointChanged(x, true);
if (notify) {
+ _update();
signal_selection_changed.emit(std::vector<key_type>(1, x), true);
}
@@ -97,13 +97,15 @@ std::pair<ControlPointSelection::iterator, bool> ControlPointSelection::insert(c
}
/** Remove a point from the selection. */
-void ControlPointSelection::erase(iterator pos)
+void ControlPointSelection::erase(iterator pos, bool to_update)
{
SelectableControlPoint *erased = *pos;
_points_list.remove(*pos);
_points.erase(pos);
erased->updateState();
- _pointChanged(erased, false);
+ if (to_update) {
+ _update();
+ }
}
ControlPointSelection::size_type ControlPointSelection::erase(const key_type &k, bool notify)
{
@@ -119,18 +121,27 @@ ControlPointSelection::size_type ControlPointSelection::erase(const key_type &k,
void ControlPointSelection::erase(iterator first, iterator last)
{
std::vector<SelectableControlPoint *> out(first, last);
- while (first != last) erase(first++);
+ while (first != last) {
+ erase(first++, false);
+ }
+ _update();
signal_selection_changed.emit(out, false);
}
/** Remove all points from the selection, making it empty. */
void ControlPointSelection::clear()
{
- std::vector<SelectableControlPoint *> out(begin(), end());
- for (iterator i = begin(); i != end(); )
- erase(i++);
- if (!out.empty())
- signal_selection_changed.emit(out, false);
+ if (empty()) {
+ return;
+ }
+
+ std::vector<SelectableControlPoint *> out(begin(), end()); // begin() takes from _points
+ _points.clear();
+ _points_list.clear();
+ for (auto erased : out) {
+ erased->updateState();
+ }
+ signal_selection_changed.emit(out, false);
}
/** Select all points that this selection can contain. */
@@ -140,8 +151,10 @@ void ControlPointSelection::selectAll()
insert(_all_point, false);
}
std::vector<SelectableControlPoint *> out(_all_points.begin(), _all_points.end());
- if (!out.empty())
+ if (!out.empty()) {
+ _update();
signal_selection_changed.emit(out, true);
+ }
}
/** Select all points inside the given rectangle (in desktop coordinates). */
void ControlPointSelection::selectArea(Geom::Rect const &r)
@@ -153,8 +166,10 @@ void ControlPointSelection::selectArea(Geom::Rect const &r)
out.push_back(_all_point);
}
}
- if (!out.empty())
+ if (!out.empty()) {
+ _update();
signal_selection_changed.emit(out, true);
+ }
}
/** Unselect all selected points and select all unselected points. */
void ControlPointSelection::invertSelection()
@@ -170,6 +185,7 @@ void ControlPointSelection::invertSelection()
insert(_all_point, false);
}
}
+ _update();
if (!in.empty())
signal_selection_changed.emit(in, false);
if (!out.empty())
@@ -438,20 +454,18 @@ bool ControlPointSelection::_pointClicked(SelectableControlPoint *p, GdkEventBut
return false;
}
-void ControlPointSelection::_pointChanged(SelectableControlPoint *p, bool selected)
+void ControlPointSelection::_mouseoverChanged()
+{
+ _mouseover_rot_radius = boost::none;
+}
+
+void ControlPointSelection::_update()
{
_updateBounds();
_updateTransformHandles(false);
if (_bounds) {
_handles->rotationCenter().move(_bounds->midpoint());
}
-
- //signal_point_changed.emit(p, selected);
-}
-
-void ControlPointSelection::_mouseoverChanged()
-{
- _mouseover_rot_radius = boost::none;
}
void ControlPointSelection::_updateBounds()