diff options
author | Mike Antipov <mantipov@productengine.com> | 2010-04-26 17:19:43 +0300 |
---|---|---|
committer | Mike Antipov <mantipov@productengine.com> | 2010-04-26 17:19:43 +0300 |
commit | a00712e95133001b29fb15b15ccb6e66f2ec075b (patch) | |
tree | 6ba81a60576c425769a3a94a74bdaa52678462ce /indra | |
parent | d0204a2b149462371ee20725067e43b018c485bb (diff) |
Fixed major bug EXT-6092 [crashhunters] Crash in LLFlatListView::selectItemPair
Reason:
A) incorrect UP arrow handling in accordion control: invisible accordion tab was selected to handle selection.
B) invalid std::map item (in empty map) was used to make selection in Flat List
Fix: added checks against empty map before use front/back item pair before selecting first/last items.
Also updated processing of the UP key in accordion control to not select invisible accordion tab.
Reviewed by Vadim Savchuk at https://codereview.productengine.com/secondlife/r/318/
--HG--
branch : product-engine
Diffstat (limited to 'indra')
-rw-r--r-- | indra/llui/llaccordionctrl.cpp | 16 | ||||
-rw-r--r-- | indra/llui/llflatlistview.cpp | 6 |
2 files changed, 18 insertions, 4 deletions
diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index 136fd2a9ac..dca43c5784 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -668,15 +668,23 @@ S32 LLAccordionCtrl::notifyParent(const LLSD& info) LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]); if(accordion_tab->hasFocus() && i>0) { + bool prev_visible_tab_found = false; while(i>0) { if(mAccordionTabs[--i]->getVisible()) + { + prev_visible_tab_found = true; break; + } } - - accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]); - accordion_tab->notify(LLSD().with("action","select_last")); - return 1; + + if (prev_visible_tab_found) + { + accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]); + accordion_tab->notify(LLSD().with("action","select_last")); + return 1; + } + break; } } return 0; diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index 990bf5cd22..e0b2244654 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -744,12 +744,18 @@ LLRect LLFlatListView::getLastSelectedItemRect() void LLFlatListView::selectFirstItem () { + // No items - no actions! + if (mItemPairs.empty()) return; + selectItemPair(mItemPairs.front(), true); ensureSelectedVisible(); } void LLFlatListView::selectLastItem () { + // No items - no actions! + if (mItemPairs.empty()) return; + selectItemPair(mItemPairs.back(), true); ensureSelectedVisible(); } |