diff --git a/src/TSMapEditor/Rendering/MapView.cs b/src/TSMapEditor/Rendering/MapView.cs index 4ece8f39e..02c968abb 100644 --- a/src/TSMapEditor/Rendering/MapView.cs +++ b/src/TSMapEditor/Rendering/MapView.cs @@ -62,6 +62,7 @@ public class MapView : XNAControl, ICursorActionTarget, IMutationTarget { private const float RightClickScrollRateDivisor = 64f; private const double ZoomStep = 0.1; + private const float DragScrollRateDivisor = 16f; private static Color[] MarbleMadnessTileHeightLevelColors = new Color[] { @@ -152,6 +153,10 @@ public CursorAction CursorAction private bool isRightClickScrolling = false; private Point rightClickScrollInitPos = new Point(-1, -1); + private bool isDragScrolling = false; + private Point dragScrollInitPos = new Point(-1, -1); + private Vector2 dragScrollInitCameraPos = new Vector2(-1, -1); + private MapWideOverlay mapWideOverlay; private Point lastClickedPoint; @@ -997,10 +1002,13 @@ private void DrawRangeIndicator(Point2D cellCoords, double range, Color color) public override void OnMouseScrolled() { - if (Cursor.ScrollWheelValue > 0) - Camera.ZoomLevel += ZoomStep; - else - Camera.ZoomLevel -= ZoomStep; + if (!isDragScrolling) + { + if (Cursor.ScrollWheelValue > 0) + Camera.ZoomLevel += ZoomStep; + else + Camera.ZoomLevel -= ZoomStep; + } base.OnMouseScrolled(); } @@ -1113,13 +1121,35 @@ public override void OnMouseMove() // Right-click scrolling if (Cursor.RightDown) { - if (!isRightClickScrolling) + if (!isRightClickScrolling && !isDragScrolling) { isRightClickScrolling = true; rightClickScrollInitPos = GetCursorPoint(); Camera.FloatTopLeftPoint = Camera.TopLeftPoint.ToXNAVector(); } } + + // Drag scrolling + if (Cursor.MiddleDown) + { + if (!isRightClickScrolling) + { + if (!isDragScrolling) + { + dragScrollInitPos = GetCursorPoint(); + dragScrollInitCameraPos = Camera.FloatTopLeftPoint; + isDragScrolling = true; + } + else + { + var result = dragScrollInitPos - GetCursorPoint(); + float dragScrollRate = (float)((scrollRate / DragScrollRateDivisor) / Camera.ZoomLevel); + + Camera.FloatTopLeftPoint = new Vector2(dragScrollInitCameraPos.X + result.X * dragScrollRate, + dragScrollInitCameraPos.Y + result.Y * dragScrollRate); + } + } + } } public override void OnLeftClick() @@ -1172,6 +1202,13 @@ public override void OnRightClick() base.OnRightClick(); } + public override void OnMiddleClick() + { + isDragScrolling = false; + + base.OnMiddleClick(); + } + public override void Update(GameTime gameTime) { // Make scroll rate independent of FPS