summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2010-01-11 16:36:27 -0500
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2010-01-11 16:36:27 -0500
commit8f4c2a59db47283e1edb8ae7f6dee4466b95d1e9 (patch)
treea7c424eac11ce6eea55c6041e205ef09cb8c541f
parent1d9591afbe5946f0e3a75aea917097f6a08d8ce5 (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
-rw-r--r--indra/newview/llsidetray.cpp52
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)