mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 13:01:52 +00:00
Properties window
This commit is contained in:
@@ -84,8 +84,9 @@ namespace GlitchyEditor.EditWindows
|
|||||||
|
|
||||||
public Event<EventHandler<StringView>> OnFileSelected ~ _.Dispose();
|
public Event<EventHandler<StringView>> OnFileSelected ~ _.Dispose();
|
||||||
|
|
||||||
public this(EditorContentManager contentManager, AssetThumbnailManager thumbnailManager)
|
public this(Editor editor, EditorContentManager contentManager, AssetThumbnailManager thumbnailManager)
|
||||||
{
|
{
|
||||||
|
_editor = editor;
|
||||||
_manager = contentManager;
|
_manager = contentManager;
|
||||||
_thumbnailManager = thumbnailManager;
|
_thumbnailManager = thumbnailManager;
|
||||||
}
|
}
|
||||||
@@ -864,6 +865,18 @@ namespace GlitchyEditor.EditWindows
|
|||||||
{
|
{
|
||||||
wantsDelete = true;
|
wantsDelete = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ImGui.Separator();
|
||||||
|
|
||||||
|
if (ImGui.MenuItem("Properties..."))
|
||||||
|
{
|
||||||
|
AssetHandle? assetHandle = fileOrFolder->AssetFile?.AssetConfig?.AssetHandle;
|
||||||
|
|
||||||
|
if (assetHandle != null)
|
||||||
|
{
|
||||||
|
new PropertiesWindow(_editor, .Asset(assetHandle.Value));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OpenEntry(TreeNode<AssetNode> entry)
|
private void OpenEntry(TreeNode<AssetNode> entry)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using ImGui;
|
||||||
namespace GlitchyEditor.EditWindows
|
namespace GlitchyEditor.EditWindows
|
||||||
{
|
{
|
||||||
abstract class EditorWindow
|
abstract class EditorWindow
|
||||||
@@ -29,4 +30,54 @@ namespace GlitchyEditor.EditWindows
|
|||||||
|
|
||||||
protected abstract void InternalShow();
|
protected abstract void InternalShow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract class ClosableWindow
|
||||||
|
{
|
||||||
|
private static int32 _nextWindowId = 9000;
|
||||||
|
|
||||||
|
private String _windowTitle ~ delete _;
|
||||||
|
private String _windowTitleId ~ delete _;
|
||||||
|
private int32 _windowId;
|
||||||
|
|
||||||
|
protected Editor _editor;
|
||||||
|
|
||||||
|
public StringView WindowTitle
|
||||||
|
{
|
||||||
|
get => _windowTitle;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
String.NewOrSet!(_windowTitle, value);
|
||||||
|
String.NewOrSet!(_windowTitleId, value);
|
||||||
|
_windowTitleId.AppendF($"##{_windowId}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public this(Editor editor, StringView windowTitle = "Window")
|
||||||
|
{
|
||||||
|
_windowId = ++_nextWindowId;
|
||||||
|
_editor = editor;
|
||||||
|
WindowTitle = windowTitle;
|
||||||
|
|
||||||
|
_editor.AddWindow(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Show()
|
||||||
|
{
|
||||||
|
bool open = true;
|
||||||
|
|
||||||
|
if(ImGui.Begin(_windowTitleId, &open, .None))
|
||||||
|
{
|
||||||
|
InternalShow();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui.End();
|
||||||
|
|
||||||
|
if (!open)
|
||||||
|
{
|
||||||
|
_editor.RemoveWindow(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void InternalShow();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -150,7 +150,21 @@ namespace GlitchyEditor.EditWindows
|
|||||||
Show_ContextMenu_Create(true, SelectedEntityIds.Count == 1, isAnyEntitySelected);
|
Show_ContextMenu_Create(true, SelectedEntityIds.Count == 1, isAnyEntitySelected);
|
||||||
|
|
||||||
if (isAnyEntitySelected)
|
if (isAnyEntitySelected)
|
||||||
|
{
|
||||||
deletedEntity = Show_ContextMenu_Delete();
|
deletedEntity = Show_ContextMenu_Delete();
|
||||||
|
|
||||||
|
ImGui.Separator();
|
||||||
|
|
||||||
|
if (ImGui.MenuItem("Properties..."))
|
||||||
|
{
|
||||||
|
Result<Entity> entityResult = GetSelectedEntity(0);
|
||||||
|
|
||||||
|
if (entityResult case .Ok(let entity))
|
||||||
|
{
|
||||||
|
new PropertiesWindow(_editor, .Entity(entity));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void InternalShow()
|
protected override void InternalShow()
|
||||||
|
|||||||
@@ -24,8 +24,6 @@ class InspectorWindow : EditorWindow
|
|||||||
|
|
||||||
private bool _lockCurrentSelection;
|
private bool _lockCurrentSelection;
|
||||||
|
|
||||||
private append String _selectedFileName = .();
|
|
||||||
|
|
||||||
private SelectedObject _selectedObject = .None;
|
private SelectedObject _selectedObject = .None;
|
||||||
|
|
||||||
public this(Editor editor)
|
public this(Editor editor)
|
||||||
@@ -93,19 +91,24 @@ class InspectorWindow : EditorWindow
|
|||||||
ImGui.Checkbox("Lock", &_lockCurrentSelection);
|
ImGui.Checkbox("Lock", &_lockCurrentSelection);
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
|
|
||||||
if (_selectedObject case .Asset(let assetHandle))
|
ShowSelectedObject(_selectedObject, _editor);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ShowSelectedObject(SelectedObject object, Editor editor)
|
||||||
|
{
|
||||||
|
if (object case .Asset(let assetHandle))
|
||||||
{
|
{
|
||||||
ShowAssetProperties(assetHandle);
|
ShowAssetProperties(assetHandle, editor);
|
||||||
}
|
}
|
||||||
else if (_selectedObject case .Entity(let entity))
|
else if (object case .Entity(let entity))
|
||||||
{
|
{
|
||||||
ShowEntityProperties(entity);
|
ShowEntityProperties(entity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ShowAssetProperties(AssetHandle assetHandle)
|
private static void ShowAssetProperties(AssetHandle assetHandle, Editor editor)
|
||||||
{
|
{
|
||||||
TreeNode<AssetNode> assetNode = TrySilent!(_editor.ContentManager.AssetHierarchy.GetNodeFromAssetHandle(assetHandle));
|
TreeNode<AssetNode> assetNode = TrySilent!(editor.ContentManager.AssetHierarchy.GetNodeFromAssetHandle(assetHandle));
|
||||||
|
|
||||||
AssetFile assetFile = assetNode->AssetFile;
|
AssetFile assetFile = assetNode->AssetFile;
|
||||||
|
|
||||||
@@ -134,7 +137,7 @@ class InspectorWindow : EditorWindow
|
|||||||
ImGui.EndDisabled();
|
ImGui.EndDisabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ShowEntityProperties(Entity entity)
|
private static void ShowEntityProperties(Entity entity)
|
||||||
{
|
{
|
||||||
ComponentEditWindow.ShowComponents(entity);
|
ComponentEditWindow.ShowComponents(entity);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,95 +6,21 @@ using System.Reflection;
|
|||||||
using GlitchyEngine;
|
using GlitchyEngine;
|
||||||
using GlitchyEditor.Assets;
|
using GlitchyEditor.Assets;
|
||||||
using GlitchyEngine.Core;
|
using GlitchyEngine.Core;
|
||||||
|
using GlitchyEngine.World;
|
||||||
|
|
||||||
namespace GlitchyEditor.EditWindows;
|
namespace GlitchyEditor.EditWindows;
|
||||||
|
|
||||||
class PropertiesWindow : EditorWindow
|
class PropertiesWindow : ClosableWindow
|
||||||
{
|
{
|
||||||
public const String s_WindowTitle = "Properties";
|
private SelectedObject _selectedObject = .None;
|
||||||
|
|
||||||
private AssetPropertiesEditor _currentPropertiesEditor ~ delete _;
|
public this(Editor editor, SelectedObject selectedObject) : base(editor, "Properties")
|
||||||
|
|
||||||
private bool _lockCurrentAsset;
|
|
||||||
|
|
||||||
private bool _selectedNewAsset;
|
|
||||||
|
|
||||||
private append String _selectedFileName = .();
|
|
||||||
|
|
||||||
private AssetHandle _currentAssetHandle;
|
|
||||||
|
|
||||||
private SelectedObject _selectedObject;
|
|
||||||
|
|
||||||
public this(Editor editor)
|
|
||||||
{
|
{
|
||||||
_editor = editor;
|
_selectedObject = selectedObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void InternalShow()
|
protected override void InternalShow()
|
||||||
{
|
{
|
||||||
defer { ImGui.End(); }
|
InspectorWindow.ShowSelectedObject(_selectedObject, _editor);
|
||||||
if(!ImGui.Begin(s_WindowTitle, &_open, .None))
|
|
||||||
return;
|
|
||||||
|
|
||||||
// TODO: make a little button in title bar?
|
|
||||||
ImGui.Checkbox("Lock", &_lockCurrentAsset);
|
|
||||||
ImGui.Separator();
|
|
||||||
|
|
||||||
ShowAssetProperties();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Gets the AssetFile for the asset currently selected in the ContentBrowserWindow
|
|
||||||
/// @returns the AssetFile for the currently selected asset of null, if no file is selected.
|
|
||||||
private AssetFile GetCurrentAssetFile()
|
|
||||||
{
|
|
||||||
// Only grab the currently selected file if we aren't locked
|
|
||||||
if (!_lockCurrentAsset)
|
|
||||||
{
|
|
||||||
StringView selectedInFileBrowser = _editor.ContentBrowserWindow.SelectedFile;
|
|
||||||
|
|
||||||
if (_selectedFileName != selectedInFileBrowser)
|
|
||||||
{
|
|
||||||
_selectedFileName.Set(_editor.ContentBrowserWindow.SelectedFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Result<TreeNode<AssetNode>> treeNode = _editor.ContentManager.AssetHierarchy.GetNodeFromPath(_selectedFileName);
|
|
||||||
|
|
||||||
if (treeNode case .Ok(let assetNode))
|
|
||||||
return assetNode->AssetFile;
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ShowAssetProperties()
|
|
||||||
{
|
|
||||||
AssetFile assetFile = GetCurrentAssetFile();
|
|
||||||
|
|
||||||
if (assetFile == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (ImGui.BeginPropertyTable("asset_properties", ImGui.GetID("asset_properties")))
|
|
||||||
{
|
|
||||||
assetFile.AssetConfig?.ImporterConfig?.ShowEditor();
|
|
||||||
assetFile.AssetConfig?.ProcessorConfig?.ShowEditor();
|
|
||||||
assetFile.AssetConfig?.ExporterConfig?.ShowEditor();
|
|
||||||
|
|
||||||
ImGui.EndTable();
|
|
||||||
|
|
||||||
ImGui.Separator();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hasChanges = (assetFile.AssetConfig?.ImporterConfig?.Changed ?? false) || (assetFile.AssetConfig?.ProcessorConfig?.Changed ?? false) || (assetFile.AssetConfig?.ExporterConfig?.Changed ?? false);
|
|
||||||
|
|
||||||
if (!hasChanges)
|
|
||||||
ImGui.BeginDisabled();
|
|
||||||
|
|
||||||
if (ImGui.Button("Apply"))
|
|
||||||
{
|
|
||||||
assetFile.SaveAssetConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hasChanges)
|
|
||||||
ImGui.EndDisabled();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ namespace GlitchyEditor
|
|||||||
private AssetViewer _assetViewer ~ delete _;
|
private AssetViewer _assetViewer ~ delete _;
|
||||||
private LogWindow _logWindow ~ delete _;
|
private LogWindow _logWindow ~ delete _;
|
||||||
|
|
||||||
|
private List<ClosableWindow> _windows = new .() ~ DeleteContainerAndItems!(_);
|
||||||
|
|
||||||
public Scene CurrentScene
|
public Scene CurrentScene
|
||||||
{
|
{
|
||||||
get => _scene;
|
get => _scene;
|
||||||
@@ -94,7 +96,7 @@ namespace GlitchyEditor
|
|||||||
_gameViewportWindow = new GameViewportWindow(this);
|
_gameViewportWindow = new GameViewportWindow(this);
|
||||||
_entityHierarchyWindow = new EntityHierarchyWindow(this, _scene);
|
_entityHierarchyWindow = new EntityHierarchyWindow(this, _scene);
|
||||||
_componentEditWindow = new ComponentEditWindow();
|
_componentEditWindow = new ComponentEditWindow();
|
||||||
_contentBrowserWindow = new ContentBrowserWindow((.)Application.Get().ContentManager, _thumbnailManager);
|
_contentBrowserWindow = new ContentBrowserWindow(this, (.)Application.Instance.ContentManager, _thumbnailManager);
|
||||||
_inspectorWindow = new InspectorWindow(this);
|
_inspectorWindow = new InspectorWindow(this);
|
||||||
_assetViewer = new AssetViewer((.)Application.Get().ContentManager);
|
_assetViewer = new AssetViewer((.)Application.Get().ContentManager);
|
||||||
_logWindow = new LogWindow();
|
_logWindow = new LogWindow();
|
||||||
@@ -110,6 +112,20 @@ namespace GlitchyEditor
|
|||||||
_inspectorWindow.Show();
|
_inspectorWindow.Show();
|
||||||
_assetViewer.Show();
|
_assetViewer.Show();
|
||||||
_logWindow.Show();
|
_logWindow.Show();
|
||||||
|
|
||||||
|
for (ClosableWindow window in _windows)
|
||||||
|
window.Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddWindow(ClosableWindow ownClosableWindow)
|
||||||
|
{
|
||||||
|
_windows.Add(ownClosableWindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveWindow(ClosableWindow closableWindow)
|
||||||
|
{
|
||||||
|
_windows.Remove(closableWindow);
|
||||||
|
delete closableWindow;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user