feat(ui): modernize editor shell workspace layout

This commit is contained in:
西风逍遥游 committed 2026-08-25 06:12:16 +08:00
1 parent 56d8dc6873
commit 4bc6cc1ba6
11 files changed
+176 -89

No files matched your search

+93 -59
View File
@@ -13,38 +13,43 @@ EditorShell::~EditorShell() {
if (host_) host_->setTree(window("", {}));
}
void EditorShell::open(UIHost *inspector, UIHost *database, UIHost *scene) {
void EditorShell::open(UIHost* inspector, UIHost* database, UIHost* scene) {
inspector_ = inspector;
database_ = database;
scene_ = scene;
database_ = database;
scene_ = scene;
if (!host_) {
host_ = UIHost::createHost(kShellHostName);
}
auto meta = host_->meta();
meta->overlay = true; // no title bar
meta->hasPos = true;
meta->posX = 0.f;
meta->posY = 0.f;
meta->hasSize = true;
meta->sizeX = 0.f; // width = full display (percentW below)
meta->sizeY = 34.f;
meta->percentW = 1.f;
meta->visible = true;
auto meta = host_->meta();
meta->overlay = true; // no title bar
meta->hasPos = true;
meta->lockPos = true;
meta->posX = 0.f;
meta->posY = 0.f;
meta->hasSize = true;
meta->sizeX = 0.f; // width = full display (percentW below)
meta->sizeY = toolbarHeight_;
meta->lockSize = true;
meta->percentW = 1.f;
meta->visible = true;
meta->overlayBgAlpha = 1.f;
host_->setTree(build());
relayout();
if (inspector_) inspector_->setVisible(true);
if (database_) database_->setVisible(true);
if (scene_) scene_->setVisible(true);
}
void EditorShell::close() {
if (host_) host_->setVisible(false);
if (inspector_) inspector_->setVisible(false);
if (database_) database_->setVisible(false);
if (scene_) scene_->setVisible(false);
}
bool EditorShell::isOpen() const {
return host_ && host_->meta()->visible;
}
bool EditorShell::isOpen() const { return host_ && host_->meta()->visible; }
bool EditorShell::selectPanel(const std::string &name) {
bool EditorShell::selectPanel(const std::string& name) {
if (!host_ || !host_->meta()->visible) return false;
if (name == "inspector") {
if (inspector_) inspector_->setVisible(true);
@@ -73,57 +78,86 @@ bool EditorShell::selectPanel(const std::string &name) {
return false;
}
bool EditorShell::togglePanel(const std::string& name) {
if (!host_ || !host_->meta()->visible) return false;
UIHost* panel = nullptr;
if (name == "inspector") panel = inspector_;
if (name == "database") panel = database_;
if (name == "scene") panel = scene_;
if (!panel) return false;
panel->setVisible(!panel->meta()->visible);
return true;
}
WidgetDesc EditorShell::build() {
std::vector<WidgetDesc> menu;
menu.push_back(text("DevTools", "lbl_title"));
menu.push_back(spacer("menu_spacer"));
menu.push_back(button("Inspector##menu", "menu_inspector",
[this]() { selectPanel("inspector"); }));
menu.push_back(button("Database##menu", "menu_database",
[this]() { selectPanel("database"); }));
menu.push_back(button("Scene##menu", "menu_scene",
[this]() { selectPanel("scene"); }));
menu.push_back(button("Close##menu", "menu_close",
[this]() { selectPanel(""); }));
return window("Editor", {row(std::move(menu), "menubar")}, "root");
std::vector<WidgetDesc> commands;
commands.push_back(icon(Icon::Cubes, "brand_icon"));
commands.push_back(text("EVEngine Editor", "lbl_title"));
commands.push_back(badge("Workspace", "workspace_badge"));
commands.push_back(spacer("menu_spacer"));
commands.push_back(iconButton(Icon::Sliders, "Inspector", "menu_inspector", [this]() {
togglePanel("inspector");
}).withTooltip("Show or hide the Inspector"));
commands.push_back(iconButton(Icon::Database, "Database", "menu_database", [this]() {
togglePanel("database");
}).withTooltip("Show or hide the object database"));
commands.push_back(iconButton(Icon::Layers, "Scene", "menu_scene", [this]() {
togglePanel("scene");
}).withTooltip("Show or hide the scene hierarchy"));
commands.push_back(iconButton(Icon::EyeSlash, "Hide panels", "menu_close", [this]() {
selectPanel("");
}).withTooltip("Hide all editor panels"));
return window("Editor", {toolbar(std::move(commands), "editor_toolbar")}, "root");
}
void EditorShell::relayout() {
// Simple dock (MVP): inspector / database / scene left-to-right, below the
// menu bar. Panels use fixed pixel sizes so they never overlap on the
// default window; a full flex dock layout can replace this later.
// Seed a responsive three-column workspace once. lockPos/lockSize are
// disabled so subsequent user adjustments are stored/restored by ImGui's
// standard ini workspace persistence.
if (inspector_) {
auto meta = inspector_->meta();
meta->hasPos = true;
meta->posX = 0.f;
meta->posY = 34.f;
meta->hasSize = true;
meta->sizeX = 280.f;
meta->sizeY = 600.f;
meta->percentW = 0.f;
meta->percentH = 0.f;
auto meta = inspector_->meta();
meta->hasPos = true;
meta->posX = 0.f;
meta->posY = toolbarHeight_;
meta->anchorX = 0.f;
meta->anchorY = 0.f;
meta->lockPos = false;
meta->hasSize = true;
meta->sizeX = 0.f;
meta->sizeY = 0.f;
meta->percentW = 0.3f;
meta->percentH = 0.9f;
meta->lockSize = false;
}
if (database_) {
auto meta = database_->meta();
meta->hasPos = true;
meta->posX = 280.f;
meta->posY = 34.f;
meta->hasSize = true;
meta->sizeX = 280.f;
meta->sizeY = 600.f;
meta->percentW = 0.f;
meta->percentH = 0.f;
auto meta = database_->meta();
meta->hasPos = true;
meta->posX = 0.f;
meta->posY = toolbarHeight_;
meta->anchorX = 0.3f;
meta->anchorY = 0.f;
meta->lockPos = false;
meta->hasSize = true;
meta->sizeX = 0.f;
meta->sizeY = 0.f;
meta->percentW = 0.35f;
meta->percentH = 0.9f;
meta->lockSize = false;
}
if (scene_) {
auto meta = scene_->meta();
meta->hasPos = true;
meta->posX = 560.f;
meta->posY = 34.f;
meta->hasSize = true;
meta->sizeX = 280.f;
meta->sizeY = 600.f;
meta->percentW = 0.f;
meta->percentH = 0.f;
auto meta = scene_->meta();
meta->hasPos = true;
meta->posX = 0.f;
meta->posY = toolbarHeight_;
meta->anchorX = 0.65f;
meta->anchorY = 0.f;
meta->lockPos = false;
meta->hasSize = true;
meta->sizeX = 0.f;
meta->sizeY = 0.f;
meta->percentW = 0.35f;
meta->percentH = 0.9f;
meta->lockSize = false;
}
}