From 93c1e1bd6eaa8f77e746b1346b1729ed564081b4 Mon Sep 17 00:00:00 2001
From: Sergei Litovchuk <slitovchuk@productengine.com>
Date: Sat, 14 Nov 2009 19:15:51 +0200
Subject: No ticket. - Fixed toggleable menu in Picks panel. - Minor
 optimization of LLToggleableMenu.

--HG--
branch : product-engine
---
 indra/llui/lltoggleablemenu.cpp  |  9 ++++++++-
 indra/llui/lltoggleablemenu.h    |  3 +++
 indra/newview/llfavoritesbar.cpp |  5 ++++-
 indra/newview/llpanelavatar.cpp  |  8 ++++++--
 indra/newview/llpanelpicks.cpp   | 13 ++++++++++---
 indra/newview/llpanelplaces.cpp  |  5 ++++-
 6 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/indra/llui/lltoggleablemenu.cpp b/indra/llui/lltoggleablemenu.cpp
index 717e135412..5df1d35383 100644
--- a/indra/llui/lltoggleablemenu.cpp
+++ b/indra/llui/lltoggleablemenu.cpp
@@ -40,6 +40,7 @@ static LLDefaultChildRegistry::Register<LLToggleableMenu> r("toggleable_menu");
 
 LLToggleableMenu::LLToggleableMenu(const LLToggleableMenu::Params& p)
 :	LLMenuGL(p),
+	mButtonRect(),
 	mClosedByButtonClick(false)
 {
 }
@@ -56,13 +57,19 @@ void LLToggleableMenu::handleVisibilityChange (BOOL curVisibilityIn)
 	}
 }
 
-void LLToggleableMenu::setButtonRect(const LLRect& rect, LLView* current_view) 
+void LLToggleableMenu::setButtonRect(const LLRect& rect, LLView* current_view)
 {
 	LLRect screen;
 	current_view->localRectToScreen(rect, &screen);
 	mButtonRect = screen;
 }
 
+void LLToggleableMenu::setButtonRect(LLView* current_view)
+{
+	LLRect rect = current_view->getLocalRect();
+	setButtonRect(rect, current_view);
+}
+
 bool LLToggleableMenu::toggleVisibility() 
 {
 	if (mClosedByButtonClick)
diff --git a/indra/llui/lltoggleablemenu.h b/indra/llui/lltoggleablemenu.h
index 3cd66e04a8..9d8c5261b9 100644
--- a/indra/llui/lltoggleablemenu.h
+++ b/indra/llui/lltoggleablemenu.h
@@ -49,8 +49,11 @@ protected:
 public:
 	virtual void handleVisibilityChange (BOOL curVisibilityIn);
 
+	const LLRect& getButtonRect() const { return mButtonRect; }
+
 	// Converts the given local button rect to a screen rect
 	void setButtonRect(const LLRect& rect, LLView* current_view);
+	void setButtonRect(LLView* current_view);
 
 	// Returns "true" if menu was not closed by button click
 	// and is not still visible. If menu is visible toggles
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 18135fc558..01603f390d 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -901,7 +901,10 @@ void LLFavoritesBarCtrl::showDropDownMenu()
 				menu->buildDrawLabels();
 				menu->updateParent(LLMenuGL::sMenuContainer);
 
-				menu->setButtonRect(mChevronRect, this);
+				if (menu->getButtonRect().isEmpty())
+				{
+					menu->setButtonRect(mChevronRect, this);
+				}
 
 				LLMenuGL::showPopup(this, menu, getRect().getWidth() - menu->getRect().getWidth(), 0);
 				return;
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index f0aa189b7f..2254684f21 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -570,10 +570,14 @@ void LLPanelAvatarProfile::onOverflowButtonClicked()
 		return;
 
 	LLView* btn = getChild<LLView>("overflow_btn");
-	LLRect rect = btn->getRect();
 
+	if (mProfileMenu->getButtonRect().isEmpty())
+	{
+		mProfileMenu->setButtonRect(btn);
+	}
 	mProfileMenu->updateParent(LLMenuGL::sMenuContainer);
-	mProfileMenu->setButtonRect(btn->getLocalRect(), btn);
+
+	LLRect rect = btn->getRect();
 	LLMenuGL::showPopup(this, mProfileMenu, rect.mRight, rect.mTop);
 }
 
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 6905c7e546..04b4226f82 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -346,11 +346,18 @@ void LLPanelPicks::onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab)
 
 void LLPanelPicks::onOverflowButtonClicked()
 {
-	LLRect rect;
-	childGetRect(XML_BTN_OVERFLOW, rect);
+	if (!mOverflowMenu->toggleVisibility())
+		return;
+
+	LLView* btn = getChild<LLView>(XML_BTN_OVERFLOW);
 
+	if (mOverflowMenu->getButtonRect().isEmpty())
+	{
+		mOverflowMenu->setButtonRect(btn);
+	}
 	mOverflowMenu->updateParent(LLMenuGL::sMenuContainer);
-	mOverflowMenu->setButtonRect(rect, this);
+
+	LLRect rect = btn->getRect();
 	LLMenuGL::showPopup(this, mOverflowMenu, rect.mRight, rect.mTop);
 }
 
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 3d0fba9426..eb10d97b37 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -601,9 +601,12 @@ void LLPanelPlaces::onOverflowButtonClicked()
 	if (!menu->toggleVisibility())
 		return;
 
+	if (menu->getButtonRect().isEmpty())
+	{
+		menu->setButtonRect(mOverflowBtn);
+	}
 	menu->updateParent(LLMenuGL::sMenuContainer);
 	LLRect rect = mOverflowBtn->getRect();
-	menu->setButtonRect(rect, this);
 	LLMenuGL::showPopup(this, menu, rect.mRight, rect.mTop);
 }
 
-- 
cgit v1.2.3