-/* $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"
+#include <set>
+#include <vector>
+#include "libr2c2/object.h"
+#include "tool.h"
-class Designer;
class Selection;
-class Manipulator
+class Manipulator: public Tool
{
-private:
- enum Mode
- {
- NONE,
- MOVE,
- ROTATE,
- ELEVATE
- };
-
- struct MTrack
+protected:
+ struct MObject
{
- Marklin::Track *track;
- Marklin::Point pos;
- float rot;
+ R2C2::Object *object;
+ R2C2::Vector original_position;
+ R2C2::Angle original_rotation;
- MTrack(Marklin::Track *);
- };
-
- struct TrackOrder
- {
- Marklin::Track *track;
- bool rev;
-
- TrackOrder(Marklin::Track *t, bool r): track(t), rev(r) { }
- };
-
- struct TrackWrap
- {
- Marklin::Point pos;
- float rot;
- float width;
- float height;
+ MObject(R2C2::Object *);
};
public:
- sigc::signal<void, const std::string &> signal_status;
sigc::signal<void, bool> signal_done;
-private:
- Designer &designer;
- Selection *selection;
- std::vector<MTrack> tracks;
- Marklin::Point center;
-
- std::list<TrackWrap> wrap;
- Marklin::Point wrap_pos;
- float wrap_rot;
+protected:
+ typedef std::vector<MObject> ObjectArray;
- Marklin::Point gpointer;
- int pointer_y;
- Mode mode;
- Marklin::Point move_origin;
- float angle;
- float rot_origin;
- int elev_origin;
- std::set<Marklin::Track *> neighbors;
- sigc::connection selection_changed_conn;
+ ObjectArray objects;
+ R2C2::Vector center;
public:
- Manipulator(Designer &);
+ Manipulator(Designer &, Msp::Input::Keyboard &, Msp::Input::Mouse &, const std::set<R2C2::Object *> &);
+ virtual ~Manipulator();
- 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:
- void selection_changed();
- void update_wrap();
- void update_neighbors();
- void set_slope(TrackOrder &, float, float);
+ virtual void finish();
};
#endif