X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdesigner%2Fmanipulator.cpp;h=83a093a712d77fb98949c1852fadcd6da15b7f1a;hb=abc0c5d8d150dafcf61aa522d56b2a36ee662229;hp=359fbbb5e0b8d05feb884ac4ada0fb3707ebaceb;hpb=f8a7788cee0261babfc4c804a58515aad6dfbc3d;p=r2c2.git diff --git a/source/designer/manipulator.cpp b/source/designer/manipulator.cpp index 359fbbb..83a093a 100644 --- a/source/designer/manipulator.cpp +++ b/source/designer/manipulator.cpp @@ -1,13 +1,6 @@ -/* $Id$ - -This file is part of R²C² -Copyright © 2006-2010 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - #include #include -#include +#include #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 <racks = 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::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 counts; length = 0; for(vector::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::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 Manipulator::create_straight(const R2C2::Vector &start, float di float s = sin(dir); for(vector::iterator i=lengths.begin(); i!=lengths.end(); ++i) { - map::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);