]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/list.cpp
Fix a comparison that let an off-by-one error in
[libs/gltk.git] / source / list.cpp
index 296709ce4f300b773a2035acade69ae053268725..7227f0c59f6cd971ec330f6de266b84d8ecadc82 100644 (file)
@@ -82,6 +82,17 @@ void List::set_data(ListData &d)
        own_data = false;
        observer = new DataObserver(*this);
 
+       for(vector<Item *>::iterator i=items.begin(); i!=items.end(); ++i)
+               delete *i;
+       items.clear();
+       unsigned n_items = data->size();
+       for(unsigned i=0; i<n_items; ++i)
+       {
+               Item *item = create_item(i);
+               add(*item);
+               items.push_back(item);
+       }
+
        items_changed();
 }
 
@@ -110,7 +121,7 @@ void List::set_view_all()
 
 void List::set_selected_index(int i)
 {
-       if(i>static_cast<int>(data->size()))
+       if(i>=static_cast<int>(data->size()))
                throw out_of_range("List::set_selected_index");
 
        if(sel_index>=0)
@@ -264,7 +275,7 @@ List::DataObserver::DataObserver(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_strings.connect(sigc::mem_fun(this, &DataObserver::refresh_strings));
+       list.data->signal_refresh_item.connect(sigc::mem_fun(this, &DataObserver::refresh_item));
 }
 
 void List::DataObserver::item_added(unsigned i)
@@ -299,8 +310,10 @@ void List::DataObserver::cleared()
        list.items_changed();
 }
 
-void List::DataObserver::refresh_strings()
+void List::DataObserver::refresh_item(unsigned i)
 {
+       delete list.items[i];
+       list.items[i] = list.create_item(i);
        list.items_changed();
 }
 
@@ -358,6 +371,7 @@ List::Loader::Loader(List &l):
        DataFile::DerivedObjectLoader<List, Widget::Loader>(l)
 {
        add("item", &Loader::item);
+       add("view_size", &List::view_size);
 }
 
 void List::Loader::item(const string &v)