]> git.tdb.fi Git - r2c2.git/blob - source/designer/manipulator.h
Further adjustments to changes in GLtk
[r2c2.git] / source / designer / manipulator.h
1 #ifndef MANIPULATOR_H_
2 #define MANIPULATOR_H_
3
4 #include <sigc++/sigc++.h>
5 #include "libr2c2/geometry.h"
6
7 class Designer;
8 class Selection;
9
10 class Manipulator
11 {
12 private:
13         enum Mode
14         {
15                 NONE,
16                 MOVE,
17                 ROTATE,
18                 ELEVATE,
19                 EXTEND
20         };
21
22         struct MObject
23         {
24                 R2C2::Object *object;
25                 R2C2::Vector pos;
26                 R2C2::Angle rot;
27
28                 MObject(R2C2::Object *);
29         };
30
31         struct TrackOrder
32         {
33                 R2C2::Track *track;
34                 bool rev;
35
36                 TrackOrder(R2C2::Track *t, bool r): track(t), rev(r) { }
37         };
38
39 public:
40         sigc::signal<void, const std::string &> signal_status;
41         sigc::signal<void, bool> signal_done;
42
43 private:
44         Designer &designer;
45         Msp::Input::Mouse &mouse;
46         Selection &selection;
47         std::vector<MObject> objects;
48         R2C2::Vector center;
49
50         R2C2::Vector pointer;
51         R2C2::Vector gpointer;
52         Mode mode;
53         R2C2::Vector move_origin;
54         R2C2::Angle angle;
55         R2C2::Angle rot_origin;
56         float elev_origin;
57         std::set<R2C2::Object *> neighbors;
58         std::vector<R2C2::Track *> extend_tracks;
59
60 public:
61         Manipulator(Designer &, Msp::Input::Mouse &, Selection &);
62
63         void start_move();
64         void start_rotate();
65         void start_elevate();
66         bool start_extend();
67         void duplicate();
68         void flatten();
69         void even_slope(bool =false);
70         void connect();
71         void cancel();
72 private:
73         void button_press(unsigned);
74         void axis_motion(unsigned, float, float);
75         void selection_changed();
76         void update_objects();
77         void update_neighbors();
78         void set_slope(TrackOrder &, float, float);
79         std::vector<R2C2::Track *> create_straight(const R2C2::Vector &, const R2C2::Angle &, float, float);
80 };
81
82 #endif