]> git.tdb.fi Git - r2c2.git/blob - source/engineer/trainlistdialog.cpp
f4fbb102fe580b2f114ae0810f2852eb519aa07e
[r2c2.git] / source / engineer / trainlistdialog.cpp
1 #include <msp/core/maputils.h>
2 #include <msp/gltk/button.h>
3 #include <msp/gltk/style.h>
4 #include "engineer.h"
5 #include "libr2c2/train.h"
6 #include "newtraindialog.h"
7 #include "traindialog.h"
8 #include "trainlistdialog.h"
9
10 using namespace std;
11 using namespace Msp;
12 using namespace R2C2;
13
14 class TrainItem: public GLtk::List::MultiColumnItem
15 {
16 public:
17         typedef R2C2::Train *ValueType;
18
19         TrainItem(ValueType);
20 };
21
22
23 TrainListDialog::TrainListDialog(Engineer &e):
24         engineer(e),
25         layout(engineer.get_layout())
26 {
27         Loader::WidgetMap widgets;
28         DataFile::load(*this, "data/trainlistdialog.ui", widgets);
29
30         lst_trains = dynamic_cast<GLtk::List *>(get_item(widgets, "lst_trains"));
31         lst_trains->set_data(trains);
32         lst_trains->set_item_type<TrainItem>();
33
34         dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_new"))->signal_clicked.connect(sigc::mem_fun(this, &TrainListDialog::new_clicked));
35         dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_show"))->signal_clicked.connect(sigc::mem_fun(this, &TrainListDialog::show_clicked));
36
37         const map<unsigned, Train *> &ltrains = layout.get_trains();
38         for(map<unsigned, Train *>::const_iterator i=ltrains.begin(); i!=ltrains.end(); ++i)
39         {
40                 trains.append(i->second);
41                 i->second->signal_name_changed.connect(sigc::hide(sigc::bind(sigc::mem_fun(this, &TrainListDialog::train_name_changed), sigc::ref(*i->second))));
42         }
43
44         layout.signal_train_added.connect(sigc::mem_fun(this, &TrainListDialog::train_added));
45         layout.signal_train_removed.connect(sigc::mem_fun(this, &TrainListDialog::train_removed));
46 }
47
48 void TrainListDialog::new_clicked()
49 {
50         NewTrainDialog *dlg = new NewTrainDialog(engineer);
51         find_ancestor<GLtk::Root>()->add(*dlg);
52         dlg->autosize();
53 }
54
55 void TrainListDialog::show_clicked()
56 {
57         int index = lst_trains->get_selected_index();
58         if(index>=0)
59         {
60                 TrainDialog *dlg = new TrainDialog(engineer, *trains.get(index));
61                 find_ancestor<GLtk::Root>()->add(*dlg);
62         }
63 }
64
65 void TrainListDialog::train_added(Train &train)
66 {
67         unsigned n_items = trains.size();
68         unsigned i;
69         for(i=0; i<n_items; ++i)
70                 if(trains.get(i)->get_address()>train.get_address())
71                         break;
72         trains.insert(i, &train);
73
74         train.signal_name_changed.connect(sigc::hide(sigc::bind(sigc::mem_fun(this, &TrainListDialog::train_name_changed), sigc::ref(train))));
75 }
76
77 void TrainListDialog::train_removed(Train &train)
78 {
79         int i = trains.find(&train);
80         if(i>=0)
81                 trains.remove(i);
82 }
83
84 void TrainListDialog::train_name_changed(Train &train)
85 {
86         trains.refresh(&train);
87 }
88
89
90 TrainItem::TrainItem(ValueType train)
91 {
92         add(*new GLtk::Label(train->get_protocol()));
93         add(*new GLtk::Label(lexical_cast<string>(train->get_address())));
94         add(*new GLtk::Label(train->get_name()));
95 }
96