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