Refactor editor UI architecture

This commit is contained in:
2026-03-26 21:18:33 +08:00
parent 8f486611d5
commit 6467d87b81
60 changed files with 2994 additions and 1403 deletions

View File

@@ -2,6 +2,8 @@
#include "Layers/EditorLayer.h"
#include "Core/EditorContext.h"
#include "Core/EditorConsoleSink.h"
#include "Core/EditorEvents.h"
#include "Core/EventBus.h"
#include <XCEngine/Debug/Logger.h>
#include <XCEngine/Debug/FileLogSink.h>
#include <XCEngine/Debug/ConsoleLogSink.h>
@@ -64,6 +66,10 @@ std::string GetExecutableLogPath(const char* fileName) {
return GetExecutableDirectoryUtf8() + "\\" + fileName;
}
std::string BuildEditorConfigDirectory(const std::string& projectPath) {
return (std::filesystem::path(projectPath) / ".xceditor").string();
}
} // namespace
static LONG WINAPI GlobalExceptionFilter(EXCEPTION_POINTERS* exceptionPointers) {
@@ -128,28 +134,21 @@ bool Application::Initialize(HWND hwnd) {
return false;
}
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
io.Fonts->AddFontFromFileTTF("C:/Windows/Fonts/msyh.ttc", 16.0f);
io.Fonts->AddFontDefault();
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
ApplyUnityDarkTheme();
m_editorContext = std::make_shared<EditorContext>();
m_editorContext->SetProjectPath(exeDir);
m_exitRequestedHandlerId = m_editorContext->GetEventBus().Subscribe<EditorExitRequestedEvent>(
[this](const EditorExitRequestedEvent&) {
if (m_hwnd) {
PostMessageW(m_hwnd, WM_CLOSE, 0, 0);
}
});
ConfigureImGui(m_editorContext->GetProjectPath());
ImGui_ImplWin32_Init(hwnd);
ImGui_ImplDX12_Init(m_device, 3, DXGI_FORMAT_R8G8B8A8_UNORM, m_srvHeap,
m_srvHeap->GetCPUDescriptorHandleForHeapStart(),
m_srvHeap->GetGPUDescriptorHandleForHeapStart());
m_editorContext = std::make_shared<EditorContext>();
m_editorContext->SetProjectPath(exeDir);
m_editorLayer = new EditorLayer();
m_editorLayer->SetContext(m_editorContext);
m_layerStack.pushLayer(std::unique_ptr<Core::Layer>(m_editorLayer));
@@ -160,6 +159,12 @@ bool Application::Initialize(HWND hwnd) {
void Application::Shutdown() {
m_layerStack.onDetach();
SaveImGuiSettings();
if (m_editorContext && m_exitRequestedHandlerId) {
m_editorContext->GetEventBus().Unsubscribe<EditorExitRequestedEvent>(m_exitRequestedHandlerId);
m_exitRequestedHandlerId = 0;
}
ImGui_ImplDX12_Shutdown();
ImGui_ImplWin32_Shutdown();
@@ -200,7 +205,7 @@ void Application::Render() {
barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
m_commandList->ResourceBarrier(1, &barrier);
float clearColor[4] = { 0.12f, 0.12f, 0.12f, 1.0f };
float clearColor[4] = { 0.22f, 0.22f, 0.22f, 1.0f };
D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle = m_rtvHeap->GetCPUDescriptorHandleForHeapStart();
rtvHandle.ptr += m_frameIndex * m_rtvDescriptorSize;
m_commandList->ClearRenderTargetView(rtvHandle, clearColor, 0, nullptr);
@@ -228,6 +233,45 @@ void Application::Render() {
}
}
void Application::ConfigureImGui(const std::string& projectPath) {
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
ConfigureImGuiIniFile(projectPath, io);
if (ImFont* uiFont = io.Fonts->AddFontFromFileTTF("C:/Windows/Fonts/msyh.ttc", 15.0f)) {
io.FontDefault = uiFont;
} else {
io.FontDefault = io.Fonts->AddFontDefault();
}
unsigned char* pixels = nullptr;
int width = 0;
int height = 0;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
ApplyUnityDarkTheme();
}
void Application::ConfigureImGuiIniFile(const std::string& projectPath, ImGuiIO& io) {
const std::filesystem::path configDir = BuildEditorConfigDirectory(projectPath);
std::error_code ec;
std::filesystem::create_directories(configDir, ec);
m_imguiIniPath = (configDir / "imgui_layout.ini").string();
io.IniFilename = m_imguiIniPath.c_str();
}
void Application::SaveImGuiSettings() {
if (m_imguiIniPath.empty() || ImGui::GetCurrentContext() == nullptr) {
return;
}
ImGui::SaveIniSettingsToDisk(m_imguiIniPath.c_str());
}
void Application::UpdateWindowTitle() {
if (!m_hwnd || !m_editorContext) {
return;
@@ -249,7 +293,7 @@ void Application::UpdateWindowTitle() {
sceneName += std::filesystem::path(sceneManager.GetCurrentScenePath()).filename().string();
}
const std::wstring title = Utf8ToWide(sceneName + " - XCVolumeRenderer - Unity Style Editor");
const std::wstring title = Utf8ToWide(sceneName + " - XCEngine Editor");
if (title != m_lastWindowTitle) {
SetWindowTextW(m_hwnd, title.c_str());
m_lastWindowTitle = title;