61 ImVec4(0.15f, 0.15f, 0.17f, 0.5f));
64 const float button_size = 28.0f;
65 const float padding = 4.0f;
66 const int num_buttons = 2;
67 const float item_spacing = ImGui::GetStyle().ItemSpacing.x;
69 float total_width = (num_buttons * button_size) +
70 ((num_buttons - 1) * item_spacing) + (padding * 2);
72 ImGui::BeginChild(
"##ModeGroup", ImVec2(total_width, button_size + padding),
73 ImGuiChildFlags_AlwaysUseWindowPadding,
74 ImGuiWindowFlags_NoScrollbar);
273 if (p_open && !*p_open) {
279 int current_frame = ImGui::GetFrameCount();
295 "[PanelWindow] DUPLICATE DETECTED: '%s' Begin() called twice in "
311 ImGuiWindowFlags flags = ImGuiWindowFlags_None;
315 flags |= ImGuiWindowFlags_NoTitleBar;
316 flags |= ImGuiWindowFlags_NoCollapse;
321 flags |= ImGuiWindowFlags_NoDocking;
326 flags |= ImGuiWindowFlags_NoSavedSettings;
331 float display_width = ImGui::GetIO().DisplaySize.x;
332 float display_height = ImGui::GetIO().DisplaySize.y;
338 ImVec2 work_size = ImGui::GetMainViewport()
339 ? ImGui::GetMainViewport()->WorkSize
340 : ImVec2(display_width, display_height);
341 ImVec2 min_size(work_size.x * 0.65f, work_size.y * 0.55f);
342 ImVec2 max_size(work_size.x * 0.96f, work_size.y * 0.92f);
346 : ImVec2(work_size.x * 0.9f, work_size.y * 0.82f);
347 initial_size.x = std::clamp(desired.x, min_size.x, max_size.x);
348 initial_size.y = std::clamp(desired.y, min_size.y, max_size.y);
351 const size_t hash = std::hash<std::string>{}(
window_name_);
352 const float step = 18.0f;
353 start_offset.x += step *
static_cast<float>(hash % 5);
354 start_offset.y += step *
static_cast<float>((hash / 5) % 5);
360 ImGui::SetNextWindowPos(
361 ImVec2(display_width - initial_size.x - 10.0f, 30.0f) +
363 ImGuiCond_FirstUseEver);
366 ImGui::SetNextWindowPos(ImVec2(10.0f, 30.0f) + start_offset,
367 ImGuiCond_FirstUseEver);
370 ImGui::SetNextWindowPos(
371 ImVec2(10.0f, display_height - initial_size.y - 10.0f) +
373 ImGuiCond_FirstUseEver);
376 ImGui::SetNextWindowPos(ImVec2(10.0f, 30.0f) + start_offset,
377 ImGuiCond_FirstUseEver);
380 ImGui::SetNextWindowPos(
381 ImVec2(display_width * 0.5f - initial_size.x * 0.5f,
382 display_height * 0.5f - initial_size.y * 0.5f) +
384 ImGuiCond_FirstUseEver);
388 ImGui::SetNextWindowPos(
389 ImVec2(display_width * 0.5f - initial_size.x * 0.5f,
390 display_height * 0.3f) +
392 ImGuiCond_FirstUseEver);
396 ImGui::SetNextWindowSize(initial_size, ImGuiCond_FirstUseEver);
402 std::initializer_list<StyleVarGuard::Entry>{
403 {ImGuiStyleVar_WindowRounding, 8.0f},
404 {ImGuiStyleVar_WindowPadding, ImVec2(10, 10)}});
406 std::initializer_list<StyleColorGuard::Entry>{
411 bool* actual_p_open = p_open ? p_open :
p_open_;
415 closable_ ? actual_p_open :
nullptr, flags);
422 ImGuiWindow* window = ImGui::GetCurrentWindow();
423 if (window && !window->DockNode && !window->Collapsed) {
424 const ImGuiViewport* viewport =
425 window->Viewport ? window->Viewport : ImGui::GetMainViewport();
426 const bool dragging =
427 ImGui::IsMouseDragging(ImGuiMouseButton_Left) &&
428 ImGui::IsWindowHovered(
429 ImGuiHoveredFlags_AllowWhenBlockedByActiveItem);
430 if (!dragging && viewport) {
431 constexpr float kMinVisible = 32.0f;
435 viewport->WorkSize, kMinVisible);
437 ImGui::SetWindowPos(clamp.pos, ImGuiCond_Always);
445 if (ImGui::GetCurrentWindow() && ImGui::GetCurrentWindow()->ID != 0) {
446 std::string panel_path = absl::StrFormat(
"PanelWindow:%s",
title_.c_str());
448 panel_path,
"window", ImGui::GetCurrentWindow()->ID,
449 absl::StrFormat(
"Editor panel: %s",
title_.c_str()));
477 ImGui::SetNextWindowSize(ImVec2(50, 50));
479 ImGuiWindowFlags flags =
480 ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize |
481 ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse;
483 std::string icon_window_name =
window_name_ +
"##IconCollapsed";
485 if (ImGui::Begin(icon_window_name.c_str(),
nullptr, flags)) {
487 if (ImGui::Button(
icon_.c_str(), ImVec2(40, 40))) {
491 if (ImGui::IsItemHovered()) {
492 ImGui::SetTooltip(
"Expand %s",
title_.c_str());
496 if (ImGui::IsWindowHovered() &&
497 ImGui::IsMouseDragging(ImGuiMouseButton_Left)) {
498 ImVec2 mouse_delta = ImGui::GetIO().MouseDelta;