Distributed under the LGPL
*/
+#include <msp/gl/immediate.h>
#include <msp/gl/matrix.h>
#include <msp/gl/transform.h>
#include "graphic.h"
{
items.clear();
sel_index=-1;
+
+ recalculate_parameters();
+}
+
+void List::set_selected_index(int i)
+{
+ if(i<0)
+ sel_index=-1;
+ else if(i<static_cast<int>(items.size()))
+ {
+ sel_index=i;
+ signal_item_selected.emit(sel_index, items[sel_index]);
+ }
+ else
+ throw InvalidParameterValue("Index out of range");
}
const string &List::get_selected() const
y+=items_part->get_margin().top;
unsigned i=(geom.h-1-y)/row_height;
- if(i<n_visible)
+ if(i<n_visible && first+i<items.size())
{
sel_index=first+i;
{
const GL::Font *const font=style->get_font();
const float font_size=font->get_default_size();
+ const GL::Color &color=style->get_font_color();
const unsigned row_height=static_cast<unsigned>(font_size);
const Sides &margin=part.get_margin();
Geometry pgeom=geom;
pgeom.h=row_height;
+ pgeom.w-=margin.left+margin.right;
for(unsigned i=0; (i<n_visible && first+i<items.size()); ++i)
{
Geometry rgeom;
rgeom.w=static_cast<unsigned>(font->get_string_width(items[first+i])*font_size);
rgeom.h=static_cast<unsigned>((font->get_ascent()-font->get_descent())*font_size);
+ rgeom.x=margin.left;
rgeom.y=geom.h-margin.top-(i+1)*row_height-static_cast<int>(font->get_descent()*font_size);
part.get_alignment().apply(rgeom, pgeom);
GL::push_matrix();
GL::translate(rgeom.x, rgeom.y, 0);
GL::scale_uniform(font_size);
- font->draw_string(items[first+i]);
+ GL::Immediate imm((GL::COLOR4_UBYTE, GL::TEXCOORD2, GL::VERTEX2));
+ imm.color(color.r, color.g, color.b);
+ font->draw_string(items[first+i], imm);
GL::pop_matrix();
}
}
void List::slider_value_changed(double value)
{
- first=items.size()-n_visible-static_cast<unsigned>(value);
+ if(items.size()>n_visible)
+ first=items.size()-n_visible-static_cast<unsigned>(value);
}