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:
		
							parent
							
								
									d4d1a79af8
								
							
						
					
					
						commit
						7863dcdba6
					
				@ -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)
 | 
				
			||||||
@ -1771,7 +1771,7 @@ namespace nana
 | 
				
			|||||||
						else
 | 
											else
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
							offs -= (item_left_in_this_cat+1) ;
 | 
												offs -= (item_left_in_this_cat+1) ;
 | 
				
			||||||
							item = from;
 | 
												item = from;                        
 | 
				
			||||||
							item.item += item_left_in_this_cat ;// select the last item
 | 
												item.item += item_left_in_this_cat ;// select the last item
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
@ -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);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user