diff --git a/Source/Editor/Viewport/PrefabWindowViewport.cs b/Source/Editor/Viewport/PrefabWindowViewport.cs index acac4767f..256b41290 100644 --- a/Source/Editor/Viewport/PrefabWindowViewport.cs +++ b/Source/Editor/Viewport/PrefabWindowViewport.cs @@ -5,10 +5,12 @@ using System.Collections.Generic; using System.Linq; using FlaxEditor.Content; using FlaxEditor.Gizmo; +using FlaxEditor.GUI.ContextMenu; using FlaxEditor.SceneGraph; using FlaxEditor.Scripting; using FlaxEditor.Viewport.Cameras; using FlaxEditor.Viewport.Previews; +using FlaxEditor.Viewport.Widgets; using FlaxEditor.Windows.Assets; using FlaxEngine; using FlaxEngine.GUI; @@ -44,7 +46,7 @@ namespace FlaxEditor.Viewport private sealed class PrefabUIEditorRoot : UIEditorRoot { private readonly PrefabWindowViewport _viewport; - private bool UI => _viewport._hasUILinkedCached; + private bool UI => _viewport.ShowUI; public PrefabUIEditorRoot(PrefabWindowViewport viewport) : base(true) @@ -67,8 +69,78 @@ namespace FlaxEditor.Viewport private PrefabSpritesRenderer _spritesRenderer; private IntPtr _tempDebugDrawContext; - private bool _hasUILinkedCached; private PrefabUIEditorRoot _uiRoot; + private bool _showUI = false; + + private ContextMenuButton _uiModeButton; + + /// + /// Event fired when the UI Mode is toggled. + /// + public event Action UIModeToggled; + + /// + /// set the initial UI mod + /// + /// the initial ShowUI value + public void SetInitialUIMode(bool value) + { + ShowUI = value; + _uiModeButton.Checked = value; + } + + /// + /// Whether to show the UI mode or not. + /// + public bool ShowUI + { + get => _showUI; + set + { + _showUI = value; + if (_showUI) + { + // UI widget + Gizmos.Active = null; + ViewportCamera = new UIEditorCamera { UIEditor = _uiRoot }; + + // Hide 3D visuals + ShowEditorPrimitives = false; + ShowDefaultSceneActors = false; + ShowDebugDraw = false; + + // Show whole UI on startup + var canvas = (CanvasRootControl)_uiParentLink.Children.FirstOrDefault(x => x is CanvasRootControl); + if (canvas != null) + ViewportCamera.ShowActor(canvas.Canvas); + else if (Instance is UIControl) + ViewportCamera.ShowActor(Instance); + _uiRoot.Visible = true; + } + else + { + // Generic prefab + Gizmos.Active = TransformGizmo; + ViewportCamera = new FPSCamera(); + _uiRoot.Visible = false; + } + + // Update default components usage + bool defaultFeatures = !_showUI; + _disableInputUpdate = _showUI; + _spritesRenderer.Enabled = defaultFeatures; + SelectionOutline.Enabled = defaultFeatures; + _showDefaultSceneButton.Visible = defaultFeatures; + _cameraWidget.Visible = defaultFeatures; + _cameraButton.Visible = defaultFeatures; + _orthographicModeButton.Visible = defaultFeatures; + Task.Enabled = defaultFeatures; + UseAutomaticTaskManagement = defaultFeatures; + ShowDefaultSceneActors = defaultFeatures; + TintColor = defaultFeatures ? Color.White : Color.Transparent; + UIModeToggled?.Invoke(_showUI); + } + } /// /// Drag and drop handlers @@ -138,6 +210,11 @@ namespace FlaxEditor.Viewport _uiRoot.IndexInParent = 0; // Move viewport down below other widgets in the viewport _uiParentLink = _uiRoot.UIRoot; + // UI mode buton + _uiModeButton = ViewWidgetShowMenu.AddButton("UI Mode", (button) => ShowUI = button.Checked); + _uiModeButton.AutoCheck = true; + _uiModeButton.VisibleChanged += control => (control as ContextMenuButton).Checked = ShowUI; + EditorGizmoViewport.AddGizmoViewportWidgets(this, TransformGizmo); // Setup input actions @@ -146,58 +223,8 @@ namespace FlaxEditor.Viewport SetUpdate(ref _update, OnUpdate); } - /// - /// Updates the viewport's gizmos, especially to toggle between 3D and UI editing modes. - /// - internal void UpdateGizmoMode() - { - // Skip if gizmo mode was unmodified - if (_hasUILinked == _hasUILinkedCached) - return; - _hasUILinkedCached = _hasUILinked; - - if (_hasUILinked) - { - // UI widget - Gizmos.Active = null; - ViewportCamera = new UIEditorCamera { UIEditor = _uiRoot }; - - // Hide 3D visuals - ShowEditorPrimitives = false; - ShowDefaultSceneActors = false; - ShowDebugDraw = false; - - // Show whole UI on startup - var canvas = (CanvasRootControl)_uiParentLink.Children.FirstOrDefault(x => x is CanvasRootControl); - if (canvas != null) - ViewportCamera.ShowActor(canvas.Canvas); - else if (Instance is UIControl) - ViewportCamera.ShowActor(Instance); - } - else - { - // Generic prefab - Gizmos.Active = TransformGizmo; - ViewportCamera = new FPSCamera(); - } - - // Update default components usage - bool defaultFeatures = !_hasUILinked; - _disableInputUpdate = _hasUILinked; - _spritesRenderer.Enabled = defaultFeatures; - SelectionOutline.Enabled = defaultFeatures; - _showDefaultSceneButton.Visible = defaultFeatures; - _cameraWidget.Visible = defaultFeatures; - _cameraButton.Visible = defaultFeatures; - _orthographicModeButton.Visible = defaultFeatures; - Task.Enabled = defaultFeatures; - UseAutomaticTaskManagement = defaultFeatures; - TintColor = defaultFeatures ? Color.White : Color.Transparent; - } - private void OnUpdate(float deltaTime) { - UpdateGizmoMode(); for (int i = 0; i < Gizmos.Count; i++) { Gizmos[i].Update(deltaTime); diff --git a/Source/Editor/Windows/Assets/PrefabWindow.cs b/Source/Editor/Windows/Assets/PrefabWindow.cs index 7ee8ecff0..5bf3236ee 100644 --- a/Source/Editor/Windows/Assets/PrefabWindow.cs +++ b/Source/Editor/Windows/Assets/PrefabWindow.cs @@ -355,13 +355,22 @@ namespace FlaxEditor.Windows.Assets private void OnPrefabOpened() { _viewport.Prefab = _asset; - _viewport.UpdateGizmoMode(); + if (Editor.ProjectCache.TryGetCustomData($"UIMode:{_asset.ID}", out bool value)) + _viewport.SetInitialUIMode(value); + else + _viewport.SetInitialUIMode(_viewport._hasUILinked); + _viewport.UIModeToggled += OnUIModeToggled; Graph.MainActor = _viewport.Instance; Selection.Clear(); Select(Graph.Main); Graph.Root.TreeNode.Expand(true); } + private void OnUIModeToggled(bool value) + { + Editor.ProjectCache.SetCustomData($"UIMode:{_asset.ID}", value); + } + /// public override void Save() {