#include <msp/gltk/button.h>
+#include <msp/gltk/column.h>
#include <msp/gltk/label.h>
+#include <msp/gltk/row.h>
+#include "libr2c2/block.h"
+#include "libr2c2/track.h"
#include "zoneproperties.h"
using namespace std;
using namespace Msp;
using namespace R2C2;
+string track_block_name(Track *const &track)
+{
+ if(track)
+ return track->get_block().get_name();
+ else
+ return "(unspecified)";
+}
+
ZoneProperties::ZoneProperties(Zone &z):
- zone(z)
+ zone(z),
+ up_directions(&track_block_name)
{
- set_size(300, 140);
+ set_layout(new GLtk::Layout);
+ GLtk::Column col(*layout);
- GLtk::Label *lbl;
+ GLtk::Label *lbl1, *lbl2;
+
+ add(*(lbl1 = new GLtk::Label("Zone properties")));
+ lbl1->set_style("title");
+
+ {
+ GLtk::Row row(*layout);
+ add(*(lbl1 = new GLtk::Label("Group")));
+ add(*(ent_group = new GLtk::Entry(zone.get_group())));
+ ent_group->set_edit_size(30, 1);
+ }
- add(*(lbl = new GLtk::Label("Zone properties")));
- lbl->set_geometry(GLtk::Geometry(10, geom.h-30, geom.w-20, 20));
+ {
+ GLtk::Row row(*layout);
+ add(*(lbl2 = new GLtk::Label("Qualifier")));
+ layout->add_constraint(*lbl1, GLtk::Layout::COPY_WIDTH, *lbl2);
- add(*(lbl = new GLtk::Label("Group")));
- lbl->set_geometry(GLtk::Geometry(10, geom.h-65, 70, 20));
+ add(*(drp_qualifier = new GLtk::Dropdown));
+ GLtk::ListDataStore<string> &data = dynamic_cast<GLtk::ListDataStore<string> &>(drp_qualifier->get_data());
+ const char *qualifiers[] = { "(none)", "track", "platform", "siding", 0 };
+ for(unsigned i=0; qualifiers[i]; ++i)
+ {
+ data.append(qualifiers[i]);
+ if(zone.get_qualifier()==qualifiers[i])
+ drp_qualifier->set_selected_index(i);
+ }
- add(*(ent_group = new GLtk::Entry(zone.get_group())));
- ent_group->set_geometry(GLtk::Geometry(80, geom.h-65, geom.w-90, 20));
-
- add(*(lbl = new GLtk::Label("Qualifier")));
- lbl->set_geometry(GLtk::Geometry(10, geom.h-95, 70, 20));
+ if(zone.get_qualifier().empty())
+ drp_qualifier->set_selected_index(0);
+ }
- add(*(drp_qualifier = new GLtk::Dropdown));
- drp_qualifier->set_geometry(GLtk::Geometry(80, geom.h-95, 80, 20));
- const char *qualifiers[] = { "track", "platform", "siding", 0 };
- for(unsigned i=0; qualifiers[i]; ++i)
{
- drp_qualifier->append(qualifiers[i]);
- if(zone.get_qualifier()==qualifiers[i])
- drp_qualifier->set_selected_index(i);
+ GLtk::Row row(*layout);
+ add(*(lbl1 = new GLtk::Label("Number")));
+ layout->add_constraint(*lbl1, GLtk::Layout::COPY_WIDTH, *lbl2);
+ unsigned n = zone.get_number();
+ add(*(ent_number = new GLtk::Entry(n ? lexical_cast<string>(zone.get_number()) : string())));
+ ent_number->set_edit_size(4, 1);
}
- add(*(lbl = new GLtk::Label("Number")));
- lbl->set_geometry(GLtk::Geometry(170, geom.h-95, 70, 20));
+ {
+ GLtk::Row row(*layout);
+ add(*(lbl2 = new GLtk::Label("Up towards")));
+ layout->add_constraint(*lbl1, GLtk::Layout::COPY_WIDTH, *lbl2);
+ add(*(drp_up_direction = new GLtk::Dropdown(up_directions)));
+
+ up_directions.append(0);
- add(*(ent_number = new GLtk::Entry(lexical_cast(zone.get_number()))));
- ent_number->set_geometry(GLtk::Geometry(240, geom.h-95, 50, 20));
+ Track *up = zone.get_end(TrackChain::UP).next().track();
+ if(!up)
+ drp_up_direction->set_selected_index(0);
+
+ for(unsigned i=0; i<2; ++i)
+ if(TrackIter iter = zone.get_end(i).next())
+ {
+ up_directions.append(iter.track());
+ if(iter.track()==up)
+ drp_up_direction->set_selected_index(up_directions.size()-1);
+ }
+ }
+
+ {
+ GLtk::Row row(*layout);
+ add(*(lbl1 = new GLtk::Label("Direction")));
+ layout->add_constraint(*lbl1, GLtk::Layout::COPY_WIDTH, *lbl2);
+
+ add(*(drp_preferred_dir = new GLtk::Dropdown));
+ GLtk::ListDataStore<string> &data = dynamic_cast<GLtk::ListDataStore<string> &>(drp_preferred_dir->get_data());
+ const char *directions[] = { "either", "up", "down", 0 };
+ for(unsigned i=0; directions[i]; ++i)
+ {
+ data.append(directions[i]);
+ if(zone.get_preferred_direction()==i)
+ drp_preferred_dir->set_selected_index(i);
+ }
+ }
GLtk::Button *btn;
- add_button(*(btn = new GLtk::Button("Cncl")), 0);
- btn->set_geometry(GLtk::Geometry(geom.w-90, 10, 40, 24));
- btn->set_style("red");
+ {
+ GLtk::Row row(*layout);
+ row.split();
+ add_button(*(btn = new GLtk::Button("Cncl")), 0);
+ btn->set_style("red");
- add_button(*(btn = new GLtk::Button("OK")), 1);
- btn->set_geometry(GLtk::Geometry(geom.w-50, 10, 40, 24));
- btn->set_style("green");
+ add_button(*(btn = new GLtk::Button("OK")), 1);
+ btn->set_style("green");
+ }
}
void ZoneProperties::on_response(int code)
if(code==1)
{
string qualifier;
- if(drp_qualifier->get_selected_index()>=0)
- qualifier = drp_qualifier->get_selected();
- unsigned number = lexical_cast<unsigned>(ent_number->get_text());
+ int sel = drp_qualifier->get_selected_index();
+ if(sel>0)
+ qualifier = drp_qualifier->get_data().get_string(sel);
+
+ unsigned number = 0;
+ string num_str = ent_number->get_text();
+ if(!num_str.empty())
+ number = lexical_cast<unsigned>(ent_number->get_text());
+
zone.set_name(ent_group->get_text(), qualifier, number);
+
+ sel = drp_up_direction->get_selected_index();
+ if(sel==0)
+ zone.clear_direction();
+ else
+ zone.set_direction_towards(*up_directions.get(sel), TrackChain::UP);
+
+ if(zone.has_direction())
+ {
+ sel = drp_preferred_dir->get_selected_index();
+ zone.set_preferred_direction(static_cast<TrackChain::Direction>(sel));
+ }
}
}