]> git.tdb.fi Git - r2c2.git/blob - source/designer/manipulator.h
Major code refactoring:
[r2c2.git] / source / designer / manipulator.h
1 #ifndef MANIPULATOR_H_
2 #define MANIPULATOR_H_
3
4 #include <sigc++/sigc++.h>
5 #include "3d/track.h"
6
7 class Designer;
8 class Selection;
9
10 class Manipulator
11 {
12 public:
13         sigc::signal<void, const std::string &> signal_status;
14         sigc::signal<void, bool> signal_done;
15
16         Manipulator(Designer &);
17         void set_selection(Selection *);
18         void start_move();
19         void start_rotate();
20         void start_elevate();
21         void duplicate();
22         void flatten();
23         void even_slope(bool =false);
24         void cancel();
25         void button_press(int, int, float, float, unsigned);
26         void pointer_motion(int, int, float, float);
27         void render();
28 private:
29         enum Mode
30         {
31                 NONE,
32                 MOVE,
33                 ROTATE,
34                 ELEVATE
35         };
36
37         struct MTrack
38         {
39                 Marklin::Track *track;
40                 Marklin::Point pos;
41                 float rot;
42
43                 MTrack(Marklin::Track *);
44         };
45
46         struct TrackOrder
47         {
48                 Marklin::Track *track;
49                 bool rev;
50
51                 TrackOrder(Marklin::Track *t, bool r): track(t), rev(r) { }
52         };
53
54         struct TrackWrap
55         {
56                 Marklin::Point pos;
57                 float rot;
58                 float width;
59                 float height;
60         };
61
62         Designer   &designer;
63         Selection  *selection;
64         std::vector<MTrack> tracks;
65         Marklin::Point center;
66
67         std::list<TrackWrap> wrap;
68         Marklin::Point wrap_pos;
69         float wrap_rot;
70
71         Marklin::Point gpointer;
72         int            pointer_y;
73         Mode           mode;
74         Marklin::Point move_origin;
75         float          angle;
76         float          rot_origin;
77         int            elev_origin;
78         std::set<Marklin::Track *> neighbors;
79         sigc::connection selection_changed_conn;
80
81         void selection_changed();
82         void update_wrap();
83         void update_neighbors();
84         void set_slope(TrackOrder &, float, float);
85 };
86
87 #endif