Lay out the overlay panels in a fixed 3-column scheme

Panels used to Begin at cascade positions, so they overlapped and clipped. A new
apply_panel_layout() in app_chrome positions/sizes each panel from the main
viewport work area (ImGuiCond_FirstUseEver, still movable): Injection left column
full height (room for hook diagnostics), Controllers/Video/Audio stacked in the
center column, Log right edge full height (max room for the log stream). Added a
"View -> Reset layout" menu item (request_layout_reset / apply_layout_end_frame
re-apply the defaults once via ImGuiCond_Always). Each panel now calls
apply_panel_layout(Panel::X) instead of its own ad-hoc SetNextWindowPos/Size.

Verified live: captured the host overlay -- Injection (left, full height),
Controllers/Video/Audio (center stack), Log (right, full height), no overlap among
the panels. x64 build + ctest green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-21 01:19:45 +02:00
parent 80cc5e72bd
commit 37d0f64e23
9 changed files with 105 additions and 21 deletions

View File

@@ -4,6 +4,7 @@
#include "imgui.h"
#include "injection_panel.hpp"
#include "ui/app_chrome.hpp"
namespace coop
{
@@ -23,8 +24,7 @@ bool CapturePanel::init(ID3D11Device* device)
void CapturePanel::draw_ui(const FrameStats& stats)
{
ImGui::SetNextWindowPos(ImVec2(460, 40), ImGuiCond_FirstUseEver);
ImGui::SetNextWindowSize(ImVec2(360, 0), ImGuiCond_FirstUseEver);
apply_panel_layout(Panel::Video);
ImGui::Begin("Video mirror");
const unsigned long hook_pid = injection_ != nullptr ? injection_->target_pid() : 0;