From f7f24611c69d64934b4a815636bc4a948fe8ba52 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Wed, 5 Jul 2017 19:34:04 +0300
Subject: MAINT-203 Fixed auto-scroll zones being uneven in inventory

---
 indra/llui/llscrollcontainer.cpp       | 44 +++++++++++++++++++++++++++-------
 indra/llui/llscrollcontainer.h         |  4 +++-
 indra/newview/llpanelmaininventory.cpp |  2 +-
 3 files changed, 40 insertions(+), 10 deletions(-)

(limited to 'indra')

diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp
index f70eebc594..770315fadd 100644
--- a/indra/llui/llscrollcontainer.cpp
+++ b/indra/llui/llscrollcontainer.cpp
@@ -290,7 +290,21 @@ BOOL LLScrollContainer::handleDragAndDrop(S32 x, S32 y, MASK mask,
 	return TRUE;
 }
 
+bool LLScrollContainer::canAutoScroll(S32 x, S32 y)
+{
+	if (mAutoScrolling)
+	{
+		return true; // already scrolling
+	}
+	return autoScroll(x, y, false);
+}
+
 bool LLScrollContainer::autoScroll(S32 x, S32 y)
+{
+	return autoScroll(x, y, true);
+}
+
+bool LLScrollContainer::autoScroll(S32 x, S32 y, bool do_scroll)
 {
 	static LLUICachedControl<S32> scrollbar_size_control ("UIScrollbarSize", 0);
 	S32 scrollbar_size = (mSize == -1 ? scrollbar_size_control : mSize);
@@ -302,6 +316,8 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
 		screenRectToLocal(getRootView()->getLocalRect(), &screen_local_extents);
 
 		LLRect inner_rect_local( 0, mInnerRect.getHeight(), mInnerRect.getWidth(), 0 );
+		// Note: Will also include scrollers as scroll zones, so opposite
+		// scroll zones might have different size due to visible scrollers
 		if(	mScrollbar[HORIZONTAL]->getVisible() )
 		{
 			inner_rect_local.mBottom += scrollbar_size;
@@ -325,8 +341,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
 			left_scroll_rect.mRight = inner_rect_local.mLeft + auto_scroll_region_width;
 			if( left_scroll_rect.pointInRect( x, y ) && (mScrollbar[HORIZONTAL]->getDocPos() > 0) )
 			{
-				mScrollbar[HORIZONTAL]->setDocPos( mScrollbar[HORIZONTAL]->getDocPos() - auto_scroll_speed );
-				mAutoScrolling = TRUE;
+				if (do_scroll)
+				{
+					mScrollbar[HORIZONTAL]->setDocPos(mScrollbar[HORIZONTAL]->getDocPos() - auto_scroll_speed);
+					mAutoScrolling = TRUE;
+				}
 				scrolling = true;
 			}
 
@@ -334,8 +353,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
 			right_scroll_rect.mLeft = inner_rect_local.mRight - auto_scroll_region_width;
 			if( right_scroll_rect.pointInRect( x, y ) && (mScrollbar[HORIZONTAL]->getDocPos() < mScrollbar[HORIZONTAL]->getDocPosMax()) )
 			{
-				mScrollbar[HORIZONTAL]->setDocPos( mScrollbar[HORIZONTAL]->getDocPos() + auto_scroll_speed );
-				mAutoScrolling = TRUE;
+				if (do_scroll)
+				{
+					mScrollbar[HORIZONTAL]->setDocPos(mScrollbar[HORIZONTAL]->getDocPos() + auto_scroll_speed);
+					mAutoScrolling = TRUE;
+				}
 				scrolling = true;
 			}
 		}
@@ -345,8 +367,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
 			bottom_scroll_rect.mTop = inner_rect_local.mBottom + auto_scroll_region_height;
 			if( bottom_scroll_rect.pointInRect( x, y ) && (mScrollbar[VERTICAL]->getDocPos() < mScrollbar[VERTICAL]->getDocPosMax()) )
 			{
-				mScrollbar[VERTICAL]->setDocPos( mScrollbar[VERTICAL]->getDocPos() + auto_scroll_speed );
-				mAutoScrolling = TRUE;
+				if (do_scroll)
+				{
+					mScrollbar[VERTICAL]->setDocPos(mScrollbar[VERTICAL]->getDocPos() + auto_scroll_speed);
+					mAutoScrolling = TRUE;
+				}
 				scrolling = true;
 			}
 
@@ -354,8 +379,11 @@ bool LLScrollContainer::autoScroll(S32 x, S32 y)
 			top_scroll_rect.mBottom = inner_rect_local.mTop - auto_scroll_region_height;
 			if( top_scroll_rect.pointInRect( x, y ) && (mScrollbar[VERTICAL]->getDocPos() > 0) )
 			{
-				mScrollbar[VERTICAL]->setDocPos( mScrollbar[VERTICAL]->getDocPos() - auto_scroll_speed );
-				mAutoScrolling = TRUE;
+				if (do_scroll)
+				{
+					mScrollbar[VERTICAL]->setDocPos(mScrollbar[VERTICAL]->getDocPos() - auto_scroll_speed);
+					mAutoScrolling = TRUE;
+				}
 				scrolling = true;
 			}
 		}
diff --git a/indra/llui/llscrollcontainer.h b/indra/llui/llscrollcontainer.h
index c4c4d0a136..a2f7d14f1a 100644
--- a/indra/llui/llscrollcontainer.h
+++ b/indra/llui/llscrollcontainer.h
@@ -114,7 +114,8 @@ public:
 
 	virtual void	draw();
 	virtual bool	addChild(LLView* view, S32 tab_group = 0);
-	
+
+	bool canAutoScroll(S32 x, S32 y);
 	bool autoScroll(S32 x, S32 y);
 
 	S32 getSize() const { return mSize; }
@@ -128,6 +129,7 @@ private:
 	virtual void scrollHorizontal( S32 new_pos );
 	virtual void scrollVertical( S32 new_pos );
 	void updateScroll();
+	bool autoScroll(S32 x, S32 y, bool do_scroll);
 	void calcVisibleSize( S32 *visible_width, S32 *visible_height, BOOL* show_h_scrollbar, BOOL* show_v_scrollbar ) const;
 
 	LLScrollbar* mScrollbar[ORIENTATION_COUNT];
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index dd75ae9c06..c34dd64cba 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -540,7 +540,7 @@ BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 {
 	// Check to see if we are auto scrolling from the last frame
 	LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel();
-	BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y);
+	BOOL needsToScroll = panel->getScrollableContainer()->canAutoScroll(x, y);
 	if(mFilterTabs)
 	{
 		if(needsToScroll)
-- 
cgit v1.2.3