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