index 025f9bb618be83927473a0e942c4f1396969ec9d..0e5acf6c5cc84e05151f5f8de19915117a02f20a 100644 (file)
/** @file
- * Node selection - stores a set of nodes and applies transformations
+ * Control point selection - stores a set of control points and applies transformations
* to them
*/
/* Authors:
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#ifndef SEEN_UI_TOOL_NODE_SELECTION_H
-#define SEEN_UI_TOOL_NODE_SELECTION_H
+#ifndef SEEN_UI_TOOL_CONTROL_POINT_SELECTION_H
+#define SEEN_UI_TOOL_CONTROL_POINT_SELECTION_H
#include <memory>
-#include <tr1/unordered_map>
-#include <tr1/unordered_set>
-#include <boost/shared_ptr.hpp>
-#include <boost/weak_ptr.hpp>
#include <boost/optional.hpp>
#include <sigc++/sigc++.h>
#include <2geom/forward.h>
#include <2geom/point.h>
-#include "display/display-forward.h"
+#include <2geom/rect.h>
#include "util/accumulators.h"
-#include "util/hash.h"
+#include "util/unordered-containers.h"
#include "ui/tool/commit-events.h"
#include "ui/tool/manipulator.h"
+#include "snap-candidate.h"
class SPDesktop;
+struct SPCanvasGroup;
namespace Inkscape {
namespace UI {
namespace Inkscape {
namespace UI {
-class ControlPointSelection : public Manipulator {
+class ControlPointSelection : public Manipulator, public sigc::trackable {
public:
ControlPointSelection(SPDesktop *d, SPCanvasGroup *th_group);
~ControlPointSelection();
- typedef std::list<sigc::connection> connlist_type;
- typedef std::tr1::unordered_set< SelectableControlPoint * > set_type;
+ typedef INK_UNORDERED_SET<SelectableControlPoint *> set_type;
typedef set_type Set; // convenience alias
typedef set_type::iterator iterator;
void erase(iterator first, iterator last);
// find
- iterator find(const key_type &k) { return _points.find(k); }
+ iterator find(const key_type &k) {
+ return _points.find(k);
+ }
// Sometimes it is very useful to keep a list of all selectable points.
set_type const &allPoints() const { return _all_points; }
Geom::OptRect pointwiseBounds();
Geom::OptRect bounds();
+ bool transformHandlesEnabled() { return _handles_visible; }
void showTransformHandles(bool v, bool one_node);
// the two methods below do not modify the state; they are for use in manipulators
// that need to temporarily hide the handles, for example when moving a node
sigc::signal<void> signal_update;
sigc::signal<void, SelectableControlPoint *, bool> signal_point_changed;
sigc::signal<void, CommitEvent> signal_commit;
+
+ std::vector<Inkscape::SnapCandidatePoint> getOriginalPoints();
+ void setOriginalPoints();
+
private:
// The functions below are invoked from SelectableControlPoint.
// Previously they were connected to handlers when selecting, but this
// creates problems when dragging a point that was not selected.
- void _pointGrabbed();
- void _pointDragged(Geom::Point const &, Geom::Point &, GdkEventMotion *);
+ void _pointGrabbed(SelectableControlPoint *);
+ void _pointDragged(Geom::Point &, GdkEventMotion *);
void _pointUngrabbed();
bool _pointClicked(SelectableControlPoint *, GdkEventButton *);
+ void _pointChanged(SelectableControlPoint *, bool);
+ void _mouseoverChanged();
void _updateTransformHandles(bool preserve_center);
+ void _updateBounds();
bool _keyboardMove(GdkEventKey const &, Geom::Point const &);
bool _keyboardRotate(GdkEventKey const &, int);
bool _keyboardScale(GdkEventKey const &, int);
bool _keyboardFlip(Geom::Dim2);
void _keyboardTransform(Geom::Matrix const &);
- void _commitTransform(CommitEvent ce);
+ void _commitHandlesTransform(CommitEvent ce);
+ double _rotationRadius(Geom::Point const &);
+
set_type _points;
set_type _all_points;
+ INK_UNORDERED_MAP<SelectableControlPoint *, Geom::Point> _original_positions;
+ INK_UNORDERED_MAP<SelectableControlPoint *, Geom::Matrix> _last_trans;
boost::optional<double> _rot_radius;
+ boost::optional<double> _mouseover_rot_radius;
+ Geom::OptRect _bounds;
TransformHandleSet *_handles;
- SelectableControlPoint *_grabbed_point;
+ SelectableControlPoint *_grabbed_point, *_farthest_point;
unsigned _dragging : 1;
unsigned _handles_visible : 1;
unsigned _one_node_handles : 1;
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :