X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flist.cpp;h=7041f733759da99585d2b4dde562458a9684ea3e;hb=815194201203afd6fa59e650e1007a355c829544;hp=e1f39b7dc8ecaa67db27c9212ada54ef24199593;hpb=11d1b67a9180a0e468b56e355fbe0c88d104ef72;p=libs%2Fgltk.git diff --git a/source/list.cpp b/source/list.cpp index e1f39b7..7041f73 100644 --- a/source/list.cpp +++ b/source/list.cpp @@ -1,6 +1,5 @@ -#include #include -#include +#include #include "graphic.h" #include "list.h" #include "part.h" @@ -40,12 +39,13 @@ void List::autosize_rows(unsigned n) if(items_part) { const Sides &margin = items_part->get_margin(); + const GL::Font &font = style->get_font(); float font_size = style->get_font_size(); unsigned max_w = 0; for(vector::iterator i=items.begin(); i!=items.end(); ++i) { - unsigned w = static_cast(style->get_font()->get_string_width(*i)*font_size); + unsigned w = static_cast(font.get_string_width(*i)*font_size); max_w = max(max_w, w); } @@ -73,6 +73,7 @@ void List::autosize_rows(unsigned n) } check_view_range(); + rebuild(); } void List::autosize_all() @@ -83,8 +84,7 @@ void List::autosize_all() void List::append(const string &v) { items.push_back(v); - check_view_range(); - signal_autosize_changed.emit(); + items_changed(); } void List::insert(unsigned i, const string &v) @@ -93,8 +93,7 @@ void List::insert(unsigned i, const string &v) throw out_of_range("List::insert"); items.insert(items.begin()+i, v); - check_view_range(); - signal_autosize_changed.emit(); + items_changed(); } void List::remove(unsigned i) @@ -108,17 +107,21 @@ void List::remove(unsigned i) else if(sel_index==static_cast(i)) sel_index = -1; - check_view_range(); - signal_autosize_changed.emit(); + items_changed(); } void List::clear() { items.clear(); sel_index = -1; + items_changed(); +} +void List::items_changed() +{ check_view_range(); signal_autosize_changed.emit(); + rebuild(); } void List::set_selected_index(int i) @@ -142,7 +145,7 @@ const string &List::get_selected() const return items[sel_index]; } -void List::render_special(const Part &part) const +void List::rebuild_special(const Part &part, CachedPart &cache) { if(part.get_name()=="items") { @@ -150,14 +153,23 @@ void List::render_special(const Part &part) const Geometry pgeom = geom; pgeom.h = row_height+margin.top+margin.bottom; - GL::PushMatrix push_mtx; - GL::translate(0, geom.h-pgeom.h, 0); + const GL::Font &font = style->get_font(); + cache.texture = &font.get_texture(); + cache.clear_mesh(); + + GL::MeshBuilder bld(*cache.mesh); + bld.color(style->get_font_color()); + bld.matrix() *= GL::Matrix::translation(pgeom.x, pgeom.y+geom.h-pgeom.h, 0); for(unsigned i=0; (i(row_height), 0); - Text(*style, items[first+i]).render(part, pgeom); + bld.matrix() *= GL::Matrix::translation(0, -static_cast(row_height), 0); + + GL::MatrixStack::Push _pushm(bld.matrix()); + bld.matrix() *= GL::Matrix::scaling(style->get_font_size()); + + style->get_font().build_string(items[first+i], bld); } } else if(part.get_name()=="selection") @@ -175,14 +187,22 @@ void List::render_special(const Part &part) const rgeom.x += margin.left; part.get_alignment().apply(rgeom, pgeom); - GL::push_matrix(); - GL::translate(rgeom.x, rgeom.y, 0); - part.get_graphic(state)->render(rgeom.w, rgeom.h); - GL::pop_matrix(); + cache.texture = part.get_graphic(state)->get_texture(); + cache.clear_mesh(); + + GL::MeshBuilder bld(*cache.mesh); + bld.matrix() *= GL::Matrix::translation(rgeom.x, rgeom.y, 0); + part.get_graphic(state)->build(rgeom.w, rgeom.h, bld); } + else + cache.texture = 0; } - else if(part.get_name()=="slider") - slider.render(); +} + +void List::render_special(const Part &part, GL::Renderer &renderer) const +{ + if(part.get_name()=="slider") + slider.render(renderer); } void List::button_press(int x, int y, unsigned btn) @@ -199,6 +219,7 @@ void List::button_press(int x, int y, unsigned btn) sel_index = first+i; signal_item_selected.emit(sel_index, items[sel_index]); + rebuild(); } } } @@ -222,7 +243,7 @@ void List::on_style_change() items_part = style->get_part("items"); - const GL::Font &font = *style->get_font(); + const GL::Font &font = style->get_font(); row_height = static_cast((font.get_ascent()-font.get_descent())*style->get_font_size()); check_view_range(); @@ -275,7 +296,10 @@ void List::check_view_range() void List::slider_value_changed(double value) { if(items.size()>n_visible) + { first = items.size()-n_visible-static_cast(value); + rebuild(); + } }