]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/list.cpp
Fix Alignment to not fail when geom is larger han parent
[libs/gltk.git] / source / list.cpp
index 5665ef5dc264391f7020005d5635be43c30009d8..04adb399cc2adf237b3384384ac807ea5b6b5ff3 100644 (file)
@@ -5,6 +5,7 @@ Copyright © 2007  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
+#include <msp/gl/immediate.h>
 #include <msp/gl/matrix.h>
 #include <msp/gl/transform.h>
 #include "graphic.h"
@@ -71,6 +72,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<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
@@ -132,24 +148,29 @@ void List::render_special(const Part &part) const
        {
                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();
                }
        }
@@ -247,7 +268,8 @@ void List::recalculate_parameters()
 
 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);
 }