Browse Source

Animation editor zoom, scroll and resize working

BearishSun 9 years ago
parent
commit
ebc6b39f56

+ 34 - 18
Source/BansheeEngine/Source/BsGUISliderHandle.cpp

@@ -251,9 +251,9 @@ namespace BansheeEngine
 						INT32 right = left + handleSize;
 
 						INT32 clickPos = ev.getPosition().x;
-						if(clickPos >= left && clickPos < (left + (INT32)RESIZE_HANDLE_SIZE))
+						if (clickPos >= left && clickPos < (left + (INT32)RESIZE_HANDLE_SIZE))
 							mDragState = DragState::LeftResize;
-						else if(clickPos >= (right - (INT32)RESIZE_HANDLE_SIZE) && clickPos < right)
+						else if (clickPos >= (right - (INT32)RESIZE_HANDLE_SIZE) && clickPos < right)
 							mDragState = DragState::RightResize;
 						else
 							mDragState = DragState::Normal;
@@ -295,36 +295,52 @@ namespace BansheeEngine
 		{
 			if (!_isDisabled())
 			{
-				INT32 handlePosPx;
-				if (mFlags.isSet(GUISliderHandleFlag::Horizontal))
-					handlePosPx = ev.getPosition().x - mDragStartPos - mLayoutData.area.x;
-				else
-					handlePosPx = ev.getPosition().y - mDragStartPos - mLayoutData.area.y;
-
 				if (mDragState == DragState::Normal)
 				{
+					INT32 handlePosPx;
+					if (mFlags.isSet(GUISliderHandleFlag::Horizontal))
+						handlePosPx = ev.getPosition().x - mDragStartPos - mLayoutData.area.x;
+					else
+						handlePosPx = ev.getPosition().y - mDragStartPos - mLayoutData.area.y;
+
 					setHandlePosPx(handlePosPx);
 					onHandleMovedOrResized(mPctHandlePos, _getHandleSizePct());
 				}
 				else // Resizing
 				{
+					INT32 clickPosPx;
+					if (mFlags.isSet(GUISliderHandleFlag::Horizontal))
+						clickPosPx = ev.getPosition().x - mLayoutData.area.x;
+					else
+						clickPosPx = ev.getPosition().y - mLayoutData.area.y;
+
+					INT32 left = getHandlePosPx();
+					UINT32 maxSize = getMaxSize();
+
+					INT32 newHandleSize;
+					float newHandlePos;
 					if(mDragState == DragState::LeftResize)
 					{
-						INT32 right = getHandlePosPx() + handleSize;
-						INT32 newHandleSize = right - handlePosPx;
+						INT32 newLeft = clickPosPx - mDragStartPos;
+						INT32 right = left + handleSize;
+						newLeft = Math::clamp(newLeft, 0, right);
 
-						_setHandleSize(newHandleSize / (float)getMaxSize());
-						setHandlePosPx(handlePosPx);
-						onHandleMovedOrResized(mPctHandlePos, _getHandleSizePct());
+						newHandleSize = std::max((INT32)mMinHandleSize, right - newLeft);
+						newLeft = right - newHandleSize;
+						newHandlePos = newLeft / (float)(maxSize - newHandleSize);
 					}
-					else if(mDragState == DragState::RightResize)
+					else // Right resize
 					{
-						INT32 left = getHandlePosPx();
-						INT32 newHandleSize = handlePosPx - left;
+						INT32 newRight = clickPosPx;
+						newHandleSize = std::max((INT32)mMinHandleSize, std::min(newRight, (INT32)maxSize) - left);
 
-						_setHandleSize(newHandleSize / (float)getMaxSize());
-						onHandleMovedOrResized(mPctHandlePos, _getHandleSizePct());
+						newHandlePos = left / (float)(maxSize - newHandleSize);
 					}
+
+					_setHandleSize(newHandleSize / (float)maxSize);
+					_setHandlePos(newHandlePos);
+
+					onHandleMovedOrResized(mPctHandlePos, _getHandleSizePct());
 				}
 
 				_markLayoutAsDirty();

+ 4 - 11
Source/MBansheeEditor/Windows/AnimationWindow.cs

@@ -394,6 +394,8 @@ namespace BansheeEditor
 
             horzScrollBar.HandleSize = visibleRange.x / totalRange.x;
             vertScrollBar.HandleSize = visibleRange.y / totalRange.y;
+
+            Debug.Log(visibleRange.y + " - " + totalRange.y + " - " + (visibleRange.y / totalRange.y));
         }
 
         private void UpdateScrollBarPosition()
@@ -432,19 +434,11 @@ namespace BansheeEditor
         private Vector2 GetTotalRange()
         {
             // Return optimal range (that covers the visible curve)
-            Vector2 totalRange = GetOptimalRange();
+            Vector2 optimalRange = GetOptimalRange();
 
             // Increase range in case user zoomed out
             Vector2 zoomedRange = GetZoomedRange();
-            totalRange = Vector2.Max(totalRange, zoomedRange);
-
-            // Increase range in case user dragged outside of the optimal range
-            Vector2 visibleRange = guiCurveEditor.Range;
-            Vector2 draggedRange = guiCurveEditor.Offset;
-            draggedRange.x += visibleRange.x;
-            draggedRange.y = Math.Abs(draggedRange.y) + visibleRange.y;
-
-            return Vector2.Max(totalRange, draggedRange);
+            return Vector2.Max(optimalRange, zoomedRange);
         }
 
         private void Zoom(Vector2 curvePos, float amount)
@@ -455,7 +449,6 @@ namespace BansheeEditor
             Vector2 zoomedRange = GetZoomedRange();
 
             Vector2 zoomedDiff = zoomedRange - oldZoomedRange;
-            zoomedDiff.y *= 0.5f;
 
             Vector2 currentRange = guiCurveEditor.Range;
             Vector2 newRange = currentRange + zoomedDiff;