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 "
314 ImGui::SetNextWindowDockID(0, ImGuiCond_Always);
315 ImGui::SetNextWindowFocus();
318 ImGuiWindowFlags flags = ImGuiWindowFlags_None;
322 flags |= ImGuiWindowFlags_NoTitleBar;
323 flags |= ImGuiWindowFlags_NoCollapse;
328 flags |= ImGuiWindowFlags_NoDocking;
333 flags |= ImGuiWindowFlags_NoSavedSettings;
339 float display_width = ImGui::GetIO().DisplaySize.x;
340 float display_height = ImGui::GetIO().DisplaySize.y;
346 ImVec2 work_size = ImGui::GetMainViewport()
347 ? ImGui::GetMainViewport()->WorkSize
348 : ImVec2(display_width, display_height);
349 ImVec2 min_size(work_size.x * 0.65f, work_size.y * 0.55f);
350 ImVec2 max_size(work_size.x * 0.96f, work_size.y * 0.92f);
354 : ImVec2(work_size.x * 0.9f, work_size.y * 0.82f);
355 initial_size.x = std::clamp(desired.x, min_size.x, max_size.x);
356 initial_size.y = std::clamp(desired.y, min_size.y, max_size.y);
359 const size_t hash = std::hash<std::string>{}(
window_name_);
360 const float step = 18.0f;
361 start_offset.x += step *
static_cast<float>(hash % 5);
362 start_offset.y += step *
static_cast<float>((hash / 5) % 5);
368 ImGui::SetNextWindowPos(
369 ImVec2(display_width - initial_size.x - 10.0f, 30.0f) +
371 ImGuiCond_FirstUseEver);
374 ImGui::SetNextWindowPos(ImVec2(10.0f, 30.0f) + start_offset,
375 ImGuiCond_FirstUseEver);
378 ImGui::SetNextWindowPos(
379 ImVec2(10.0f, display_height - initial_size.y - 10.0f) +
381 ImGuiCond_FirstUseEver);
384 ImGui::SetNextWindowPos(ImVec2(10.0f, 30.0f) + start_offset,
385 ImGuiCond_FirstUseEver);
388 ImGui::SetNextWindowPos(
389 ImVec2(display_width * 0.5f - initial_size.x * 0.5f,
390 display_height * 0.5f - initial_size.y * 0.5f) +
392 ImGuiCond_FirstUseEver);
396 ImGui::SetNextWindowPos(
397 ImVec2(display_width * 0.5f - initial_size.x * 0.5f,
398 display_height * 0.3f) +
400 ImGuiCond_FirstUseEver);
404 ImGui::SetNextWindowSize(
405 initial_size, force_undock ? ImGuiCond_Always : ImGuiCond_FirstUseEver);
416 {ImGuiStyleVar_WindowRounding, 8.0f},
423 bool* actual_p_open = p_open ? p_open :
p_open_;
427 closable_ ? actual_p_open :
nullptr, flags);
434 ImGuiWindow* window = ImGui::GetCurrentWindow();
435 if (window && !window->DockNode && !window->Collapsed) {
436 const ImGuiViewport* viewport =
437 window->Viewport ? window->Viewport : ImGui::GetMainViewport();
438 const bool dragging = ImGui::IsMouseDragging(ImGuiMouseButton_Left) &&
439 ImGui::IsWindowHovered(
440 ImGuiHoveredFlags_AllowWhenBlockedByActiveItem);
441 if (!dragging && viewport) {
442 constexpr float kMinVisible = 32.0f;
444 window->Pos, window->Size, viewport->WorkPos, viewport->WorkSize,
447 ImGui::SetWindowPos(clamp.pos, ImGuiCond_Always);
455 if (ImGui::GetCurrentWindow() && ImGui::GetCurrentWindow()->ID != 0) {
456 std::string panel_path = absl::StrFormat(
"PanelWindow:%s",
title_.c_str());
458 panel_path,
"window", ImGui::GetCurrentWindow()->ID,
459 absl::StrFormat(
"Editor panel: %s",
title_.c_str()));
487 ImGui::SetNextWindowSize(ImVec2(50, 50));
489 ImGuiWindowFlags flags =
490 ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize |
491 ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse;
493 std::string icon_window_name =
window_name_ +
"##IconCollapsed";
495 if (ImGui::Begin(icon_window_name.c_str(),
nullptr, flags)) {
497 if (ImGui::Button(
icon_.c_str(), ImVec2(40, 40))) {
501 if (ImGui::IsItemHovered()) {
502 ImGui::SetTooltip(tr(
"Expand %s"),
title_.c_str());
506 if (ImGui::IsWindowHovered() &&
507 ImGui::IsMouseDragging(ImGuiMouseButton_Left)) {
508 ImVec2 mouse_delta = ImGui::GetIO().MouseDelta;