]> git.tdb.fi Git - r2c2.git/blob - source/designer/trackproperties.cpp
b85a99ae76e6459247f2f2719a0c17e287c0802d
[r2c2.git] / source / designer / trackproperties.cpp
1 #include <msp/gltk/button.h>
2 #include <msp/gltk/label.h>
3 #include <msp/gltk/mixedrows.h>
4 #include "libr2c2/track.h"
5 #include "libr2c2/tracktype.h"
6 #include "selection.h"
7 #include "trackproperties.h"
8
9 using namespace std;
10 using namespace Msp;
11 using namespace R2C2;
12
13 TrackProperties::TrackProperties(const Selection &s):
14         selection(s)
15 {
16         GLtk::MixedRows *rows = new GLtk::MixedRows;
17         set_layout(rows);
18
19         GLtk::Label *lbl1, *lbl2;
20
21         add(*(lbl1 = new GLtk::Label("Track properties")));
22         layout->set_expand(*lbl1, true, false);
23         lbl1->set_style("title");
24
25         rows->start_row();
26         add(*(lbl1 = new GLtk::Label("Turnout ID")));
27         add(*(ent_turnout_id = new GLtk::Entry));
28         ent_turnout_id->set_edit_size(5, 1);
29
30         rows->start_row();
31         add(*(lbl2 = new GLtk::Label("Sensor ID")));
32         rows->add_constraint(*lbl1, GLtk::Layout::COPY_WIDTH, *lbl2);
33         add(*(ent_sensor_id = new GLtk::Entry));
34         ent_sensor_id->set_edit_size(5, 1);
35
36         GLtk::Button *btn;
37
38         rows->start_row();
39         rows->split_columns();
40         add_button(*(btn = new GLtk::Button("Cncl")), 0);
41         btn->set_style("red");
42
43         add_button(*(btn = new GLtk::Button("OK")), 1);
44         btn->set_style("green");
45
46         if(selection.size()==1)
47         {
48                 if(unsigned tid = selection.get_object<Track>()->get_turnout_id())
49                         ent_turnout_id->set_text(lexical_cast<string>(tid));
50         }
51
52         const set<Track *> &tracks = selection.get_objects<Track>();
53         int sensor_id = -1;
54         for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
55         {
56                 if(static_cast<int>((*i)->get_sensor_id())!=sensor_id)
57                 {
58                         if(sensor_id==-1)
59                                 sensor_id = (*i)->get_sensor_id();
60                         else
61                                 sensor_id = -2;
62                 }
63         }
64
65         if(sensor_id>=0)
66                 ent_sensor_id->set_text(lexical_cast<string>(sensor_id));
67 }
68
69 void TrackProperties::on_response(int code)
70 {
71         if(code==1)
72         {
73                 if(selection.size()==1)
74                 {
75                         Track *track = selection.get_object<Track>();
76                         if(track->get_type().is_turnout())
77                                 track->set_turnout_id(lexical_cast<unsigned>(ent_turnout_id->get_text()));
78                 }
79
80                 string sensor_id_text = ent_sensor_id->get_text();
81                 if(!sensor_id_text.empty())
82                 {
83                         unsigned sensor_id = lexical_cast<unsigned>(sensor_id_text);
84                         const set<Track *> &tracks = selection.get_objects<Track>();
85                         for(set<Track *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
86                                 if(!(*i)->get_type().is_turnout())
87                                         (*i)->set_sensor_id(sensor_id);
88                 }
89         }
90 }