]> 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 0a31d67808c7a72a275fd41136d01c4bc0c87d67..ce1bcb8902f27ca0ed6688755f7abb651c601059 100644 (file)
@@ -43,17 +43,19 @@ 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()
 {
-       GLtk::Container *root = parent;
-       while(root->get_parent())
-               root = root->get_parent();
-
        NewTrainDialog *dlg = new NewTrainDialog(engineer);
-       root->add(*dlg);
+       find_ancestor<GLtk::Root>()->add(*dlg);
        dlg->autosize();
 }
 
@@ -62,16 +64,36 @@ void TrainListDialog::show_clicked()
        int index = lst_trains->get_selected_index();
        if(index>=0)
        {
-               GLtk::Container *root = parent;
-               while(root->get_parent())
-                       root = root->get_parent();
-
                TrainDialog *dlg = new TrainDialog(engineer, *trains.get(index));
-               root->add(*dlg);
+               find_ancestor<GLtk::Root>()->add(*dlg);
                dlg->autosize();
        }
 }
 
+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())),