From 888b39c283e53fd128778e70e231bcb6053de4b8 Mon Sep 17 00:00:00 2001
From: Leslie Linden <none@none>
Date: Wed, 8 Jun 2011 13:14:15 -0700
Subject: [PATCH] EXP-865 PROGRESS -- Modify LLBadge to allow it to hang off of
 non-buttons

Moved LLBadge use from LLButton into a separate LLBadgeOwner class.
LLButton now derives from LLBadgeOwner which handles the bulk of the
badge management.
---
 indra/llui/CMakeLists.txt   |   2 +
 indra/llui/llbadgeowner.cpp | 116 ++++++++++++++++++++++++++++++++++++
 indra/llui/llbadgeowner.h   |  58 ++++++++++++++++++
 indra/llui/llbutton.cpp     |  87 +++------------------------
 indra/llui/llbutton.h       |  10 +---
 5 files changed, 185 insertions(+), 88 deletions(-)
 create mode 100644 indra/llui/llbadgeowner.cpp
 create mode 100644 indra/llui/llbadgeowner.h

diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index fb585e062c8..e9283788bdf 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -29,6 +29,7 @@ set(llui_SOURCE_FILES
     llaccordionctrl.cpp
     llaccordionctrltab.cpp
     llbadge.cpp
+    llbadgeowner.cpp
     llbutton.cpp
     llcheckboxctrl.cpp
     llclipboard.cpp
@@ -121,6 +122,7 @@ set(llui_HEADER_FILES
     llaccordionctrl.h
     llaccordionctrltab.h
     llbadge.h
+    llbadgeowner.h
     llbutton.h
     llcallbackmap.h
     llcheckboxctrl.h
diff --git a/indra/llui/llbadgeowner.cpp b/indra/llui/llbadgeowner.cpp
new file mode 100644
index 00000000000..c77cf21ae0f
--- /dev/null
+++ b/indra/llui/llbadgeowner.cpp
@@ -0,0 +1,116 @@
+/** 
+ * @file llbadgeowner.cpp
+ * @brief Class to manage badges attached to a UI control
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llbadgeowner.h"
+#include "llpanel.h"
+
+//
+// Classes
+//
+
+LLBadgeOwner::LLBadgeOwner(LLHandle<LLUICtrl> ctrlHandle)
+	: mBadge(NULL)
+	, mBadgeOwnerCtrl(ctrlHandle)
+{
+}
+
+void LLBadgeOwner::initBadgeParams(const LLBadge::Params& p)
+{
+	if (!p.equals(LLUICtrlFactory::getDefaultParams<LLBadge>()))
+	{
+		mBadge = createBadge(p);
+	}
+}
+
+void LLBadgeOwner::setBadgeLabel(const LLStringExplicit& label)
+{
+	if (mBadge == NULL)
+	{
+		mBadge = createBadge(LLUICtrlFactory::getDefaultParams<LLBadge>());
+
+		addBadgeToParentPanel();
+	}
+
+	if (mBadge)
+	{
+		mBadge->setLabel(label);
+
+		//
+		// Push the badge to the front so it renders on top
+		//
+
+		LLUICtrl * parent = mBadge->getParentUICtrl();
+
+		if (parent)
+		{
+			parent->sendChildToFront(mBadge);
+		}
+	}
+}
+
+void LLBadgeOwner::addBadgeToParentPanel()
+{
+	if (mBadge && mBadgeOwnerCtrl.get())
+	{
+		// Find the appropriate parent panel for the badge
+
+		LLUICtrl * owner_ctrl = mBadgeOwnerCtrl.get();
+		LLUICtrl * parent = owner_ctrl->getParentUICtrl();
+
+		LLPanel * parentPanel = NULL;
+
+		while (parent)
+		{
+			parentPanel = dynamic_cast<LLPanel *>(parent);
+
+			if (parentPanel && parentPanel->acceptsBadge())
+			{
+				break;
+			}
+
+			parent = parent->getParentUICtrl();
+		}
+
+		if (parentPanel)
+		{
+			parentPanel->addChild(mBadge);
+		}
+		else
+		{
+			llwarns << "Unable to find parent panel for badge " << mBadge->getName() << " on ui control " << owner_ctrl->getName() << llendl;
+		}
+	}
+}
+
+LLBadge* LLBadgeOwner::createBadge(const LLBadge::Params& p)
+{
+	LLBadge::Params badge_params(p);
+	badge_params.owner = mBadgeOwnerCtrl;
+
+	return LLUICtrlFactory::create<LLBadge>(badge_params);
+}
diff --git a/indra/llui/llbadgeowner.h b/indra/llui/llbadgeowner.h
new file mode 100644
index 00000000000..7b2bbe01fd3
--- /dev/null
+++ b/indra/llui/llbadgeowner.h
@@ -0,0 +1,58 @@
+/** 
+ * @file llbadgeowner.h
+ * @brief Header for badge owners
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLBADGEOWNER_H
+#define LL_LLBADGEOWNER_H
+
+#include "llbadge.h"
+#include "lluictrl.h"
+
+//
+// Classes
+//
+
+class LLBadgeOwner
+{
+public:
+
+	LLBadgeOwner(LLHandle<LLUICtrl> ctrlHandle);
+
+	void initBadgeParams(const LLBadge::Params& p);
+	void addBadgeToParentPanel();
+
+	void setBadgeLabel(const LLStringExplicit& label);
+
+private:
+
+	LLBadge* createBadge(const LLBadge::Params& p);
+
+private:
+
+	LLBadge*			mBadge;
+	LLHandle<LLUICtrl>	mBadgeOwnerCtrl;
+};
+
+#endif  // LL_LLBADGEOWNER_H
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index c841933a5fc..ecad38894cc 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -113,6 +113,7 @@ LLButton::Params::Params()
 
 LLButton::LLButton(const LLButton::Params& p)
 :	LLUICtrl(p),
+	LLBadgeOwner(getUICtrlHandle()),
 	mMouseDownFrame(0),
 	mMouseHeldDownCount(0),
 	mBorderEnabled( FALSE ),
@@ -164,8 +165,7 @@ LLButton::LLButton(const LLButton::Params& p)
 	mMouseDownSignal(NULL),
 	mMouseUpSignal(NULL),
 	mHeldDownSignal(NULL),
-	mUseDrawContextAlpha(p.use_draw_context_alpha),
-	mBadge(NULL)
+	mUseDrawContextAlpha(p.use_draw_context_alpha)
 {
 	static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0);
 	static Params default_params(LLUICtrlFactory::getDefaultParams<LLButton>());
@@ -248,16 +248,10 @@ LLButton::LLButton(const LLButton::Params& p)
 	{
 		setHeldDownCallback(initCommitCallback(p.mouse_held_callback));
 	}
-	
-	// Only create a badge here if a non-default one was provided.
+
 	if (p.badge.isProvided())
 	{
-		if (!p.badge().equals(LLUICtrlFactory::getDefaultParams<LLBadge>()))
-		{
-			LLBadge::Params badge_params(p.badge());
-			badge_params.owner = getUICtrlHandle();
-			mBadge = LLUICtrlFactory::create<LLBadge>(badge_params);
-		}
+		LLBadgeOwner::initBadgeParams(p.badge());
 	}
 }
 
@@ -343,14 +337,11 @@ BOOL LLButton::postBuild()
 {
 	autoResize();
 
-	// Attach the badge to the appropriate parent panel
-	if (mBadge)
-	{
-		addBadgeToParentPanel();
-	}
+	addBadgeToParentPanel();
 
-	return TRUE;
+	return LLUICtrl::postBuild();
 }
+
 BOOL LLButton::handleUnicodeCharHere(llwchar uni_char)
 {
 	BOOL handled = FALSE;
@@ -1085,70 +1076,6 @@ void LLButton::setImageOverlay(const LLUUID& image_id, LLFontGL::HAlign alignmen
 	}
 }
 
-void LLButton::addBadgeToParentPanel()
-{
-	if (mBadge)
-	{
-		// Find the appropriate parent panel for the badge
-
-		LLPanel * parentPanel = NULL;
-		LLUICtrl * parent = getParentUICtrl();
-		
-		while (parent)
-		{
-			parentPanel = dynamic_cast<LLPanel*>(parent);
-		
-			if (parentPanel && parentPanel->acceptsBadge())
-			{
-				break;
-			}
-
-			parent = parent->getParentUICtrl();
-		}
-
-		if (parentPanel)
-		{
-			parentPanel->addChild(mBadge);
-		}
-		else
-		{
-			llwarns << "Unable to find parent panel for badge " << mBadge->getName() << " on button " << getName() << llendl;
-		}
-	}
-	else
-	{
-		llwarns << "Unable to add NULL badge to button " << getName() << llendl;
-	}
-}
-
-void LLButton::setBadgeLabel(const LLStringExplicit& label)
-{
-	if (mBadge == NULL)
-	{
-		LLBadge::Params badge_params(LLUICtrlFactory::getDefaultParams<LLBadge>());
-		badge_params.owner = getUICtrlHandle();
-		mBadge = LLUICtrlFactory::create<LLBadge>(badge_params);
-
-		addBadgeToParentPanel();
-	}
-
-	if (mBadge)
-	{
-		mBadge->setLabel(label);
-
-		//
-		// Push the badge to the front so it renders last
-		//
-
-		LLUICtrl * parent = mBadge->getParentUICtrl();
-
-		if (parent)
-		{
-			parent->sendChildToFront(mBadge);
-		}
-	}
-}
-
 void LLButton::onMouseCaptureLost()
 {
 	resetMouseDownTimer();
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 07f03957199..5880a0e1f21 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -28,7 +28,7 @@
 #define LL_LLBUTTON_H
 
 #include "lluuid.h"
-#include "llbadge.h"
+#include "llbadgeowner.h"
 #include "llcontrol.h"
 #include "lluictrl.h"
 #include "v4color.h"
@@ -60,7 +60,7 @@ class LLUICtrlFactory;
 //
 
 class LLButton
-: public LLUICtrl
+: public LLUICtrl, public LLBadgeOwner
 {
 public:
 	struct Params 
@@ -252,8 +252,6 @@ class LLButton
 	void			setImageFlash(LLPointer<LLUIImage> image);
 	void			setImagePressed(LLPointer<LLUIImage> image);
 	
-	void			setBadgeLabel(const LLStringExplicit& label);
-
 	void			setCommitOnReturn(BOOL commit) { mCommitOnReturn = commit; }
 	BOOL			getCommitOnReturn() const { return mCommitOnReturn; }
 
@@ -271,8 +269,6 @@ class LLButton
 	LLPointer<LLUIImage> getImageUnselected() const	{ return mImageUnselected; }
 	LLPointer<LLUIImage> getImageSelected() const	{ return mImageSelected; }
 
-	void addBadgeToParentPanel();
-
 	LLFrameTimer	mMouseDownTimer;
 
 private:
@@ -363,8 +359,6 @@ class LLButton
 	bool						mForcePressedState;
 
 	LLFrameTimer				mFlashingTimer;
-	
-	LLBadge*					mBadge;
 };
 
 // Build time optimization, generate once in .cpp file
-- 
GitLab