diff options
Diffstat (limited to 'indra/llui')
| -rw-r--r-- | indra/llui/llbutton.cpp | 3 | ||||
| -rw-r--r-- | indra/llui/llfloater.cpp | 101 | ||||
| -rw-r--r-- | indra/llui/llfloater.h | 13 | ||||
| -rw-r--r-- | indra/llui/llhandle.h | 67 | ||||
| -rw-r--r-- | indra/llui/llmenugl.h | 2 | ||||
| -rw-r--r-- | indra/llui/llpanel.cpp | 2 | ||||
| -rw-r--r-- | indra/llui/llpanel.h | 3 | ||||
| -rw-r--r-- | indra/llui/lltabcontainer.cpp | 185 | ||||
| -rw-r--r-- | indra/llui/lltabcontainer.h | 6 | ||||
| -rw-r--r-- | indra/llui/lluictrl.cpp | 11 | ||||
| -rw-r--r-- | indra/llui/lluictrl.h | 3 | ||||
| -rw-r--r-- | indra/llui/llview.h | 9 | ||||
| -rw-r--r-- | indra/llui/tests/llurlentry_stub.cpp | 3 | ||||
| -rw-r--r-- | indra/llui/tests/llurlmatch_test.cpp | 5 | 
14 files changed, 199 insertions, 214 deletions
| diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 74b8885e1f..93d8282aa7 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -115,7 +115,7 @@ LLButton::Params::Params()  LLButton::LLButton(const LLButton::Params& p)  :	LLUICtrl(p), -	LLBadgeOwner(LLView::getHandle()), +	LLBadgeOwner(getHandle()),  	mMouseDownFrame(0),  	mMouseHeldDownCount(0),  	mBorderEnabled( FALSE ), @@ -1234,7 +1234,6 @@ void LLButton::resetMouseDownTimer()  	mMouseDownTimer.reset();  } -  BOOL LLButton::handleDoubleClick(S32 x, S32 y, MASK mask)  {  	// just treat a double click as a second click diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 432397d3e9..40b550269c 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -58,6 +58,8 @@  #include "llhelp.h"  #include "llmultifloater.h"  #include "llsdutil.h" +#include <boost/foreach.hpp> +  // use this to control "jumping" behavior when Ctrl-Tabbing  const S32 TABBED_FLOATER_OFFSET = 0; @@ -111,7 +113,6 @@ LLFloater::click_callback LLFloater::sButtonCallbacks[BUTTON_COUNT] =  LLMultiFloater* LLFloater::sHostp = NULL;  BOOL			LLFloater::sQuitting = FALSE; // Flag to prevent storing visibility controls while quitting -LLFloater::handle_map_t	LLFloater::sFloaterMap;  LLFloaterView* gFloaterView = NULL; @@ -268,7 +269,6 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)  	mMinimizeSignal(NULL)  //	mNotificationContext(NULL)  { -	mHandle.bind(this);  //	mNotificationContext = new LLFloaterNotificationContext(getHandle());  	// Clicks stop here. @@ -323,9 +323,6 @@ void LLFloater::initFloater(const Params& p)  	// Floaters are created in the invisible state	  	setVisible(FALSE); -	// add self to handle->floater map -	sFloaterMap[mHandle] = this; -  	if (!getParent())  	{  		gFloaterView->addChild(this); @@ -532,8 +529,6 @@ LLFloater::~LLFloater()  	// correct, non-minimized positions.  	setMinimized( FALSE ); -	sFloaterMap.erase(mHandle); -  	delete mDragHandle;  	for (S32 i = 0; i < 4; i++)   	{ @@ -1038,7 +1033,9 @@ BOOL LLFloater::canSnapTo(const LLView* other_view)  	if (other_view != getParent())  	{  		const LLFloater* other_floaterp = dynamic_cast<const LLFloater*>(other_view);		 -		if (other_floaterp && other_floaterp->getSnapTarget() == getHandle() && mDependents.find(other_floaterp->getHandle()) != mDependents.end()) +		if (other_floaterp  +			&& other_floaterp->getSnapTarget() == getHandle()  +			&& mDependents.find(other_floaterp->getHandle()) != mDependents.end())  		{  			// this is a dependent that is already snapped to us, so don't snap back to it  			return FALSE; @@ -1677,18 +1674,17 @@ void LLFloater::onClickHelp( LLFloater* self )  LLFloater* LLFloater::getClosableFloaterFromFocus()  {  	LLFloater* focused_floater = NULL; - -	handle_map_iter_t iter; -	for(iter = sFloaterMap.begin(); iter != sFloaterMap.end(); ++iter) +	LLInstanceTracker<LLFloater>::instance_iter it = beginInstances(); +	LLInstanceTracker<LLFloater>::instance_iter end_it = endInstances(); +	for (; it != end_it; ++it)  	{ -		focused_floater = iter->second; -		if (focused_floater->hasFocus()) +		if (it->hasFocus())  		{  			break;  		}  	} -	if (iter == sFloaterMap.end()) +	if (it == endInstances())  	{  		// nothing found, return  		return NULL; @@ -1949,6 +1945,12 @@ void LLFloater::setCanDrag(BOOL can_drag)  	}  } +bool LLFloater::getCanDrag() +{ +	return mDragHandle->getEnabled(); +} + +  void LLFloater::updateTitleButtons()  {  	static LLUICachedControl<S32> floater_close_box_size ("UIFloaterCloseBoxSize", 0); @@ -2163,8 +2165,15 @@ LLFloaterView::LLFloaterView (const Params& p)  // By default, adjust vertical.  void LLFloaterView::reshape(S32 width, S32 height, BOOL called_from_parent)  { -	S32 old_width = getRect().getWidth(); -	S32 old_height = getRect().getHeight(); +	S32 old_right = mLastSnapRect.mRight; +	S32 old_top = mLastSnapRect.mTop; + +	LLView::reshape(width, height, called_from_parent); + +	S32 new_right = getSnapRect().mRight; +	S32 new_top = getSnapRect().mTop; + +	mLastSnapRect = getSnapRect();  	for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)  	{ @@ -2172,66 +2181,48 @@ void LLFloaterView::reshape(S32 width, S32 height, BOOL called_from_parent)  		LLFloater* floaterp = (LLFloater*)viewp;  		if (floaterp->isDependent())  		{ -			// dependents use same follow flags as their "dependee" +			// dependents are moved with their "dependee"  			continue;  		} -		// Make if follow the edge it is closest to -		U32 follow_flags = 0x0; - -		if (floaterp->isMinimized()) -		{ -			follow_flags |= (FOLLOWS_LEFT | FOLLOWS_TOP); -		} -		else +		if (!floaterp->isMinimized())  		{  			LLRect r = floaterp->getRect();  			// Compute absolute distance from each edge of screen  			S32 left_offset = llabs(r.mLeft - 0); -			S32 right_offset = llabs(old_width - r.mRight); +			S32 right_offset = llabs(old_right - r.mRight); -			S32 top_offset = llabs(old_height - r.mTop); +			S32 top_offset = llabs(old_top - r.mTop);  			S32 bottom_offset = llabs(r.mBottom - 0); +			S32 translate_x = 0; +			S32 translate_y = 0; -			if (left_offset < right_offset) -			{ -				follow_flags |= FOLLOWS_LEFT; -			} -			else +			if (left_offset > right_offset)  			{ -				follow_flags |= FOLLOWS_RIGHT; +				translate_x = new_right - old_right;  			} -			// "No vertical adjustment" usually means that the bottom of the view -			// has been pushed up or down.  Hence we want the floaters to follow -			// the top.  			if (top_offset < bottom_offset)  			{ -				follow_flags |= FOLLOWS_TOP; +				translate_y = new_top - old_top;  			} -			else + +			// don't reposition immovable floaters +			if (floaterp->getCanDrag())  			{ -				follow_flags |= FOLLOWS_BOTTOM; +				floaterp->translate(translate_x, translate_y);  			} -		} - -		floaterp->setFollows(follow_flags); - -		//RN: all dependent floaters copy follow behavior of "parent" -		for(LLFloater::handle_set_iter_t dependent_it = floaterp->mDependents.begin(); -			dependent_it != floaterp->mDependents.end(); ++dependent_it) -		{ -			LLFloater* dependent_floaterp = dependent_it->get(); -			if (dependent_floaterp) +			BOOST_FOREACH(LLHandle<LLFloater> dependent_floater, floaterp->mDependents)  			{ -				dependent_floaterp->setFollows(follow_flags); +				if (dependent_floater.get()) +				{ +					dependent_floater.get()->translate(translate_x, translate_y); +				}  			}  		}  	} - -	LLView::reshape(width, height, called_from_parent);  } @@ -2631,6 +2622,12 @@ void LLFloaterView::shiftFloaters(S32 x_offset, S32 y_offset)  void LLFloaterView::refresh()  { +	LLRect snap_rect = getSnapRect(); +	if (snap_rect != mLastSnapRect) +	{ +		reshape(getRect().getWidth(), getRect().getHeight(), TRUE); +	} +  	// Constrain children to be entirely on the screen  	for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)  	{ diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 73e9c9e831..c70eb0958d 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -83,7 +83,7 @@ namespace LLInitParam  } -class LLFloater : public LLPanel +class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater>  {  	friend class LLFloaterView;  	friend class LLFloaterReg; @@ -234,6 +234,7 @@ public:  	void			setCanTearOff(BOOL can_tear_off);  	virtual void	setCanResize(BOOL can_resize);  	void			setCanDrag(BOOL can_drag); +	bool			getCanDrag();  	void			setHost(LLMultiFloater* host);  	BOOL			isResizable() const				{ return mResizable; }  	void			setResizeLimits( S32 min_width, S32 min_height ); @@ -282,7 +283,7 @@ public:  	void			clearSnapTarget() { mSnappedTo.markDead(); }  	LLHandle<LLFloater>	getSnapTarget() const { return mSnappedTo; } -	LLHandle<LLFloater> getHandle() const { return mHandle; } +	LLHandle<LLFloater> getHandle() const { return getDerivedHandle<LLFloater>(); }  	const LLSD& 	getKey() { return mKey; }  	virtual bool	matchesKey(const LLSD& key) { return mSingleInstance || KeyCompare::equate(key, mKey); } @@ -460,16 +461,9 @@ private:  	typedef void(*click_callback)(LLFloater*);  	static click_callback sButtonCallbacks[BUTTON_COUNT]; -	typedef std::map<LLHandle<LLFloater>, LLFloater*> handle_map_t; -	typedef std::map<LLHandle<LLFloater>, LLFloater*>::iterator handle_map_iter_t; -	static handle_map_t	sFloaterMap; -  	BOOL			mHasBeenDraggedWhileMinimized;  	S32				mPreviousMinimizedBottom;  	S32				mPreviousMinimizedLeft; - -//	LLFloaterNotificationContext* mNotificationContext; -	LLRootHandle<LLFloater>		mHandle;	  }; @@ -537,6 +531,7 @@ public:  private:  	void hiddenFloaterClosed(LLFloater* floater); +	LLRect				mLastSnapRect;  	LLHandle<LLView>	mSnapView;  	BOOL			mFocusCycleMode;  	S32				mSnapOffsetBottom; diff --git a/indra/llui/llhandle.h b/indra/llui/llhandle.h index 8c000eee48..e6390ee599 100644 --- a/indra/llui/llhandle.h +++ b/indra/llui/llhandle.h @@ -28,17 +28,18 @@  #define LLHANDLE_H  #include "llpointer.h" +#include <boost/type_traits/is_convertible.hpp> +#include <boost/utility/enable_if.hpp> -template <typename T>  class LLTombStone : public LLRefCount  {  public: -	LLTombStone(T* target = NULL) : mTarget(target) {} +	LLTombStone(void* target = NULL) : mTarget(target) {} -	void setTarget(T* target) { mTarget = target; } -	T* getTarget() const { return mTarget; } +	void setTarget(void* target) { mTarget = target; } +	void* getTarget() const { return mTarget; }  private: -	T* mTarget; +	mutable void* mTarget;  };  //	LLHandles are used to refer to objects whose lifetime you do not control or influence.   @@ -53,13 +54,15 @@ private:  template <typename T>  class LLHandle  { +	template <typename U> friend class LLHandle; +	template <typename U> friend class LLHandleProvider;  public:  	LLHandle() : mTombStone(getDefaultTombStone()) {} -	const LLHandle<T>& operator =(const LLHandle<T>& other)   -	{  -		mTombStone = other.mTombStone; -		return *this;  -	} + +	template<typename U> +	LLHandle(const LLHandle<U>& other, typename boost::enable_if< typename boost::is_convertible<U*, T*> >::type* dummy = 0) +	: mTombStone(other.mTombStone) +	{}  	bool isDead() const   	{  @@ -73,7 +76,7 @@ public:  	T* get() const  	{ -		return mTombStone->getTarget(); +		return reinterpret_cast<T*>(mTombStone->getTarget());  	}  	friend bool operator== (const LLHandle<T>& lhs, const LLHandle<T>& rhs) @@ -94,12 +97,13 @@ public:  	}  protected: -	LLPointer<LLTombStone<T> > mTombStone; +	LLPointer<LLTombStone> mTombStone;  private: -	static LLPointer<LLTombStone<T> >& getDefaultTombStone() +	typedef T* pointer_t; +	static LLPointer<LLTombStone>& getDefaultTombStone()  	{ -		static LLPointer<LLTombStone<T> > sDefaultTombStone = new LLTombStone<T>; +		static LLPointer<LLTombStone> sDefaultTombStone = new LLTombStone;  		return sDefaultTombStone;  	}  }; @@ -108,23 +112,26 @@ template <typename T>  class LLRootHandle : public LLHandle<T>  {  public: +	typedef LLRootHandle<T> self_t; +	typedef LLHandle<T> base_t; +  	LLRootHandle(T* object) { bind(object); }  	LLRootHandle() {};  	~LLRootHandle() { unbind(); } -	// this is redundant, since a LLRootHandle *is* an LLHandle -	LLHandle<T> getHandle() { return LLHandle<T>(*this); } +	// this is redundant, since an LLRootHandle *is* an LLHandle +	//LLHandle<T> getHandle() { return LLHandle<T>(*this); }  	void bind(T* object)   	{   		// unbind existing tombstone  		if (LLHandle<T>::mTombStone.notNull())  		{ -			if (LLHandle<T>::mTombStone->getTarget() == object) return; +			if (LLHandle<T>::mTombStone->getTarget() == (void*)object) return;  			LLHandle<T>::mTombStone->setTarget(NULL);  		}  		// tombstone reference counted, so no paired delete -		LLHandle<T>::mTombStone = new LLTombStone<T>(object); +		LLHandle<T>::mTombStone = new LLTombStone((void*)object);  	}  	void unbind()  @@ -142,6 +149,15 @@ private:  template <typename T>  class LLHandleProvider  { +public: +	LLHandle<T> getHandle() const +	{  +		// perform lazy binding to avoid small tombstone allocations for handle +		// providers whose handles are never referenced +		mHandle.bind(static_cast<T*>(const_cast<LLHandleProvider<T>* >(this)));  +		return mHandle;  +	} +  protected:  	typedef LLHandle<T> handle_type_t;  	LLHandleProvider()  @@ -149,16 +165,17 @@ protected:  		// provided here to enforce T deriving from LLHandleProvider<T>  	}  -	LLHandle<T> getHandle()  -	{  -		// perform lazy binding to avoid small tombstone allocations for handle -		// providers whose handles are never referenced -		mHandle.bind(static_cast<T*>(this));  -		return mHandle;  +	template <typename U> +	typename LLHandle<U> getDerivedHandle(typename boost::enable_if< typename boost::is_convertible<U*, T*> >::type* dummy = 0) const +	{ +		LLHandle<U> downcast_handle; +		downcast_handle.mTombStone = getHandle().mTombStone; +		return downcast_handle;  	} +  private: -	LLRootHandle<T> mHandle; +	mutable LLRootHandle<T> mHandle;  };  #endif diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index bdae899933..36f3ba34b9 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -681,7 +681,7 @@ public:  			BOOL	appendContextSubMenu(LLContextMenu *menu); -			LLHandle<LLContextMenu> getHandle() { mHandle.bind(this); return mHandle; } +			LLHandle<LLContextMenu> getHandle() { return getDerivedHandle<LLContextMenu>(); }  protected:  	BOOL						mHoveredAnyItem; diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index a45b617c2e..00318cec6b 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -122,8 +122,6 @@ LLPanel::LLPanel(const LLPanel::Params& p)  	{  		addBorder(p.border);  	} -	 -	mPanelHandle.bind(this);  }  LLPanel::~LLPanel() diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index ab1c87caff..cd33938226 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -153,7 +153,7 @@ public:  	void			setCtrlsEnabled(BOOL b); -	LLHandle<LLPanel>	getHandle() const { return mPanelHandle; } +	LLHandle<LLPanel>	getHandle() const { return getDerivedHandle<LLPanel>(); }  	const LLCallbackMap::map_t& getFactoryMap() const { return mFactoryMap; } @@ -278,7 +278,6 @@ private:  	LLViewBorder*	mBorder;  	LLButton*		mDefaultBtn;  	LLUIString		mLabel; -	LLRootHandle<LLPanel> mPanelHandle;  	typedef std::map<std::string, std::string> ui_string_map_t;  	ui_string_map_t	mUIStrings; diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index ad1f3c504d..d5f8707381 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -214,6 +214,7 @@ LLTabContainer::Params::Params()  	middle_tab("middle_tab"),  	last_tab("last_tab"),  	use_custom_icon_ctrl("use_custom_icon_ctrl", false), +	open_tabs_on_drag_and_drop("open_tabs_on_drag_and_drop", false),  	tab_icon_ctrl_pad("tab_icon_ctrl_pad", 0),  	use_ellipses("use_ellipses"),  	font_halign("halign") @@ -250,6 +251,7 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)  	mMiddleTabParams(p.middle_tab),  	mLastTabParams(p.last_tab),  	mCustomIconCtrlUsed(p.use_custom_icon_ctrl), +	mOpenTabsOnDragAndDrop(p.open_tabs_on_drag_and_drop),  	mTabIconCtrlPad(p.tab_icon_ctrl_pad),  	mUseTabEllipses(p.use_ellipses)  { @@ -812,50 +814,62 @@ BOOL LLTabContainer::handleDragAndDrop(S32 x, S32 y, MASK mask,	BOOL drop,	EDrag  {  	BOOL has_scroll_arrows = (getMaxScrollPos() > 0); -	if( !getTabsHidden() -		&& mDragAndDropDelayTimer.getStarted()  -		&& mDragAndDropDelayTimer.getElapsedTimeF32() > SCROLL_DELAY_TIME ) +	if(mOpenTabsOnDragAndDrop && !getTabsHidden())  	{ -		if (has_scroll_arrows) +		// In that case, we'll open the hovered tab while dragging and dropping items. +		// This allows for drilling through tabs. +		if (mDragAndDropDelayTimer.getStarted())  		{ -			if (mJumpPrevArrowBtn && mJumpPrevArrowBtn->getRect().pointInRect(x, y)) +			if (mDragAndDropDelayTimer.getElapsedTimeF32() > SCROLL_DELAY_TIME)  			{ -				S32	local_x	= x	- mJumpPrevArrowBtn->getRect().mLeft; -				S32	local_y	= y	- mJumpPrevArrowBtn->getRect().mBottom; -				mJumpPrevArrowBtn->handleHover(local_x,	local_y, mask); -			} -			if (mJumpNextArrowBtn && mJumpNextArrowBtn->getRect().pointInRect(x, y)) -			{ -				S32	local_x	= x	- mJumpNextArrowBtn->getRect().mLeft; -				S32	local_y	= y	- mJumpNextArrowBtn->getRect().mBottom; -				mJumpNextArrowBtn->handleHover(local_x,	local_y, mask); -			} -			if (mPrevArrowBtn->getRect().pointInRect(x,	y)) -			{ -				S32	local_x	= x	- mPrevArrowBtn->getRect().mLeft; -				S32	local_y	= y	- mPrevArrowBtn->getRect().mBottom; -				mPrevArrowBtn->handleHover(local_x,	local_y, mask); -			} -			else if	(mNextArrowBtn->getRect().pointInRect(x, y)) -			{ -				S32	local_x	= x	- mNextArrowBtn->getRect().mLeft; -				S32	local_y	= y	- mNextArrowBtn->getRect().mBottom; -				mNextArrowBtn->handleHover(local_x, local_y, mask); -			} -		} +				if (has_scroll_arrows) +				{ +					if (mJumpPrevArrowBtn && mJumpPrevArrowBtn->getRect().pointInRect(x, y)) +					{ +						S32	local_x	= x	- mJumpPrevArrowBtn->getRect().mLeft; +						S32	local_y	= y	- mJumpPrevArrowBtn->getRect().mBottom; +						mJumpPrevArrowBtn->handleHover(local_x,	local_y, mask); +					} +					if (mJumpNextArrowBtn && mJumpNextArrowBtn->getRect().pointInRect(x, y)) +					{ +						S32	local_x	= x	- mJumpNextArrowBtn->getRect().mLeft; +						S32	local_y	= y	- mJumpNextArrowBtn->getRect().mBottom; +						mJumpNextArrowBtn->handleHover(local_x,	local_y, mask); +					} +					if (mPrevArrowBtn->getRect().pointInRect(x,	y)) +					{ +						S32	local_x	= x	- mPrevArrowBtn->getRect().mLeft; +						S32	local_y	= y	- mPrevArrowBtn->getRect().mBottom; +						mPrevArrowBtn->handleHover(local_x,	local_y, mask); +					} +					else if	(mNextArrowBtn->getRect().pointInRect(x, y)) +					{ +						S32	local_x	= x	- mNextArrowBtn->getRect().mLeft; +						S32	local_y	= y	- mNextArrowBtn->getRect().mBottom; +						mNextArrowBtn->handleHover(local_x, local_y, mask); +					} +				} -		for(tuple_list_t::iterator iter	= mTabList.begin();	iter !=	 mTabList.end(); ++iter) -		{ -			LLTabTuple*	tuple =	*iter; -			tuple->mButton->setVisible(	TRUE ); -			S32	local_x	= x	- tuple->mButton->getRect().mLeft; -			S32	local_y	= y	- tuple->mButton->getRect().mBottom; -			if (tuple->mButton->pointInView(local_x, local_y) &&  tuple->mButton->getEnabled() && !tuple->mTabPanel->getVisible()) -			{ -				tuple->mButton->onCommit(); +				for(tuple_list_t::iterator iter	= mTabList.begin();	iter !=	 mTabList.end(); ++iter) +				{ +					LLTabTuple*	tuple =	*iter; +					tuple->mButton->setVisible(	TRUE ); +					S32	local_x	= x	- tuple->mButton->getRect().mLeft; +					S32	local_y	= y	- tuple->mButton->getRect().mBottom; +					if (tuple->mButton->pointInView(local_x, local_y) &&  tuple->mButton->getEnabled() && !tuple->mTabPanel->getVisible()) +					{ +						tuple->mButton->onCommit(); +					} +				} +				// Stop the timer whether successful or not. Don't let it run forever.  				mDragAndDropDelayTimer.stop();  			}  		} +		else  +		{ +			// Start a timer so we don't open tabs as soon as we hover on them +			mDragAndDropDelayTimer.start(); +		}  	}  	return LLView::handleDragAndDrop(x,	y, mask, drop, type, cargo_data,  accept, tooltip); @@ -1025,85 +1039,50 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)  	}  	else  	{ +		LLButton::Params& p = (mCustomIconCtrlUsed ? custom_btn_params : normal_btn_params); +		 +		p.rect(btn_rect); +		p.font(mFont); +		p.font_halign = mFontHalign; +		p.label(trimmed_label); +		p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child)); +		if (indent) +		{ +			p.pad_left(indent); +		} +		p.pad_bottom( mLabelPadBottom ); +		p.scale_image(true); +		p.tab_stop(false); +		p.label_shadow(false); +		p.follows.flags = FOLLOWS_LEFT; +		  		if (mIsVertical)  		{ -			LLButton::Params& p = (mCustomIconCtrlUsed)? -					custom_btn_params:normal_btn_params; -  			p.name(std::string("vert tab button")); -			p.rect(btn_rect); -			p.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT); -			p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child)); -			p.font(mFont); -			p.label(trimmed_label);  			p.image_unselected(mMiddleTabParams.tab_left_image_unselected);  			p.image_selected(mMiddleTabParams.tab_left_image_selected); -			p.scale_image(true); -			p.font_halign = mFontHalign; -			p.pad_bottom( mLabelPadBottom ); -			p.tab_stop(false); -			p.label_shadow(false); -			if (indent) -			{ -				p.pad_left(indent); -			} -			 -			 -			if(mCustomIconCtrlUsed) -			{ -				btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params); -				 -			} -			else -			{ -				btn = LLUICtrlFactory::create<LLButton>(p); -			} +			p.follows.flags = p.follows.flags() | FOLLOWS_TOP;  		}  		else  		{ -			LLButton::Params& p = (mCustomIconCtrlUsed)? -					custom_btn_params:normal_btn_params;  			p.name(std::string(child->getName()) + " tab"); -			p.rect(btn_rect); -			p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child)); -			p.font(mFont); -			p.label(trimmed_label);  			p.visible(false); -			p.scale_image(true);  			p.image_unselected(tab_img);  			p.image_selected(tab_selected_img); -			p.tab_stop(false); -			p.label_shadow(false); +			p.follows.flags = p.follows.flags() | (getTabPosition() == TOP ? FOLLOWS_TOP : FOLLOWS_BOTTOM);  			// Try to squeeze in a bit more text  			p.pad_left( mLabelPadLeft );  			p.pad_right(2); -			p.pad_bottom( mLabelPadBottom ); -			p.font_halign = mFontHalign; -			p.follows.flags = FOLLOWS_LEFT; -			p.follows.flags = FOLLOWS_LEFT; -	 -			if (indent) -			{ -				p.pad_left(indent); -			} - -			if( getTabPosition() == TOP ) -			{ -				p.follows.flags = p.follows.flags() | FOLLOWS_TOP; -			} -			else -			{ -				p.follows.flags = p.follows.flags() | FOLLOWS_BOTTOM; -			} - -			if(mCustomIconCtrlUsed) -			{ -				btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params); -			} -			else -			{ -				btn = LLUICtrlFactory::create<LLButton>(p); -			} +		} +		 +		// *TODO : It seems wrong not to use p in both cases considering the way p is initialized +		if (mCustomIconCtrlUsed) +		{ +			btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params); +		} +		else +		{ +			btn = LLUICtrlFactory::create<LLButton>(p);  		}  	} @@ -1280,6 +1259,10 @@ void LLTabContainer::enableTabButton(S32 which, BOOL enable)  	{  		mTabList[which]->mButton->setEnabled(enable);  	} +	// Stop the DaD timer as it might run forever +	// enableTabButton() is typically called on refresh and draw when anything changed +	// in the tab container so it's a good time to reset that. +	mDragAndDropDelayTimer.stop();  }  void LLTabContainer::deleteAllTabs() diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h index eaa2fd54e0..cebace2ceb 100644 --- a/indra/llui/lltabcontainer.h +++ b/indra/llui/lltabcontainer.h @@ -105,6 +105,11 @@ public:  		Optional<bool>						use_custom_icon_ctrl;  		/** +		 * Open tabs on hover in drag and drop situations +		 */ +		Optional<bool>						open_tabs_on_drag_and_drop; +		 +		/**  		 *  Paddings for LLIconCtrl in case of LLCustomButtonIconCtrl usage(use_custom_icon_ctrl = true)  		 */  		Optional<S32>						tab_icon_ctrl_pad; @@ -300,6 +305,7 @@ private:  	TabParams						mLastTabParams;  	bool							mCustomIconCtrlUsed; +	bool							mOpenTabsOnDragAndDrop;  	S32								mTabIconCtrlPad;  	bool							mUseTabEllipses;  }; diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index 2fa260ded1..b9c843e931 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -118,7 +118,6 @@ LLUICtrl::LLUICtrl(const LLUICtrl::Params& p, const LLViewModelPtr& viewmodel)  	mDoubleClickSignal(NULL),  	mTransparencyType(TT_DEFAULT)  { -	mUICtrlHandle.bind(this);  }  void LLUICtrl::initFromParams(const Params& p) @@ -460,7 +459,7 @@ void LLUICtrl::setControlVariable(LLControlVariable* control)  	if (control)  	{  		mControlVariable = control; -		mControlConnection = mControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("value"))); +		mControlConnection = mControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("value")));  		setValue(mControlVariable->getValue());  	}  } @@ -491,7 +490,7 @@ void LLUICtrl::setEnabledControlVariable(LLControlVariable* control)  	if (control)  	{  		mEnabledControlVariable = control; -		mEnabledControlConnection = mEnabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("enabled"))); +		mEnabledControlConnection = mEnabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("enabled")));  		setEnabled(mEnabledControlVariable->getValue().asBoolean());  	}  } @@ -506,7 +505,7 @@ void LLUICtrl::setDisabledControlVariable(LLControlVariable* control)  	if (control)  	{  		mDisabledControlVariable = control; -		mDisabledControlConnection = mDisabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("disabled"))); +		mDisabledControlConnection = mDisabledControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("disabled")));  		setEnabled(!(mDisabledControlVariable->getValue().asBoolean()));  	}  } @@ -521,7 +520,7 @@ void LLUICtrl::setMakeVisibleControlVariable(LLControlVariable* control)  	if (control)  	{  		mMakeVisibleControlVariable = control; -		mMakeVisibleControlConnection = mMakeVisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("visible"))); +		mMakeVisibleControlConnection = mMakeVisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("visible")));  		setVisible(mMakeVisibleControlVariable->getValue().asBoolean());  	}  } @@ -536,7 +535,7 @@ void LLUICtrl::setMakeInvisibleControlVariable(LLControlVariable* control)  	if (control)  	{  		mMakeInvisibleControlVariable = control; -		mMakeInvisibleControlConnection = mMakeInvisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getUICtrlHandle(), std::string("invisible"))); +		mMakeInvisibleControlConnection = mMakeInvisibleControlVariable->getSignal()->connect(boost::bind(&controlListener, _2, getHandle(), std::string("invisible")));  		setVisible(!(mMakeInvisibleControlVariable->getValue().asBoolean()));  	}  } diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index 3e055a9d06..fb2196bb16 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -223,7 +223,7 @@ public:  	BOOL	focusLastItem(BOOL prefer_text_fields = FALSE);  	// Non Virtuals -	LLHandle<LLUICtrl> getUICtrlHandle() const { return mUICtrlHandle; } +	LLHandle<LLUICtrl> getHandle() const { return getDerivedHandle<LLUICtrl>(); }  	BOOL			getIsChrome() const;  	void			setTabStop( BOOL b ); @@ -313,7 +313,6 @@ private:  	BOOL			mRequestsFront;  	BOOL			mTabStop;  	BOOL			mTentative; -	LLRootHandle<LLUICtrl> mUICtrlHandle;  	ETypeTransparency mTransparencyType; diff --git a/indra/llui/llview.h b/indra/llui/llview.h index ec7f8e385d..f21fb37e18 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -97,7 +97,11 @@ private:  	static std::vector<LLViewDrawContext*> sDrawContextStack;  }; -class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElement +class LLView  +:	public LLMouseHandler,			// handles mouse events +	public LLFocusableElement,		// handles keyboard events +	public LLMortician,				// lazy deletion +	public LLHandleProvider<LLView>	// passes out weak references to self  {  public:  	struct Follows : public LLInitParam::ChoiceBlock<Follows> @@ -306,8 +310,6 @@ public:  	void			popVisible()				{ setVisible(mLastVisible); }  	BOOL			getLastVisible()	const	{ return mLastVisible; } -	LLHandle<LLView>	getHandle()				{ mHandle.bind(this); return mHandle; } -  	U32			getFollows() const				{ return mReshapeFlags; }  	BOOL		followsLeft() const				{ return mReshapeFlags & FOLLOWS_LEFT; }  	BOOL		followsRight() const			{ return mReshapeFlags & FOLLOWS_RIGHT; } @@ -606,7 +608,6 @@ private:  	BOOL		mIsFocusRoot;  	BOOL		mUseBoundingRect; // hit test against bounding rectangle that includes all child elements -	LLRootHandle<LLView> mHandle;  	BOOL		mLastVisible;  	S32			mNextInsertionOrdinal; diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp index 4f251db93b..c75df86891 100644 --- a/indra/llui/tests/llurlentry_stub.cpp +++ b/indra/llui/tests/llurlentry_stub.cpp @@ -105,8 +105,6 @@ LLStyle::Params::Params()  namespace LLInitParam  { -	BaseBlock::BaseBlock() {} -	BaseBlock::~BaseBlock() {}  	Param::Param(BaseBlock* enclosing_block)  	:	mIsProvided(false)  	{ @@ -114,7 +112,6 @@ namespace LLInitParam  		const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block);  		mEnclosingBlockOffset = (U16)(my_addr - block_addr);  	} -	void BaseBlock::paramChanged(const Param& last_param, bool user_provided) {}  	void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name){}  	void BaseBlock::addSynonym(Param& param, const std::string& synonym) {} diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp index 627f3129e9..7183413463 100644 --- a/indra/llui/tests/llurlmatch_test.cpp +++ b/indra/llui/tests/llurlmatch_test.cpp @@ -63,9 +63,6 @@ S32 LLUIImage::getHeight() const  namespace LLInitParam  { -	BaseBlock::BaseBlock() {} -	BaseBlock::~BaseBlock() {} -  	BlockDescriptor::BlockDescriptor() {}  	ParamDescriptor::ParamDescriptor(param_handle_t p,   						merge_func_t merge_func,  @@ -77,8 +74,6 @@ namespace LLInitParam  						S32 max_count){}  	ParamDescriptor::~ParamDescriptor() {} -	void BaseBlock::paramChanged(const Param& last_param, bool user_provided) {} -  	void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptorPtr in_param, const char* char_name){}  	param_handle_t BaseBlock::getHandleFromParam(const Param* param) const {return 0;}  	void BaseBlock::addSynonym(Param& param, const std::string& synonym) {} | 
