@ -7882,387 +7882,6 @@ void ImGui::AlignTextToFramePadding()
window - > DC . CurrentLineTextBaseOffset = ImMax ( window - > DC . CurrentLineTextBaseOffset , g . Style . FramePadding . y ) ;
window - > DC . CurrentLineTextBaseOffset = ImMax ( window - > DC . CurrentLineTextBaseOffset , g . Style . FramePadding . y ) ;
}
}
bool ImGui : : ButtonBehavior ( const ImRect & bb , ImGuiID id , bool * out_hovered , bool * out_held , ImGuiButtonFlags flags )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( flags & ImGuiButtonFlags_Disabled )
{
if ( out_hovered ) * out_hovered = false ;
if ( out_held ) * out_held = false ;
if ( g . ActiveId = = id ) ClearActiveID ( ) ;
return false ;
}
// Default behavior requires click+release on same spot
if ( ( flags & ( ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick ) ) = = 0 )
flags | = ImGuiButtonFlags_PressedOnClickRelease ;
ImGuiWindow * backup_hovered_window = g . HoveredWindow ;
if ( ( flags & ImGuiButtonFlags_FlattenChildren ) & & g . HoveredRootWindow = = window )
g . HoveredWindow = window ;
bool pressed = false ;
bool hovered = ItemHoverable ( bb , id ) ;
// Drag source doesn't report as hovered
if ( hovered & & g . DragDropActive & & g . DragDropPayload . SourceId = = id & & ! ( g . DragDropSourceFlags & ImGuiDragDropFlags_SourceNoDisableHover ) )
hovered = false ;
// Special mode for Drag and Drop where holding button pressed for a long time while dragging another item triggers the button
if ( g . DragDropActive & & ( flags & ImGuiButtonFlags_PressedOnDragDropHold ) & & ! ( g . DragDropSourceFlags & ImGuiDragDropFlags_SourceNoHoldToOpenOthers ) )
if ( IsItemHovered ( ImGuiHoveredFlags_AllowWhenBlockedByActiveItem ) )
{
hovered = true ;
SetHoveredID ( id ) ;
if ( CalcTypematicPressedRepeatAmount ( g . HoveredIdTimer + 0.0001f , g . HoveredIdTimer + 0.0001f - g . IO . DeltaTime , 0.01f , 0.70f ) ) // FIXME: Our formula for CalcTypematicPressedRepeatAmount() is fishy
{
pressed = true ;
FocusWindow ( window ) ;
}
}
if ( ( flags & ImGuiButtonFlags_FlattenChildren ) & & g . HoveredRootWindow = = window )
g . HoveredWindow = backup_hovered_window ;
// AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one.
if ( hovered & & ( flags & ImGuiButtonFlags_AllowItemOverlap ) & & ( g . HoveredIdPreviousFrame ! = id & & g . HoveredIdPreviousFrame ! = 0 ) )
hovered = false ;
// Mouse
if ( hovered )
{
if ( ! ( flags & ImGuiButtonFlags_NoKeyModifiers ) | | ( ! g . IO . KeyCtrl & & ! g . IO . KeyShift & & ! g . IO . KeyAlt ) )
{
// | CLICKING | HOLDING with ImGuiButtonFlags_Repeat
// PressedOnClickRelease | <on release>* | <on repeat> <on repeat> .. (NOT on release) <-- MOST COMMON! (*) only if both click/release were over bounds
// PressedOnClick | <on click> | <on click> <on repeat> <on repeat> ..
// PressedOnRelease | <on release> | <on repeat> <on repeat> .. (NOT on release)
// PressedOnDoubleClick | <on dclick> | <on dclick> <on repeat> <on repeat> ..
// FIXME-NAV: We don't honor those different behaviors.
if ( ( flags & ImGuiButtonFlags_PressedOnClickRelease ) & & g . IO . MouseClicked [ 0 ] )
{
SetActiveID ( id , window ) ;
if ( ! ( flags & ImGuiButtonFlags_NoNavFocus ) )
SetFocusID ( id , window ) ;
FocusWindow ( window ) ;
}
if ( ( ( flags & ImGuiButtonFlags_PressedOnClick ) & & g . IO . MouseClicked [ 0 ] ) | | ( ( flags & ImGuiButtonFlags_PressedOnDoubleClick ) & & g . IO . MouseDoubleClicked [ 0 ] ) )
{
pressed = true ;
if ( flags & ImGuiButtonFlags_NoHoldingActiveID )
ClearActiveID ( ) ;
else
SetActiveID ( id , window ) ; // Hold on ID
FocusWindow ( window ) ;
}
if ( ( flags & ImGuiButtonFlags_PressedOnRelease ) & & g . IO . MouseReleased [ 0 ] )
{
if ( ! ( ( flags & ImGuiButtonFlags_Repeat ) & & g . IO . MouseDownDurationPrev [ 0 ] > = g . IO . KeyRepeatDelay ) ) // Repeat mode trumps <on release>
pressed = true ;
ClearActiveID ( ) ;
}
// 'Repeat' mode acts when held regardless of _PressedOn flags (see table above).
// Relies on repeat logic of IsMouseClicked() but we may as well do it ourselves if we end up exposing finer RepeatDelay/RepeatRate settings.
if ( ( flags & ImGuiButtonFlags_Repeat ) & & g . ActiveId = = id & & g . IO . MouseDownDuration [ 0 ] > 0.0f & & IsMouseClicked ( 0 , true ) )
pressed = true ;
}
if ( pressed )
g . NavDisableHighlight = true ;
}
// Gamepad/Keyboard navigation
// We report navigated item as hovered but we don't set g.HoveredId to not interfere with mouse.
if ( g . NavId = = id & & ! g . NavDisableHighlight & & g . NavDisableMouseHover & & ( g . ActiveId = = 0 | | g . ActiveId = = id | | g . ActiveId = = window - > MoveId ) )
hovered = true ;
if ( g . NavActivateDownId = = id )
{
bool nav_activated_by_code = ( g . NavActivateId = = id ) ;
bool nav_activated_by_inputs = IsNavInputPressed ( ImGuiNavInput_Activate , ( flags & ImGuiButtonFlags_Repeat ) ? ImGuiInputReadMode_Repeat : ImGuiInputReadMode_Pressed ) ;
if ( nav_activated_by_code | | nav_activated_by_inputs )
pressed = true ;
if ( nav_activated_by_code | | nav_activated_by_inputs | | g . ActiveId = = id )
{
// Set active id so it can be queried by user via IsItemActive(), equivalent of holding the mouse button.
g . NavActivateId = id ; // This is so SetActiveId assign a Nav source
SetActiveID ( id , window ) ;
if ( ! ( flags & ImGuiButtonFlags_NoNavFocus ) )
SetFocusID ( id , window ) ;
g . ActiveIdAllowNavDirFlags = ( 1 < < ImGuiDir_Left ) | ( 1 < < ImGuiDir_Right ) | ( 1 < < ImGuiDir_Up ) | ( 1 < < ImGuiDir_Down ) ;
}
}
bool held = false ;
if ( g . ActiveId = = id )
{
if ( g . ActiveIdSource = = ImGuiInputSource_Mouse )
{
if ( g . ActiveIdIsJustActivated )
g . ActiveIdClickOffset = g . IO . MousePos - bb . Min ;
if ( g . IO . MouseDown [ 0 ] )
{
held = true ;
}
else
{
if ( hovered & & ( flags & ImGuiButtonFlags_PressedOnClickRelease ) )
if ( ! ( ( flags & ImGuiButtonFlags_Repeat ) & & g . IO . MouseDownDurationPrev [ 0 ] > = g . IO . KeyRepeatDelay ) ) // Repeat mode trumps <on release>
if ( ! g . DragDropActive )
pressed = true ;
ClearActiveID ( ) ;
}
if ( ! ( flags & ImGuiButtonFlags_NoNavFocus ) )
g . NavDisableHighlight = true ;
}
else if ( g . ActiveIdSource = = ImGuiInputSource_Nav )
{
if ( g . NavActivateDownId ! = id )
ClearActiveID ( ) ;
}
}
if ( out_hovered ) * out_hovered = hovered ;
if ( out_held ) * out_held = held ;
return pressed ;
}
bool ImGui : : ButtonEx ( const char * label , const ImVec2 & size_arg , ImGuiButtonFlags flags )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
ImGuiContext & g = * GImGui ;
const ImGuiStyle & style = g . Style ;
const ImGuiID id = window - > GetID ( label ) ;
const ImVec2 label_size = CalcTextSize ( label , NULL , true ) ;
ImVec2 pos = window - > DC . CursorPos ;
if ( ( flags & ImGuiButtonFlags_AlignTextBaseLine ) & & style . FramePadding . y < window - > DC . CurrentLineTextBaseOffset ) // Try to vertically align buttons that are smaller/have no padding so that text baseline matches (bit hacky, since it shouldn't be a flag)
pos . y + = window - > DC . CurrentLineTextBaseOffset - style . FramePadding . y ;
ImVec2 size = CalcItemSize ( size_arg , label_size . x + style . FramePadding . x * 2.0f , label_size . y + style . FramePadding . y * 2.0f ) ;
const ImRect bb ( pos , pos + size ) ;
ItemSize ( bb , style . FramePadding . y ) ;
if ( ! ItemAdd ( bb , id ) )
return false ;
if ( window - > DC . ItemFlags & ImGuiItemFlags_ButtonRepeat )
flags | = ImGuiButtonFlags_Repeat ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held , flags ) ;
if ( pressed )
MarkItemEdited ( id ) ;
// Render
const ImU32 col = GetColorU32 ( ( held & & hovered ) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button ) ;
RenderNavHighlight ( bb , id ) ;
RenderFrame ( bb . Min , bb . Max , col , true , style . FrameRounding ) ;
RenderTextClipped ( bb . Min + style . FramePadding , bb . Max - style . FramePadding , label , NULL , & label_size , style . ButtonTextAlign , & bb ) ;
// Automatically close popups
//if (pressed && !(flags & ImGuiButtonFlags_DontClosePopups) && (window->Flags & ImGuiWindowFlags_Popup))
// CloseCurrentPopup();
return pressed ;
}
bool ImGui : : Button ( const char * label , const ImVec2 & size_arg )
{
return ButtonEx ( label , size_arg , 0 ) ;
}
// Small buttons fits within text without additional vertical spacing.
bool ImGui : : SmallButton ( const char * label )
{
ImGuiContext & g = * GImGui ;
float backup_padding_y = g . Style . FramePadding . y ;
g . Style . FramePadding . y = 0.0f ;
bool pressed = ButtonEx ( label , ImVec2 ( 0 , 0 ) , ImGuiButtonFlags_AlignTextBaseLine ) ;
g . Style . FramePadding . y = backup_padding_y ;
return pressed ;
}
bool ImGui : : ArrowButtonEx ( const char * str_id , ImGuiDir dir , ImVec2 size , ImGuiButtonFlags flags )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
ImGuiContext & g = * GImGui ;
const ImGuiID id = window - > GetID ( str_id ) ;
const ImRect bb ( window - > DC . CursorPos , window - > DC . CursorPos + size ) ;
const float default_size = GetFrameHeight ( ) ;
ItemSize ( bb , ( size . y > = default_size ) ? g . Style . FramePadding . y : 0.0f ) ;
if ( ! ItemAdd ( bb , id ) )
return false ;
if ( window - > DC . ItemFlags & ImGuiItemFlags_ButtonRepeat )
flags | = ImGuiButtonFlags_Repeat ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held , flags ) ;
// Render
const ImU32 col = GetColorU32 ( ( held & & hovered ) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button ) ;
RenderNavHighlight ( bb , id ) ;
RenderFrame ( bb . Min , bb . Max , col , true , g . Style . FrameRounding ) ;
RenderArrow ( bb . Min + ImVec2 ( ImMax ( 0.0f , size . x - g . FontSize - g . Style . FramePadding . x ) , ImMax ( 0.0f , size . y - g . FontSize - g . Style . FramePadding . y ) ) , dir ) ;
return pressed ;
}
bool ImGui : : ArrowButton ( const char * str_id , ImGuiDir dir )
{
float sz = GetFrameHeight ( ) ;
return ArrowButtonEx ( str_id , dir , ImVec2 ( sz , sz ) , 0 ) ;
}
// Tip: use ImGui::PushID()/PopID() to push indices or pointers in the ID stack.
// Then you can keep 'str_id' empty or the same for all your buttons (instead of creating a string based on a non-string id)
bool ImGui : : InvisibleButton ( const char * str_id , const ImVec2 & size_arg )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
// Cannot use zero-size for InvisibleButton(). Unlike Button() there is not way to fallback using the label size.
IM_ASSERT ( size_arg . x ! = 0.0f & & size_arg . y ! = 0.0f ) ;
const ImGuiID id = window - > GetID ( str_id ) ;
ImVec2 size = CalcItemSize ( size_arg , 0.0f , 0.0f ) ;
const ImRect bb ( window - > DC . CursorPos , window - > DC . CursorPos + size ) ;
ItemSize ( bb ) ;
if ( ! ItemAdd ( bb , id ) )
return false ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held ) ;
return pressed ;
}
// Button to close a window
bool ImGui : : CloseButton ( ImGuiID id , const ImVec2 & pos , float radius )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
// We intentionally allow interaction when clipped so that a mechanical Alt,Right,Validate sequence close a window.
// (this isn't the regular behavior of buttons, but it doesn't affect the user much because navigation tends to keep items visible).
const ImRect bb ( pos - ImVec2 ( radius , radius ) , pos + ImVec2 ( radius , radius ) ) ;
bool is_clipped = ! ItemAdd ( bb , id ) ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held ) ;
if ( is_clipped )
return pressed ;
// Render
ImVec2 center = bb . GetCenter ( ) ;
if ( hovered )
window - > DrawList - > AddCircleFilled ( center , ImMax ( 2.0f , radius ) , GetColorU32 ( ( held & & hovered ) ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered ) , 9 ) ;
float cross_extent = ( radius * 0.7071f ) - 1.0f ;
ImU32 cross_col = GetColorU32 ( ImGuiCol_Text ) ;
center - = ImVec2 ( 0.5f , 0.5f ) ;
window - > DrawList - > AddLine ( center + ImVec2 ( + cross_extent , + cross_extent ) , center + ImVec2 ( - cross_extent , - cross_extent ) , cross_col , 1.0f ) ;
window - > DrawList - > AddLine ( center + ImVec2 ( + cross_extent , - cross_extent ) , center + ImVec2 ( - cross_extent , + cross_extent ) , cross_col , 1.0f ) ;
return pressed ;
}
bool ImGui : : CollapseButton ( ImGuiID id , const ImVec2 & pos )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = g . CurrentWindow ;
ImRect bb ( pos , pos + ImVec2 ( g . FontSize , g . FontSize ) + g . Style . FramePadding * 2.0f ) ;
ItemAdd ( bb , id ) ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held , ImGuiButtonFlags_None ) ;
ImU32 col = GetColorU32 ( ( held & & hovered ) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button ) ;
if ( hovered | | held )
window - > DrawList - > AddCircleFilled ( bb . GetCenter ( ) + ImVec2 ( 0.0f , - 0.5f ) , g . FontSize * 0.5f + 1.0f , col , 9 ) ;
RenderArrow ( bb . Min + g . Style . FramePadding , window - > Collapsed ? ImGuiDir_Right : ImGuiDir_Down , 1.0f ) ;
// Switch to moving the window after mouse is moved beyond the initial drag threshold
if ( IsItemActive ( ) & & IsMouseDragging ( ) )
StartMouseMovingWindow ( window ) ;
return pressed ;
}
void ImGui : : Image ( ImTextureID user_texture_id , const ImVec2 & size , const ImVec2 & uv0 , const ImVec2 & uv1 , const ImVec4 & tint_col , const ImVec4 & border_col )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return ;
ImRect bb ( window - > DC . CursorPos , window - > DC . CursorPos + size ) ;
if ( border_col . w > 0.0f )
bb . Max + = ImVec2 ( 2 , 2 ) ;
ItemSize ( bb ) ;
if ( ! ItemAdd ( bb , 0 ) )
return ;
if ( border_col . w > 0.0f )
{
window - > DrawList - > AddRect ( bb . Min , bb . Max , GetColorU32 ( border_col ) , 0.0f ) ;
window - > DrawList - > AddImage ( user_texture_id , bb . Min + ImVec2 ( 1 , 1 ) , bb . Max - ImVec2 ( 1 , 1 ) , uv0 , uv1 , GetColorU32 ( tint_col ) ) ;
}
else
{
window - > DrawList - > AddImage ( user_texture_id , bb . Min , bb . Max , uv0 , uv1 , GetColorU32 ( tint_col ) ) ;
}
}
// frame_padding < 0: uses FramePadding from style (default)
// frame_padding = 0: no framing
// frame_padding > 0: set framing size
// The color used are the button colors.
bool ImGui : : ImageButton ( ImTextureID user_texture_id , const ImVec2 & size , const ImVec2 & uv0 , const ImVec2 & uv1 , int frame_padding , const ImVec4 & bg_col , const ImVec4 & tint_col )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
ImGuiContext & g = * GImGui ;
const ImGuiStyle & style = g . Style ;
// Default to using texture ID as ID. User can still push string/integer prefixes.
// We could hash the size/uv to create a unique ID but that would prevent the user from animating UV.
PushID ( ( void * ) user_texture_id ) ;
const ImGuiID id = window - > GetID ( " #image " ) ;
PopID ( ) ;
const ImVec2 padding = ( frame_padding > = 0 ) ? ImVec2 ( ( float ) frame_padding , ( float ) frame_padding ) : style . FramePadding ;
const ImRect bb ( window - > DC . CursorPos , window - > DC . CursorPos + size + padding * 2 ) ;
const ImRect image_bb ( window - > DC . CursorPos + padding , window - > DC . CursorPos + padding + size ) ;
ItemSize ( bb ) ;
if ( ! ItemAdd ( bb , id ) )
return false ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held ) ;
// Render
const ImU32 col = GetColorU32 ( ( held & & hovered ) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button ) ;
RenderNavHighlight ( bb , id ) ;
RenderFrame ( bb . Min , bb . Max , col , true , ImClamp ( ( float ) ImMin ( padding . x , padding . y ) , 0.0f , style . FrameRounding ) ) ;
if ( bg_col . w > 0.0f )
window - > DrawList - > AddRectFilled ( image_bb . Min , image_bb . Max , GetColorU32 ( bg_col ) ) ;
window - > DrawList - > AddImage ( user_texture_id , image_bb . Min , image_bb . Max , uv0 , uv1 , GetColorU32 ( tint_col ) ) ;
return pressed ;
}
// Start logging ImGui output to TTY
// Start logging ImGui output to TTY
void ImGui : : LogToTTY ( int max_depth )
void ImGui : : LogToTTY ( int max_depth )
{
{
@ -8752,28 +8371,6 @@ ImGuiID ImGui::GetID(const void* ptr_id)
return GImGui - > CurrentWindow - > GetID ( ptr_id ) ;
return GImGui - > CurrentWindow - > GetID ( ptr_id ) ;
}
}
void ImGui : : Bullet ( )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return ;
ImGuiContext & g = * GImGui ;
const ImGuiStyle & style = g . Style ;
const float line_height = ImMax ( ImMin ( window - > DC . CurrentLineSize . y , g . FontSize + g . Style . FramePadding . y * 2 ) , g . FontSize ) ;
const ImRect bb ( window - > DC . CursorPos , window - > DC . CursorPos + ImVec2 ( g . FontSize , line_height ) ) ;
ItemSize ( bb ) ;
if ( ! ItemAdd ( bb , 0 ) )
{
SameLine ( 0 , style . FramePadding . x * 2 ) ;
return ;
}
// Render and stay on same line
RenderBullet ( bb . Min + ImVec2 ( style . FramePadding . x + g . FontSize * 0.5f , line_height * 0.5f ) ) ;
SameLine ( 0 , style . FramePadding . x * 2 ) ;
}
static inline int DataTypeFormatString ( char * buf , int buf_size , ImGuiDataType data_type , const void * data_ptr , const char * format )
static inline int DataTypeFormatString ( char * buf , int buf_size , ImGuiDataType data_type , const void * data_ptr , const char * format )
{
{
if ( data_type = = ImGuiDataType_S32 | | data_type = = ImGuiDataType_U32 ) // Signedness doesn't matter when pushing the argument
if ( data_type = = ImGuiDataType_S32 | | data_type = = ImGuiDataType_U32 ) // Signedness doesn't matter when pushing the argument
@ -9995,177 +9592,6 @@ void ImGui::PlotHistogram(const char* label, float (*values_getter)(void* data,
PlotEx ( ImGuiPlotType_Histogram , label , values_getter , data , values_count , values_offset , overlay_text , scale_min , scale_max , graph_size ) ;
PlotEx ( ImGuiPlotType_Histogram , label , values_getter , data , values_count , values_offset , overlay_text , scale_min , scale_max , graph_size ) ;
}
}
// size_arg (for each axis) < 0.0f: align to end, 0.0f: auto, > 0.0f: specified size
void ImGui : : ProgressBar ( float fraction , const ImVec2 & size_arg , const char * overlay )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return ;
ImGuiContext & g = * GImGui ;
const ImGuiStyle & style = g . Style ;
ImVec2 pos = window - > DC . CursorPos ;
ImRect bb ( pos , pos + CalcItemSize ( size_arg , CalcItemWidth ( ) , g . FontSize + style . FramePadding . y * 2.0f ) ) ;
ItemSize ( bb , style . FramePadding . y ) ;
if ( ! ItemAdd ( bb , 0 ) )
return ;
// Render
fraction = ImSaturate ( fraction ) ;
RenderFrame ( bb . Min , bb . Max , GetColorU32 ( ImGuiCol_FrameBg ) , true , style . FrameRounding ) ;
bb . Expand ( ImVec2 ( - style . FrameBorderSize , - style . FrameBorderSize ) ) ;
const ImVec2 fill_br = ImVec2 ( ImLerp ( bb . Min . x , bb . Max . x , fraction ) , bb . Max . y ) ;
RenderRectFilledRangeH ( window - > DrawList , bb , GetColorU32 ( ImGuiCol_PlotHistogram ) , 0.0f , fraction , style . FrameRounding ) ;
// Default displaying the fraction as percentage string, but user can override it
char overlay_buf [ 32 ] ;
if ( ! overlay )
{
ImFormatString ( overlay_buf , IM_ARRAYSIZE ( overlay_buf ) , " %.0f%% " , fraction * 100 + 0.01f ) ;
overlay = overlay_buf ;
}
ImVec2 overlay_size = CalcTextSize ( overlay , NULL ) ;
if ( overlay_size . x > 0.0f )
RenderTextClipped ( ImVec2 ( ImClamp ( fill_br . x + style . ItemSpacing . x , bb . Min . x , bb . Max . x - overlay_size . x - style . ItemInnerSpacing . x ) , bb . Min . y ) , bb . Max , overlay , NULL , & overlay_size , ImVec2 ( 0.0f , 0.5f ) , & bb ) ;
}
bool ImGui : : Checkbox ( const char * label , bool * v )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
ImGuiContext & g = * GImGui ;
const ImGuiStyle & style = g . Style ;
const ImGuiID id = window - > GetID ( label ) ;
const ImVec2 label_size = CalcTextSize ( label , NULL , true ) ;
const ImRect check_bb ( window - > DC . CursorPos , window - > DC . CursorPos + ImVec2 ( label_size . y + style . FramePadding . y * 2 , label_size . y + style . FramePadding . y * 2 ) ) ; // We want a square shape to we use Y twice
ItemSize ( check_bb , style . FramePadding . y ) ;
ImRect total_bb = check_bb ;
if ( label_size . x > 0 )
SameLine ( 0 , style . ItemInnerSpacing . x ) ;
const ImRect text_bb ( window - > DC . CursorPos + ImVec2 ( 0 , style . FramePadding . y ) , window - > DC . CursorPos + ImVec2 ( 0 , style . FramePadding . y ) + label_size ) ;
if ( label_size . x > 0 )
{
ItemSize ( ImVec2 ( text_bb . GetWidth ( ) , check_bb . GetHeight ( ) ) , style . FramePadding . y ) ;
total_bb = ImRect ( ImMin ( check_bb . Min , text_bb . Min ) , ImMax ( check_bb . Max , text_bb . Max ) ) ;
}
if ( ! ItemAdd ( total_bb , id ) )
return false ;
bool hovered , held ;
bool pressed = ButtonBehavior ( total_bb , id , & hovered , & held ) ;
if ( pressed )
{
* v = ! ( * v ) ;
MarkItemEdited ( id ) ;
}
RenderNavHighlight ( total_bb , id ) ;
RenderFrame ( check_bb . Min , check_bb . Max , GetColorU32 ( ( held & & hovered ) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg ) , true , style . FrameRounding ) ;
if ( * v )
{
const float check_sz = ImMin ( check_bb . GetWidth ( ) , check_bb . GetHeight ( ) ) ;
const float pad = ImMax ( 1.0f , ( float ) ( int ) ( check_sz / 6.0f ) ) ;
RenderCheckMark ( check_bb . Min + ImVec2 ( pad , pad ) , GetColorU32 ( ImGuiCol_CheckMark ) , check_bb . GetWidth ( ) - pad * 2.0f ) ;
}
if ( g . LogEnabled )
LogRenderedText ( & text_bb . Min , * v ? " [x] " : " [ ] " ) ;
if ( label_size . x > 0.0f )
RenderText ( text_bb . Min , label ) ;
return pressed ;
}
bool ImGui : : CheckboxFlags ( const char * label , unsigned int * flags , unsigned int flags_value )
{
bool v = ( ( * flags & flags_value ) = = flags_value ) ;
bool pressed = Checkbox ( label , & v ) ;
if ( pressed )
{
if ( v )
* flags | = flags_value ;
else
* flags & = ~ flags_value ;
}
return pressed ;
}
bool ImGui : : RadioButton ( const char * label , bool active )
{
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
ImGuiContext & g = * GImGui ;
const ImGuiStyle & style = g . Style ;
const ImGuiID id = window - > GetID ( label ) ;
const ImVec2 label_size = CalcTextSize ( label , NULL , true ) ;
const ImRect check_bb ( window - > DC . CursorPos , window - > DC . CursorPos + ImVec2 ( label_size . y + style . FramePadding . y * 2 - 1 , label_size . y + style . FramePadding . y * 2 - 1 ) ) ;
ItemSize ( check_bb , style . FramePadding . y ) ;
ImRect total_bb = check_bb ;
if ( label_size . x > 0 )
SameLine ( 0 , style . ItemInnerSpacing . x ) ;
const ImRect text_bb ( window - > DC . CursorPos + ImVec2 ( 0 , style . FramePadding . y ) , window - > DC . CursorPos + ImVec2 ( 0 , style . FramePadding . y ) + label_size ) ;
if ( label_size . x > 0 )
{
ItemSize ( ImVec2 ( text_bb . GetWidth ( ) , check_bb . GetHeight ( ) ) , style . FramePadding . y ) ;
total_bb . Add ( text_bb ) ;
}
if ( ! ItemAdd ( total_bb , id ) )
return false ;
ImVec2 center = check_bb . GetCenter ( ) ;
center . x = ( float ) ( int ) center . x + 0.5f ;
center . y = ( float ) ( int ) center . y + 0.5f ;
const float radius = check_bb . GetHeight ( ) * 0.5f ;
bool hovered , held ;
bool pressed = ButtonBehavior ( total_bb , id , & hovered , & held ) ;
if ( pressed )
MarkItemEdited ( id ) ;
RenderNavHighlight ( total_bb , id ) ;
window - > DrawList - > AddCircleFilled ( center , radius , GetColorU32 ( ( held & & hovered ) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg ) , 16 ) ;
if ( active )
{
const float check_sz = ImMin ( check_bb . GetWidth ( ) , check_bb . GetHeight ( ) ) ;
const float pad = ImMax ( 1.0f , ( float ) ( int ) ( check_sz / 6.0f ) ) ;
window - > DrawList - > AddCircleFilled ( center , radius - pad , GetColorU32 ( ImGuiCol_CheckMark ) , 16 ) ;
}
if ( style . FrameBorderSize > 0.0f )
{
window - > DrawList - > AddCircle ( center + ImVec2 ( 1 , 1 ) , radius , GetColorU32 ( ImGuiCol_BorderShadow ) , 16 , style . FrameBorderSize ) ;
window - > DrawList - > AddCircle ( center , radius , GetColorU32 ( ImGuiCol_Border ) , 16 , style . FrameBorderSize ) ;
}
if ( g . LogEnabled )
LogRenderedText ( & text_bb . Min , active ? " (x) " : " ( ) " ) ;
if ( label_size . x > 0.0f )
RenderText ( text_bb . Min , label ) ;
return pressed ;
}
bool ImGui : : RadioButton ( const char * label , int * v , int v_button )
{
const bool pressed = RadioButton ( label , * v = = v_button ) ;
if ( pressed )
* v = v_button ;
return pressed ;
}
static int InputTextCalcTextLenAndLineCount ( const char * text_begin , const char * * out_text_end )
static int InputTextCalcTextLenAndLineCount ( const char * text_begin , const char * * out_text_end )
{
{
int line_count = 0 ;
int line_count = 0 ;