From 48bfdc6231f6a5afc55a9a9139f417060d4e1eb0 Mon Sep 17 00:00:00 2001 From: Hermann Vincent Date: Fri, 26 Dec 2025 03:06:56 +0100 Subject: [PATCH 1/3] Fix being able to play in prefab scene cause weird effect && play mode wasnt switch to detected session scene tab --- engine/Sandbox.Tools/Assets/IAssetEditor.cs | 8 +++++++- engine/Sandbox.Tools/Scene/EditorScene.cs | 11 +++++++++++ .../Scene/Session/SceneEditorSession.cs | 17 ++++++++++++++++- .../Code/Scene/SceneTree/GameObjectNode.cs | 2 ++ .../tools/Code/Scene/SceneView/SceneDock.cs | 3 ++- .../Code/Scene/SceneView/SceneViewportWidget.cs | 4 +++- 6 files changed, 41 insertions(+), 4 deletions(-) diff --git a/engine/Sandbox.Tools/Assets/IAssetEditor.cs b/engine/Sandbox.Tools/Assets/IAssetEditor.cs index 128ddfff3..384d97314 100644 --- a/engine/Sandbox.Tools/Assets/IAssetEditor.cs +++ b/engine/Sandbox.Tools/Assets/IAssetEditor.cs @@ -23,7 +23,8 @@ public interface IAssetEditor : IValid public static bool OpenInEditor( Asset asset, out IAssetEditor editor ) { System.ArgumentNullException.ThrowIfNull( asset ); - + + Log.Info($"Open In Editor {asset.GetSourceFile()}"); // // Stick this on the recent opened list // @@ -33,6 +34,8 @@ public static bool OpenInEditor( Asset asset, out IAssetEditor editor ) if ( OpenSingleEditors.TryGetValue( path, out var openEditor ) && openEditor.IsValid ) { + Log.Info("Should not focus. "); + // ReSharper disable once SuspiciousTypeConversion.Global if ( openEditor is BaseWindow window ) { @@ -47,6 +50,7 @@ public static bool OpenInEditor( Asset asset, out IAssetEditor editor ) if ( OpenMultiAssetEditors.TryGetValue( extension, out openEditor ) && openEditor.IsValid ) { + Log.Info( $"Open In MultiAssetEditor {asset.GetSourceFile()}" ); openEditor.AssetOpen( asset ); editor = openEditor; @@ -86,6 +90,8 @@ public static bool OpenInEditor( Asset asset, out IAssetEditor editor ) var created = found.Type.Create(); + Log.Info( $"widgetWindow create {created} {created.GetType().ToString()}" ); + if ( created is not IAssetEditor ae ) { created.Destroy(); diff --git a/engine/Sandbox.Tools/Scene/EditorScene.cs b/engine/Sandbox.Tools/Scene/EditorScene.cs index aa0fd4432..a1872a284 100644 --- a/engine/Sandbox.Tools/Scene/EditorScene.cs +++ b/engine/Sandbox.Tools/Scene/EditorScene.cs @@ -85,6 +85,7 @@ public static void OpenPrefab( PrefabFile resource ) { if ( SceneEditorSession.Resolve( resource ) is PrefabEditorSession session ) { + Log.Info( "EditorScene#OpenPrefab.l88" ); session.MakeActive(); return; } @@ -97,6 +98,7 @@ public static void OpenPrefab( PrefabFile resource ) session = new PrefabEditorSession( prefabScene ); session.MakeActive(); + Log.Info( "EditorScene#OpenPrefab.l101" ); } } @@ -161,6 +163,9 @@ public static void Discard() static SceneEditorSession FindPlayableSession() { + if ( SceneEditorSession.Active is not PrefabEditorSession ) + return SceneEditorSession.Active; + // Current scene is good if ( SceneEditorSession.Active?.Scene is not PrefabScene ) return SceneEditorSession.Active; @@ -239,7 +244,13 @@ public static void Play( bool playMode, SceneEditorSession playableSession = nul playableSession ??= FindPlayableSession(); if ( playableSession is null ) return; + Log.Info( playableSession ); + Log.Info( playableSession.GetType() ); + Log.Info( playableSession.Scene ); + Log.Info( playableSession.Scene.GetType() ); + OnPlayStore(); + playableSession.MakeActive(); Game.IsPlaying = true; diff --git a/engine/Sandbox.Tools/Scene/Session/SceneEditorSession.cs b/engine/Sandbox.Tools/Scene/Session/SceneEditorSession.cs index f3f240dae..0f4a3986c 100644 --- a/engine/Sandbox.Tools/Scene/Session/SceneEditorSession.cs +++ b/engine/Sandbox.Tools/Scene/Session/SceneEditorSession.cs @@ -79,6 +79,8 @@ void CreateSceneDock() SceneDock.Parent = EditorWindow; SceneDock.Visible = true; + Log.Info($"SceneEditorSession#CreateSceneDock.l82 {SceneDock} {SceneDock.IsValid}"); + UpdateEditorTitle(); Dock(); @@ -167,12 +169,17 @@ public virtual void Destroy() /// public void MakeActive( bool bringToFront = true ) { - Active = this; + if (Active == this) + { + return; + } + Active = this; if ( bringToFront && EditorWindow is not null ) { BringToFront(); } + Log.Info($"SceneEditorSession#MakeActive scene: {Scene.Name}"); } /// @@ -180,12 +187,20 @@ public void MakeActive( bool bringToFront = true ) /// public void BringToFront() { + Log.Info($"SceneEditorSession#BringToFront scene: {Scene.Name}"); if ( EditorWindow.DockManager.IsDockOpen( SceneDock, false ) ) { EditorWindow.DockManager.RaiseDock( SceneDock ); } + // Focus the dock + if ( SceneDock.IsValid() ) + SceneDock.Focus(); // if it doesn't focus, UpdateEditorTile will not work + + UpdateEditorTitle(); + + } RealTimeSince timeSinceSavedState; diff --git a/game/addons/tools/Code/Scene/SceneTree/GameObjectNode.cs b/game/addons/tools/Code/Scene/SceneTree/GameObjectNode.cs index 704226358..21ee52ffd 100644 --- a/game/addons/tools/Code/Scene/SceneTree/GameObjectNode.cs +++ b/game/addons/tools/Code/Scene/SceneTree/GameObjectNode.cs @@ -1,4 +1,5 @@ using static Editor.BaseItemWidget; +using System; namespace Editor; partial class GameObjectNode : TreeNode @@ -567,6 +568,7 @@ public static void AddGameObjectMenuItems( Menu m, TreeNode treeNode ) { if ( prefabAsset.TryLoadResource( out var prefab ) && prefab.IsValid ) { + Log.Info( "GameObjectNode.cs#AddGameObjectMenuItems.l570" ); EditorScene.OpenPrefab( prefab ); } } ).Enabled = !prefabAsset.IsProcedural; diff --git a/game/addons/tools/Code/Scene/SceneView/SceneDock.cs b/game/addons/tools/Code/Scene/SceneView/SceneDock.cs index 5414440ae..1f8bb781d 100644 --- a/game/addons/tools/Code/Scene/SceneView/SceneDock.cs +++ b/game/addons/tools/Code/Scene/SceneView/SceneDock.cs @@ -49,9 +49,9 @@ public override void OnDestroyed() protected override void OnVisibilityChanged( bool visible ) { base.OnVisibilityChanged( visible ); - if ( visible ) { + Log.Info($"SceneDock.OnVisibilityChanged.l52 visible {visible} {Session.Scene.Name}"); Session.MakeActive(); } } @@ -59,6 +59,7 @@ protected override void OnVisibilityChanged( bool visible ) protected override void OnFocus( FocusChangeReason reason ) { base.OnFocus( reason ); + Log.Info($"SceneDock.OnFocus.l62 {Session.Scene.Name}"); Session.MakeActive(); } diff --git a/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.cs b/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.cs index b19b0332b..667740696 100644 --- a/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.cs +++ b/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.cs @@ -446,8 +446,10 @@ void OnEditorPreFrame() // var hasMouseFocus = hasMouseInput; - if ( IsFocused && SceneViewWidget.Current.IsValid() ) + if ( IsFocused && SceneViewWidget.Current.LastSelectedViewportWidget != this && SceneViewWidget.Current.IsValid() ) { + Log.Info("SceneViewportWidget#OnEditorPreFrame.l451"); + // After log look at SceneViewWidget flow SceneViewWidget.Current.LastSelectedViewportWidget = this; } From b8dd58cc06a83fc208ef8876b756bf1e7cba457e Mon Sep 17 00:00:00 2001 From: Hermann Vincent Date: Fri, 26 Dec 2025 03:14:25 +0100 Subject: [PATCH 2/3] Fix being able to play in prefab scene cause weird effect && play mode wasnt switch to detected session scene tab, without comments --- engine/Sandbox.Tools/Assets/IAssetEditor.cs | 8 +----- engine/Sandbox.Tools/Scene/EditorScene.cs | 7 ------ .../Scene/Session/SceneEditorSession.cs | 11 ++------ .../Code/Scene/SceneTree/GameObjectNode.cs | 2 -- .../tools/Code/Scene/SceneView/SceneDock.cs | 2 -- .../Code/Scene/SceneView/SceneViewWidget.cs | 25 +++++++++++-------- .../Scene/SceneView/SceneViewportWidget.cs | 2 -- 7 files changed, 18 insertions(+), 39 deletions(-) diff --git a/engine/Sandbox.Tools/Assets/IAssetEditor.cs b/engine/Sandbox.Tools/Assets/IAssetEditor.cs index 384d97314..128ddfff3 100644 --- a/engine/Sandbox.Tools/Assets/IAssetEditor.cs +++ b/engine/Sandbox.Tools/Assets/IAssetEditor.cs @@ -23,8 +23,7 @@ public interface IAssetEditor : IValid public static bool OpenInEditor( Asset asset, out IAssetEditor editor ) { System.ArgumentNullException.ThrowIfNull( asset ); - - Log.Info($"Open In Editor {asset.GetSourceFile()}"); + // // Stick this on the recent opened list // @@ -34,8 +33,6 @@ public static bool OpenInEditor( Asset asset, out IAssetEditor editor ) if ( OpenSingleEditors.TryGetValue( path, out var openEditor ) && openEditor.IsValid ) { - Log.Info("Should not focus. "); - // ReSharper disable once SuspiciousTypeConversion.Global if ( openEditor is BaseWindow window ) { @@ -50,7 +47,6 @@ public static bool OpenInEditor( Asset asset, out IAssetEditor editor ) if ( OpenMultiAssetEditors.TryGetValue( extension, out openEditor ) && openEditor.IsValid ) { - Log.Info( $"Open In MultiAssetEditor {asset.GetSourceFile()}" ); openEditor.AssetOpen( asset ); editor = openEditor; @@ -90,8 +86,6 @@ public static bool OpenInEditor( Asset asset, out IAssetEditor editor ) var created = found.Type.Create(); - Log.Info( $"widgetWindow create {created} {created.GetType().ToString()}" ); - if ( created is not IAssetEditor ae ) { created.Destroy(); diff --git a/engine/Sandbox.Tools/Scene/EditorScene.cs b/engine/Sandbox.Tools/Scene/EditorScene.cs index a1872a284..d56d8bcf8 100644 --- a/engine/Sandbox.Tools/Scene/EditorScene.cs +++ b/engine/Sandbox.Tools/Scene/EditorScene.cs @@ -85,7 +85,6 @@ public static void OpenPrefab( PrefabFile resource ) { if ( SceneEditorSession.Resolve( resource ) is PrefabEditorSession session ) { - Log.Info( "EditorScene#OpenPrefab.l88" ); session.MakeActive(); return; } @@ -98,7 +97,6 @@ public static void OpenPrefab( PrefabFile resource ) session = new PrefabEditorSession( prefabScene ); session.MakeActive(); - Log.Info( "EditorScene#OpenPrefab.l101" ); } } @@ -243,11 +241,6 @@ public static void Play( bool playMode, SceneEditorSession playableSession = nul { playableSession ??= FindPlayableSession(); if ( playableSession is null ) return; - - Log.Info( playableSession ); - Log.Info( playableSession.GetType() ); - Log.Info( playableSession.Scene ); - Log.Info( playableSession.Scene.GetType() ); OnPlayStore(); playableSession.MakeActive(); diff --git a/engine/Sandbox.Tools/Scene/Session/SceneEditorSession.cs b/engine/Sandbox.Tools/Scene/Session/SceneEditorSession.cs index 0f4a3986c..51a7477b8 100644 --- a/engine/Sandbox.Tools/Scene/Session/SceneEditorSession.cs +++ b/engine/Sandbox.Tools/Scene/Session/SceneEditorSession.cs @@ -79,8 +79,6 @@ void CreateSceneDock() SceneDock.Parent = EditorWindow; SceneDock.Visible = true; - Log.Info($"SceneEditorSession#CreateSceneDock.l82 {SceneDock} {SceneDock.IsValid}"); - UpdateEditorTitle(); Dock(); @@ -179,7 +177,6 @@ public void MakeActive( bool bringToFront = true ) { BringToFront(); } - Log.Info($"SceneEditorSession#MakeActive scene: {Scene.Name}"); } /// @@ -187,20 +184,16 @@ public void MakeActive( bool bringToFront = true ) /// public void BringToFront() { - Log.Info($"SceneEditorSession#BringToFront scene: {Scene.Name}"); if ( EditorWindow.DockManager.IsDockOpen( SceneDock, false ) ) { EditorWindow.DockManager.RaiseDock( SceneDock ); } - // Focus the dock if ( SceneDock.IsValid() ) - SceneDock.Focus(); // if it doesn't focus, UpdateEditorTile will not work - - - UpdateEditorTitle(); + SceneDock.Focus(); + UpdateEditorTitle(); } RealTimeSince timeSinceSavedState; diff --git a/game/addons/tools/Code/Scene/SceneTree/GameObjectNode.cs b/game/addons/tools/Code/Scene/SceneTree/GameObjectNode.cs index 21ee52ffd..704226358 100644 --- a/game/addons/tools/Code/Scene/SceneTree/GameObjectNode.cs +++ b/game/addons/tools/Code/Scene/SceneTree/GameObjectNode.cs @@ -1,5 +1,4 @@ using static Editor.BaseItemWidget; -using System; namespace Editor; partial class GameObjectNode : TreeNode @@ -568,7 +567,6 @@ public static void AddGameObjectMenuItems( Menu m, TreeNode treeNode ) { if ( prefabAsset.TryLoadResource( out var prefab ) && prefab.IsValid ) { - Log.Info( "GameObjectNode.cs#AddGameObjectMenuItems.l570" ); EditorScene.OpenPrefab( prefab ); } } ).Enabled = !prefabAsset.IsProcedural; diff --git a/game/addons/tools/Code/Scene/SceneView/SceneDock.cs b/game/addons/tools/Code/Scene/SceneView/SceneDock.cs index 1f8bb781d..b4dae7279 100644 --- a/game/addons/tools/Code/Scene/SceneView/SceneDock.cs +++ b/game/addons/tools/Code/Scene/SceneView/SceneDock.cs @@ -51,7 +51,6 @@ protected override void OnVisibilityChanged( bool visible ) base.OnVisibilityChanged( visible ); if ( visible ) { - Log.Info($"SceneDock.OnVisibilityChanged.l52 visible {visible} {Session.Scene.Name}"); Session.MakeActive(); } } @@ -59,7 +58,6 @@ protected override void OnVisibilityChanged( bool visible ) protected override void OnFocus( FocusChangeReason reason ) { base.OnFocus( reason ); - Log.Info($"SceneDock.OnFocus.l62 {Session.Scene.Name}"); Session.MakeActive(); } diff --git a/game/addons/tools/Code/Scene/SceneView/SceneViewWidget.cs b/game/addons/tools/Code/Scene/SceneView/SceneViewWidget.cs index 66d9445c0..d1b7fac1d 100644 --- a/game/addons/tools/Code/Scene/SceneView/SceneViewWidget.cs +++ b/game/addons/tools/Code/Scene/SceneView/SceneViewWidget.cs @@ -82,13 +82,21 @@ protected override void OnPaint() public void Frame() { var session = Session; - if ( session is null ) return; - if ( !session.Scene.IsValid() ) return; + if ( session is null ) + { + Log.Info($"SceneViewWidget#Frame.L91 is null {session is null}"); + return; + } + if ( !session.Scene.IsValid() ) + { + return; + } using var scope = session.Scene.Push(); bool isActive = session == SceneEditorSession.Active; - + if (!isActive) + Log.Info($"SceneViewWidget#Frame.L91 {session.Scene.Name} isActive = {isActive}"); // Update inspector with current selection, if changed if ( isActive && selectionHash != session.Selection.GetHashCode() ) { @@ -112,6 +120,7 @@ public void Frame() if ( isActive ) { + // Log.Info("SceneViewWidget#Frame.L115 isActive"); Current = this; } @@ -338,15 +347,9 @@ void OnToolChanged() scroller.Canvas = toolWidget; _sidebar.Add( scroller ); + Log.Info($"SceneViewWidget.ViewportToolBar#OnToolChanged.L351 {toolWidget.Name}"); toolWidget.Focus(); } - else - { - if ( SceneViewWidget.Current?.LastSelectedViewportWidget?.IsValid() ?? false ) - { - SceneViewWidget.Current.LastSelectedViewportWidget.Focus(); - } - } // Update footer var footerWidget = subTool?.CreateToolFooter() ?? rootTool?.CreateToolFooter(); @@ -370,6 +373,8 @@ public void Frame() if ( _activeTool != tool || (selectionHash != _selectionHash && (tool?.RebuildSidebarOnSelectionChange ?? false)) ) { + Log.Info($"_activeTool {_activeTool?.GetType().ToString()} {SceneViewWidget.Current?.Tools.CurrentSession.Scene.Name}"); + Log.Info($"tool {tool?.GetType().ToString()}"); _activeTool = tool; _selectionHash = selectionHash; OnToolChanged(); diff --git a/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.cs b/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.cs index 667740696..10f3b1669 100644 --- a/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.cs +++ b/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.cs @@ -448,8 +448,6 @@ void OnEditorPreFrame() var hasMouseFocus = hasMouseInput; if ( IsFocused && SceneViewWidget.Current.LastSelectedViewportWidget != this && SceneViewWidget.Current.IsValid() ) { - Log.Info("SceneViewportWidget#OnEditorPreFrame.l451"); - // After log look at SceneViewWidget flow SceneViewWidget.Current.LastSelectedViewportWidget = this; } From 0a76d8d6d0b4e97e072de3fdf7273fcc633256de Mon Sep 17 00:00:00 2001 From: Hermann Vincent Date: Sun, 28 Dec 2025 04:50:42 +0100 Subject: [PATCH 3/3] fix --- .../SceneView/SceneViewportWidget.Sizing.cs | 77 +++++++++++++++---- 1 file changed, 61 insertions(+), 16 deletions(-) diff --git a/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.Sizing.cs b/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.Sizing.cs index 3e266012f..691932b8e 100644 --- a/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.Sizing.cs +++ b/game/addons/tools/Code/Scene/SceneView/SceneViewportWidget.Sizing.cs @@ -15,6 +15,7 @@ public partial class SceneViewportWidget /// public void SetDefaultSize() { + Log.Info("SetDefaultSize"); ForcedSize = null; ForcedAspectRatio = null; @@ -24,13 +25,25 @@ public void SetDefaultSize() SetSizeMode( SizeMode.CanGrow, SizeMode.CanGrow ); } - + /// /// Set the viewport to a specific aspect ratio /// /// public void SetAspectRatio( float aspectRatio ) { + Log.Info("SetAspectRatio"); + + MinimumSize = Vector2.Zero; + MaximumSize = QT_MAX_SIZE; + FixedSize = QT_MAX_SIZE; + + // Don't update if the aspect ratio hasn't changed + if ( ForcedAspectRatio.HasValue && ForcedAspectRatio.Value.AlmostEqual( aspectRatio ) && !ForcedSize.HasValue ) + { + return; + } + ForcedAspectRatio = aspectRatio; ForcedSize = null; @@ -51,58 +64,90 @@ public void SetResolution( Vector2 resolution ) private void UpdateSizeConstraints() { + Log.Info("UpdateSizeConstraints"); if ( ForcedSize.HasValue ) { var size = ForcedSize.Value; - // For fixed resolution, use exact size constraints MaximumSize = size; FixedSize = size; } + else if ( ForcedAspectRatio.HasValue ) + { + if ( Parent != null ) + { + Log.Info($"CurrentSize: x{Size.x} y{Size.y}"); + var contentRect = Parent.ContentRect; + var parentSize = new Vector2( contentRect.Width, contentRect.Height ); + MaximumSize = parentSize; + Log.Info($"MaximumSize: x{MaximumSize.x} y{MaximumSize.y}"); + } + else + { + MaximumSize = new Vector2( QT_MAX_SIZE, QT_MAX_SIZE ); + } + FixedSize = QT_MAX_SIZE; + Log.Info($"FixedSize: x{FixedSize.x} y{FixedSize.y}"); + } else { - // For aspect ratio mode or free, don't lock the size - let it be dynamic MaximumSize = new Vector2( QT_MAX_SIZE, QT_MAX_SIZE ); FixedSize = QT_MAX_SIZE; } Layout.SizeConstraint = SizeConstraint.SetDefaultConstraint; SetSizeMode( SizeMode.Expand, SizeMode.Expand ); - - UpdateGeometry(); - AdjustSize(); } + Vector2? defaultSize; + protected override Vector2 SizeHint() { - // Exact size, easy if ( ForcedSize.HasValue ) { return ForcedSize.Value; } - // Free if ( !ForcedAspectRatio.HasValue ) { return base.SizeHint(); } - // Dynamically calculate size based on current parent size - var parentSize = Parent?.Size ?? base.SizeHint(); - var parentAspect = parentSize.x / parentSize.y; + if ( defaultSize == null ) + { + defaultSize = Size; + } + + var availableSize = defaultSize.Value; + if ( availableSize.x <= 0 || availableSize.y <= 0 ) + { + return base.SizeHint(); + } + var aspectRatio = ForcedAspectRatio.Value; + Log.Info( $"Aspect ratio: {aspectRatio}" ); + + if ( aspectRatio <= 0 || float.IsNaN( aspectRatio ) || float.IsInfinity( aspectRatio ) ) + { + return availableSize; + } - if ( aspectRatio > parentAspect ) + var availableAspect = availableSize.x / availableSize.y; + Vector2 result; + if ( aspectRatio > availableAspect ) { - // Fit to width - return new Vector2( parentSize.x, parentSize.x / aspectRatio ); + result = new Vector2( availableSize.x, availableSize.x / aspectRatio ); } else { - // Fit to height - return new Vector2( parentSize.y * aspectRatio, parentSize.y ); + result = new Vector2( availableSize.y * aspectRatio, availableSize.y ); } + if ( MaximumSize.x > 0 && MaximumSize.y > 0 ) + { + result = new Vector2( MathF.Min( result.x, MaximumSize.x ), MathF.Min( result.y, MaximumSize.y ) ); + } + return result; } }