private bool Move(MoveToDirections direction, double amountInPx, double distanceToTopBoundaryIfFloating, double distanceToBottomBoundaryIfFloating, double distanceToLeftBoundaryIfFloating, double distanceToRightBoundaryIfFloating, WindowStates windowState, Rect floatingSizeAndPosition) { Log.InfoFormat("Move called with direction:{0}, amountInPx:{1}, distanceToTopBoundaryIfFloating:{2}, distanceToBottomBoundaryIfFloating:{3}, distanceToLeftBoundaryIfFloating:{4}, distanceToRightBoundaryIfFloating: {5}, windowState:{6}, floatingSizeAndPosition.Top:{7}, floatingSizeAndPosition.Bottom:{8}, floatingSizeAndPosition.Left:{9}, floatingSizeAndPosition.Right:{10}", direction, amountInPx, distanceToTopBoundaryIfFloating, distanceToBottomBoundaryIfFloating, distanceToLeftBoundaryIfFloating, distanceToRightBoundaryIfFloating, windowState, floatingSizeAndPosition.Top, floatingSizeAndPosition.Bottom, floatingSizeAndPosition.Left, floatingSizeAndPosition.Right); bool adjustment = false; var yAdjustmentAmount = amountInPx / Graphics.DipScalingFactorY; var xAdjustmentAmount = amountInPx / Graphics.DipScalingFactorX; var yAdjustmentToBottom = distanceToBottomBoundaryIfFloating < 0 ? distanceToBottomBoundaryIfFloating : yAdjustmentAmount.CoerceToUpperLimit(distanceToBottomBoundaryIfFloating); var yAdjustmentToTop = distanceToTopBoundaryIfFloating < 0 ? distanceToTopBoundaryIfFloating : yAdjustmentAmount.CoerceToUpperLimit(distanceToTopBoundaryIfFloating); var xAdjustmentToLeft = distanceToLeftBoundaryIfFloating < 0 ? distanceToLeftBoundaryIfFloating : xAdjustmentAmount.CoerceToUpperLimit(distanceToLeftBoundaryIfFloating); var xAdjustmentToRight = distanceToRightBoundaryIfFloating < 0 ? distanceToRightBoundaryIfFloating : xAdjustmentAmount.CoerceToUpperLimit(distanceToRightBoundaryIfFloating); switch (windowState) { case WindowStates.Docked: switch (getDockPosition()) { case DockEdges.Top: switch (direction) { case MoveToDirections.Bottom: case MoveToDirections.BottomLeft: case MoveToDirections.BottomRight: UnRegisterAppBar(); saveWindowState(WindowStates.Floating); savePreviousWindowState(WindowStates.Floating); window.Top = screenBoundsInDp.Top; switch (direction) { case MoveToDirections.Bottom: window.Left = floatingSizeAndPosition.Left; break; case MoveToDirections.BottomLeft: window.Left = floatingSizeAndPosition.Left - xAdjustmentToLeft; break; case MoveToDirections.BottomRight: window.Left = floatingSizeAndPosition.Left + xAdjustmentToRight; break; } window.Height = floatingSizeAndPosition.Height; window.Width = floatingSizeAndPosition.Width; adjustment = true; break; } break; case DockEdges.Bottom: switch (direction) { case MoveToDirections.Top: case MoveToDirections.TopLeft: case MoveToDirections.TopRight: UnRegisterAppBar(); saveWindowState(WindowStates.Floating); savePreviousWindowState(WindowStates.Floating); window.Top = screenBoundsInDp.Bottom - floatingSizeAndPosition.Height; switch (direction) { case MoveToDirections.Top: window.Left = floatingSizeAndPosition.Left; break; case MoveToDirections.TopLeft: window.Left = floatingSizeAndPosition.Left - xAdjustmentToLeft; break; case MoveToDirections.TopRight: window.Left = floatingSizeAndPosition.Left + xAdjustmentToRight; break; } window.Height = floatingSizeAndPosition.Height; window.Width = floatingSizeAndPosition.Width; adjustment = true; break; } break; case DockEdges.Left: switch (direction) { case MoveToDirections.Right: case MoveToDirections.TopRight: case MoveToDirections.BottomRight: UnRegisterAppBar(); saveWindowState(WindowStates.Floating); savePreviousWindowState(WindowStates.Floating); window.Left = screenBoundsInDp.Left; switch (direction) { case MoveToDirections.Right: window.Top = floatingSizeAndPosition.Top; break; case MoveToDirections.TopRight: window.Top = floatingSizeAndPosition.Top - yAdjustmentToTop; break; case MoveToDirections.BottomRight: window.Top = floatingSizeAndPosition.Top + yAdjustmentToBottom; break; } window.Height = floatingSizeAndPosition.Height; window.Width = floatingSizeAndPosition.Width; adjustment = true; break; } break; case DockEdges.Right: switch (direction) { case MoveToDirections.Left: case MoveToDirections.TopLeft: case MoveToDirections.BottomLeft: UnRegisterAppBar(); saveWindowState(WindowStates.Floating); savePreviousWindowState(WindowStates.Floating); window.Left = screenBoundsInDp.Right - floatingSizeAndPosition.Width; switch (direction) { case MoveToDirections.Left: window.Top = floatingSizeAndPosition.Top; break; case MoveToDirections.TopLeft: window.Top = floatingSizeAndPosition.Top - yAdjustmentToTop; break; case MoveToDirections.BottomLeft: window.Top = floatingSizeAndPosition.Top + yAdjustmentToBottom; break; } window.Height = floatingSizeAndPosition.Height; window.Width = floatingSizeAndPosition.Width; adjustment = true; break; } break; } break; case WindowStates.Floating: switch (direction) //Handle horizontal adjustment { case MoveToDirections.Left: case MoveToDirections.BottomLeft: case MoveToDirections.TopLeft: if (xAdjustmentAmount > xAdjustmentToLeft) { saveWindowState(WindowStates.Docked); savePreviousWindowState(WindowStates.Docked); saveDockPosition(DockEdges.Left); RegisterAppBar(); } else { window.Left -= xAdjustmentToLeft; } break; case MoveToDirections.Right: case MoveToDirections.BottomRight: case MoveToDirections.TopRight: if (xAdjustmentAmount > xAdjustmentToRight) { saveWindowState(WindowStates.Docked); savePreviousWindowState(WindowStates.Docked); saveDockPosition(DockEdges.Right); RegisterAppBar(); } else { window.Left += xAdjustmentToRight; } break; } switch (direction) //Handle vertical adjustment { case MoveToDirections.Bottom: case MoveToDirections.BottomLeft: case MoveToDirections.BottomRight: if (yAdjustmentAmount > yAdjustmentToBottom) { saveWindowState(WindowStates.Docked); savePreviousWindowState(WindowStates.Docked); saveDockPosition(DockEdges.Bottom); RegisterAppBar(); } else { window.Top += yAdjustmentToBottom; } break; case MoveToDirections.Top: case MoveToDirections.TopLeft: case MoveToDirections.TopRight: if (yAdjustmentAmount > yAdjustmentToTop) { saveWindowState(WindowStates.Docked); savePreviousWindowState(WindowStates.Docked); saveDockPosition(DockEdges.Top); RegisterAppBar(); } else { window.Top -= yAdjustmentToTop; } break; } adjustment = true; break; } return adjustment; }
private bool MoveToEdge(MoveToDirections direction, WindowStates windowState, double distanceToTopBoundaryIfFloating, double distanceToBottomBoundaryIfFloating, double distanceToLeftBoundaryIfFloating, double distanceToRightBoundaryIfFloating) { Log.InfoFormat("MoveToEdge called with direction:{0}, windowState:{1}, distanceToTopBoundaryIfFloating:{2}, distanceToBottomBoundaryIfFloating:{3}, distanceToLeftBoundaryIfFloating:{4}, distanceToRightBoundaryIfFloating: {5}", direction, windowState, distanceToTopBoundaryIfFloating, distanceToBottomBoundaryIfFloating, distanceToLeftBoundaryIfFloating, distanceToRightBoundaryIfFloating); bool adjustment = false; switch (windowState) { case WindowStates.Docked: //Jump to (and dock on) a different edge var dockPosition = getDockPosition(); if (direction == MoveToDirections.Top && dockPosition != DockEdges.Top) { saveDockPosition(DockEdges.Top); adjustment = true; } else if (direction == MoveToDirections.Bottom && dockPosition != DockEdges.Bottom) { saveDockPosition(DockEdges.Bottom); adjustment = true; } else if (direction == MoveToDirections.Left && dockPosition != DockEdges.Left) { saveDockPosition(DockEdges.Left); adjustment = true; } else if (direction == MoveToDirections.Right && dockPosition != DockEdges.Right) { saveDockPosition(DockEdges.Right); adjustment = true; } break; case WindowStates.Floating: //Jump to edge(s) switch (direction) //Handle horizontal adjustment { case MoveToDirections.Left: case MoveToDirections.BottomLeft: case MoveToDirections.TopLeft: window.Left -= distanceToLeftBoundaryIfFloating; break; case MoveToDirections.Right: case MoveToDirections.BottomRight: case MoveToDirections.TopRight: window.Left += distanceToRightBoundaryIfFloating; break; } switch (direction) //Handle vertical adjustment { case MoveToDirections.Bottom: case MoveToDirections.BottomLeft: case MoveToDirections.BottomRight: window.Top += distanceToBottomBoundaryIfFloating; break; case MoveToDirections.Top: case MoveToDirections.TopLeft: case MoveToDirections.TopRight: window.Top -= distanceToTopBoundaryIfFloating; break; } adjustment = true; break; } return adjustment; }
public void Move(MoveToDirections direction, double? amountInPx) { Log.InfoFormat("Move called with direction {0} and amount (px) {1}", direction, amountInPx); var windowState = getWindowState(); if (windowState == WindowStates.Maximised) return; var floatingSizeAndPosition = getFloatingSizeAndPosition(); var distanceToTopBoundaryIfFloating = floatingSizeAndPosition.Top - screenBoundsInDp.Top; var distanceToBottomBoundaryIfFloating = screenBoundsInDp.Bottom - (floatingSizeAndPosition.Top + floatingSizeAndPosition.Height); var distanceToLeftBoundaryIfFloating = floatingSizeAndPosition.Left - screenBoundsInDp.Left; var distanceToRightBoundaryIfFloating = screenBoundsInDp.Right - (floatingSizeAndPosition.Left + floatingSizeAndPosition.Width); bool adjustment; if (amountInPx != null) { adjustment = Move(direction, amountInPx.Value, distanceToTopBoundaryIfFloating, distanceToBottomBoundaryIfFloating, distanceToLeftBoundaryIfFloating, distanceToRightBoundaryIfFloating, windowState, floatingSizeAndPosition); } else { adjustment = MoveToEdge(direction, windowState, distanceToTopBoundaryIfFloating, distanceToBottomBoundaryIfFloating, distanceToLeftBoundaryIfFloating, distanceToRightBoundaryIfFloating); } if (adjustment) { switch (getWindowState()) { case WindowStates.Floating: PersistSizeAndPosition(); break; case WindowStates.Docked: var dockSizeAndPositionInPx = CalculateDockSizeAndPositionInPx(getDockPosition(), getDockSize()); SetAppBarSizeAndPosition(getDockPosition(), dockSizeAndPositionInPx); break; } } }