diff options
| -rw-r--r-- | indra/llui/llscrollcontainer.cpp | 15 | ||||
| -rw-r--r-- | indra/llui/llscrollcontainer.h | 6 | ||||
| -rw-r--r-- | indra/newview/llfolderview.cpp | 28 | ||||
| -rw-r--r-- | indra/newview/llfolderview.h | 24 | ||||
| -rw-r--r-- | indra/newview/llinventorypanel.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llpanelobjectinventory.cpp | 2 | 
6 files changed, 69 insertions, 9 deletions
| diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp index 20bed050ad..9b7e30bb04 100644 --- a/indra/llui/llscrollcontainer.cpp +++ b/indra/llui/llscrollcontainer.cpp @@ -389,10 +389,17 @@ void LLScrollContainer::calcVisibleSize( S32 *visible_width, S32 *visible_height  		{  			*show_h_scrollbar = TRUE;  			*visible_height -= scrollbar_size; -			// Note: Do *not* recompute *show_v_scrollbar here because with -			// the (- scrollbar_size) we just did we will always add a vertical scrollbar -			// even if the height of the items is actually less than the visible size. -			// Fear not though: there's enough calcVisibleSize() calls to add a vertical slider later. + +			// The view inside the scroll container should not be extended +			// to container's full height to ensure the correct computation +			// of *show_v_scrollbar after subtracting horizontal scrollbar_size. + +			// Must retest now that visible_height has changed +			if( !*show_v_scrollbar && ((doc_height - *visible_height) > 1) ) +			{ +				*show_v_scrollbar = TRUE; +				*visible_width -= scrollbar_size; +			}  		}  	}  } diff --git a/indra/llui/llscrollcontainer.h b/indra/llui/llscrollcontainer.h index 3aa79cc255..d87c95b3d7 100644 --- a/indra/llui/llscrollcontainer.h +++ b/indra/llui/llscrollcontainer.h @@ -91,7 +91,7 @@ public:  	void			setReserveScrollCorner( BOOL b ) { mReserveScrollCorner = b; }  	LLRect			getVisibleContentRect();  	LLRect			getContentWindowRect(); -	const LLRect&	getScrolledViewRect() const { return mScrolledView ? mScrolledView->getRect() : LLRect::null; } +	virtual const LLRect	getScrolledViewRect() const { return mScrolledView ? mScrolledView->getRect() : LLRect::null; }  	void			pageUp(S32 overlap = 0);  	void			pageDown(S32 overlap = 0);  	void			goToTop(); @@ -116,6 +116,9 @@ public:  	bool autoScroll(S32 x, S32 y); +protected: +	LLView*		mScrolledView; +  private:  	// internal scrollbar handlers  	virtual void scrollHorizontal( S32 new_pos ); @@ -124,7 +127,6 @@ private:  	void calcVisibleSize( S32 *visible_width, S32 *visible_height, BOOL* show_h_scrollbar, BOOL* show_v_scrollbar ) const;  	LLScrollbar* mScrollbar[SCROLLBAR_COUNT]; -	LLView*		mScrolledView;  	S32			mSize;  	BOOL		mIsOpaque;  	LLUIColor	mBackgroundColor; diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 4a42bb2c24..6c4b781122 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -165,6 +165,33 @@ void LLCloseAllFoldersFunctor::doItem(LLFolderViewItem* item)  { }  ///---------------------------------------------------------------------------- +/// Class LLFolderViewScrollContainer +///---------------------------------------------------------------------------- + +// virtual +const LLRect LLFolderViewScrollContainer::getScrolledViewRect() const +{ +	LLRect rect = LLRect::null; +	if (mScrolledView) +	{ +		LLFolderView* folder_view = dynamic_cast<LLFolderView*>(mScrolledView); +		if (folder_view) +		{ +			S32 height = folder_view->mRunningHeight; + +			rect = mScrolledView->getRect(); +			rect.setLeftTopAndSize(rect.mLeft, rect.mTop, rect.getWidth(), height); +		} +	} + +	return rect; +} + +LLFolderViewScrollContainer::LLFolderViewScrollContainer(const LLScrollContainer::Params& p) +:	LLScrollContainer(p) +{} + +///----------------------------------------------------------------------------  /// Class LLFolderView  ///----------------------------------------------------------------------------  LLFolderView::Params::Params() @@ -535,6 +562,7 @@ void LLFolderView::reshape(S32 width, S32 height, BOOL called_from_parent)  	{  		width = scroll_rect.getWidth();  	} +  	LLView::reshape(width, height, called_from_parent);  	mReshapeSignal(mSelectedItems, FALSE);  } diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 1d018b5e6a..5c5a3a894f 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -44,6 +44,7 @@  #include "lldepthstack.h"  #include "lleditmenuhandler.h"  #include "llfontgl.h" +#include "llscrollcontainer.h"  #include "lltooldraganddrop.h"  #include "llviewertexture.h" @@ -54,10 +55,28 @@ class LLInventoryModel;  class LLPanel;  class LLLineEditor;  class LLMenuGL; -class LLScrollContainer;  class LLUICtrl;  class LLTextBox; +/** + * Class LLFolderViewScrollContainer + * + * A scroll container which provides the information about the height + * of currently displayed folder view contents. + * Used for updating vertical scroll bar visibility in inventory panel. + * See LLScrollContainer::calcVisibleSize(). + */ +class LLFolderViewScrollContainer : public LLScrollContainer +{ +public: +	/*virtual*/ ~LLFolderViewScrollContainer() {}; +	/*virtual*/ const LLRect getScrolledViewRect() const; + +protected: +	LLFolderViewScrollContainer(const LLScrollContainer::Params& p); +	friend class LLUICtrlFactory; +}; +  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  // Class LLFolderView  // @@ -81,6 +100,9 @@ public:  		Params();  	}; + +	friend class LLFolderViewScrollContainer; +  	LLFolderView(const Params&);  	virtual ~LLFolderView( void ); diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 01a8ecfb5d..c47b74815f 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -206,10 +206,11 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)  		scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);  		LLScrollContainer::Params scroller_params(params.scroll());  		scroller_params.rect(scroller_view_rect); -		mScroller = LLUICtrlFactory::create<LLScrollContainer>(scroller_params); +		mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);  		addChild(mScroller);  		mScroller->addChild(mFolderRoot);  		mFolderRoot->setScrollContainer(mScroller); +		mFolderRoot->setFollowsAll();  		mFolderRoot->addChild(mFolderRoot->mStatusTextBox);  	} diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 98ea680504..f3ecba7185 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1568,7 +1568,7 @@ void LLPanelObjectInventory::reset()  	scroll_p.rect(scroller_rect);  	scroll_p.tab_stop(true);  	scroll_p.follows.flags(FOLLOWS_ALL); -	mScroller = LLUICtrlFactory::create<LLScrollContainer>(scroll_p); +	mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroll_p);  	addChild(mScroller);  	mScroller->addChild(mFolders); | 
