X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flist.cpp;h=5bef36732e601ebd4a30023d04e51a9f14f2db78;hb=1a5f227ac945bc9e6449d1552e5d9eb4c1c196fb;hp=5665ef5dc264391f7020005d5635be43c30009d8;hpb=af13797a82b242a3cd8fdd405b057a9e311631ac;p=libs%2Fgltk.git diff --git a/source/list.cpp b/source/list.cpp index 5665ef5..5bef367 100644 --- a/source/list.cpp +++ b/source/list.cpp @@ -5,6 +5,7 @@ Copyright © 2007 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ +#include #include #include #include "graphic.h" @@ -23,6 +24,7 @@ List::List(const Resources &r): sel_index(-1), first(0), n_visible(1), + row_height(1), items_part(0), slider(new VSlider(res)), slider_active(false) @@ -71,6 +73,21 @@ void List::clear() { items.clear(); sel_index=-1; + + recalculate_parameters(); +} + +void List::set_selected_index(int i) +{ + if(i<0) + sel_index=-1; + else if(i(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 @@ -91,9 +108,6 @@ void List::button_press(int x, int y, unsigned btn) } else if(btn==1) { - const GL::Font *const font=style->get_font(); - const unsigned row_height=static_cast(font->get_default_size()); - if(items_part) y+=items_part->get_margin().top; @@ -130,26 +144,30 @@ void List::render_special(const Part &part) const { if(part.get_name()=="items") { - const GL::Font *const font=style->get_font(); - const float font_size=font->get_default_size(); - const unsigned row_height=static_cast(font_size); + const GL::Font &font=*style->get_font(); + const float font_size=font.get_default_size(); + const GL::Color &color=style->get_font_color(); const Sides &margin=part.get_margin(); Geometry pgeom=geom; pgeom.h=row_height; + pgeom.w-=margin.left+margin.right; for(unsigned i=0; (i(font->get_string_width(items[first+i])*font_size); - rgeom.h=static_cast((font->get_ascent()-font->get_descent())*font_size); - rgeom.y=geom.h-margin.top-(i+1)*row_height-static_cast(font->get_descent()*font_size); + rgeom.w=static_cast(font.get_string_width(items[first+i])*font_size); + rgeom.h=row_height; + rgeom.x=margin.left; + rgeom.y=geom.h-margin.top-(i+1)*row_height-static_cast(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(); } } @@ -157,9 +175,6 @@ void List::render_special(const Part &part) const { if(sel_index>=static_cast(first) && sel_index(first+n_visible)) { - const GL::Font *const font=style->get_font(); - const float font_size=font->get_default_size(); - const unsigned row_height=static_cast(font_size); const Sides &margin=part.get_margin(); Geometry pgeom=geom; @@ -197,6 +212,9 @@ void List::on_style_change() if(i->get_name()=="items") items_part=&*i; + const GL::Font &font=*style->get_font(); + row_height=static_cast((font.get_ascent()-font.get_descent())*font.get_default_size()); + recalculate_parameters(); } @@ -213,9 +231,6 @@ void List::reposition_slider() void List::recalculate_parameters() { - const GL::Font *font=style->get_font(); - unsigned row_height=static_cast(font->get_default_size()); - unsigned h=geom.h; if(items_part) { @@ -247,7 +262,8 @@ void List::recalculate_parameters() void List::slider_value_changed(double value) { - first=items.size()-n_visible-static_cast(value); + if(items.size()>n_visible) + first=items.size()-n_visible-static_cast(value); }