@ -1473,7 +1473,7 @@ void ImGui::Separator()
}
// Using 'hover_visibility_delay' allows us to hide the highlight and mouse cursor for a short time, which can be convenient to reduce visual noise.
bool ImGui : : SplitterBehavior ( const ImRect & bb , ImGuiID id , ImGuiAxis axis , float * size1 , float * size2 , float min_size1 , float min_size2 , float hover_extend , float hover_visibility_delay )
bool ImGui : : SplitterBehavior ( const ImRect & bb , ImGuiID id , ImGuiAxis axis , float * size1 , float * size2 , float min_size1 , float min_size2 , float hover_extend , float hover_visibility_delay , ImU32 bg_col )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
@ -1521,7 +1521,9 @@ bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float
}
}
// Render
// Render at new position
if ( bg_col & IM_COL32_A_MASK )
window - > DrawList - > AddRectFilled ( bb_render . Min , bb_render . Max , bg_col , 0.0f ) ;
const ImU32 col = GetColorU32 ( held ? ImGuiCol_SeparatorActive : ( hovered & & g . HoveredIdTimer > = hover_visibility_delay ) ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator ) ;
window - > DrawList - > AddRectFilled ( bb_render . Min , bb_render . Max , col , 0.0f ) ;
@ -7303,7 +7305,7 @@ struct ImGuiTabBarSection
namespace ImGui
{
static void TabBarLayout ( ImGuiTabBar * tab_bar ) ;
static ImU32 TabBarCalcTabID ( ImGuiTabBar * tab_bar , const char * label ) ;
static ImU32 TabBarCalcTabID ( ImGuiTabBar * tab_bar , const char * label , ImGuiWindow * docked_window ) ;
static float TabBarCalcMaxTabWidth ( ) ;
static float TabBarScrollClamp ( ImGuiTabBar * tab_bar , float scrolling ) ;
static void TabBarScrollToTab ( ImGuiTabBar * tab_bar , ImGuiID tab_id , ImGuiTabBarSection * sections ) ;
@ -7696,9 +7698,11 @@ static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
window - > DC . IdealMaxPos . x = ImMax ( window - > DC . IdealMaxPos . x , tab_bar - > BarRect . Min . x + tab_bar - > WidthAllTabsIdeal ) ;
}
// Dockables uses Name/ID in the global namespace. Non-dockable items use the ID stack.
static ImU32 ImGui : : TabBarCalcTabID ( ImGuiTabBar * tab_bar , const char * label )
// Dockable window s uses Name/ID in the global namespace. Non-dockable items use the ID stack.
static ImU32 ImGui : : TabBarCalcTabID ( ImGuiTabBar * tab_bar , const char * label , ImGuiWindow * docked_window )
{
IM_ASSERT ( docked_window = = NULL ) ; // master branch only
IM_UNUSED ( docked_window ) ;
if ( tab_bar - > Flags & ImGuiTabBarFlags_DockNode )
{
ImGuiID id = ImHashStr ( label ) ;
@ -8005,7 +8009,7 @@ bool ImGui::BeginTabItem(const char* label, bool* p_open, ImGuiTabItemFlags f
}
IM_ASSERT ( ! ( flags & ImGuiTabItemFlags_Button ) ) ; // BeginTabItem() Can't be used with button flags, use TabItemButton() instead!
bool ret = TabItemEx ( tab_bar , label , p_open , flags ) ;
bool ret = TabItemEx ( tab_bar , label , p_open , flags , NULL ) ;
if ( ret & & ! ( flags & ImGuiTabItemFlags_NoPushId ) )
{
ImGuiTabItem * tab = & tab_bar - > Tabs [ tab_bar - > LastTabItemIdx ] ;
@ -8046,10 +8050,10 @@ bool ImGui::TabItemButton(const char* label, ImGuiTabItemFlags flags)
IM_ASSERT_USER_ERROR ( tab_bar ! = NULL , " Needs to be called between BeginTabBar() and EndTabBar()! " ) ;
return false ;
}
return TabItemEx ( tab_bar , label , NULL , flags | ImGuiTabItemFlags_Button | ImGuiTabItemFlags_NoReorder ) ;
return TabItemEx ( tab_bar , label , NULL , flags | ImGuiTabItemFlags_Button | ImGuiTabItemFlags_NoReorder , NULL ) ;
}
bool ImGui : : TabItemEx ( ImGuiTabBar * tab_bar , const char * label , bool * p_open , ImGuiTabItemFlags flags )
bool ImGui : : TabItemEx ( ImGuiTabBar * tab_bar , const char * label , bool * p_open , ImGuiTabItemFlags flags , ImGuiWindow * docked_window )
{
// Layout whole tab bar if not already done
ImGuiContext & g = * GImGui ;
@ -8064,7 +8068,7 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open,
return false ;
const ImGuiStyle & style = g . Style ;
const ImGuiID id = TabBarCalcTabID ( tab_bar , label ) ;
const ImGuiID id = TabBarCalcTabID ( tab_bar , label , docked_window ) ;
// If the user called us with *p_open == false, we early out and don't render.
// We make a call to ItemAdd() so that attempts to use a contextual popup menu with an implicit ID won't use an older ID.
@ -8114,9 +8118,16 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open,
tab - > LastFrameVisible = g . FrameCount ;
tab - > Flags = flags ;
// Append name with zero-terminator
tab - > NameOffset = ( ImS32 ) tab_bar - > TabsNames . size ( ) ;
tab_bar - > TabsNames . append ( label , label + strlen ( label ) + 1 ) ;
// Append name _WITH_ the zero-terminator
if ( docked_window ! = NULL )
{
IM_ASSERT ( docked_window = = NULL ) ; // master branch only
}
else
{
tab - > NameOffset = ( ImS32 ) tab_bar - > TabsNames . size ( ) ;
tab_bar - > TabsNames . append ( label , label + strlen ( label ) + 1 ) ;
}
// Update selected tab
if ( ! is_tab_button )
@ -8279,7 +8290,7 @@ void ImGui::SetTabItemClosed(const char* label)
if ( is_within_manual_tab_bar )
{
ImGuiTabBar * tab_bar = g . CurrentTabBar ;
ImGuiID tab_id = TabBarCalcTabID ( tab_bar , label ) ;
ImGuiID tab_id = TabBarCalcTabID ( tab_bar , label , NULL ) ;
if ( ImGuiTabItem * tab = TabBarFindTabByID ( tab_bar , tab_id ) )
tab - > WantClose = true ; // Will be processed by next call to TabBarLayout()
}
@ -8297,6 +8308,12 @@ ImVec2 ImGui::TabItemCalcSize(const char* label, bool has_close_button_or_unsave
return ImVec2 ( ImMin ( size . x , TabBarCalcMaxTabWidth ( ) ) , size . y ) ;
}
ImVec2 ImGui : : TabItemCalcSize ( ImGuiWindow * )
{
IM_ASSERT ( 0 ) ; // This function exists to facilitate merge with 'docking' branch.
return ImVec2 ( 0.0f , 0.0f ) ;
}
void ImGui : : TabItemBackground ( ImDrawList * draw_list , const ImRect & bb , ImGuiTabItemFlags flags , ImU32 col )
{
// While rendering tabs, we trim 1 pixel off the top of our bounding box so they can fit within a regular frame height while looking "detached" from it.