// Copyright (c) 2012-2020 Wojciech Figat. All rights reserved. using System.Collections.Generic; namespace FlaxEngine.GUI { /// /// GUI root control that is represented by a window or an canvas and can contain children but has no parent at all. It's a source of the input events. /// public abstract class RootControl : ContainerControl { private static ContainerControl _gameRoot; private static CanvasContainer _canvasContainer = new CanvasContainer(); /// /// Gets the main GUI control (it can be window or editor overriden control). Use it to plug-in custom GUI controls. /// public static ContainerControl GameRoot { get => _gameRoot; internal set { _gameRoot = value; _canvasContainer.Parent = _gameRoot; } } /// /// Gets the canvas controls root container. /// internal static CanvasContainer CanvasRoot => _canvasContainer; /// /// Gets or sets the current focused control /// public abstract Control FocusedControl { get; set; } /// /// Gets the tracking mouse offset. /// public abstract Vector2 TrackingMouseOffset { get; } /// /// Gets or sets the position of the mouse in the window space coordinates. /// public abstract Vector2 MousePosition { get; set; } /// /// The update callbacks collection. Controls can register for this to get the update event for logic handling. /// public readonly List UpdateCallbacks = new List(1024); /// /// The update callbacks to add before invoking the update. /// public List UpdateCallbacksToAdd = new List(); /// /// The update callbacks to remove before invoking the update. /// public List UpdateCallbacksToRemove = new List(); /// /// Initializes a new instance of the class. /// protected RootControl() : base(0, 0, 100, 60) { AutoFocus = false; } /// public override void Update(float deltaTime) { base.Update(deltaTime); // Flush requests Profiler.BeginEvent("RootControl.SyncCallbacks"); for (int i = 0; i < UpdateCallbacksToAdd.Count; i++) { UpdateCallbacks.Add(UpdateCallbacksToAdd[i]); } UpdateCallbacksToAdd.Clear(); for (int i = 0; i < UpdateCallbacksToRemove.Count; i++) { UpdateCallbacks.Remove(UpdateCallbacksToRemove[i]); } UpdateCallbacksToRemove.Clear(); Profiler.EndEvent(); // Perform the UI update try { Profiler.BeginEvent("RootControl.Update"); for (int i = 0; i < UpdateCallbacks.Count; i++) { UpdateCallbacks[i](deltaTime); } } finally { Profiler.EndEvent(); } } /// /// Starts the mouse tracking. Used by the scrollbars, splitters, etc. /// /// The target control that want to track mouse. It will receive OnMouseMove event. /// If set to true will use mouse screen offset. public abstract void StartTrackingMouse(Control control, bool useMouseScreenOffset); /// /// Ends the mouse tracking. /// public abstract void EndTrackingMouse(); /// /// Gets keyboard key state. /// /// Key to check. /// True while the user holds down the key identified by id. public abstract bool GetKey(KeyboardKeys key); /// /// Gets keyboard key down state. /// /// Key to check. /// True during the frame the user starts pressing down the key. public abstract bool GetKeyDown(KeyboardKeys key); /// /// Gets keyboard key up state. /// /// Key to check. /// True during the frame the user releases the button. public abstract bool GetKeyUp(KeyboardKeys key); /// /// Gets mouse button state. /// /// Mouse button to check. /// True while the user holds down the button. public abstract bool GetMouseButton(MouseButton button); /// /// Gets mouse button down state. /// /// Mouse button to check. /// True during the frame the user starts pressing down the button. public abstract bool GetMouseButtonDown(MouseButton button); /// /// Gets mouse button up state. /// /// Mouse button to check. /// True during the frame the user releases the button. public abstract bool GetMouseButtonUp(MouseButton button); /// public override RootControl Root => this; } }