using namespace Msp;
using namespace R2C2;
-class TrainItem: public GLtk::List::Item
+class TrainItem: public GLtk::List::MultiColumnItem
{
-private:
- GLtk::Label address;
- GLtk::Label name;
-
-public:
+public:
typedef R2C2::Train *ValueType;
TrainItem(ValueType);
+};
-private:
- virtual void on_style_change();
+
+class DetectedLocoItem: public GLtk::List::MultiColumnItem
+{
+public:
+ typedef const Driver::DetectedLocomotive *ValueType;
+
+ DetectedLocoItem(ValueType);
};
lst_trains->set_data(trains);
lst_trains->set_item_type<TrainItem>();
+ lst_imported = dynamic_cast<GLtk::List *>(get_item(widgets, "lst_imported"));
+ lst_imported->set_data(detected_locos);
+ lst_imported->set_item_type<DetectedLocoItem>();
+
+ dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_trains"))->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &TrainListDialog::tab_toggled), lst_trains));
+ dynamic_cast<GLtk::Toggle *>(get_item(widgets, "tgl_import"))->signal_toggled.connect(sigc::bind(sigc::mem_fun(this, &TrainListDialog::tab_toggled), lst_imported));
+
dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_new"))->signal_clicked.connect(sigc::mem_fun(this, &TrainListDialog::new_clicked));
dynamic_cast<GLtk::Button *>(get_item(widgets, "btn_show"))->signal_clicked.connect(sigc::mem_fun(this, &TrainListDialog::show_clicked));
i->second->signal_name_changed.connect(sigc::hide(sigc::bind(sigc::mem_fun(this, &TrainListDialog::train_name_changed), sigc::ref(*i->second))));
}
+ if(layout.has_driver())
+ {
+ Driver &driver = layout.get_driver();
+ driver.signal_locomotive_detected.connect(sigc::mem_fun(this, &TrainListDialog::locomotive_detected));
+ driver.signal_locomotive_gone.connect(sigc::mem_fun(this, &TrainListDialog::locomotive_gone));
+
+ unsigned i = 0;
+ while(const Driver::DetectedLocomotive *loco = driver.enumerate_detected_locos(i++))
+ detected_locos.append(loco);
+ }
layout.signal_train_added.connect(sigc::mem_fun(this, &TrainListDialog::train_added));
layout.signal_train_removed.connect(sigc::mem_fun(this, &TrainListDialog::train_removed));
}
void TrainListDialog::new_clicked()
{
NewTrainDialog *dlg = new NewTrainDialog(engineer);
+ if(lst_imported->is_visible())
+ {
+ int selected = lst_imported->get_selected_index();
+ if(selected>=0)
+ dlg->prefill(*detected_locos.get(selected));
+ }
find_ancestor<GLtk::Root>()->add(*dlg);
dlg->autosize();
}
}
}
+void TrainListDialog::tab_toggled(bool value, GLtk::Widget *wdg)
+{
+ wdg->set_visible(value);
+}
+
+void TrainListDialog::locomotive_detected(const Driver::DetectedLocomotive &loco)
+{
+ detected_locos.append(&loco);
+}
+
+void TrainListDialog::locomotive_gone(const Driver::DetectedLocomotive &loco)
+{
+ int index = detected_locos.find(&loco);
+ if(index>=0)
+ detected_locos.remove(index);
+}
+
void TrainListDialog::train_added(Train &train)
{
unsigned n_items = trains.size();
}
-TrainItem::TrainItem(ValueType train):
- address(lexical_cast<string>(train->get_address())),
- name(train->get_name())
+TrainItem::TrainItem(ValueType train)
{
- add(address);
- add(name);
+ add(*new GLtk::Label(train->get_protocol()));
+ add(*new GLtk::Label(lexical_cast<string>(train->get_address())));
+ add(*new GLtk::Label(train->get_name()));
}
-void TrainItem::on_style_change()
-{
- if(!style)
- return;
-
- address.autosize();
- name.autosize();
- if(const GLtk::Part *part = style->get_part("children"))
- {
- const GLtk::Sides &margin = part->get_margin();
- address.set_position(margin.left, margin.bottom);
- name.set_position(margin.left+30, margin.bottom);
- }
+DetectedLocoItem::DetectedLocoItem(ValueType loco)
+{
+ add(*new GLtk::Label(loco->protocol));
+ add(*new GLtk::Label(lexical_cast<string>(loco->address)));
+ add(*new GLtk::Label(loco->name));
}