@ -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 )