diff options
| author | Nathan Lee <2431820-nathanal@users.noreply.gitlab.com> | 2019-10-08 14:36:08 +0000 |
|---|---|---|
| committer | Marc Jeanmougin <marcjeanmougin@free.fr> | 2019-10-09 22:28:43 +0000 |
| commit | da553628b2e496c0153c06913382092b951b686a (patch) | |
| tree | 6b57599983ae1b75a2d724132949a603498bbaf0 /src/ui/tool/control-point-selection.cpp | |
| parent | update inkscape.pot (diff) | |
| download | inkscape-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.cpp | 52 |
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() |
