private IEnumerator <object> MainTask() { while (true) { var pressedPosition = inputWidget.LocalMousePosition(); if (input.WasMousePressed()) { if (placement.Root == placement.Parent) { WindowDragBehaviour.CreateFor(placement, pressedPosition); } else { var size = inputWidget.Parent.AsWidget.Size; var initialPosition = LocalMousePosition; while (input.IsMousePressed() && LocalMousePosition.X > -Offset && LocalMousePosition.X < size.X + Offset && Mathf.Abs(LocalMousePosition.Y - initialPosition.Y) < Offset ) { yield return(null); } if (input.IsMousePressed()) { OnUndock?.Invoke(pressedPosition, Application.DesktopMousePosition - (input.MousePosition - contentWidget.GlobalPosition)); } } } yield return(null); } }
private IEnumerator <object> MainTask() { while (true) { if (input.WasMousePressed()) { var pressedPosition = inputWidget.LocalMousePosition(); var windowPlacement = (WindowPlacement)placement.Root; bool doUndock = windowPlacement != placement && (placement.Parent != windowPlacement || windowPlacement.Placements.Count > 1); if (!doUndock) { var panelWindow = (WindowWidget)contentWidget.GetRoot(); var window = panelWindow.Window; if (window.State == WindowState.Maximized) { var initialPosition = LocalMousePosition; while (input.IsMousePressed()) { var diff = Mathf.Abs(LocalMousePosition - initialPosition); if (diff.X >= DragThreshold || diff.Y >= DragThreshold) { window.State = WindowState.Normal; pressedPosition = new Vector2(window.ClientSize.X / 2, 10); WindowDragBehaviour.CreateFor(placement, pressedPosition); break; } yield return(null); } yield return(null); continue; } WindowDragBehaviour.CreateFor(placement, pressedPosition); } else { var size = inputWidget.Parent.AsWidget.Size; var initialPosition = LocalMousePosition; while (input.IsMousePressed() && LocalMousePosition.X > -DragThreshold && LocalMousePosition.X < size.X + DragThreshold && Mathf.Abs(LocalMousePosition.Y - initialPosition.Y) < DragThreshold ) { yield return(null); } if (input.IsMousePressed()) { OnUndock?.Invoke(pressedPosition, Application.DesktopMousePosition - (input.MousePosition - contentWidget.GlobalPosition)); } } } yield return(null); } }
IEnumerator <object> DragTask() { var dockSite = DockSite.None; var dockSiteRect = new Rectangle(); mainWidget.PostPresenter = new DelegatePresenter <Widget>(widget => { if (dockSite != DockSite.None) { widget.PrepareRendererState(); Renderer.DrawRectOutline(dockSiteRect.A + Vector2.One, dockSiteRect.B - Vector2.One, ColorTheme.Current.Docking.DragRectagleOutline, 2); Renderer.DrawRect(dockSiteRect.A + Vector2.One, dockSiteRect.B - Vector2.One, ColorTheme.Current.Docking.DragRectagleOutline.Transparentify(0.8f)); } }); var input = panel.TitleWidget.Input; const float dockSiteWidth = 0.25f; var dockSiteRects = new Rectangle[4] { new Rectangle(Vector2.Zero, new Vector2(dockSiteWidth, 1)), new Rectangle(Vector2.Zero, new Vector2(1, dockSiteWidth)), new Rectangle(new Vector2(1 - dockSiteWidth, 0), Vector2.One), new Rectangle(new Vector2(0, 1 - dockSiteWidth), Vector2.One) }; ThumbnalWindow thumbWindow = null; var initialMousePos = input.MousePosition; var mainWindow = mainWidget.Window; while (input.IsMousePressed()) { var extent = mainWindow.ClientSize; dockSite = DockSite.None; for (int i = 0; i < 4; i++) { var r = dockSiteRects[i]; r.A *= extent; r.B *= extent; var p = Application.DesktopMousePosition - mainWindow.ClientPosition; if (Application.Platform == PlatformId.Mac) { p.Y = mainWindow.ClientSize.Y - p.Y; } if (r.Contains(p)) { dockSiteRect = r; dockSite = (DockSite)(i + 1); } } if (dockSite == DockSite.None) { if (thumbWindow == null) { thumbWindow = new ThumbnalWindow(panel.Title); } } else { mainWindow.Invalidate(); thumbWindow?.Dispose(); thumbWindow = null; } yield return(null); } mainWidget.PostPresenter = null; mainWindow.Invalidate(); thumbWindow?.Dispose(); thumbWindow = null; if (dockSite != DockSite.None) { OnDock?.Invoke(dockSite); } else { OnUndock?.Invoke(Application.DesktopMousePosition - (initialMousePos - panel.TitleWidget.GlobalPosition)); } }