Contain XCUI ImGui adapters behind explicit host seams
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include "Application.h"
|
||||
#include "XCUIBackend/ImGuiXCUIPanelCanvasHost.h"
|
||||
#include "XCUIBackend/ImGuiXCUIHostedPreviewPresenter.h"
|
||||
#include "XCUIBackend/ImGuiWindowUICompositor.h"
|
||||
|
||||
@@ -41,12 +42,12 @@ const char* GetHostedPreviewPathLabel(bool nativeRequested, bool nativePresenter
|
||||
return "native queued offscreen surface";
|
||||
}
|
||||
if (nativeRequested) {
|
||||
return "native requested, legacy presenter bound";
|
||||
return "native requested, hosted presenter bound";
|
||||
}
|
||||
if (nativePresenterBound) {
|
||||
return "legacy requested, native presenter still bound";
|
||||
return "hosted presenter requested, native presenter still bound";
|
||||
}
|
||||
return "legacy imgui transition";
|
||||
return "hosted presenter";
|
||||
}
|
||||
|
||||
const char* GetHostedPreviewStateLabel(
|
||||
@@ -90,70 +91,20 @@ Application::CreateHostedPreviewPresenter(bool nativePreview) {
|
||||
return ::XCEngine::Editor::XCUIBackend::CreateImGuiXCUIHostedPreviewPresenter();
|
||||
}
|
||||
|
||||
Application::ShellPanelChromeState* Application::TryGetShellPanelState(ShellPanelId panelId) {
|
||||
const std::size_t index = GetShellPanelIndex(panelId);
|
||||
if (index >= m_shellPanels.size()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return &m_shellPanels[index];
|
||||
}
|
||||
|
||||
const Application::ShellPanelChromeState* Application::TryGetShellPanelState(ShellPanelId panelId) const {
|
||||
const std::size_t index = GetShellPanelIndex(panelId);
|
||||
if (index >= m_shellPanels.size()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return &m_shellPanels[index];
|
||||
return m_shellChromeState.TryGetPanelState(panelId);
|
||||
}
|
||||
|
||||
bool Application::IsShellViewToggleEnabled(ShellViewToggleId toggleId) const {
|
||||
switch (toggleId) {
|
||||
case ShellViewToggleId::ImGuiDemoWindow:
|
||||
return m_shellViewToggles.imguiDemoWindowVisible;
|
||||
case ShellViewToggleId::NativeBackdrop:
|
||||
return m_shellViewToggles.nativeBackdropVisible;
|
||||
case ShellViewToggleId::PulseAccent:
|
||||
return m_shellViewToggles.pulseAccentEnabled;
|
||||
case ShellViewToggleId::NativeXCUIOverlay:
|
||||
return m_shellViewToggles.nativeXCUIOverlayVisible;
|
||||
case ShellViewToggleId::HostedPreviewHud:
|
||||
return m_shellViewToggles.hostedPreviewHudVisible;
|
||||
case ShellViewToggleId::Count:
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return m_shellChromeState.GetViewToggle(toggleId);
|
||||
}
|
||||
|
||||
void Application::SetShellViewToggleEnabled(ShellViewToggleId toggleId, bool enabled) {
|
||||
switch (toggleId) {
|
||||
case ShellViewToggleId::ImGuiDemoWindow:
|
||||
m_shellViewToggles.imguiDemoWindowVisible = enabled;
|
||||
return;
|
||||
case ShellViewToggleId::NativeBackdrop:
|
||||
m_shellViewToggles.nativeBackdropVisible = enabled;
|
||||
return;
|
||||
case ShellViewToggleId::PulseAccent:
|
||||
m_shellViewToggles.pulseAccentEnabled = enabled;
|
||||
return;
|
||||
case ShellViewToggleId::NativeXCUIOverlay:
|
||||
m_shellViewToggles.nativeXCUIOverlayVisible = enabled;
|
||||
return;
|
||||
case ShellViewToggleId::HostedPreviewHud:
|
||||
m_shellViewToggles.hostedPreviewHudVisible = enabled;
|
||||
return;
|
||||
case ShellViewToggleId::Count:
|
||||
default:
|
||||
return;
|
||||
}
|
||||
m_shellChromeState.SetViewToggle(toggleId, enabled);
|
||||
}
|
||||
|
||||
bool Application::IsNativeHostedPreviewEnabled(ShellPanelId panelId) const {
|
||||
const ShellPanelChromeState* panelState = TryGetShellPanelState(panelId);
|
||||
return panelState != nullptr &&
|
||||
panelState->hostedPreviewEnabled &&
|
||||
panelState->previewMode == ShellHostedPreviewMode::NativeOffscreen;
|
||||
return m_shellChromeState.IsNativeHostedPreviewActive(panelId);
|
||||
}
|
||||
|
||||
void Application::ConfigureHostedPreviewPresenters() {
|
||||
@@ -178,25 +129,19 @@ void Application::ConfigureShellCommandRouter() {
|
||||
|
||||
ShellCommandBindings bindings = {};
|
||||
bindings.getXCUIDemoPanelVisible = [this]() {
|
||||
const ShellPanelChromeState* panelState = TryGetShellPanelState(ShellPanelId::XCUIDemo);
|
||||
return panelState != nullptr && panelState->visible;
|
||||
return m_shellChromeState.IsPanelVisible(ShellPanelId::XCUIDemo);
|
||||
};
|
||||
bindings.setXCUIDemoPanelVisible = [this](bool visible) {
|
||||
if (ShellPanelChromeState* panelState = TryGetShellPanelState(ShellPanelId::XCUIDemo)) {
|
||||
panelState->visible = visible;
|
||||
}
|
||||
m_shellChromeState.SetPanelVisible(ShellPanelId::XCUIDemo, visible);
|
||||
if (m_demoPanel != nullptr) {
|
||||
m_demoPanel->SetVisible(visible);
|
||||
}
|
||||
};
|
||||
bindings.getXCUILayoutLabPanelVisible = [this]() {
|
||||
const ShellPanelChromeState* panelState = TryGetShellPanelState(ShellPanelId::XCUILayoutLab);
|
||||
return panelState != nullptr && panelState->visible;
|
||||
return m_shellChromeState.IsPanelVisible(ShellPanelId::XCUILayoutLab);
|
||||
};
|
||||
bindings.setXCUILayoutLabPanelVisible = [this](bool visible) {
|
||||
if (ShellPanelChromeState* panelState = TryGetShellPanelState(ShellPanelId::XCUILayoutLab)) {
|
||||
panelState->visible = visible;
|
||||
}
|
||||
m_shellChromeState.SetPanelVisible(ShellPanelId::XCUILayoutLab, visible);
|
||||
if (m_layoutLabPanel != nullptr) {
|
||||
m_layoutLabPanel->SetVisible(visible);
|
||||
}
|
||||
@@ -235,23 +180,17 @@ void Application::ConfigureShellCommandRouter() {
|
||||
return IsNativeHostedPreviewEnabled(ShellPanelId::XCUIDemo);
|
||||
};
|
||||
bindings.setNativeDemoPanelPreviewEnabled = [this](bool enabled) {
|
||||
if (ShellPanelChromeState* panelState = TryGetShellPanelState(ShellPanelId::XCUIDemo)) {
|
||||
panelState->previewMode =
|
||||
enabled
|
||||
? ShellHostedPreviewMode::NativeOffscreen
|
||||
: ShellHostedPreviewMode::LegacyImGui;
|
||||
}
|
||||
m_shellChromeState.SetHostedPreviewMode(
|
||||
ShellPanelId::XCUIDemo,
|
||||
enabled ? ShellHostedPreviewMode::NativeOffscreen : ShellHostedPreviewMode::HostedPresenter);
|
||||
};
|
||||
bindings.getNativeLayoutLabPreviewEnabled = [this]() {
|
||||
return IsNativeHostedPreviewEnabled(ShellPanelId::XCUILayoutLab);
|
||||
};
|
||||
bindings.setNativeLayoutLabPreviewEnabled = [this](bool enabled) {
|
||||
if (ShellPanelChromeState* panelState = TryGetShellPanelState(ShellPanelId::XCUILayoutLab)) {
|
||||
panelState->previewMode =
|
||||
enabled
|
||||
? ShellHostedPreviewMode::NativeOffscreen
|
||||
: ShellHostedPreviewMode::LegacyImGui;
|
||||
}
|
||||
m_shellChromeState.SetHostedPreviewMode(
|
||||
ShellPanelId::XCUILayoutLab,
|
||||
enabled ? ShellHostedPreviewMode::NativeOffscreen : ShellHostedPreviewMode::HostedPresenter);
|
||||
};
|
||||
bindings.onHostedPreviewModeChanged = [this]() { ConfigureHostedPreviewPresenters(); };
|
||||
|
||||
@@ -356,10 +295,12 @@ int Application::Run(HINSTANCE instance, int nCmdShow) {
|
||||
InitializeWindowCompositor();
|
||||
m_demoPanel = std::make_unique<XCUIDemoPanel>(
|
||||
&m_xcuiInputSource,
|
||||
CreateHostedPreviewPresenter(IsNativeHostedPreviewEnabled(ShellPanelId::XCUIDemo)));
|
||||
CreateHostedPreviewPresenter(IsNativeHostedPreviewEnabled(ShellPanelId::XCUIDemo)),
|
||||
::XCEngine::Editor::XCUIBackend::CreateImGuiXCUIPanelCanvasHost());
|
||||
m_layoutLabPanel = std::make_unique<XCUILayoutLabPanel>(
|
||||
&m_xcuiInputSource,
|
||||
CreateHostedPreviewPresenter(IsNativeHostedPreviewEnabled(ShellPanelId::XCUILayoutLab)));
|
||||
CreateHostedPreviewPresenter(IsNativeHostedPreviewEnabled(ShellPanelId::XCUILayoutLab)),
|
||||
::XCEngine::Editor::XCUIBackend::CreateImGuiXCUIPanelCanvasHost());
|
||||
ConfigureHostedPreviewPresenters();
|
||||
m_shellInputBridge.Reset();
|
||||
ConfigureShellCommandRouter();
|
||||
@@ -531,13 +472,12 @@ void Application::DestroyHostedPreviewSurfaces() {
|
||||
}
|
||||
|
||||
void Application::SyncShellChromePanelStateFromPanels() {
|
||||
if (ShellPanelChromeState* demoState = TryGetShellPanelState(ShellPanelId::XCUIDemo)) {
|
||||
demoState->visible = m_demoPanel != nullptr && m_demoPanel->IsVisible();
|
||||
}
|
||||
|
||||
if (ShellPanelChromeState* layoutLabState = TryGetShellPanelState(ShellPanelId::XCUILayoutLab)) {
|
||||
layoutLabState->visible = m_layoutLabPanel != nullptr && m_layoutLabPanel->IsVisible();
|
||||
}
|
||||
m_shellChromeState.SetPanelVisible(
|
||||
ShellPanelId::XCUIDemo,
|
||||
m_demoPanel != nullptr && m_demoPanel->IsVisible());
|
||||
m_shellChromeState.SetPanelVisible(
|
||||
ShellPanelId::XCUILayoutLab,
|
||||
m_layoutLabPanel != nullptr && m_layoutLabPanel->IsVisible());
|
||||
}
|
||||
|
||||
void Application::SyncHostedPreviewSurfaces() {
|
||||
@@ -864,14 +804,14 @@ void Application::RenderShellChrome() {
|
||||
"XCUI Demo preview: %s",
|
||||
IsNativeHostedPreviewEnabled(ShellPanelId::XCUIDemo)
|
||||
? "native offscreen preview surface"
|
||||
: "ImGui hosted preview");
|
||||
: "hosted presenter");
|
||||
}
|
||||
if (m_layoutLabPanel != nullptr) {
|
||||
ImGui::TextDisabled(
|
||||
"Layout Lab preview: %s",
|
||||
IsNativeHostedPreviewEnabled(ShellPanelId::XCUILayoutLab)
|
||||
? "native offscreen preview surface"
|
||||
: "ImGui hosted preview");
|
||||
: "hosted presenter");
|
||||
}
|
||||
ImGui::EndMenuBar();
|
||||
}
|
||||
@@ -1102,8 +1042,10 @@ void Application::Frame() {
|
||||
if (m_layoutLabPanel) {
|
||||
m_layoutLabPanel->RenderIfVisible();
|
||||
}
|
||||
if (m_shellViewToggles.imguiDemoWindowVisible) {
|
||||
ImGui::ShowDemoWindow(&m_shellViewToggles.imguiDemoWindowVisible);
|
||||
bool showImGuiDemoWindow = IsShellViewToggleEnabled(ShellViewToggleId::ImGuiDemoWindow);
|
||||
if (showImGuiDemoWindow) {
|
||||
ImGui::ShowDemoWindow(&showImGuiDemoWindow);
|
||||
SetShellViewToggleEnabled(ShellViewToggleId::ImGuiDemoWindow, showImGuiDemoWindow);
|
||||
}
|
||||
|
||||
SyncShellChromePanelStateFromPanels();
|
||||
|
||||
Reference in New Issue
Block a user