]> git.tdb.fi Git - r2c2.git/blob - source/designer/manipulator.h
3a8882e8f97f686405651774aa478c7b1289a237
[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         typedef std::list<MTrack> MTrackSeq;
46
47         struct TrackOrder
48         {
49                 Marklin::Track *track;
50                 bool rev;
51
52                 TrackOrder(Marklin::Track *t, bool r): track(t), rev(r) { }
53         };
54         typedef std::list<TrackOrder> TrackOrderSeq;
55
56         struct TrackWrap
57         {
58                 Marklin::Point pos;
59                 float rot;
60                 float width;
61                 float height;
62         };
63
64         Designer   &designer;
65         Selection  *selection;
66         MTrackSeq  tracks;
67         Marklin::Point center;
68
69         std::list<TrackWrap> wrap;
70         Marklin::Point wrap_pos;
71         float wrap_rot;
72
73         Marklin::Point gpointer;
74         int            pointer_y;
75         Mode           mode;
76         Marklin::Point move_origin;
77         float          angle;
78         float          rot_origin;
79         int            elev_origin;
80         Marklin::TrackSeq neighbors;
81         sigc::connection selection_changed_conn;
82
83         void selection_changed();
84         void update_wrap();
85         void update_neighbors();
86         void set_slope(TrackOrder &, float, float);
87 };
88
89 #endif