8 changed files with 147 additions and 13 deletions
@ -0,0 +1,85 @@ |
|||
using System; |
|||
using Avalonia.Controls; |
|||
using Avalonia.Input; |
|||
using Avalonia.Input.Raw; |
|||
using Avalonia.Platform; |
|||
|
|||
namespace Avalonia |
|||
{ |
|||
internal class ManagedWindowResizeDragHelper |
|||
{ |
|||
private readonly IWindowBaseImpl _window; |
|||
private readonly Action<bool> _captureMouse; |
|||
private readonly Action<Rect> _resize; |
|||
private WindowEdge? _edge; |
|||
private Point _prevPoint; |
|||
|
|||
public ManagedWindowResizeDragHelper(IWindowBaseImpl window, Action<bool> captureMouse, Action<Rect> resize = null) |
|||
{ |
|||
_window = window; |
|||
_captureMouse = captureMouse; |
|||
_resize = resize; |
|||
} |
|||
|
|||
public void BeginResizeDrag(WindowEdge edge, Point currentMousePosition) |
|||
{ |
|||
_captureMouse(true); |
|||
_prevPoint = currentMousePosition; |
|||
_edge = edge; |
|||
} |
|||
|
|||
public bool PreprocessInputEvent(ref RawInputEventArgs e) |
|||
{ |
|||
if (_edge == null) |
|||
return false; |
|||
if (e is RawMouseEventArgs args) |
|||
{ |
|||
if (args.Type == RawMouseEventType.LeftButtonUp) |
|||
{ |
|||
_edge = null; |
|||
_captureMouse(false); |
|||
} |
|||
if (args.Type == RawMouseEventType.Move) |
|||
{ |
|||
MoveWindow(args.Position); |
|||
return true; |
|||
} |
|||
|
|||
|
|||
_edge = null; |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
|
|||
private void MoveWindow(Point position) |
|||
{ |
|||
var diff = position - _prevPoint; |
|||
var edge = _edge.Value; |
|||
var rc = new Rect(_window.Position, _window.ClientSize); |
|||
if (edge == WindowEdge.East || edge == WindowEdge.NorthEast || edge == WindowEdge.SouthEast) |
|||
{ |
|||
rc = rc.WithWidth(rc.Width + diff.X); |
|||
_prevPoint = _prevPoint.WithX(position.X); |
|||
} |
|||
if (edge == WindowEdge.West || edge == WindowEdge.NorthWest || edge == WindowEdge.SouthWest) |
|||
rc = rc.WithX(rc.X + diff.X).WithWidth(rc.Width - diff.X); |
|||
if (edge == WindowEdge.South || edge == WindowEdge.SouthWest || edge == WindowEdge.SouthEast) |
|||
{ |
|||
rc = rc.WithHeight(rc.Height + diff.Y); |
|||
_prevPoint = _prevPoint.WithY(position.Y); |
|||
} |
|||
if (edge == WindowEdge.North || edge == WindowEdge.NorthWest || edge == WindowEdge.NorthEast) |
|||
rc = rc.WithY(rc.Y + diff.Y).WithHeight(rc.Height - diff.Y); |
|||
if (_resize != null) |
|||
_resize(rc); |
|||
else |
|||
{ |
|||
if (_window.Position != rc.Position) |
|||
_window.Position = rc.Position; |
|||
if (_window.ClientSize != rc.Size) |
|||
_window.Resize(rc.Size); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue