FIX: crash in page down and home of a listbox with categories, trying to create an item_proxy {cat, npos} and select it

This commit is contained in:
qPCR4vir 2015-05-05 13:59:59 +02:00
parent d4d1a79af8
commit 7863dcdba6

View File

@ -1598,17 +1598,17 @@ namespace nana
cat_proxy cpx{ess_,cat}; cat_proxy cpx{ess_,cat};
for (item_proxy &it : cpx ) for (item_proxy &it : cpx )
{ {
if (it.selected() != sel) if (it.selected() != sel)
changed = true; changed = true;
it.select(sel); it.select(sel);
if (sel) // not check for single_selection_ if (sel) // not check for single_selection_
last_selected_abs = it->pos(); last_selected_abs = it->pos();
else if (last_selected_abs == it->pos()) else if (last_selected_abs == it->pos())
last_selected_abs.set_both(npos); last_selected_abs.set_both(npos);
} }
last_selected_abs = index_pair{cat,npos}; last_selected_abs = index_pair{cat,npos};
return changed; return changed;
} }
@ -1653,7 +1653,7 @@ namespace nana
index_pair first_displ() const index_pair first_displ() const
{ {
return absolute ( first() ); return absolute ( first() );
} }
bool good(size_type cat) const bool good(size_type cat) const
{ {
@ -1676,7 +1676,7 @@ namespace nana
if (0 == pos.cat) // but for cat 0 return first item if (0 == pos.cat) // but for cat 0 return first item
item.item = 0; // let check this is good item.item = 0; // let check this is good
else else
return true; return true;
} }
auto i = _m_at(pos.cat); // pos is not a cat and i point to it cat auto i = _m_at(pos.cat); // pos is not a cat and i point to it cat
@ -1738,7 +1738,7 @@ namespace nana
/// all arg are relative to display order, or all are absolute, but not mixed /// all arg are relative to display order, or all are absolute, but not mixed
bool forward(index_pair from, size_type offs, index_pair& item) const bool forward(index_pair from, size_type offs, index_pair& item) const
{ {
if(!good_item(from, from)) if(!good_item(from, from))
return false; return false;
if(offs == 0) if(offs == 0)
@ -3378,21 +3378,35 @@ namespace nana
if (! scrl.make_page_scroll(!up)) if (! scrl.make_page_scroll(!up))
return; return;
essence_->lister.select_for_all(false); essence_->lister.select_for_all(false);
if (up)
item_proxy {essence_, essence_->scroll_y_abs()}.select(true); index_pair idx{essence_->scroll_y_dpl()};
else if (!up)
{
index_pair idx{essence_->scroll_y_dpl()};
essence_->lister.forward(idx, scrl.range()-1, idx); essence_->lister.forward(idx, scrl.range()-1, idx);
item_proxy::from_display(essence_,idx).select(true);
} if (idx.is_item())
item_proxy::from_display(essence_, idx).select(true);
else
if(!essence_->lister.single_selection())
essence_->lister.categ_selected(idx.cat, true);
essence_->trace_last_selected_item ();
break; break;
} }
case keyboard::os_home: case keyboard::os_home:
{
essence_->lister.select_for_all(false); essence_->lister.select_for_all(false);
item_proxy::from_display(essence_, {0,0}).select(true);
index_pair frst{essence_->lister.first()};
if (frst.is_item())
item_proxy::from_display(essence_, frst).select(true);
else
if(!essence_->lister.single_selection())
essence_->lister.categ_selected(frst.cat, true);
essence_->trace_last_selected_item (); essence_->trace_last_selected_item ();
break; break;
}
case keyboard::os_end: case keyboard::os_end:
essence_->lister.select_for_all(false); essence_->lister.select_for_all(false);
item_proxy::from_display(essence_, essence_->lister.last()).select(true); item_proxy::from_display(essence_, essence_->lister.last()).select(true);