X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdesigner%2Fdesigner.cpp;h=30b022f8597e12e8e539d6b247d8e38d92728b9c;hb=05b95b6b6b095821f1e79dabed802b853c296c9d;hp=cfe3938a91d3c6258d631467f14d1bd0ad7ae5ac;hpb=a7bce7810670436ab667c034c80291b2f712d2a2;p=r2c2.git diff --git a/source/designer/designer.cpp b/source/designer/designer.cpp index cfe3938..30b022f 100644 --- a/source/designer/designer.cpp +++ b/source/designer/designer.cpp @@ -28,6 +28,7 @@ #include "manipulator.h" #include "measure.h" #include "movetool.h" +#include "objectselecttool.h" #include "rotatetool.h" #include "routebar.h" #include "selection.h" @@ -51,15 +52,13 @@ Designer::Designer(int argc, char **argv): base_object(0), cur_route(0), cur_zone(0), - mode(SELECT), + mode(TOOL), sel_wrap(selection), cur_tool(0) { window.set_title("Railway Designer"); window.signal_close.connect(sigc::bind(sigc::mem_fun(this, &Designer::exit), 0)); - selection.signal_changed.connect(sigc::mem_fun(this, &Designer::selection_changed)); - // Setup catalogue and layout DataFile::load(catalogue, "tracks.dat"); @@ -151,7 +150,7 @@ Designer::Designer(int argc, char **argv): const set &tracks = layout->get_all(); for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) - update_track_icon(layout_3d->get(**i)); + update_track_icon(layout_3d->get_3d(**i)); } Designer::~Designer() @@ -172,7 +171,7 @@ int Designer::main() { window.show(); - mode = SELECT; + use_select_tool(); return Application::main(); } @@ -192,8 +191,7 @@ void Designer::quit() void Designer::new_track() { - if(mode!=SELECT) - return; + use_select_tool(); mode = CATALOGUE; lbl_status->set_text("Select new track or press Esc to cancel"); @@ -201,21 +199,21 @@ void Designer::new_track() void Designer::erase_tracks() { - if(mode!=SELECT) - return; + use_select_tool(); set tracks = selection.get_objects(); selection.clear(); for(set::iterator i=tracks.begin(); i!=tracks.end(); ++i) { - overlay->clear(layout_3d->get(**i)); + overlay->clear(layout_3d->get_3d(**i)); delete *i; } } void Designer::track_properties() { - if(mode!=SELECT || selection.empty()) + use_select_tool(); + if(selection.empty()) return; TrackProperties *track_prop = new TrackProperties(selection); @@ -260,7 +258,8 @@ void Designer::edit_route(Route *r) void Designer::rename_route() { - if(mode!=SELECT || !cur_route) + use_select_tool(); + if(!cur_route) return; InputDialog *input = new InputDialog(*this, "Route name", cur_route->get_name()); @@ -342,9 +341,7 @@ void Designer::tick() if(cur_tool && cur_tool->is_done()) { cur_tool->update_selection(selection); - delete cur_tool; - cur_tool = 0; - mode = SELECT; + use_select_tool(); } window.tick(); @@ -386,12 +383,6 @@ void Designer::key_press(unsigned key) } else if(key==Msp::Input::KEY_W) save(); - else if(key==Msp::Input::KEY_PLUS) - selection.select_more(); - else if(key==Msp::Input::KEY_L && shift) - selection.select_blocks(); - else if(key==Msp::Input::KEY_L) - selection.select_linked(); else if(key==Msp::Input::KEY_M) use_tool(); else if(key==Msp::Input::KEY_Z) @@ -399,9 +390,7 @@ void Designer::key_press(unsigned key) else if(key==Msp::Input::KEY_ESC) { if(mode==CATALOGUE) - mode = SELECT; - else if(mode==SELECT) - selection.clear(); + use_select_tool(); } else if(key==Msp::Input::KEY_X) erase_tracks(); @@ -417,7 +406,7 @@ void Designer::key_press(unsigned key) if(*j!=*i) (*i)->snap_to(**j, true); - update_track_icon(layout_3d->get(**i)); + update_track_icon(layout_3d->get_3d(**i)); } } else if(key==Msp::Input::KEY_F) @@ -466,49 +455,38 @@ void Designer::use_tool(Tool *tool) } cur_tool = tool; - cur_tool->signal_status.connect(sigc::mem_fun(this, &Designer::manipulation_status)); - manipulation_status(cur_tool->get_status()); + cur_tool->signal_status.connect(sigc::mem_fun(this, &Designer::tool_status)); + tool_status(cur_tool->get_status()); mode = TOOL; } -void Designer::button_press(unsigned btn) +void Designer::use_select_tool() { - bool shift = keyboard.get_button_state(Input::KEY_SHIFT_L) || keyboard.get_button_state(Input::KEY_SHIFT_R); + use_tool(new ObjectSelectTool(*this, keyboard, mouse, selection)); +} +void Designer::button_press(unsigned btn) +{ Vector pointer(mouse.get_axis_value(0), mouse.get_axis_value(1), 0); Vector ground = map_pointer_to_ground(pointer); if(mode==CATALOGUE) { + Object *obj; if(btn==1) - { - Object *cobj = pick_object(pointer); - if(cobj) - { - Object *obj = cobj->clone(layout); - obj->set_position(ground); - - selection.clear(); - selection.add_object(obj); + obj = pick_object(pointer); - mode = SELECT; - } - } - else - mode = SELECT; - } - else if(mode==SELECT) - { - if(btn==1) + if(obj) { - Object *obj = pick_object(pointer); - if(obj) - { - if(!shift) - selection.clear(); - selection.toggle_object(obj); - } + obj = obj->clone(layout); + obj->set_position(ground); + + selection.clear(); + selection.add_object(obj); } + + if(obj || btn==3) + use_select_tool(); } } @@ -553,36 +531,16 @@ void Designer::update_track_icon(Track3D &track) } } -void Designer::selection_changed() -{ - const set &tracks = selection.get_objects(); - if(tracks.empty()) - lbl_status->set_text(string()); - else - { - float len = 0; - for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) - len += (*i)->get_type().get_total_length(); - lbl_status->set_text(format("%.2fm of track selected\n", len)); - } -} - -void Designer::manipulation_status(const string &status) +void Designer::tool_status(const string &status) { lbl_status->set_text(status); } -void Designer::measure_done() -{ - mode = SELECT; - selection_changed(); -} - void Designer::track_properties_response(int) { const set &tracks = selection.get_objects(); for(set::const_iterator i=tracks.begin(); i!=tracks.end(); ++i) - update_track_icon(layout_3d->get(**i)); + update_track_icon(layout_3d->get_3d(**i)); } void Designer::route_name_accept(const string &text) @@ -633,7 +591,7 @@ void Designer::show_route(const Route &route) const set &rtracks = route.get_tracks(); for(set::iterator i=rtracks.begin(); i!=rtracks.end(); ++i) { - Track3D &t3d = layout_3d->get(**i); + Track3D &t3d = layout_3d->get_3d(**i); Path3D *path = new Path3D(t3d); path->set_color(GL::Color(0.5, 0.8, 1.0)); if(unsigned tid = (*i)->get_turnout_id()) @@ -648,7 +606,7 @@ void Designer::show_zone(const Zone &zone) const Zone::TrackSet &ztracks = zone.get_tracks(); for(Zone::TrackSet::const_iterator i=ztracks.begin(); i!=ztracks.end(); ++i) { - Track3D &t3d = layout_3d->get(**i); + Track3D &t3d = layout_3d->get_3d(**i); Path3D *path = new Path3D(t3d); path->set_color(GL::Color(0.8, 1.0, 0.5)); }