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 void CreateDragBehaviour(Placement placement, Widget inputWidget, Widget contentWidget) { var db = new DragBehaviour(inputWidget, contentWidget, placement); db.OnUndock += (positionOffset, windowPosition) => { var panelWindow = (WindowWidget)contentWidget.GetRoot(); var windowPlacement = Model.GetWindowByPlacement(placement); if (windowPlacement.Root.GetPanelPlacements().Count(p => !p.Hidden) > 1) { var globalSize = placement.CalcGlobalStretch() * panelWindow.Size; var wrapper = new WindowPlacement { Size = new Vector2(Mathf.Max(panelMinWidth, globalSize.X), globalSize.Y) }; placement.Unlink(); windowPlacement.Root.RemoveRedundantNodes(); Model.AddWindow(wrapper); wrapper.Placements.Add(placement); wrapper.Stretches.Add(1); #if MAC wrapper.Position = windowPosition - new Vector2(0, wrapper.Size.Y); #else wrapper.Position = windowPosition; #endif RefreshWindow(windowPlacement); CreateFloatingWindow(wrapper); RefreshWindow(wrapper); } WindowDragBehaviour.CreateFor(placement, positionOffset); }; }
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); } }