+ {
+ items[sel_index]->set_active(true);
+ if(state&FOCUS)
+ set_input_focus(items[focus_index].get());
+ signal_item_selected.emit(sel_index);
+ }
+}
+
+void List::set_selected_item(Widget *item)
+{
+ for(size_t i=rows[first_row].first; (i<items.size() && items[i]->is_visible()); ++i)
+ if(item==items[i].get())
+ return set_selected_index(i);
+}
+
+void List::rebuild_special(const Part &part)
+{
+ if(part.get_name()=="slider")
+ reposition_child(slider, part);
+ else if(part.get_name()=="items")
+ {
+ SetFlag flag(ignore_slider_change);
+ reposition_items(true);
+ size_t old_first_row = first_row;
+ size_t old_max_scroll = max_scroll;
+ check_view_range();
+ if(first_row!=old_first_row || max_scroll!=old_max_scroll)
+ reposition_items(false);
+ }
+
+ Widget::rebuild_special(part);
+}
+
+void List::render_special(const Part &part, GL::Renderer &renderer) const
+{
+ if(part.get_name()=="items")
+ {
+ for(size_t i=rows[first_row].first; (i<items.size() && items[i]->is_visible()); ++i)
+ items[i]->render(renderer);
+ }
+ else if(part.get_name()=="slider")
+ slider.render(renderer);