diff --git a/include/nana/gui/widgets/listbox.hpp b/include/nana/gui/widgets/listbox.hpp index 844f8229..71280b7e 100644 --- a/include/nana/gui/widgets/listbox.hpp +++ b/include/nana/gui/widgets/listbox.hpp @@ -1403,7 +1403,9 @@ the nana::detail::basic_window member pointer scheme /// Scrolls the view to the first or last item of a specified category void scroll(bool to_bottom, size_type cat_pos = ::nana::npos); - void scroll(bool to_bottom, const index_pair& pos); + + /// Scrolls the view to show an item sepcified by absolute position at top/bottom of the listbox. + void scroll(bool to_bottom, const index_pair& abs_pos); /// Appends a new column with a header text and the specified width at the end, and return it position size_type append_header(std::string text_utf8, unsigned width = 120); diff --git a/source/gui/widgets/listbox.cpp b/source/gui/widgets/listbox.cpp index 47d519f3..a6161056 100644 --- a/source/gui/widgets/listbox.cpp +++ b/source/gui/widgets/listbox.cpp @@ -963,7 +963,7 @@ namespace nana return prstatus; } - void scroll(const index_pair& pos, bool to_bottom); + void scroll(const index_pair& abs_pos, bool to_bottom); /// Append a new category with a specified name and return a pointer to it. category_t* create_cat(native_string_type&& text) @@ -2840,16 +2840,16 @@ namespace nana std::vector> panes_; }; - void es_lister::scroll(const index_pair& pos, bool to_bottom) + void es_lister::scroll(const index_pair& abs_pos, bool to_bottom) { - auto& cat = *get(pos.cat); + auto& cat = *get(abs_pos.cat); - if ((pos.item != nana::npos) && (pos.item >= cat.items.size())) + if ((abs_pos.item != nana::npos) && (abs_pos.item >= cat.items.size())) throw std::invalid_argument("listbox: invalid pos to scroll"); if (!cat.expand) { - this->expand(pos.cat, true); + this->expand(abs_pos.cat, true); ess_->calc_content_size(); } else if (!ess_->auto_draw) @@ -2862,7 +2862,7 @@ namespace nana auto origin = ess_->content_view->origin(); origin.y = 0; - auto off = this->distance(this->first(), pos) * ess_->item_height(); + auto off = this->distance(this->first(), this->index_cast(abs_pos, false)) * ess_->item_height(); auto screen_px = ess_->content_view->view_area().height; @@ -5222,9 +5222,9 @@ namespace nana ess.update(); } - void listbox::scroll(bool to_bottom, const index_pair& pos) + void listbox::scroll(bool to_bottom, const index_pair& abs_pos) { - _m_ess().lister.scroll(pos, to_bottom); + _m_ess().lister.scroll(abs_pos, to_bottom); _m_ess().update(); }