From c6b9a38300cc2ecfc0df66af162620b9ea5a1e3e Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Thu, 18 Nov 2010 18:20:07 +0000 Subject: [PATCH] Split the single large toolbar into a few smaller collapsible ones Replace turnout and sensor ID setting with a track properties dialog Add left and right arrow button styles --- gui.blend | Bin 578284 -> 591452 bytes gui.png | Bin 6260 -> 6752 bytes r2c2.res | 68 +++++++++++-- source/designer/designer.cpp | 86 +++++++--------- source/designer/designer.h | 9 +- source/designer/layoutbar.cpp | 32 ++++++ source/designer/layoutbar.h | 21 ++++ source/designer/routebar.cpp | 107 +++++++++++++++++++ source/designer/routebar.h | 30 ++++++ source/designer/selection.h | 1 + source/designer/toolbar.cpp | 153 +++++++--------------------- source/designer/toolbar.h | 33 +++--- source/designer/trackbar.cpp | 27 +++++ source/designer/trackbar.h | 21 ++++ source/designer/trackproperties.cpp | 94 +++++++++++++++++ source/designer/trackproperties.h | 30 ++++++ 16 files changed, 519 insertions(+), 193 deletions(-) create mode 100644 source/designer/layoutbar.cpp create mode 100644 source/designer/layoutbar.h create mode 100644 source/designer/routebar.cpp create mode 100644 source/designer/routebar.h create mode 100644 source/designer/trackbar.cpp create mode 100644 source/designer/trackbar.h create mode 100644 source/designer/trackproperties.cpp create mode 100644 source/designer/trackproperties.h diff --git a/gui.blend b/gui.blend index f70f183e3c1dadd5392b2c7d5bc56495c235d335..6171856ded86cb3d1691a9390bd3fd1f30bd1e6a 100644 GIT binary patch delta 55382 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 Jh5-Ng_dno8@}>X) delta 48910 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 diff --git a/gui.png b/gui.png index 50c8c5bc345a5c994903ba4acf44148d47ea4760..0f2310062bbf48dd756c8f639b7eab7637c4527c 100644 GIT binary patch literal 6752 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 HEW-W=9?kb_ diff --git a/r2c2.res b/r2c2.res index b40871e..642433f 100644 --- a/r2c2.res +++ b/r2c2.res @@ -10,7 +10,11 @@ style "root" style "label" { font_color 0 0 0; - special "text"; + special "text" + { + align 0.0 0.5; + fill 0.0 0.0; + }; }; style "image" @@ -97,28 +101,56 @@ graphic "up_arrow_button" { texture "gui.png"; slice 2 18 13 13; - shadow { top 0; right 1; bottom 2; left 0; }; + shadow { right 1; bottom 2; }; }; graphic "up_arrow_button_pressed" { texture "gui.png"; - slice 17 18 13 13; - shadow { top 0; right 1; bottom 2; left 0; }; + slice 17 19 13 12; + shadow { right 1; bottom 1; }; }; graphic "down_arrow_button" { texture "gui.png"; slice 2 4 13 13; - shadow { top 0; right 1; bottom 2; left 0; }; + shadow { right 1; bottom 2; }; }; graphic "down_arrow_button_pressed" { texture "gui.png"; - slice 17 4 13 13; - shadow { top 0; right 1; bottom 2; left 0; }; + slice 17 5 13 12; + shadow { right 1; bottom 1; }; +}; + +graphic "right_arrow_button" +{ + texture "gui.png"; + slice 32 17 12 14; + shadow { right 1; bottom 2; }; +}; + +graphic "right_arrow_button_pressed" +{ + texture "gui.png"; + slice 32 3 12 13; + shadow { right 1; bottom 1; }; +}; + +graphic "left_arrow_button" +{ + texture "gui.png"; + slice 46 2 12 14; + shadow { right 1; bottom 2; }; +}; + +graphic "left_arrow_button_pressed" +{ + texture "gui.png"; + slice 60 3 12 13; + shadow { right 1; bottom 1; }; }; style "button" @@ -200,6 +232,28 @@ style "button-arrow_down" }; }; +style "button-arrow_right" +{ + part + { + graphic NORMAL "right_arrow_button"; + graphic ACTIVE "right_arrow_button_pressed"; + align 0.5 0.5; + fill 0.0 0.0; + }; +}; + +style "button-arrow_left" +{ + part + { + graphic NORMAL "left_arrow_button"; + graphic ACTIVE "left_arrow_button_pressed"; + align 0.5 0.5; + fill 0.0 0.0; + }; +}; + graphic "yellow_lamp" { texture "gui.png"; diff --git a/source/designer/designer.cpp b/source/designer/designer.cpp index 8ab0465..34398f3 100644 --- a/source/designer/designer.cpp +++ b/source/designer/designer.cpp @@ -31,11 +31,14 @@ Distributed under the GPL #include "3d/path.h" #include "designer.h" #include "input.h" +#include "layoutbar.h" #include "manipulator.h" #include "measure.h" +#include "routebar.h" #include "selection.h" #include "svgexporter.h" -#include "toolbar.h" +#include "trackbar.h" +#include "trackproperties.h" using namespace std; using namespace R2C2; @@ -124,10 +127,17 @@ Designer::Designer(int argc, char **argv): root.signal_pointer_motion.connect(sigc::mem_fun(this, &Designer::pointer_motion)); root.signal_tooltip.connect(sigc::mem_fun(this, &Designer::tooltip)); - toolbar = new Toolbar(*this); - root.add(*toolbar); - toolbar->set_position(0, window.get_height()-toolbar->get_geometry().h); - toolbar->set_focusable(false); + toolbars.push_back(new Layoutbar(*this)); + toolbars.push_back(new Trackbar(*this)); + toolbars.push_back(new Routebar(*this)); + for(vector::iterator i=toolbars.begin(); i!=toolbars.end(); ++i) + { + root.add(**i); + if(i!=toolbars.begin()) + (*i)->expand(false); + (*i)->signal_expanded.connect(sigc::hide(sigc::mem_fun(this, &Designer::arrange_toolbars))); + } + arrange_toolbars(); GLtk::Panel *statusbar = new GLtk::Panel; root.add(*statusbar); @@ -182,39 +192,18 @@ void Designer::new_track() mode = CATALOGUE; } -void Designer::set_turnout_id() +void Designer::track_properties() { - Track *track = selection.get_track(); - if(selection.size()==1 && track->get_type().is_turnout()) - { - InputDialog *input = new InputDialog(*this, "Turnout ID", lexical_cast(track->get_turnout_id())); - input->signal_accept.connect(sigc::mem_fun(this, &Designer::turnout_id_accept)); - } -} + if(selection.empty()) + return; -void Designer::set_sensor_id() -{ - const set &tracks = selection.get_tracks(); - bool ok = false; - int id = -1; - for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) - { - if(!(*i)->get_type().is_turnout()) - ok = true; - if(static_cast((*i)->get_sensor_id())!=id) - { - if(id==-1) - id = (*i)->get_sensor_id(); - else - id = -2; - } - } + TrackProperties *track_prop = new TrackProperties(selection); + root.add(*track_prop); + const GLtk::Geometry &root_geom = root.get_geometry(); + const GLtk::Geometry &dlg_geom = track_prop->get_geometry(); + track_prop->set_position((root_geom.w-dlg_geom.w)/2, (root_geom.h-dlg_geom.h)/2); - if(ok) - { - InputDialog *input = new InputDialog(*this, "Sensor ID", (id>=0 ? lexical_cast(id) : string())); - input->signal_accept.connect(sigc::mem_fun(this, &Designer::sensor_id_accept)); - } + track_prop->signal_response.connect(sigc::mem_fun(this, &Designer::track_properties_response)); } void Designer::rename_route() @@ -374,16 +363,14 @@ void Designer::key_press(unsigned key, unsigned mod, wchar_t) manipulator.even_slope(true); else if(key==Msp::Input::KEY_E) manipulator.even_slope(); - else if(key==Msp::Input::KEY_T) - set_turnout_id(); - else if(key==Msp::Input::KEY_S) - set_sensor_id(); else if(key==Msp::Input::KEY_A) add_selection_to_route(); else if(key==Msp::Input::KEY_C) manipulator.connect(); else if(key==Msp::Input::KEY_V) svg_export(); + else if(key==Msp::Input::KEY_P) + track_properties(); } void Designer::button_press(int x, int y, unsigned btn, unsigned mod) @@ -581,25 +568,22 @@ void Designer::measure_done() selection_changed(); } -void Designer::turnout_id_accept(const string &text) +void Designer::arrange_toolbars() { - Track *track = selection.get_track(); - unsigned id = (text.empty() ? 0 : lexical_cast(text)); - track->set_turnout_id(id); - - update_track_icon(layout_3d->get_track(*track)); + unsigned x = 0; + for(vector::iterator i=toolbars.begin(); i!=toolbars.end(); ++i) + { + const GLtk::Geometry &geom = (*i)->get_geometry(); + (*i)->set_position(x, window.get_height()-geom.h); + x += geom.w; + } } -void Designer::sensor_id_accept(const string &text) +void Designer::track_properties_response(int) { const set &tracks = selection.get_tracks(); - unsigned id = (text.empty() ? 0 : lexical_cast(text)); for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) - { - (*i)->set_sensor_id(id); - update_track_icon(layout_3d->get_track(**i)); - } } void Designer::route_name_accept(const string &text) diff --git a/source/designer/designer.h b/source/designer/designer.h index 9fc2961..e8d0d76 100644 --- a/source/designer/designer.h +++ b/source/designer/designer.h @@ -50,7 +50,7 @@ private: Msp::GLtk::Resources ui_res; Msp::GLtk::Root root; - Toolbar *toolbar; + std::vector toolbars; Msp::GLtk::Label *lbl_status; R2C2::Catalogue catalogue; @@ -94,8 +94,7 @@ public: Msp::GLtk::Root &get_root() { return root; } void new_track(); - void set_turnout_id(); - void set_sensor_id(); + void track_properties(); void rename_route(); void svg_export(); @@ -120,8 +119,8 @@ private: void manipulation_done(bool); void measure_changed(); void measure_done(); - void turnout_id_accept(const std::string &); - void sensor_id_accept(const std::string &); + void arrange_toolbars(); + void track_properties_response(int); void route_name_accept(const std::string &); void svg_export_accept(const std::string &); std::string tooltip(int, int); diff --git a/source/designer/layoutbar.cpp b/source/designer/layoutbar.cpp new file mode 100644 index 0000000..d47485f --- /dev/null +++ b/source/designer/layoutbar.cpp @@ -0,0 +1,32 @@ +/* $Id$ + +This file is part of R²C² +Copyright © 2010 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + +#include "designer.h" +#include "layoutbar.h" + +using namespace Msp; + +Layoutbar::Layoutbar(Designer &designer): + Toolbar("Layout", 120) +{ + GLtk::Button *btn; + + pnl_content->add(*(btn = new GLtk::Button("Load"))); + btn->set_geometry(GLtk::Geometry(0, 10, 40, 24)); + btn->set_tooltip("Load layout (not implemented)"); + + pnl_content->add(*(btn = new GLtk::Button("Save"))); + btn->set_geometry(GLtk::Geometry(40, 10, 40, 24)); + btn->set_tooltip("Save current layout"); + btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::save)); + + pnl_content->add(*(btn = new GLtk::Button("Quit"))); + btn->set_geometry(GLtk::Geometry(80, 10, 40, 24)); + btn->set_style("red"); + btn->set_tooltip("Exit Designer"); + btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::quit)); +} diff --git a/source/designer/layoutbar.h b/source/designer/layoutbar.h new file mode 100644 index 0000000..20a129c --- /dev/null +++ b/source/designer/layoutbar.h @@ -0,0 +1,21 @@ +/* $Id$ + +This file is part of R²C² +Copyright © 2010 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + +#ifndef LAYOUTBAR_H_ +#define LAYOUTBAR_H_ + +#include "toolbar.h" + +class Designer; + +class Layoutbar: public Toolbar +{ +public: + Layoutbar(Designer &); +}; + +#endif diff --git a/source/designer/routebar.cpp b/source/designer/routebar.cpp new file mode 100644 index 0000000..0a2b979 --- /dev/null +++ b/source/designer/routebar.cpp @@ -0,0 +1,107 @@ +/* $Id$ + +This file is part of R²C² +Copyright © 2010 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + +#include +#include "libr2c2/route.h" +#include "designer.h" +#include "routebar.h" + +using namespace std; +using namespace Msp; +using namespace R2C2; + +Routebar::Routebar(Designer &d): + Toolbar("Route", 370), + designer(d) +{ + pnl_content->add(*(drp_routes = new GLtk::Dropdown)); + drp_routes->set_geometry(GLtk::Geometry(0, 10, 250, 20)); + drp_routes->set_tooltip("Select route to edit"); + drp_routes->append("(new route)"); + drp_routes->signal_item_selected.connect(sigc::mem_fun(this, &Routebar::route_selected)); + + GLtk::Button *btn; + + pnl_content->add(*(btn = new GLtk::Button("Del"))); + btn->set_geometry(GLtk::Geometry(250, 10, 40, 24)); + btn->set_tooltip("Delete the current route"); + btn->signal_clicked.connect(sigc::mem_fun(this, &Routebar::delete_route_clicked)); + + pnl_content->add(*(btn = new GLtk::Button("Name"))); + btn->set_geometry(GLtk::Geometry(290, 10, 40, 24)); + btn->set_tooltip("Rename the current route"); + btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::rename_route)); + + pnl_content->add(*(btn = new GLtk::Button("Add"))); + btn->set_geometry(GLtk::Geometry(330, 10, 40, 24)); + btn->set_tooltip("Add selected tracks to current route"); + btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::add_selection_to_route)); + + designer.get_layout().signal_route_added.connect(sigc::mem_fun(this, &Routebar::route_added)); + designer.get_layout().signal_route_removed.connect(sigc::hide(sigc::mem_fun(this, &Routebar::update_routes))); + + const set &routes = designer.get_layout().get_routes(); + for(set::const_iterator i=routes.begin(); i!=routes.end(); ++i) + (*i)->signal_name_changed.connect(sigc::hide(sigc::mem_fun(this, &Routebar::update_routes))); + + update_routes(); +} + +void Routebar::route_selected(unsigned index, const string &) +{ + if(index==drp_routes->get_n_items()-1) + { + Layout &layout = designer.get_layout(); + const set &routes = layout.get_routes(); + Route *route = new Route(layout); + route->set_name(format("Route %d", routes.size())); + designer.edit_route(route); + + int selected = -1; + unsigned n = 0; + for(set::const_iterator i=routes.begin(); (selected<0 && i!=routes.end()); ++i, ++n) + if(*i==route) + selected = n; + drp_routes->set_selected_index(selected); + } + else + { + const set &routes = designer.get_layout().get_routes(); + set::const_iterator i = routes.begin(); + advance(i, index); + designer.edit_route(*i); + } +} + +void Routebar::delete_route_clicked() +{ + Route *route = designer.get_current_route(); + designer.edit_route(0); + delete route; +} + +void Routebar::route_added(Route &r) +{ + r.signal_name_changed.connect(sigc::hide(sigc::mem_fun(this, &Routebar::update_routes))); + update_routes(); +} + +void Routebar::update_routes() +{ + drp_routes->clear(); + const set &routes = designer.get_layout().get_routes(); + int selected = -1; + unsigned n = 0; + for(set::const_iterator i=routes.begin(); i!=routes.end(); ++i, ++n) + { + drp_routes->append((*i)->get_name()); + if(*i==designer.get_current_route()) + selected = n; + } + drp_routes->append("(new route)"); + drp_routes->set_selected_index(selected); +} diff --git a/source/designer/routebar.h b/source/designer/routebar.h new file mode 100644 index 0000000..005b004 --- /dev/null +++ b/source/designer/routebar.h @@ -0,0 +1,30 @@ +/* $Id$ + +This file is part of R²C² +Copyright © 2010 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + +#ifndef ROUTEBAR_H_ +#define ROUTEBAR_H_ + +#include +#include "toolbar.h" + +class Routebar: public Toolbar +{ +private: + Designer &designer; + Msp::GLtk::Dropdown *drp_routes; + +public: + Routebar(Designer &); + +private: + void route_selected(unsigned, const std::string &); + void delete_route_clicked(); + void route_added(R2C2::Route &); + void update_routes(); +}; + +#endif diff --git a/source/designer/selection.h b/source/designer/selection.h index 479f5af..a3d8b30 100644 --- a/source/designer/selection.h +++ b/source/designer/selection.h @@ -24,6 +24,7 @@ public: const std::set &get_tracks() const { return tracks; } R2C2::Track *get_track() const; unsigned size() const { return tracks.size(); } + bool empty() const { return tracks.empty(); } void clear(); diff --git a/source/designer/toolbar.cpp b/source/designer/toolbar.cpp index c6d859b..a4046f5 100644 --- a/source/designer/toolbar.cpp +++ b/source/designer/toolbar.cpp @@ -1,143 +1,64 @@ /* $Id$ This file is part of R²C² -Copyright © 2009-2010 Mikkosoft Productions, Mikko Rasa +Copyright © 2010 Mikkosoft Productions, Mikko Rasa Distributed under the GPL */ -#include -#include -#include "libr2c2/route.h" -#include "designer.h" #include "toolbar.h" using namespace std; using namespace Msp; -using namespace R2C2; -Toolbar::Toolbar(Designer &d): - designer(d) +Toolbar::Toolbar(const string &name, unsigned w): + content_width(w), + expanded(true) { - set_size(640, 40); + set_focusable(false); - GLtk::Button *btn; - GLtk::Label *lbl; + add(*(lbl_title = new GLtk::Label(name))); - add(*(btn=new GLtk::Button("Load"))); - btn->set_geometry(GLtk::Geometry(5, 10, 40, 24)); - btn->set_tooltip("Load layout (not implemented)"); + add(*(btn_expand = new GLtk::Button)); + btn_expand->set_size(15, 20); + btn_expand->set_style("arrow_left"); + btn_expand->set_tooltip("Collapse toolbar"); + btn_expand->signal_clicked.connect(sigc::mem_fun(this, &Toolbar::expand_clicked)); - add(*(btn=new GLtk::Button("Save"))); - btn->set_geometry(GLtk::Geometry(45, 10, 40, 24)); - btn->set_tooltip("Save current layout"); - btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::save)); - - add(*(btn=new GLtk::Button("Quit"))); - btn->set_geometry(GLtk::Geometry(85, 10, 40, 24)); - btn->set_style("red"); - btn->set_tooltip("Exit Designer"); - btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::quit)); - - add(*(btn=new GLtk::Button("+Trk"))); - btn->set_geometry(GLtk::Geometry(135, 10, 40, 24)); - btn->set_tooltip("Add a track piece"); - btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::new_track)); - - add(*(btn=new GLtk::Button("Trnt"))); - btn->set_geometry(GLtk::Geometry(175, 10, 40, 24)); - btn->set_tooltip("Set turnout ID of selected track"); - btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::set_turnout_id)); - - add(*(btn=new GLtk::Button("Sens"))); - btn->set_geometry(GLtk::Geometry(215, 10, 40, 24)); - btn->set_tooltip("Set sensor ID of selected tracks"); - btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::set_sensor_id)); - - add(*(lbl=new GLtk::Label("Routes:"))); - lbl->set_geometry(GLtk::Geometry(265, 22, 40, 13)); - - add(*(drp_routes=new GLtk::Dropdown)); - drp_routes->set_geometry(GLtk::Geometry(265, 5, 250, 17)); - drp_routes->set_tooltip("Select route to edit"); - drp_routes->append("(new route)"); - drp_routes->signal_item_selected.connect(sigc::mem_fun(this, &Toolbar::route_selected)); - - add(*(btn=new GLtk::Button("Del"))); - btn->set_geometry(GLtk::Geometry(515, 10, 40, 24)); - btn->set_tooltip("Delete the current route"); - btn->signal_clicked.connect(sigc::mem_fun(this, &Toolbar::delete_route_clicked)); - - add(*(btn=new GLtk::Button("Name"))); - btn->set_geometry(GLtk::Geometry(555, 10, 40, 24)); - btn->set_tooltip("Rename the current route"); - btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::rename_route)); - - add(*(btn=new GLtk::Button("Add"))); - btn->set_geometry(GLtk::Geometry(595, 10, 40, 24)); - btn->set_tooltip("Add selected tracks to current route"); - btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::add_selection_to_route)); - - designer.get_layout().signal_route_added.connect(sigc::mem_fun(this, &Toolbar::route_added)); - designer.get_layout().signal_route_removed.connect(sigc::hide(sigc::mem_fun(this, &Toolbar::update_routes))); - - const set &routes = designer.get_layout().get_routes(); - for(set::const_iterator i=routes.begin(); i!=routes.end(); ++i) - (*i)->signal_name_changed.connect(sigc::hide(sigc::mem_fun(this, &Toolbar::update_routes))); - - update_routes(); + add(*(pnl_content = new GLtk::Panel)); + pnl_content->set_size(content_width, 40); + pnl_content->set_style("group"); } -void Toolbar::route_selected(unsigned index, const string &) +void Toolbar::expand(bool e) { - if(index==drp_routes->get_n_items()-1) - { - Layout &layout = designer.get_layout(); - const set &routes = layout.get_routes(); - Route *route = new Route(layout); - route->set_name(format("Route %d", routes.size())); - designer.edit_route(route); + expanded = e; + btn_expand->set_style(expanded ? "arrow_left" : "arrow_right"); + btn_expand->set_tooltip(expanded ? "Collapse toolbar" : "Expand toolbar"); + pnl_content->set_visible(expanded); - int selected = -1; - unsigned n = 0; - for(set::const_iterator i=routes.begin(); (selected<0 && i!=routes.end()); ++i, ++n) - if(*i==route) - selected = n; - drp_routes->set_selected_index(selected); - } - else - { - const set &routes = designer.get_layout().get_routes(); - set::const_iterator i = routes.begin(); - advance(i, index); - designer.edit_route(*i); - } -} + unsigned w = lbl_title->get_geometry().w+40; + if(expanded) + w += content_width+5; + set_size(w, 40); -void Toolbar::delete_route_clicked() -{ - Route *route = designer.get_current_route(); - designer.edit_route(0); - delete route; + signal_expanded.emit(expanded); } -void Toolbar::route_added(Route &r) +void Toolbar::expand_clicked() { - r.signal_name_changed.connect(sigc::hide(sigc::mem_fun(this, &Toolbar::update_routes))); - update_routes(); + expand(!expanded); } -void Toolbar::update_routes() +void Toolbar::on_style_change() { - drp_routes->clear(); - const set &routes = designer.get_layout().get_routes(); - int selected = -1; - unsigned n = 0; - for(set::const_iterator i=routes.begin(); i!=routes.end(); ++i, ++n) - { - drp_routes->append((*i)->get_name()); - if(*i==designer.get_current_route()) - selected = n; - } - drp_routes->append("(new route)"); - drp_routes->set_selected_index(selected); + lbl_title->autosize(); + const GLtk::Geometry &lbl_geom = lbl_title->get_geometry(); + unsigned w = lbl_geom.w+40; + if(expanded) + w += content_width+5; + set_size(w, 40); + + lbl_title->set_position(10, (geom.h-lbl_geom.h)/2); + btn_expand->set_position(lbl_geom.w+15, 10); + pnl_content->set_position(lbl_geom.w+35, 0); } diff --git a/source/designer/toolbar.h b/source/designer/toolbar.h index 9029a9c..5a2d86c 100644 --- a/source/designer/toolbar.h +++ b/source/designer/toolbar.h @@ -1,33 +1,38 @@ /* $Id$ This file is part of R²C² -Copyright © 2009 Mikkosoft Productions, Mikko Rasa +Copyright © 2010 Mikkosoft Productions, Mikko Rasa Distributed under the GPL */ #ifndef TOOLBAR_H_ #define TOOLBAR_H_ -#include -#include +#include +#include #include -#include "libr2c2/route.h" -class Designer; - -class Toolbar: public Msp::GLtk::Panel, public sigc::trackable +class Toolbar: public Msp::GLtk::Panel { +public: + sigc::signal signal_expanded; + private: - Designer &designer; - Msp::GLtk::Dropdown *drp_routes; + unsigned content_width; + Msp::GLtk::Label *lbl_title; + Msp::GLtk::Button *btn_expand; + bool expanded; +protected: + Msp::GLtk::Panel *pnl_content; + + Toolbar(const std::string &, unsigned); public: - Toolbar(Designer &); + void expand(bool); + private: - void route_selected(unsigned, const std::string &); - void delete_route_clicked(); - void route_added(R2C2::Route &); - void update_routes(); + void expand_clicked(); + virtual void on_style_change(); }; #endif diff --git a/source/designer/trackbar.cpp b/source/designer/trackbar.cpp new file mode 100644 index 0000000..9d7ebc5 --- /dev/null +++ b/source/designer/trackbar.cpp @@ -0,0 +1,27 @@ +/* $Id$ + +This file is part of R²C² +Copyright © 2010 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + +#include "designer.h" +#include "trackbar.h" + +using namespace Msp; + +Trackbar::Trackbar(Designer &designer): + Toolbar("Track", 80) +{ + GLtk::Button *btn; + + pnl_content->add(*(btn = new GLtk::Button("+Trk"))); + btn->set_geometry(GLtk::Geometry(0, 10, 40, 24)); + btn->set_tooltip("Add a track piece"); + btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::new_track)); + + pnl_content->add(*(btn = new GLtk::Button("Prop"))); + btn->set_geometry(GLtk::Geometry(40, 10, 40, 24)); + btn->set_tooltip("Change properties of selected tracks"); + btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::track_properties)); +} diff --git a/source/designer/trackbar.h b/source/designer/trackbar.h new file mode 100644 index 0000000..7123a19 --- /dev/null +++ b/source/designer/trackbar.h @@ -0,0 +1,21 @@ +/* $Id$ + +This file is part of R²C² +Copyright © 2010 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + +#ifndef TRACKBAR_H_ +#define TRACKBAR_H_ + +#include "toolbar.h" + +class Designer; + +class Trackbar: public Toolbar +{ +public: + Trackbar(Designer &); +}; + +#endif diff --git a/source/designer/trackproperties.cpp b/source/designer/trackproperties.cpp new file mode 100644 index 0000000..ce806c5 --- /dev/null +++ b/source/designer/trackproperties.cpp @@ -0,0 +1,94 @@ +/* $Id$ + +This file is part of R²C² +Copyright © 2010 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + +#include +#include +#include "libr2c2/tracktype.h" +#include "selection.h" +#include "trackproperties.h" + +using namespace std; +using namespace Msp; +using namespace R2C2; + +TrackProperties::TrackProperties(const Selection &s): + selection(s) +{ + set_size(300, 110); + + GLtk::Label *lbl; + + add(*(lbl = new GLtk::Label("Track properties"))); + lbl->set_geometry(GLtk::Geometry(10, geom.h-30, geom.w-20, 20)); + + add(*(lbl = new GLtk::Label("Turnout ID"))); + lbl->set_geometry(GLtk::Geometry(10, geom.h-65, 70, 20)); + + add(*(ent_turnout_id = new GLtk::Entry)); + ent_turnout_id->set_geometry(GLtk::Geometry(80, geom.h-65, 50, 20)); + + add(*(lbl = new GLtk::Label("Sensor ID"))); + lbl->set_geometry(GLtk::Geometry(150, geom.h-65, 70, 20)); + + add(*(ent_sensor_id = new GLtk::Entry)); + ent_sensor_id->set_geometry(GLtk::Geometry(220, geom.h-65, 50, 20)); + + 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"); + + add_button(*(btn = new GLtk::Button("OK")), 1); + btn->set_geometry(GLtk::Geometry(geom.w-50, 10, 40, 24)); + btn->set_style("green"); + + if(selection.size()==1) + { + if(unsigned tid = selection.get_track()->get_turnout_id()) + ent_turnout_id->set_text(lexical_cast(tid)); + } + + const set &tracks = selection.get_tracks(); + int sensor_id = -1; + for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) + { + if(static_cast((*i)->get_sensor_id())!=sensor_id) + { + if(sensor_id==-1) + sensor_id = (*i)->get_sensor_id(); + else + sensor_id = -2; + } + } + + if(sensor_id>=0) + ent_sensor_id->set_text(lexical_cast(sensor_id)); +} + +void TrackProperties::on_response(int code) +{ + if(code==1) + { + if(selection.size()==1) + { + Track *track = selection.get_track(); + if(track->get_type().is_turnout()) + track->set_turnout_id(lexical_cast(ent_turnout_id->get_text())); + } + + string sensor_id_text = ent_sensor_id->get_text(); + if(!sensor_id_text.empty()) + { + unsigned sensor_id = lexical_cast(sensor_id_text); + const set &tracks = selection.get_tracks(); + for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) + if(!(*i)->get_type().is_turnout()) + (*i)->set_sensor_id(sensor_id); + } + } +} diff --git a/source/designer/trackproperties.h b/source/designer/trackproperties.h new file mode 100644 index 0000000..a1fe450 --- /dev/null +++ b/source/designer/trackproperties.h @@ -0,0 +1,30 @@ +/* $Id$ + +This file is part of R²C² +Copyright © 2010 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + +#ifndef TRACKPROPERTIES_H_ +#define TRACKPROPERTIES_H_ + +#include +#include + +class Selection; + +class TrackProperties: public Msp::GLtk::Dialog +{ +private: + const Selection &selection; + Msp::GLtk::Entry *ent_turnout_id; + Msp::GLtk::Entry *ent_sensor_id; + +public: + TrackProperties(const Selection &); + +private: + virtual void on_response(int); +}; + +#endif -- 2.45.2