+
+List::DataObserver::DataObserver(List &l):
+ list(l)
+{
+ list.data->signal_item_added.connect(sigc::mem_fun(this, &DataObserver::item_added));
+ list.data->signal_item_removed.connect(sigc::mem_fun(this, &DataObserver::item_removed));
+ list.data->signal_cleared.connect(sigc::mem_fun(this, &DataObserver::cleared));
+ list.data->signal_refresh_item.connect(sigc::mem_fun(this, &DataObserver::refresh_item));
+}
+
+void List::DataObserver::item_added(size_t i)
+{
+ adjust_index(list.sel_index, i, 1);
+ adjust_index(list.focus_index, i, 1);
+
+ list.items.insert(list.items.begin()+i, list.create_item(i));
+ list.items_changed();
+}
+
+void List::DataObserver::item_removed(size_t i)
+{
+ bool had_selection = (list.sel_index!=INVALID_INDEX);
+ adjust_index(list.sel_index, i, -1);
+ adjust_index(list.focus_index, i, -1);
+
+ list.items.erase(list.items.begin()+i);
+ list.items_changed();
+
+ if(had_selection && list.sel_index==INVALID_INDEX)
+ list.signal_selection_cleared.emit();
+}
+
+void List::DataObserver::cleared()
+{
+ list.sel_index = INVALID_INDEX;
+ list.focus_index = INVALID_INDEX;
+ list.items.clear();
+ list.items_changed();
+
+ list.signal_selection_cleared.emit();
+}
+
+void List::DataObserver::refresh_item(size_t i)
+{
+ // Destroy the old item before calling create_item
+ list.items[i].reset();
+ list.items[i] = list.create_item(i);
+ list.items_changed();
+}
+
+
+List::Item::Item()
+{
+ input_type = INPUT_NAVIGATION;
+}
+
+void List::Item::autosize_special(const Part &part, Geometry &ageom) const
+{
+ if(part.get_name()=="children")