|
@@ -1077,6 +1077,7 @@ static void UpdateMouseInputs();
|
|
|
static void UpdateMouseWheel();
|
|
|
static void UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4]);
|
|
|
static void RenderWindowOuterBorders(ImGuiWindow* window);
|
|
|
+static void RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size);
|
|
|
static void RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open);
|
|
|
|
|
|
}
|
|
@@ -4964,6 +4965,82 @@ static void ImGui::RenderWindowOuterBorders(ImGuiWindow* window)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size)
|
|
|
+{
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
+ ImGuiStyle& style = g.Style;
|
|
|
+ ImGuiWindowFlags flags = window->Flags;
|
|
|
+
|
|
|
+ // Draw window + handle manual resize
|
|
|
+ // As we highlight the title bar when want_focus is set, multiple reappearing windows will have have their title bar highlighted on their reappearing frame.
|
|
|
+ const float window_rounding = window->WindowRounding;
|
|
|
+ const float window_border_size = window->WindowBorderSize;
|
|
|
+ if (window->Collapsed)
|
|
|
+ {
|
|
|
+ // Title bar only
|
|
|
+ float backup_border_size = style.FrameBorderSize;
|
|
|
+ g.Style.FrameBorderSize = window->WindowBorderSize;
|
|
|
+ ImU32 title_bar_col = GetColorU32((title_bar_is_highlight && !g.NavDisableHighlight) ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBgCollapsed);
|
|
|
+ RenderFrame(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, true, window_rounding);
|
|
|
+ g.Style.FrameBorderSize = backup_border_size;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // Window background
|
|
|
+ if (!(flags & ImGuiWindowFlags_NoBackground))
|
|
|
+ {
|
|
|
+ ImU32 bg_col = GetColorU32(GetWindowBgColorIdxFromFlags(flags));
|
|
|
+ float alpha = 1.0f;
|
|
|
+ if (g.NextWindowData.BgAlphaCond != 0)
|
|
|
+ alpha = g.NextWindowData.BgAlphaVal;
|
|
|
+ if (alpha != 1.0f)
|
|
|
+ bg_col = (bg_col & ~IM_COL32_A_MASK) | (IM_F32_TO_INT8_SAT(alpha) << IM_COL32_A_SHIFT);
|
|
|
+ window->DrawList->AddRectFilled(window->Pos + ImVec2(0, window->TitleBarHeight()), window->Pos + window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Bot);
|
|
|
+ }
|
|
|
+ g.NextWindowData.BgAlphaCond = 0;
|
|
|
+
|
|
|
+ // Title bar
|
|
|
+ if (!(flags & ImGuiWindowFlags_NoTitleBar))
|
|
|
+ {
|
|
|
+ ImU32 title_bar_col = GetColorU32(title_bar_is_highlight ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg);
|
|
|
+ window->DrawList->AddRectFilled(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, window_rounding, ImDrawCornerFlags_Top);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Menu bar
|
|
|
+ if (flags & ImGuiWindowFlags_MenuBar)
|
|
|
+ {
|
|
|
+ ImRect menu_bar_rect = window->MenuBarRect();
|
|
|
+ menu_bar_rect.ClipWith(window->Rect()); // Soft clipping, in particular child window don't have minimum size covering the menu bar so this is useful for them.
|
|
|
+ window->DrawList->AddRectFilled(menu_bar_rect.Min + ImVec2(window_border_size, 0), menu_bar_rect.Max - ImVec2(window_border_size, 0), GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, ImDrawCornerFlags_Top);
|
|
|
+ if (style.FrameBorderSize > 0.0f && menu_bar_rect.Max.y < window->Pos.y + window->Size.y)
|
|
|
+ window->DrawList->AddLine(menu_bar_rect.GetBL(), menu_bar_rect.GetBR(), GetColorU32(ImGuiCol_Border), style.FrameBorderSize);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Scrollbars
|
|
|
+ if (window->ScrollbarX)
|
|
|
+ Scrollbar(ImGuiAxis_X);
|
|
|
+ if (window->ScrollbarY)
|
|
|
+ Scrollbar(ImGuiAxis_Y);
|
|
|
+
|
|
|
+ // Render resize grips (after their input handling so we don't have a frame of latency)
|
|
|
+ if (!(flags & ImGuiWindowFlags_NoResize))
|
|
|
+ {
|
|
|
+ for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++)
|
|
|
+ {
|
|
|
+ const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n];
|
|
|
+ const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPosN);
|
|
|
+ window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(window_border_size, resize_grip_draw_size) : ImVec2(resize_grip_draw_size, window_border_size)));
|
|
|
+ window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(resize_grip_draw_size, window_border_size) : ImVec2(window_border_size, resize_grip_draw_size)));
|
|
|
+ window->DrawList->PathArcToFast(ImVec2(corner.x + grip.InnerDir.x * (window_rounding + window_border_size), corner.y + grip.InnerDir.y * (window_rounding + window_border_size)), window_rounding, grip.AngleMin12, grip.AngleMax12);
|
|
|
+ window->DrawList->PathFillConvex(resize_grip_col[resize_grip_n]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Borders
|
|
|
+ RenderWindowOuterBorders(window);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void ImGui::RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open)
|
|
|
{
|
|
|
ImGuiContext& g = *GImGui;
|
|
@@ -5349,7 +5426,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
int border_held = -1;
|
|
|
ImU32 resize_grip_col[4] = { 0 };
|
|
|
const int resize_grip_count = g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // 4
|
|
|
- const float grip_draw_size = (float)(int)ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f);
|
|
|
+ const float resize_grip_draw_size = (float)(int)ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f);
|
|
|
if (!window->Collapsed)
|
|
|
UpdateManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0]);
|
|
|
window->ResizeBorderHeld = (signed char)border_held;
|
|
@@ -5423,76 +5500,9 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
|
|
window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowingHighlight, g.NavWindowingHighlightAlpha * 0.25f), g.Style.WindowRounding);
|
|
|
}
|
|
|
|
|
|
- // Draw window + handle manual resize
|
|
|
- // As we highlight the title bar when want_focus is set, multiple reappearing windows will have have their title bar highlighted on their reappearing frame.
|
|
|
- const float window_rounding = window->WindowRounding;
|
|
|
- const float window_border_size = window->WindowBorderSize;
|
|
|
const ImGuiWindow* window_to_highlight = g.NavWindowingTarget ? g.NavWindowingTarget : g.NavWindow;
|
|
|
const bool title_bar_is_highlight = want_focus || (window_to_highlight && window->RootWindowForTitleBarHighlight == window_to_highlight->RootWindowForTitleBarHighlight);
|
|
|
- if (window->Collapsed)
|
|
|
- {
|
|
|
- // Title bar only
|
|
|
- float backup_border_size = style.FrameBorderSize;
|
|
|
- g.Style.FrameBorderSize = window->WindowBorderSize;
|
|
|
- ImU32 title_bar_col = GetColorU32((title_bar_is_highlight && !g.NavDisableHighlight) ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBgCollapsed);
|
|
|
- RenderFrame(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, true, window_rounding);
|
|
|
- g.Style.FrameBorderSize = backup_border_size;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // Window background
|
|
|
- if (!(flags & ImGuiWindowFlags_NoBackground))
|
|
|
- {
|
|
|
- ImU32 bg_col = GetColorU32(GetWindowBgColorIdxFromFlags(flags));
|
|
|
- float alpha = 1.0f;
|
|
|
- if (g.NextWindowData.BgAlphaCond != 0)
|
|
|
- alpha = g.NextWindowData.BgAlphaVal;
|
|
|
- if (alpha != 1.0f)
|
|
|
- bg_col = (bg_col & ~IM_COL32_A_MASK) | (IM_F32_TO_INT8_SAT(alpha) << IM_COL32_A_SHIFT);
|
|
|
- window->DrawList->AddRectFilled(window->Pos + ImVec2(0, window->TitleBarHeight()), window->Pos + window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Bot);
|
|
|
- }
|
|
|
- g.NextWindowData.BgAlphaCond = 0;
|
|
|
-
|
|
|
- // Title bar
|
|
|
- if (!(flags & ImGuiWindowFlags_NoTitleBar))
|
|
|
- {
|
|
|
- ImU32 title_bar_col = GetColorU32(title_bar_is_highlight ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg);
|
|
|
- window->DrawList->AddRectFilled(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, window_rounding, ImDrawCornerFlags_Top);
|
|
|
- }
|
|
|
-
|
|
|
- // Menu bar
|
|
|
- if (flags & ImGuiWindowFlags_MenuBar)
|
|
|
- {
|
|
|
- ImRect menu_bar_rect = window->MenuBarRect();
|
|
|
- menu_bar_rect.ClipWith(window->Rect()); // Soft clipping, in particular child window don't have minimum size covering the menu bar so this is useful for them.
|
|
|
- window->DrawList->AddRectFilled(menu_bar_rect.Min+ImVec2(window_border_size,0), menu_bar_rect.Max-ImVec2(window_border_size,0), GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, ImDrawCornerFlags_Top);
|
|
|
- if (style.FrameBorderSize > 0.0f && menu_bar_rect.Max.y < window->Pos.y + window->Size.y)
|
|
|
- window->DrawList->AddLine(menu_bar_rect.GetBL(), menu_bar_rect.GetBR(), GetColorU32(ImGuiCol_Border), style.FrameBorderSize);
|
|
|
- }
|
|
|
-
|
|
|
- // Scrollbars
|
|
|
- if (window->ScrollbarX)
|
|
|
- Scrollbar(ImGuiAxis_X);
|
|
|
- if (window->ScrollbarY)
|
|
|
- Scrollbar(ImGuiAxis_Y);
|
|
|
-
|
|
|
- // Render resize grips (after their input handling so we don't have a frame of latency)
|
|
|
- if (!(flags & ImGuiWindowFlags_NoResize))
|
|
|
- {
|
|
|
- for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++)
|
|
|
- {
|
|
|
- const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n];
|
|
|
- const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPosN);
|
|
|
- window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(window_border_size, grip_draw_size) : ImVec2(grip_draw_size, window_border_size)));
|
|
|
- window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(grip_draw_size, window_border_size) : ImVec2(window_border_size, grip_draw_size)));
|
|
|
- window->DrawList->PathArcToFast(ImVec2(corner.x + grip.InnerDir.x * (window_rounding + window_border_size), corner.y + grip.InnerDir.y * (window_rounding + window_border_size)), window_rounding, grip.AngleMin12, grip.AngleMax12);
|
|
|
- window->DrawList->PathFillConvex(resize_grip_col[resize_grip_n]);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // Borders
|
|
|
- RenderWindowOuterBorders(window);
|
|
|
- }
|
|
|
+ RenderWindowDecorations(window, title_bar_rect, title_bar_is_highlight, resize_grip_count, resize_grip_col, resize_grip_draw_size);
|
|
|
|
|
|
// Draw navigation selection/windowing rectangle border
|
|
|
if (g.NavWindowingTargetAnim == window)
|