diff options
author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2010-01-11 16:36:27 -0500 |
---|---|---|
committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2010-01-11 16:36:27 -0500 |
commit | 8f4c2a59db47283e1edb8ae7f6dee4466b95d1e9 (patch) | |
tree | a7c424eac11ce6eea55c6041e205ef09cb8c541f /indra/newview/llsidetray.cpp | |
parent | 1d9591afbe5946f0e3a75aea917097f6a08d8ce5 (diff) |
For EXT-4068: [BSI] right click several times on an inventory item produces several second hang. Improved speed of panel finding by restricting search to only panels, saving time when inventory is very large
Diffstat (limited to 'indra/newview/llsidetray.cpp')
-rw-r--r-- | indra/newview/llsidetray.cpp | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 608165022f..d1236b948e 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -641,24 +641,60 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para return NULL; } -LLPanel* LLSideTray::getPanel (const std::string& panel_name) +// This is just LLView::findChildView specialized to restrict the search to LLPanels. +// Optimization for EXT-4068 to avoid searching down to the individual item level +// when inventories are large. +LLPanel *findChildPanel(LLPanel *panel, const std::string& name, bool recurse, S32& count) { - child_vector_const_iter_t child_it; - for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) + for (LLView::child_list_const_iter_t child_it = panel->beginChild(); + child_it != panel->endChild(); ++child_it) { - LLView* view = (*child_it)->findChildView(panel_name,true); - if(view) + count++; + LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); + if (!child_panel) + continue; + if (child_panel->getName() == name) + return child_panel; + } + if (recurse) + { + for (LLView::child_list_const_iter_t child_it = panel->beginChild(); + child_it != panel->endChild(); ++child_it) { - LLPanel* panel = dynamic_cast<LLPanel*>(view); - if(panel) + count++; + LLPanel *child_panel = dynamic_cast<LLPanel*>(*child_it); + if (!child_panel) + continue; + LLPanel *found_panel = findChildPanel(child_panel,name,recurse,count); + if (found_panel) { - return panel; + return found_panel; } } } return NULL; } +LLPanel* LLSideTray::getPanel(const std::string& panel_name) +{ + static S32 max_count = 0; + S32 count = 0; + for ( child_vector_const_iter_t child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) + { + LLPanel *panel = findChildPanel(*child_it,panel_name,true,count); + if (count > max_count) + { + max_count = count; + llwarns << "max_count " << max_count << llendl; + } + if(panel) + { + return panel; + } + } + return NULL; +} + LLPanel* LLSideTray::getActivePanel() { if (mActiveTab && !mCollapsed) |