+#include <msp/debug/demangle.h>
#include <msp/gl/matrix.h>
#include <msp/gl/meshbuilder.h>
#include "graphic.h"
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)
void List::init()
{
+ item_factory = 0;
sel_index = -1;
first = 0;
max_scroll = 0;
List::~List()
{
+ delete item_factory;
delete observer;
if(own_data)
delete data;
unsigned total_h = 0;
for(unsigned i=0; i<items.size(); ++i)
{
- items[i]->autosize();
const Geometry &igeom = items[i]->get_geometry();
max_w = max(max_w, igeom.w);
if(view_size==0 || i<view_size)
void List::set_data(ListData &d)
{
+ if(item_factory)
+ item_factory->set_data(d);
+
delete observer;
if(own_data)
delete data;
for(unsigned i=0; i<n_items; ++i)
{
Item *item = create_item(i);
- add(*item);
items.push_back(item);
}
List::Item *List::create_item(unsigned index)
{
- return new BasicItem(data->get_string(index));
+ Item *item = 0;
+ if(item_factory)
+ item = item_factory->create_item(index);
+ else
+ item = new BasicItem(data->get_string(index));
+ add(*item);
+ item->autosize();
+ item->signal_autosize_changed.connect(sigc::bind(sigc::mem_fun(this, &List::item_autosize_changed), item));
+ return item;
}
void List::set_view_size(unsigned s)
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(i==sel_index)
+ return;
+
if(sel_index>=0)
items[sel_index]->set_active(false);
if(i<0)
sel_index = -1;
- else if(i!=sel_index)
+ else
{
sel_index = i;
items[sel_index]->set_active(true);
}
}
+void List::item_autosize_changed(Item *item)
+{
+ signal_autosize_changed.emit();
+ item->autosize();
+ reposition_items();
+}
+
void List::reposition_items()
{
if(!style)
++list.sel_index;
Item *item = list.create_item(i);
- list.add(*item);
list.items.insert(list.items.begin()+i, item);
list.items_changed();
}