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