From 164384e55e67f35de1d0c0424297bd881da2c361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Sun, 2 Aug 2026 15:58:02 +0200 Subject: [PATCH] Made not having a project loaded less crashy --- .../src/EditWindows/ContentBrowserWindow.bf | 20 ++++- GlitchyEditor/src/EditorLayer.bf | 74 +++++++++++-------- GlitchyEngine/src/ImGui/ImGuiExtension.bf | 13 ++++ 3 files changed, 74 insertions(+), 33 deletions(-) diff --git a/GlitchyEditor/src/EditWindows/ContentBrowserWindow.bf b/GlitchyEditor/src/EditWindows/ContentBrowserWindow.bf index ab3463e..94e0f38 100644 --- a/GlitchyEditor/src/EditWindows/ContentBrowserWindow.bf +++ b/GlitchyEditor/src/EditWindows/ContentBrowserWindow.bf @@ -83,7 +83,7 @@ namespace GlitchyEditor.EditWindows public Span History => _history; - public StringView CurrentDirectoryPath => _currentIndex >= 0 ? _history[_currentIndex] : ""; + public StringView CurrentDirectoryPath => (_history.Count == 0 || _currentIndex < 0) ? "" : _history[_currentIndex]; public bool CanGoBack => _currentIndex > 0; public bool CanGoForward => (_currentIndex + 1) < _history.Count; @@ -92,7 +92,11 @@ namespace GlitchyEditor.EditWindows { // We always defer the actual navigation to the next frame, so that the UI-rendering and updates are more robust and don't flicker for one frame _currentIndex = _nextIndex; - if (_pathToInsert != null) + if (String.IsNullOrWhiteSpace(_pathToInsert)) + { + delete _pathToInsert; + } + else { if (replace) { @@ -342,7 +346,17 @@ namespace GlitchyEditor.EditWindows // Make sure we are in an existing directory. if (!_manager.AssetHierarchy.FileExists(CurrentDirectory)) { - _directoryHistory.Replace(_manager.AssetDirectory); + if (Directory.Exists(_manager.AssetDirectory)) + { + _directoryHistory.Replace(_manager.AssetDirectory); + } + else + { + // If the assets directory doesn't exist (probably, because we have no project open) + // we navigate to the resources directory. + // This MUST exist, otherwise we wouldn't have managed to launch the Editor. + _directoryHistory.Replace(_manager.ResourcesDirectory); + } } _directoryHistory.Update(); diff --git a/GlitchyEditor/src/EditorLayer.bf b/GlitchyEditor/src/EditorLayer.bf index 2484916..4a2e47c 100644 --- a/GlitchyEditor/src/EditorLayer.bf +++ b/GlitchyEditor/src/EditorLayer.bf @@ -958,6 +958,9 @@ namespace GlitchyEditor /// Creates a new scene and openes it. private void CreateAndOpenNewScene() { + if (_currentProject == null) + return; + CloseCurrentScene(); SceneFilePath = null; @@ -1032,6 +1035,9 @@ namespace GlitchyEditor /// Saves the scene in the file that is was loaded from or saved to last. If there is no such path (i.e. it is a new scene) the save file dialog will open. private void SaveCurrentScene() { + if (_currentProject == null) + return; + if (!CanSaveScene) { Log.ClientLogger.Error("Scene can't be saved while playing the game!"); @@ -1063,6 +1069,9 @@ namespace GlitchyEditor /// Opens a save file dialog and saves the scene at the user specified location. private void SaveCurrentSceneAs() { + if (_currentProject == null) + return; + if (!CanSaveScene) { Log.ClientLogger.Error("Scene can't be saved while playing the game!"); @@ -1083,6 +1092,9 @@ namespace GlitchyEditor /// Opens a open file dialog and load the scene selected by the user specified. private void OpenScene() { + if (_currentProject == null) + return; + OpenFileDialog ofd = scope .(); ofd.InitialDirectory = _currentProject.AssetsFolder; ofd.SetFilter("scene file (*.scene)|*.scene"); @@ -1400,41 +1412,43 @@ namespace GlitchyEditor { ImGui.BeginMainMenuBar(); - if(ImGui.BeginMenu("File", true)) + if (ImGui.BeginMenu("File", true)) { - if (ImGui.MenuItem("New Scene", "Ctrl+N")) - CreateAndOpenNewScene(); - - ImGui.AttachTooltip("Creates a new (almost) empty scene."); - - if (ImGui.MenuItem("Open Scene...", "Ctrl+O")) - OpenScene(); - - ImGui.AttachTooltip("Opens an existing Scene."); - - if (ImGui.BeginMenu("Open recent Scene")) + using (ImGui.DisabledScope(_currentProject == null)) { - ShowOpenRecentSceneMenu(); + if (ImGui.MenuItem("New Scene", "Ctrl+N")) + CreateAndOpenNewScene(); - ImGui.EndMenu(); + ImGui.AttachTooltip("Creates a new (almost) empty scene."); + + if (ImGui.MenuItem("Open Scene...", "Ctrl+O")) + OpenScene(); + + ImGui.AttachTooltip("Opens an existing Scene."); + + if (ImGui.BeginMenu("Open recent Scene")) + { + ShowOpenRecentSceneMenu(); + + ImGui.EndMenu(); + } + + ImGui.Separator(); + + using (ImGui.DisabledScope(!CanSaveScene)) + { + if (ImGui.MenuItem("Save Scene", "Ctrl+S")) + SaveCurrentScene(); + + ImGui.AttachTooltip("Saves the current scene."); + + if (ImGui.MenuItem("Save Scene as...", "Ctrl+Shift+S")) + SaveCurrentSceneAs(); + + ImGui.AttachTooltip("Saves the scene under the given file name."); + } } - ImGui.Separator(); - - ImGui.BeginDisabled(!CanSaveScene); - - if (ImGui.MenuItem("Save Scene", "Ctrl+S")) - SaveCurrentScene(); - - ImGui.AttachTooltip("Saves the current scene."); - - if (ImGui.MenuItem("Save Scene as...", "Ctrl+Shift+S")) - SaveCurrentSceneAs(); - - ImGui.AttachTooltip("Saves the scene under the given file name."); - - ImGui.EndDisabled(); - ImGui.Separator(); if (ImGui.MenuItem("Create new Project...", "Ctrl+ALT+N")) diff --git a/GlitchyEngine/src/ImGui/ImGuiExtension.bf b/GlitchyEngine/src/ImGui/ImGuiExtension.bf index 53826b4..7e182c1 100644 --- a/GlitchyEngine/src/ImGui/ImGuiExtension.bf +++ b/GlitchyEngine/src/ImGui/ImGuiExtension.bf @@ -743,5 +743,18 @@ namespace ImGui PushStyleVar(.DockingSeparatorSize, Value); } } + + public struct DisabledScope : IDisposable + { + public this(bool disabled = true) + { + ImGui.BeginDisabled(disabled); + } + + public void Dispose() + { + ImGui.EndDisabled(); + } + } } } \ No newline at end of file