]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/list.cpp
Use a different approach for custom item widgets
[libs/gltk.git] / source / list.cpp
index 7227f0c59f6cd971ec330f6de266b84d8ecadc82..eaab9e0e5ed8857a0bdaea7e779374577efbf7da 100644 (file)
@@ -1,3 +1,4 @@
+#include <msp/debug/demangle.h>
 #include <msp/gl/matrix.h>
 #include <msp/gl/meshbuilder.h>
 #include "graphic.h"
@@ -12,6 +13,11 @@ using namespace std;
 namespace Msp {
 namespace GLtk {
 
+incompatible_data::incompatible_data(const type_info &ti):
+       logic_error("expected "+Debug::demangle(ti.name()))
+{ }
+
+
 List::List():
        data(new BasicListData<string>),
        own_data(true)
@@ -28,6 +34,7 @@ List::List(ListData &d):
 
 void List::init()
 {
+       item_factory = 0;
        sel_index = -1;
        first = 0;
        max_scroll = 0;
@@ -42,6 +49,7 @@ void List::init()
 
 List::~List()
 {
+       delete item_factory;
        delete observer;
        if(own_data)
                delete data;
@@ -74,6 +82,9 @@ void List::autosize_special(const Part &part, Geometry &ageom)
 
 void List::set_data(ListData &d)
 {
+       if(item_factory)
+               item_factory->set_data(d);
+
        delete observer;
        if(own_data)
                delete data;
@@ -105,7 +116,10 @@ void List::items_changed()
 
 List::Item *List::create_item(unsigned index)
 {
-       return new BasicItem(data->get_string(index));
+       if(item_factory)
+               return item_factory->create_item(index);
+       else
+               return new BasicItem(data->get_string(index));
 }
 
 void List::set_view_size(unsigned s)