Files
XCEngine/editor/src/Workspace/UIEditorDetachedWindowPolicy.cpp
2026-04-25 16:46:01 +08:00

83 lines
2.8 KiB
C++

#include <XCEditor/Workspace/UIEditorDetachedWindowPolicy.h>
namespace XCEngine::UI::Editor {
namespace {
bool IsRootPanelVisible(
const UIEditorWorkspaceController& controller,
std::string_view panelId) {
const UIEditorPanelSessionState* panelState =
FindUIEditorPanelSessionState(controller.GetSession(), panelId);
return panelState != nullptr && panelState->open && panelState->visible;
}
} // namespace
const UIEditorPanelDescriptor* ResolveUIEditorSingleVisibleRootPanelDescriptor(
const UIEditorWorkspaceController& controller) {
const UIEditorWorkspaceNode& root = controller.GetWorkspace().root;
if (root.kind != UIEditorWorkspaceNodeKind::TabStack) {
return nullptr;
}
const UIEditorPanelRegistry& panelRegistry = controller.GetPanelRegistry();
const UIEditorPanelDescriptor* visibleDescriptor = nullptr;
std::size_t visibleCount = 0u;
for (const UIEditorWorkspaceNode& child : root.children) {
if (child.kind != UIEditorWorkspaceNodeKind::Panel ||
!IsRootPanelVisible(controller, child.panel.panelId)) {
continue;
}
const UIEditorPanelDescriptor* descriptor =
FindUIEditorPanelDescriptor(panelRegistry, child.panel.panelId);
if (descriptor == nullptr) {
return nullptr;
}
++visibleCount;
visibleDescriptor = descriptor;
if (visibleCount > 1u) {
return nullptr;
}
}
return visibleCount == 1u ? visibleDescriptor : nullptr;
}
bool HasUIEditorSingleVisibleRootTab(
const UIEditorWorkspaceController& controller) {
return ResolveUIEditorSingleVisibleRootPanelDescriptor(controller) != nullptr;
}
std::string ResolveUIEditorDetachedWorkspaceTitle(
const UIEditorWorkspaceController& controller,
std::string_view fallbackTitle) {
const std::string& activePanelId = controller.GetWorkspace().activePanelId;
if (const UIEditorPanelDescriptor* descriptor =
FindUIEditorPanelDescriptor(controller.GetPanelRegistry(), activePanelId);
descriptor != nullptr &&
!descriptor->defaultTitle.empty()) {
return descriptor->defaultTitle;
}
return std::string(fallbackTitle);
}
::XCEngine::UI::UISize ResolveUIEditorDetachedWorkspaceMinimumOuterSize(
const UIEditorWorkspaceController& controller,
const ::XCEngine::UI::UISize& fallbackSize) {
if (const UIEditorPanelDescriptor* descriptor =
ResolveUIEditorSingleVisibleRootPanelDescriptor(controller);
descriptor != nullptr &&
descriptor->minimumDetachedWindowSize.width > 0.0f &&
descriptor->minimumDetachedWindowSize.height > 0.0f) {
return descriptor->minimumDetachedWindowSize;
}
return fallbackSize;
}
} // namespace XCEngine::UI::Editor