#define MEASURE_H_
#include <sigc++/sigc++.h>
+#include <msp/gl/renderable.h>
+#include "libr2c2/geometry.h"
+#include "tool.h"
class Designer;
-class Measure
+class Measure: public Tool, public Msp::GL::Renderable
{
-public:
- sigc::signal<void> signal_done;
- sigc::signal<void> signal_changed;
-
- Measure(Designer &);
- float get_parallel_distance() const { return par_dist; }
- float get_perpendicular_distance() const { return perp_dist; }
- float get_angle_difference() const { return adiff; }
- void start();
- void button_press(int, int, float, float, unsigned);
- void pointer_motion(int, int, float, float);
- void render();
private:
- enum State
- {
- NONE,
- STARTING,
- ACTIVE
- };
-
- Designer &designer;
- Marklin::Point pointer;
- Marklin::Point spoint;
- float sdir;
+ R2C2::Snap start;
+ bool start_pinned;
float par_dist;
float perp_dist;
- float adiff;
- State state;
+ R2C2::Angle adiff;
+ Msp::GL::Mesh mesh;
+
+public:
+ Measure(Designer &, Msp::Input::Mouse &, const std::set<R2C2::Object *> &);
+ virtual ~Measure();
- void snap_to_tracks(Marklin::Point &, float &);
+ float get_parallel_distance() const { return par_dist; }
+ float get_perpendicular_distance() const { return perp_dist; }
+ const R2C2::Angle &get_angle_difference() const { return adiff; }
+
+ virtual void button_press(unsigned);
+ virtual void axis_motion(unsigned, float, float);
+
+ virtual void render(Msp::GL::Renderer &, const Msp::GL::Tag &) const;
+private:
+ void update_mesh();
+ void snap_to_tracks(R2C2::Snap &);
};
#endif