]> git.tdb.fi Git - r2c2.git/blobdiff - source/engineer/trainlistdialog.cpp
Base the train list item on MultiColumnItem
[r2c2.git] / source / engineer / trainlistdialog.cpp
index 5d0c9fec9d85402f94dd16c068c8947ed3bab551..f4fbb102fe580b2f114ae0810f2852eb519aa07e 100644 (file)
@@ -11,19 +11,12 @@ using namespace std;
 using namespace Msp;
 using namespace R2C2;
 
-class TrainItem: public GLtk::List::Item
+class TrainItem: public GLtk::List::MultiColumnItem
 {
-private:
-       GLtk::Label address;
-       GLtk::Label name;
-
-public:        
+public:
        typedef R2C2::Train *ValueType;
 
        TrainItem(ValueType);
-
-private:
-       virtual void on_style_change();
 };
 
 
@@ -43,7 +36,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()
@@ -60,31 +59,38 @@ void TrainListDialog::show_clicked()
        {
                TrainDialog *dlg = new TrainDialog(engineer, *trains.get(index));
                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))));
+}
 
-TrainItem::TrainItem(ValueType train):
-       address(lexical_cast<string>(train->get_address())),
-       name(train->get_name())
+void TrainListDialog::train_removed(Train &train)
 {
-       add(address);
-       add(name);
+       int i = trains.find(&train);
+       if(i>=0)
+               trains.remove(i);
 }
 
-void TrainItem::on_style_change()
+void TrainListDialog::train_name_changed(Train &train)
 {
-       if(!style)
-               return;
+       trains.refresh(&train);
+}
 
-       address.autosize();
-       name.autosize();
 
-       if(const GLtk::Part *part = style->get_part("children"))
-       {
-               const GLtk::Sides &margin = part->get_margin();
-               address.set_position(margin.left, margin.bottom);
-               name.set_position(margin.left+30, margin.bottom);
-       }
+TrainItem::TrainItem(ValueType train)
+{
+       add(*new GLtk::Label(train->get_protocol()));
+       add(*new GLtk::Label(lexical_cast<string>(train->get_address())));
+       add(*new GLtk::Label(train->get_name()));
 }
+