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));
}
if(mode)
cancel();
- elev_origin = pointer_y;
-
mode = ELEVATE;
+
+ elev_origin = pointer.y;
}
bool Manipulator::start_extend()
signal_done.emit(false);
}
-void Manipulator::button_press(int, int, unsigned btn, unsigned)
+void Manipulator::button_press(unsigned btn)
{
if(!mode)
return;
}
}
-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)
{
const set<Track *> <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<Track *>::const_iterator i=ltracks.begin(); (i!=ltracks.end() && !snapped); ++i)
{
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));
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);