]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/manipulator.cpp
Fix elevation mode in Manipulator
[r2c2.git] / source / designer / manipulator.cpp
index 359fbbb5e0b8d05feb884ac4ada0fb3707ebaceb..83a093a712d77fb98949c1852fadcd6da15b7f1a 100644 (file)
@@ -1,13 +1,6 @@
-/* $Id$
-
-This file is part of R²C²
-Copyright © 2006-2010  Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
 #include <algorithm>
 #include <cmath>
-#include <msp/strings/formatter.h>
+#include <msp/strings/format.h>
 #include "libr2c2/tracktype.h"
 #include "designer.h"
 #include "manipulator.h"
@@ -17,15 +10,15 @@ using namespace std;
 using namespace R2C2;
 using namespace Msp;
 
-Manipulator::Manipulator(Designer &d, Graphics::EventSource &es, Selection &s):
+Manipulator::Manipulator(Designer &d, Input::Mouse &m, Selection &s):
        designer(d),
-       event_source(es),
+       mouse(m),
        selection(s),
        mode(NONE),
        angle(0)
 {
-       event_source.signal_button_press.connect(sigc::mem_fun(this, &Manipulator::button_press));
-       event_source.signal_pointer_motion.connect(sigc::mem_fun(this, &Manipulator::pointer_motion));
+       mouse.signal_button_press.connect(sigc::mem_fun(this, &Manipulator::button_press));
+       mouse.signal_axis_motion.connect(sigc::mem_fun(this, &Manipulator::axis_motion));
        selection.signal_changed.connect(sigc::mem_fun(this, &Manipulator::selection_changed));
 }
 
@@ -54,9 +47,9 @@ void Manipulator::start_elevate()
        if(mode)
                cancel();
 
-       elev_origin = pointer_y;
-
        mode = ELEVATE;
+
+       elev_origin = pointer.y;
 }
 
 bool Manipulator::start_extend()
@@ -323,7 +316,7 @@ void Manipulator::cancel()
        signal_done.emit(false);
 }
 
-void Manipulator::button_press(int, int, unsigned btn, unsigned)
+void Manipulator::button_press(unsigned btn)
 {
        if(!mode)
                return;
@@ -370,10 +363,13 @@ void Manipulator::button_press(int, int, unsigned btn, unsigned)
        }
 }
 
-void Manipulator::pointer_motion(int x, int y)
+void Manipulator::axis_motion(unsigned axis, float value, float)
 {
-       pointer_y = event_source.get_height()-1-y;
-       gpointer = designer.map_pointer_to_ground(x, pointer_y);
+       if(axis==0)
+               pointer.x = value;
+       else if(axis==1)
+               pointer.y = value;
+       gpointer = designer.map_pointer_to_ground(pointer);
 
        if(mode==MOVE)
        {
@@ -387,7 +383,7 @@ void Manipulator::pointer_motion(int x, int y)
 
                const set<Track *> &ltracks = designer.get_layout().get_tracks();
                float limit = max(designer.get_layout().get_catalogue().get_gauge(),
-                       designer.get_camera_controller().get_view_scale()*5/event_source.get_height());
+                       designer.get_camera_controller().get_view_scale()/100.0f);
                MTrack *snapped = 0;
                for(set<Track *>::const_iterator i=ltracks.begin(); (i!=ltracks.end() && !snapped); ++i)
                {
@@ -432,9 +428,9 @@ void Manipulator::pointer_motion(int x, int y)
                        i->track->set_rotation(angle+i->rot);
                }
        }
-       else if(mode==ELEVATE)
+       else if(mode==ELEVATE && axis==1)
        {
-               float dz = (pointer_y-elev_origin)/1000.;
+               float dz = pointer.y-elev_origin;
 
                signal_status.emit(format("Elevation: %+.0fmm (%.0fmm)", dz*1000, (center.z+dz)*1000));
 
@@ -484,11 +480,23 @@ void Manipulator::pointer_motion(int x, int y)
                                        delete *i;
                                extend_tracks = trks;
 
+                               map<ArticleNumber, unsigned> counts;
                                length = 0;
                                for(vector<Track *>::iterator i=extend_tracks.begin(); i!=extend_tracks.end(); ++i)
+                               {
                                        length += (*i)->get_type().get_total_length();
-
-                               signal_status.emit(format("Extend: %.0fmm", length*1000));
+                                       ++counts[(*i)->get_type().get_article_number()];
+                               }
+
+                               string detail;
+                               for(map<ArticleNumber, unsigned>::const_iterator i=counts.begin(); i!=counts.end(); ++i)
+                               {
+                                       if(!detail.empty())
+                                               detail += ", ";
+                                       detail += format("%dx %s", i->second, i->first);
+                               }
+
+                               signal_status.emit(format("Extend: %.0fmm (%s)", length*1000, detail));
                        }
                }
        }
@@ -641,11 +649,7 @@ vector<Track *> Manipulator::create_straight(const R2C2::Vector &start, float di
                float s = sin(dir);
                for(vector<float>::iterator i=lengths.begin(); i!=lengths.end(); ++i)
                {
-                       map<float, const TrackType *>::iterator j = types_by_length.find(*i);
-                       if(j==types_by_length.end())
-                               throw LogicError("Internal error");
-
-                       Track *track = new Track(designer.get_layout(), *j->second);
+                       Track *track = new Track(designer.get_layout(), *get_item(types_by_length, *i));
                        track->set_position(pos);
                        track->set_rotation(dir);