From da553628b2e496c0153c06913382092b951b686a Mon Sep 17 00:00:00 2001 From: Nathan Lee <2431820-nathanal@users.noreply.gitlab.com> Date: Wed, 9 Oct 2019 01:36:08 +1100 Subject: Speed up multi-node (de)selection Delay operations till all nodes are added. Deselection improvements thanks to Jabier. Refactor to reflect changes. --- src/ui/tool/control-point-selection.cpp | 52 +++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 19 deletions(-) (limited to 'src/ui/tool/control-point-selection.cpp') 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::insert(c _points_list.push_back(x); x->updateState(); - _pointChanged(x, true); if (notify) { + _update(); signal_selection_changed.emit(std::vector(1, x), true); } @@ -97,13 +97,15 @@ std::pair 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 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 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 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 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() -- cgit v1.2.3