]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/movetool.cpp
Move gauge to TrackAppearance
[r2c2.git] / source / designer / movetool.cpp
index c7bae59cd9a8f010d324d908b5f45699bcfd8d8e..57f6216507e63c55a3d2157eaf519d6877b3f6ef 100644 (file)
@@ -6,15 +6,29 @@ using namespace std;
 using namespace Msp;
 using namespace R2C2;
 
-MoveTool::MoveTool(Designer &d, Input::Mouse &m, const set<Object *> &o):
-       Manipulator(d, m, o),
+MoveTool::MoveTool(Designer &d, Input::Keyboard &k, Input::Mouse &m, const set<Object *> &o):
+       Manipulator(d, k, m, o),
        origin(ground_pointer)
-{ }
-
-void MoveTool::axis_motion(unsigned axis, float value, float rel)
 {
-       Manipulator::axis_motion(axis, value, rel);
+       for(ObjectArray::iterator i=objects.begin(); i!=objects.end(); ++i)
+       {
+               unsigned nls = i->object->get_n_link_slots();
+               unsigned nsn = i->object->get_n_snap_nodes();
+               unsigned j;
+               for(j=0; j<nls; ++j)
+                       if(!o.count(i->object->get_link(j)))
+                               boundaries.push_back(Boundary(&*i, j));
+               for(; j<nsn; ++j)
+                       boundaries.push_back(Boundary(&*i, j));
+       }
+
+       snap_targets = designer.get_layout().get_all<Object>();
+       for(ObjectArray::const_iterator i=objects.begin(); i!=objects.end(); ++i)
+               snap_targets.erase(i->object);
+}
 
+void MoveTool::pointer_motion()
+{
        Vector offset = center+ground_pointer-origin;
        for(vector<MObject>::iterator i=objects.begin(); i!=objects.end(); ++i)
        {
@@ -22,21 +36,13 @@ void MoveTool::axis_motion(unsigned axis, float value, float rel)
                i->object->set_rotation(i->original_rotation);
        }
 
-       const set<Track *> &ltracks = designer.get_layout().get_all<Track>();
-       float limit = max(designer.get_layout().get_catalogue().get_gauge(),
-               designer.get_camera_controller().get_view_scale()/100.0f);
+       float limit = designer.get_camera_controller().get_view_scale()/100.0f;
        MObject *snapped = 0;
-       for(set<Track *>::const_iterator i=ltracks.begin(); (i!=ltracks.end() && !snapped); ++i)
+       for(list<Boundary>::iterator i=boundaries.begin(); (!snapped && i!=boundaries.end()); ++i)
        {
-               bool ok = true;
-               for(ObjectArray::iterator j=objects.begin(); (j!=objects.end() && ok); ++j)
-                       ok = (j->object!=*i);
-               if(!ok)
-                       continue;
-
-               for(ObjectArray::iterator j=objects.begin(); (j!=objects.end() && !snapped); ++j)
-                       if(j->object->snap_to(**i, limit))
-                               snapped = &*j;
+               for(set<Object *>::const_iterator j=snap_targets.begin(); (!snapped && j!=snap_targets.end()); ++j)
+                       if((*i)->snap_to(**j, (i->limit>0 ? max(i->limit, limit) : limit)))
+                               snapped = i->object;
        }
 
        if(snapped)
@@ -54,3 +60,13 @@ void MoveTool::axis_motion(unsigned axis, float value, float rel)
                }
        }
 }
+
+
+MoveTool::Boundary::Boundary(MObject *o, unsigned i):
+       object(o),
+       index(i),
+       limit(-1)
+{
+       if(Track *track = dynamic_cast<Track *>(object->object))
+               limit = track->get_type().get_appearance().get_gauge();
+}