]> git.tdb.fi Git - r2c2.git/blob - source/designer/manipulator.h
Add a feature to autofit straight runs of track
[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
13 class Designer;
14 class Selection;
15
16 class Manipulator
17 {
18 private:
19         enum Mode
20         {
21                 NONE,
22                 MOVE,
23                 ROTATE,
24                 ELEVATE
25         };
26
27         struct MTrack
28         {
29                 Marklin::Track *track;
30                 Marklin::Point pos;
31                 float rot;
32
33                 MTrack(Marklin::Track *);
34         };
35
36         struct TrackOrder
37         {
38                 Marklin::Track *track;
39                 bool rev;
40
41                 TrackOrder(Marklin::Track *t, bool r): track(t), rev(r) { }
42         };
43
44 public:
45         sigc::signal<void, const std::string &> signal_status;
46         sigc::signal<void, bool> signal_done;
47
48 private:
49         Designer &designer;
50         Selection &selection;
51         std::vector<MTrack> tracks;
52         Marklin::Point center;
53
54         Marklin::Point gpointer;
55         int pointer_y;
56         Mode mode;
57         Marklin::Point move_origin;
58         float angle;
59         float rot_origin;
60         int elev_origin;
61         std::set<Marklin::Track *> neighbors;
62
63 public:
64         Manipulator(Designer &, Selection &);
65
66         void start_move();
67         void start_rotate();
68         void start_elevate();
69         void duplicate();
70         void flatten();
71         void even_slope(bool =false);
72         void connect();
73         void cancel();
74         void button_press(int, int, float, float, unsigned);
75         void pointer_motion(int, int, float, float);
76 private:
77         void selection_changed();
78         void update_tracks();
79         void update_neighbors();
80         void set_slope(TrackOrder &, float, float);
81 };
82
83 #endif