X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fremote%2Fremote.cpp;h=f6e8692b3319e8b2c36d480071b98820c75203fd;hb=f7ab597d035a053311c1a8c5baa51b090262f045;hp=21689867a8f58c02a908537e919e883b30bfc123;hpb=fadc35133b1ebbd98af948c1fa529dcde6fddcfd;p=r2c2.git diff --git a/source/remote/remote.cpp b/source/remote/remote.cpp index 2168986..f6e8692 100644 --- a/source/remote/remote.cpp +++ b/source/remote/remote.cpp @@ -1,71 +1,98 @@ -/* $Id$ - -This file is part of R²C² -Copyright © 2009-2010 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - -#include -#include -#include -#include -#include "mainpanel.h" +#include +#include +#include +#include "connectdialog.h" #include "remote.h" -#include "trainpanel.h" using namespace std; using namespace Msp; +using namespace R2C2; -Application::RegApp Remote::reg; - -Remote::Remote(int argc, char **argv): +Remote::Remote(int, char **): + window(1024, 768), client(catalogue), - gtk(argc, argv) + ui_resources("data/r2c2.res"), + root(ui_resources, window), + root_layout(new GLtk::Layout), + status_bar(client) { - if(argc<2) - throw UsageError("No address given"); + window.signal_close.connect(sigc::bind(sigc::mem_fun(this, &Remote::exit), 0)); + + root.set_size(window.get_width()/2, window.get_height()/2); + root.set_layout(root_layout); + root_layout->set_margin(GLtk::Sides()); + root_layout->set_spacing(0); + + for(unsigned i=0; i<2; ++i) + { + selectors[i] = new TrainSelector(client); + root.add(*selectors[i]); + root_layout->set_gravity(*selectors[i], i*2-1, 1); + root_layout->set_expand(*selectors[i], true, false); + selectors[i]->signal_train_selected.connect(sigc::bind(sigc::mem_fun(this, &Remote::train_selected), i)); + + if(i>0) + { + root_layout->add_constraint(*selectors[i], GLtk::Layout::RIGHT_OF, *selectors[i-1]); + root_layout->add_constraint(*selectors[i], GLtk::Layout::COPY_WIDTH, *selectors[i-1]); + } - DataFile::load(catalogue, "locos.dat"); + panels[i] = 0; + } - client.use_event_dispatcher(event_disp); - client.signal_train_added.connect(sigc::mem_fun(this, &Remote::train_added)); - string addr_str = argv[1]; - if(addr_str.find(':')==string::npos) - addr_str += ":8315"; - Net::SockAddr *addr = Net::resolve(addr_str); - client.connect(*addr); - delete addr; + root.add(status_bar); + root_layout->set_gravity(status_bar, -1, -1); + root_layout->set_expand(status_bar, true, false); - window.signal_hide().connect(sigc::bind(sigc::mem_fun(this, &Remote::exit), 0)); - window.set_default_size(300, 200); - window.set_border_width(5); + catalogue.add_source("data/Märklin/H0"); - Gtk::ScrolledWindow *scroll = new Gtk::ScrolledWindow; - window.add(*manage(scroll)); - scroll->set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + client.use_event_dispatcher(ev_disp); +} - panel_box = new Gtk::VBox(false, 5); - scroll->add(*manage(panel_box)); +int Remote::main() +{ + ConnectDialog *dlg = new ConnectDialog(client); + root.add(*dlg); + root_layout->set_gravity(*dlg, 0, 0); - main_panel = new MainPanel(*this, client); - panel_box->pack_start(*manage(main_panel), false, true); + window.show(); - window.show_all(); + return Application::main(); } void Remote::tick() { - event_disp.tick(Time::zero); - gtk.iteration(false); + for(unsigned i=0;; ++i) + { + Time::TimeStamp t = Time::now(); + if(i>0 && t>=next_frame) + { + next_frame = t+Time::sec/30; + break; + } + ev_disp.tick(max(next_frame-t, Time::zero)); + } + + window.tick(); + + GL::Framebuffer::system().clear(GL::COLOR_BUFFER_BIT); + root.render(); + window.swap_buffers(); } -void Remote::train_added(R2C2::NetTrain &t) +void Remote::train_selected(NetTrain *train, unsigned index) { - Gtk::HSeparator *sep = new Gtk::HSeparator; - panel_box->pack_start(*manage(sep), false, true); - sep->show(); + delete panels[index]; + panels[index] = 0; - TrainPanel *panel = new TrainPanel(*this, client, t); - panel_box->pack_start(*manage(panel), false, true); - train_panels.push_back(panel); + if(train) + { + panels[index] = new TrainPanel(*train); + root.add(*panels[index]); + root_layout->set_expand(*panels[index], true, true); + root_layout->add_constraint(*panels[index], GLtk::Layout::BELOW, *selectors[index]); + root_layout->add_constraint(*panels[index], GLtk::Layout::ALIGN_LEFT, *selectors[index]); + root_layout->add_constraint(*panels[index], GLtk::Layout::ALIGN_RIGHT, *selectors[index]); + root_layout->add_constraint(*panels[index], GLtk::Layout::ABOVE, status_bar); + } }