fix bug that listbox incorrect scrolls if content is sorted(#245)
This commit is contained in:
parent
1be4b4e667
commit
4e18d81f90
@ -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
|
/// 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, 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
|
/// 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);
|
size_type append_header(std::string text_utf8, unsigned width = 120);
|
||||||
|
@ -963,7 +963,7 @@ namespace nana
|
|||||||
return prstatus;
|
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.
|
/// Append a new category with a specified name and return a pointer to it.
|
||||||
category_t* create_cat(native_string_type&& text)
|
category_t* create_cat(native_string_type&& text)
|
||||||
@ -2840,16 +2840,16 @@ namespace nana
|
|||||||
std::vector<std::pair<index_type, inline_pane*>> panes_;
|
std::vector<std::pair<index_type, inline_pane*>> 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");
|
throw std::invalid_argument("listbox: invalid pos to scroll");
|
||||||
|
|
||||||
if (!cat.expand)
|
if (!cat.expand)
|
||||||
{
|
{
|
||||||
this->expand(pos.cat, true);
|
this->expand(abs_pos.cat, true);
|
||||||
ess_->calc_content_size();
|
ess_->calc_content_size();
|
||||||
}
|
}
|
||||||
else if (!ess_->auto_draw)
|
else if (!ess_->auto_draw)
|
||||||
@ -2862,7 +2862,7 @@ namespace nana
|
|||||||
auto origin = ess_->content_view->origin();
|
auto origin = ess_->content_view->origin();
|
||||||
origin.y = 0;
|
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;
|
auto screen_px = ess_->content_view->view_area().height;
|
||||||
|
|
||||||
@ -5222,9 +5222,9 @@ namespace nana
|
|||||||
ess.update();
|
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();
|
_m_ess().update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user