+void List::DataObserver::item_added(size_t i)
+{
+ adjust_index(list.sel_index, i, 1);
+ adjust_index(list.focus_index, i, 1);
+
+ Item *item = list.create_item(i);
+ list.items.insert(list.items.begin()+i, item);
+ 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);
+
+ delete list.items[i];
+ 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()