add a listbox::scroll() to scroll the view to the top or bottom
This commit is contained in:
parent
29eddaa97f
commit
9844792c54
@ -554,7 +554,10 @@ By \a clicking on one header the list get \a reordered, first up, and then down
|
|||||||
listbox(window, bool visible);
|
listbox(window, bool visible);
|
||||||
listbox(window, const rectangle& = {}, bool visible = true);
|
listbox(window, const rectangle& = {}, bool visible = true);
|
||||||
|
|
||||||
void auto_draw(bool); ///< Set state: Redraw automatically after an operation?
|
void auto_draw(bool); ///< Set state: Redraw automatically after an operation
|
||||||
|
|
||||||
|
/// Scrolls the view to the first or last item of a specified category
|
||||||
|
void scroll(size_type cat_pos, bool to_bottom);
|
||||||
|
|
||||||
/// 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(nana::string header_text, unsigned width = 120);
|
size_type append_header(nana::string header_text, unsigned width = 120);
|
||||||
|
|||||||
@ -848,6 +848,8 @@ namespace nana
|
|||||||
return sorted_reverse_;
|
return sorted_reverse_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void scroll(const index_pair& 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(nana::string&& text)
|
category_t* create_cat(nana::string&& text)
|
||||||
{
|
{
|
||||||
@ -2405,6 +2407,54 @@ namespace nana
|
|||||||
std::vector<std::pair<index_type, essence_t::inline_pane*>> panes_;
|
std::vector<std::pair<index_type, essence_t::inline_pane*>> panes_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void es_lister::scroll(const index_pair& pos, bool to_bottom)
|
||||||
|
{
|
||||||
|
auto& cat = *get(pos.cat);
|
||||||
|
|
||||||
|
if ((pos.item != ::nana::npos) && (pos.item >= cat.items.size()))
|
||||||
|
throw std::invalid_argument("listbox: invalid pos to scroll");
|
||||||
|
|
||||||
|
if (!cat.expand)
|
||||||
|
{
|
||||||
|
this->expand(pos.cat, true);
|
||||||
|
ess_->adjust_scroll_life();
|
||||||
|
}
|
||||||
|
|
||||||
|
//The number of items can be displayed on screen
|
||||||
|
auto view_items = ess_->number_of_lister_items(false) - 1;
|
||||||
|
|
||||||
|
index_pair start_pos;
|
||||||
|
if (to_bottom)
|
||||||
|
{
|
||||||
|
//start_pos will be (0,0) if backward fails
|
||||||
|
backward(pos, view_items, start_pos);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (forward(pos, view_items, start_pos))
|
||||||
|
start_pos = pos;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
index_pair last(list_.size() - 1);
|
||||||
|
|
||||||
|
if (list_.back().expand)
|
||||||
|
{
|
||||||
|
if (list_.back().items.empty())
|
||||||
|
last.item = npos;
|
||||||
|
else
|
||||||
|
last.item = list_.back().items.size() - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
last.item = ::nana::npos;
|
||||||
|
|
||||||
|
backward(last, view_items, start_pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ess_->set_scroll_y_dpl(start_pos);
|
||||||
|
ess_->adjust_scroll_value();
|
||||||
|
}
|
||||||
|
|
||||||
void es_lister::erase(const index_pair& pos)
|
void es_lister::erase(const index_pair& pos)
|
||||||
{
|
{
|
||||||
auto & catobj = *get(pos.cat);
|
auto & catobj = *get(pos.cat);
|
||||||
@ -4180,12 +4230,41 @@ namespace nana
|
|||||||
_m_ess().set_auto_draw(ad);
|
_m_ess().set_auto_draw(ad);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void listbox::scroll(size_type cat_pos, bool to_bottom)
|
||||||
|
{
|
||||||
|
auto & ess = _m_ess();
|
||||||
|
auto cats = ess.lister.size_categ();
|
||||||
|
|
||||||
|
if (::nana::npos != cat_pos)
|
||||||
|
{
|
||||||
|
if (cat_pos >= cats)
|
||||||
|
throw std::invalid_argument("listbox: invalid category");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
cat_pos = cats - 1;
|
||||||
|
|
||||||
|
index_pair pos(cat_pos);
|
||||||
|
if (to_bottom)
|
||||||
|
{
|
||||||
|
auto items = ess.lister.size_item(cat_pos);
|
||||||
|
if (0 == items)
|
||||||
|
pos.item = ::nana::npos;
|
||||||
|
else
|
||||||
|
pos.item = items - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pos.item = ess.lister.size_item(cat_pos) ? 0 : ::nana::npos;
|
||||||
|
|
||||||
|
ess.lister.scroll(pos, to_bottom);
|
||||||
|
ess.update();
|
||||||
|
}
|
||||||
|
|
||||||
listbox::size_type listbox::append_header(nana::string text, unsigned width)
|
listbox::size_type listbox::append_header(nana::string text, unsigned width)
|
||||||
{
|
{
|
||||||
auto & ess = _m_ess();
|
auto & ess = _m_ess();
|
||||||
listbox::size_type index = ess.header.create(std::move(text), width);
|
auto pos = ess.header.create(std::move(text), width);
|
||||||
ess.update();
|
ess.update();
|
||||||
return index;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
listbox& listbox::header_width(size_type pos, unsigned pixels)
|
listbox& listbox::header_width(size_type pos, unsigned pixels)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user