-/* $Id$
-
-This file is part of R²C²
-Copyright © 2009-2010 Mikkosoft Productions, Mikko Rasa
-Distributed under the GPL
-*/
-
-#include <gtkmm/separator.h>
-#include <msp/net/resolve.h>
-#include <msp/time/units.h>
+#include <msp/gl/framebuffer.h>
+#include <msp/gltk/layout.h>
+#include <msp/time/utils.h>
+#include "connectdialog.h"
#include "remote.h"
-#include "trainpanel.h"
using namespace std;
using namespace Msp;
+using namespace R2C2;
-Application::RegApp<Remote> 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));
- DataFile::load(catalogue, "locos.dat");
+ 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);
- 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;
+ 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));
- window.signal_hide().connect(sigc::bind(sigc::mem_fun(this, &Remote::exit), 0));
- window.set_default_size(300, 200);
- window.set_border_width(5);
+ 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]);
+ }
- train_box = new Gtk::VBox(false, 5);
- window.add(*manage(train_box));
+ panels[i] = 0;
+ }
- window.show_all();
+ root.add(status_bar);
+ root_layout->set_gravity(status_bar, -1, -1);
+ root_layout->set_expand(status_bar, true, false);
+
+ catalogue.add_source("data/Märklin/H0");
+
+ client.use_event_dispatcher(ev_disp);
+}
+
+int Remote::main()
+{
+ ConnectDialog *dlg = new ConnectDialog(client);
+ root.add(*dlg);
+ root_layout->set_gravity(*dlg, 0, 0);
+
+ window.show();
+
+ 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)
{
- TrainPanel *panel = new TrainPanel(*this, client, t);
- if(!train_panels.empty())
+ delete panels[index];
+ panels[index] = 0;
+
+ if(train)
{
- Gtk::HSeparator *sep = new Gtk::HSeparator;
- train_box->pack_start(*manage(sep), false, true);
- sep->show();
+ 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);
}
- train_box->pack_start(*manage(panel), false, true);
- train_panels.push_back(panel);
}