diff options
| author | Leslie Linden <none@none> | 2011-06-08 13:14:15 -0700 | 
|---|---|---|
| committer | Leslie Linden <none@none> | 2011-06-08 13:14:15 -0700 | 
| commit | 888b39c283e53fd128778e70e231bcb6053de4b8 (patch) | |
| tree | 995b188468da71dde79924d9af174e9b7fca494d | |
| parent | d8e84f85c9377a9bfd628d61ee1a661c31f3db84 (diff) | |
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.
| -rw-r--r-- | indra/llui/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/llui/llbadgeowner.cpp | 116 | ||||
| -rw-r--r-- | indra/llui/llbadgeowner.h | 58 | ||||
| -rw-r--r-- | indra/llui/llbutton.cpp | 87 | ||||
| -rw-r--r-- | indra/llui/llbutton.h | 10 | 
5 files changed, 185 insertions, 88 deletions
| diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index fb585e062c..e9283788bd 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 0000000000..c77cf21ae0 --- /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 0000000000..7b2bbe01fd --- /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 c841933a5f..ecad38894c 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 07f0395719..5880a0e1f2 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 @@ public:  	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 @@ protected:  	LLPointer<LLUIImage> getImageUnselected() const	{ return mImageUnselected; }  	LLPointer<LLUIImage> getImageSelected() const	{ return mImageSelected; } -	void addBadgeToParentPanel(); -  	LLFrameTimer	mMouseDownTimer;  private: @@ -363,8 +359,6 @@ private:  	bool						mForcePressedState;  	LLFrameTimer				mFlashingTimer; -	 -	LLBadge*					mBadge;  };  // Build time optimization, generate once in .cpp file | 
