+/* $Id$
+
+This file is part of the MSP Märklin suite
+Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa
+Distributed under the GPL
+*/
+
#ifndef MANIPULATOR_H_
#define MANIPULATOR_H_
#include <sigc++/sigc++.h>
-#include "3d/track.h"
class Designer;
class Selection;
class Manipulator
{
-public:
- sigc::signal<void, const std::string &> signal_status;
- sigc::signal<void, bool> signal_done;
-
- Manipulator(Designer &);
- void set_selection(Selection *);
- void start_move();
- void start_rotate();
- void start_elevate();
- void duplicate();
- void flatten();
- void even_slope(bool =false);
- void cancel();
- void button_press(int, int, float, float, unsigned);
- void pointer_motion(int, int, float, float);
- void render();
private:
enum Mode
{
NONE,
MOVE,
ROTATE,
- ELEVATE
+ ELEVATE,
+ EXTEND
};
struct MTrack
TrackOrder(Marklin::Track *t, bool r): track(t), rev(r) { }
};
- struct TrackWrap
- {
- Marklin::Point pos;
- float rot;
- float width;
- float height;
- };
+public:
+ sigc::signal<void, const std::string &> signal_status;
+ sigc::signal<void, bool> signal_done;
- Designer &designer;
- Selection *selection;
+private:
+ Designer &designer;
+ Msp::Graphics::EventSource &event_source;
+ Selection &selection;
std::vector<MTrack> tracks;
Marklin::Point center;
- std::list<TrackWrap> wrap;
- Marklin::Point wrap_pos;
- float wrap_rot;
-
Marklin::Point gpointer;
- int pointer_y;
- Mode mode;
+ int pointer_y;
+ Mode mode;
Marklin::Point move_origin;
- float angle;
- float rot_origin;
- int elev_origin;
+ float angle;
+ float rot_origin;
+ int elev_origin;
std::set<Marklin::Track *> neighbors;
- sigc::connection selection_changed_conn;
+ std::vector<Marklin::Track *> extend_tracks;
+
+public:
+ Manipulator(Designer &, Msp::Graphics::EventSource &, Selection &);
+ void start_move();
+ void start_rotate();
+ void start_elevate();
+ void start_extend();
+ void duplicate();
+ void flatten();
+ void even_slope(bool =false);
+ void connect();
+ void cancel();
+private:
+ void button_press(int, int, unsigned, unsigned);
+ void pointer_motion(int, int);
void selection_changed();
- void update_wrap();
+ void update_tracks();
void update_neighbors();
void set_slope(TrackOrder &, float, float);
+ std::vector<Marklin::Track *> create_straight(const Marklin::Point &, float, float, float);
};
#endif