重构UI架构:分离数据模型和显示逻辑

- 新增 Core 模块:GameObject、LogEntry、AssetItem 数据模型
- 新增 Managers 模块:SceneManager、LogSystem、ProjectManager
- Panel 层只负责显示,不再持有数据
- 解耦 HierarchyPanel 和 InspectorPanel 之间的直接依赖
This commit is contained in:
2026-03-12 16:13:34 +08:00
parent 7d3e3b464d
commit a2f3db8718
19 changed files with 306 additions and 137 deletions

View File

@@ -0,0 +1,19 @@
#include "LogSystem.h"
namespace UI {
LogSystem& LogSystem::Get() {
static LogSystem instance;
return instance;
}
void LogSystem::AddLog(LogEntry::Level level, const std::string& message) {
m_logs.push_back({level, message});
if (m_callback) m_callback();
}
void LogSystem::Clear() {
m_logs.clear();
}
}

View File

@@ -0,0 +1,26 @@
#pragma once
#include "Core/LogEntry.h"
#include <vector>
#include <functional>
namespace UI {
class LogSystem {
public:
static LogSystem& Get();
void AddLog(LogEntry::Level level, const std::string& message);
void Clear();
const std::vector<LogEntry>& GetLogs() const { return m_logs; }
void SetCallback(std::function<void()> callback) { m_callback = callback; }
private:
LogSystem() = default;
std::vector<LogEntry> m_logs;
std::function<void()> m_callback;
};
}

View File

@@ -0,0 +1,23 @@
#include "ProjectManager.h"
namespace UI {
ProjectManager& ProjectManager::Get() {
static ProjectManager instance;
return instance;
}
void ProjectManager::CreateDemoAssets() {
m_items = {
{"Cube", "Prefab", false},
{"Sphere", "Prefab", false},
{"Player", "Prefab", false},
{"MainScript", "Script", false},
{"DefaultMat", "Material", false},
{"Scene1", "Scene", false},
{"Textures", "Folder", true},
{"Models", "Folder", true},
};
}
}

View File

@@ -0,0 +1,26 @@
#pragma once
#include "Core/AssetItem.h"
#include <vector>
#include <string>
namespace UI {
class ProjectManager {
public:
static ProjectManager& Get();
std::vector<AssetItem>& GetItems() { return m_items; }
int GetSelectedIndex() const { return m_selectedIndex; }
void SetSelectedIndex(int index) { m_selectedIndex = index; }
void CreateDemoAssets();
private:
ProjectManager() = default;
std::vector<AssetItem> m_items;
int m_selectedIndex = -1;
};
}

View File

@@ -0,0 +1,47 @@
#include "SceneManager.h"
namespace UI {
SceneManager& SceneManager::Get() {
static SceneManager instance;
return instance;
}
void SceneManager::SetSelectedObject(GameObject* obj) {
if (m_selectedObject) {
m_selectedObject->selected = false;
}
m_selectedObject = obj;
if (m_selectedObject) {
m_selectedObject->selected = true;
}
}
void SceneManager::CreateDemoScene() {
m_rootObjects.clear();
GameObject mainCamera("Main Camera");
mainCamera.AddComponent<TransformComponent>();
GameObject directionalLight("Directional Light");
GameObject cube("Cube");
cube.AddComponent<TransformComponent>();
cube.AddComponent<MeshRendererComponent>()->meshName = "Cube Mesh";
GameObject sphere("Sphere");
sphere.AddComponent<TransformComponent>();
sphere.AddComponent<MeshRendererComponent>()->meshName = "Sphere Mesh";
GameObject player("Player");
GameObject weapon("Weapon");
player.children.push_back(std::move(weapon));
m_rootObjects.push_back(std::move(mainCamera));
m_rootObjects.push_back(std::move(directionalLight));
m_rootObjects.push_back(std::move(cube));
m_rootObjects.push_back(std::move(sphere));
m_rootObjects.push_back(std::move(player));
}
}

View File

@@ -0,0 +1,25 @@
#pragma once
#include "Core/GameObject.h"
#include <vector>
namespace UI {
class SceneManager {
public:
static SceneManager& Get();
std::vector<GameObject>& GetRootObjects() { return m_rootObjects; }
GameObject* GetSelectedObject() { return m_selectedObject; }
void SetSelectedObject(GameObject* obj);
void CreateDemoScene();
private:
SceneManager() = default;
std::vector<GameObject> m_rootObjects;
GameObject* m_selectedObject = nullptr;
};
}