]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/controlpanel.cpp
Reflect the current state of functions in a newly opened train dialog
[r2c2.git] / source / engineer / controlpanel.cpp
index 0ca2d973e43c654a2b7e25726b58091ee3aa62f7..cc2fa079fbebc03bd984ee8d74e4b44380f20a9e 100644 (file)
@@ -36,6 +36,7 @@ ControlPanel::ControlPanel(Engineer &e, Train &t):
        for(VehicleType::FunctionMap::const_iterator i=funcs.begin(); i!=funcs.end(); ++i)
        {
                GLtk::Toggle *tgl = new GLtk::Toggle(i->second);
+               tgl->set_value(train.get_function(i->first));
                tgl->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &ControlPanel::ui_function_toggled), i->first));
                pnl_functions->add(*tgl);
                tgl_funcs[i->first] = tgl;
@@ -109,12 +110,27 @@ void ControlPanel::pointer_motion(int x, int y)
                int ry = y;
                map_coords_to_ancestor(rx, ry, *find_ancestor<GLtk::Root>());
                Ray ray = engineer.get_main_view().create_ray(rx, ry);
+               Vector ground = ray.get_start()-ray.get_direction()*ray.get_start().z/ray.get_direction().z;
                Track *track = engineer.get_layout().pick<Track>(ray);
                if(track)
                {
-                       place_location = TrackIter(track, 0).block_iter();
-                       if(place_location)
+                       const vector<Block::Endpoint> &eps = track->get_block().get_endpoints();
+                       int closest_ep = -1;
+                       float closest_dist = -1;
+                       for(unsigned i=0; i<eps.size(); ++i)
                        {
+                               Snap sn = eps[i].track->get_snap_node(eps[i].track_ep);
+                               float d = (sn.position-ground).norm();
+                               if(d<closest_dist || closest_dist<0)
+                               {
+                                       closest_ep = i;
+                                       closest_dist = d;
+                               }
+                       }
+
+                       if(closest_ep>=0)
+                       {
+                               place_location = BlockIter(&track->get_block(), closest_ep);
                                ghosts.back()->place(place_location.track_iter());
                                for(unsigned i=ghosts.size()-1; i--; )
                                        ghosts[i]->place_before(*ghosts[i+1]);