]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/trainlistdialog.cpp
Keep the train list dialog up to date whem trains are added or removed
[r2c2.git] / source / engineer / trainlistdialog.cpp
index 5d0c9fec9d85402f94dd16c068c8947ed3bab551..ce1bcb8902f27ca0ed6688755f7abb651c601059 100644 (file)
@@ -43,7 +43,13 @@ TrainListDialog::TrainListDialog(Engineer &e):
 
        const map<unsigned, Train *> &ltrains = layout.get_trains();
        for(map<unsigned, Train *>::const_iterator i=ltrains.begin(); i!=ltrains.end(); ++i)
+       {
                trains.append(i->second);
+               i->second->signal_name_changed.connect(sigc::hide(sigc::bind(sigc::mem_fun(this, &TrainListDialog::train_name_changed), sigc::ref(*i->second))));
+       }
+
+       layout.signal_train_added.connect(sigc::mem_fun(this, &TrainListDialog::train_added));
+       layout.signal_train_removed.connect(sigc::mem_fun(this, &TrainListDialog::train_removed));
 }
 
 void TrainListDialog::new_clicked()
@@ -64,6 +70,30 @@ void TrainListDialog::show_clicked()
        }
 }
 
+void TrainListDialog::train_added(Train &train)
+{
+       unsigned n_items = trains.size();
+       unsigned i;
+       for(i=0; i<n_items; ++i)
+               if(trains.get(i)->get_address()>train.get_address())
+                       break;
+       trains.insert(i, &train);
+
+       train.signal_name_changed.connect(sigc::hide(sigc::bind(sigc::mem_fun(this, &TrainListDialog::train_name_changed), sigc::ref(train))));
+}
+
+void TrainListDialog::train_removed(Train &train)
+{
+       int i = trains.find(&train);
+       if(i>=0)
+               trains.remove(i);
+}
+
+void TrainListDialog::train_name_changed(Train &train)
+{
+       trains.refresh(&train);
+}
+
 
 TrainItem::TrainItem(ValueType train):
        address(lexical_cast<string>(train->get_address())),