From 62a0fdcdf9064f3b1748ffedc3e8de271cd4acbc Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Fri, 9 Aug 2013 20:35:37 +0300 Subject: [PATCH] Move goto destination picking to RouterPanel --- source/engineer/routerpanel.cpp | 48 ++++++++++++++++++++++++++++----- source/engineer/routerpanel.h | 9 ++++++- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/source/engineer/routerpanel.cpp b/source/engineer/routerpanel.cpp index e69a436..5097eda 100644 --- a/source/engineer/routerpanel.cpp +++ b/source/engineer/routerpanel.cpp @@ -21,7 +21,10 @@ RouterPanel::RouterPanel(Engineer &e, Train &t): engineer(e), train(t), routes(&route_name), - updating(false) + updating(false), + goto_pick(false), + goto_target(0), + goto_highlight(0) { Loader::WidgetMap widgets; DataFile::load(*this, "data/routerpanel.ui", widgets); @@ -72,12 +75,45 @@ void RouterPanel::route_selected(unsigned index) void RouterPanel::goto_clicked() { - engineer.pick(false); - pick_conn = engineer.signal_pick_done.connect(sigc::mem_fun(this, &RouterPanel::goto_pick_done)); + goto_pick = true; + signal_grab_pointer.emit(); } -void RouterPanel::goto_pick_done(Track *track, unsigned) +void RouterPanel::button_press(int x, int y, unsigned btn) { - pick_conn.disconnect(); - train.ai_message(TrainAI::Message("set-destination-block", &track->get_block())); + Panel::button_press(x, y, btn); + + if(goto_pick) + { + signal_ungrab_pointer.emit(); + goto_pick = false; + + delete goto_highlight; + goto_highlight = 0; + + if(goto_target && btn==1) + train.ai_message(TrainAI::Message("set-destination-block", goto_target)); + } +} + +void RouterPanel::pointer_motion(int x, int y) +{ + Panel::pointer_motion(x, y); + + if(goto_pick) + { + int rx = x; + int ry = y; + map_coords_to_ancestor(rx, ry, *find_ancestor()); + Ray ray = engineer.get_main_view().create_ray(rx, ry); + Track *track = engineer.get_layout().pick(ray); + if(track) + { + goto_target = &track->get_block(); + delete goto_highlight; + goto_highlight = new TrackChain3D(engineer.get_layout_3d(), *goto_target); + goto_highlight->set_color(GL::Color(0.7)); + goto_highlight->set_layer(2); + } + } } diff --git a/source/engineer/routerpanel.h b/source/engineer/routerpanel.h index 826e9a7..93fabab 100644 --- a/source/engineer/routerpanel.h +++ b/source/engineer/routerpanel.h @@ -5,6 +5,7 @@ #include #include #include "libr2c2/train.h" +#include "3d/trackchain.h" class Engineer; @@ -19,6 +20,10 @@ private: sigc::connection pick_conn; bool updating; + bool goto_pick; + R2C2::Block *goto_target; + R2C2::TrackChain3D *goto_highlight; + public: RouterPanel(Engineer &, R2C2::Train &); @@ -27,7 +32,9 @@ private: void update_route(const R2C2::Route *); void route_selected(unsigned); void goto_clicked(); - void goto_pick_done(R2C2::Track *, unsigned); + + virtual void button_press(int, int, unsigned); + virtual void pointer_motion(int, int); }; #endif -- 2.43.0