]> git.tdb.fi Git - r2c2.git/blob - source/engineer/trainlistdialog.cpp
Complete rewrite of the engineer UI
[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::Item
15 {
16 private:
17         GLtk::Label address;
18         GLtk::Label name;
19
20 public: 
21         typedef R2C2::Train *ValueType;
22
23         TrainItem(ValueType);
24
25 private:
26         virtual void on_style_change();
27 };
28
29
30 TrainListDialog::TrainListDialog(Engineer &e):
31         engineer(e),
32         layout(engineer.get_layout())
33 {
34         Loader::WidgetMap widgets;
35         DataFile::load(*this, "data/trainlistdialog.ui", widgets);
36
37         lst_trains = dynamic_cast<GLtk::List *>(get_item(widgets, "lst_trains"));
38         lst_trains->set_data(trains);
39         lst_trains->set_item_type<TrainItem>();
40
41         dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_new"))->signal_clicked.connect(sigc::mem_fun(this, &TrainListDialog::new_clicked));
42         dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_show"))->signal_clicked.connect(sigc::mem_fun(this, &TrainListDialog::show_clicked));
43
44         const map<unsigned, Train *> &ltrains = layout.get_trains();
45         for(map<unsigned, Train *>::const_iterator i=ltrains.begin(); i!=ltrains.end(); ++i)
46                 trains.append(i->second);
47 }
48
49 void TrainListDialog::new_clicked()
50 {
51         GLtk::Container *root = parent;
52         while(root->get_parent())
53                 root = root->get_parent();
54
55         NewTrainDialog *dlg = new NewTrainDialog(engineer);
56         root->add(*dlg);
57         dlg->autosize();
58 }
59
60 void TrainListDialog::show_clicked()
61 {
62         int index = lst_trains->get_selected_index();
63         if(index>=0)
64         {
65                 GLtk::Container *root = parent;
66                 while(root->get_parent())
67                         root = root->get_parent();
68
69                 TrainDialog *dlg = new TrainDialog(engineer, *trains.get(index));
70                 root->add(*dlg);
71                 dlg->autosize();
72         }
73 }
74
75
76 TrainItem::TrainItem(ValueType train):
77         address(lexical_cast<string>(train->get_address())),
78         name(train->get_name())
79 {
80         add(address);
81         add(name);
82 }
83
84 void TrainItem::on_style_change()
85 {
86         if(!style)
87                 return;
88
89         address.autosize();
90         name.autosize();
91
92         if(const GLtk::Part *part = style->get_part("children"))
93         {
94                 const GLtk::Sides &margin = part->get_margin();
95                 address.set_position(margin.left, margin.bottom);
96                 name.set_position(margin.left+30, margin.bottom);
97         }
98 }