@ -191,6 +191,7 @@
Here is a change - log of API breaking changes , if you are using one of the functions listed , expect to have to fix some code .
Also read releases logs https : //github.com/ocornut/imgui/releases for more details.
- 2016 / 10 / 15 ( 1.50 ) - avoid ' void * user_data ' parameter to io . SetClipboardTextFn / io . GetClipboardTextFn pointers . We pass io . ClipboardUserData to it .
- 2016 / 09 / 25 ( 1.50 ) - style . WindowTitleAlign is now a ImVec2 ( ImGuiAlign enum was removed ) . set to ( 0.5f , 0.5f ) for horizontal + vertical centering , ( 0.0f , 0.0f ) for upper - left , etc .
- 2016 / 07 / 30 ( 1.50 ) - SameLine ( x ) with x > 0.0f is now relative to left of column / group if any , and not always to left of window . This was sort of always the intent and hopefully breakage should be minimal .
- 2016 / 07 / 18 ( 1.50 ) - renamed IsMouseHoveringAnyWindow ( ) to IsAnyWindowHovered ( ) for consistency . Kept inline redirection function ( will obsolete ) .
@ -338,7 +339,7 @@
Also make sure your orthographic projection matrix and io . DisplaySize matches your actual framebuffer dimension .
Q : I integrated ImGui in my engine and some elements are clipping or disappearing when I move windows around . .
A : Most likely you are mishandling the clipping rectangles in your render function . Rectangles provided by ImGui are defined as ( x1 , y1 , x2 , y2 ) and NOT as ( x1 , y1 , width , height ) .
A : Most likely you are mishandling the clipping rectangles in your render function . Rectangles provided by ImGui are defined as ( x1 = left , y1 = top , x2 = right , y2 = bottom ) and NOT as ( x1 , y1 , width , height ) .
Q : Can I have multiple widgets with the same label ? Can I have widget without a label ? ( Yes )
A : Yes . A primer on the use of labels / IDs in ImGui . .
@ -748,8 +749,8 @@ static bool DataTypeApplyOpFromText(const char* buf, const char* ini
// Platform dependent default implementations
//-----------------------------------------------------------------------------
static const char * GetClipboardTextFn_DefaultImpl ( ) ;
static void SetClipboardTextFn_DefaultImpl ( const char * text ) ;
static const char * GetClipboardTextFn_DefaultImpl ( void * user_data ) ;
static void SetClipboardTextFn_DefaultImpl ( void * user_data , const char * text ) ;
static void ImeSetInputScreenPosFn_DefaultImpl ( int x , int y ) ;
//-----------------------------------------------------------------------------
@ -874,6 +875,7 @@ ImGuiIO::ImGuiIO()
MemFreeFn = free ;
GetClipboardTextFn = GetClipboardTextFn_DefaultImpl ; // Platform dependent default implementations
SetClipboardTextFn = SetClipboardTextFn_DefaultImpl ;
ClipboardUserData = NULL ;
ImeSetInputScreenPosFn = ImeSetInputScreenPosFn_DefaultImpl ;
ImeWindowHandle = NULL ;
@ -2287,13 +2289,13 @@ void ImGui::MemFree(void* ptr)
const char * ImGui : : GetClipboardText ( )
{
return GImGui - > IO . GetClipboardTextFn ? GImGui - > IO . GetClipboardTextFn ( ) : " " ;
return GImGui - > IO . GetClipboardTextFn ? GImGui - > IO . GetClipboardTextFn ( GImGui - > IO . ClipboardUserData ) : " " ;
}
void ImGui : : SetClipboardText ( const char * text )
{
if ( GImGui - > IO . SetClipboardTextFn )
GImGui - > IO . SetClipboardTextFn ( text) ;
GImGui - > IO . SetClipboardTextFn ( GImGui- > IO . ClipboardUserData , text) ;
}
const char * ImGui : : GetVersion ( )
@ -3625,7 +3627,7 @@ void ImGui::RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border,
}
// Render a triangle to denote expanded/collapsed state
void ImGui : : RenderCollapseTriangle ( ImVec2 p_min , bool is_open , float scale , bool shadow )
void ImGui : : RenderCollapseTriangle ( ImVec2 p_min , bool is_open , float scale )
{
ImGuiContext & g = * GImGui ;
ImGuiWindow * window = GetCurrentWindow ( ) ;
@ -3649,8 +3651,6 @@ void ImGui::RenderCollapseTriangle(ImVec2 p_min, bool is_open, float scale, bool
c = center + ImVec2 ( - 0.500f , - 0.866f ) * r ;
}
if ( shadow & & ( window - > Flags & ImGuiWindowFlags_ShowBorders ) ! = 0 )
window - > DrawList - > AddTriangleFilled ( a + ImVec2 ( 2 , 2 ) , b + ImVec2 ( 2 , 2 ) , c + ImVec2 ( 2 , 2 ) , GetColorU32 ( ImGuiCol_BorderShadow ) ) ;
window - > DrawList - > AddTriangleFilled ( a , b , c , GetColorU32 ( ImGuiCol_Text ) ) ;
}
@ -4233,11 +4233,11 @@ static bool BeginPopupEx(const char* str_id, ImGuiWindowFlags extra_flags)
ImGui : : PushStyleVar ( ImGuiStyleVar_WindowRounding , 0.0f ) ;
ImGuiWindowFlags flags = extra_flags | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize ;
char name [ 3 2] ;
char name [ 20 ] ;
if ( flags & ImGuiWindowFlags_ChildMenu )
ImFormatString ( name , 20 , " ##menu_%d " , g . CurrentPopupStack . Size ) ; // Recycle windows based on depth
ImFormatString ( name , IM_ARRAYSIZE ( name ) , " ##menu_%d " , g . CurrentPopupStack . Size ) ; // Recycle windows based on depth
else
ImFormatString ( name , 20 , " ##popup_%08x " , id ) ; // Not recycling, so we can close/open during the same frame
ImFormatString ( name , IM_ARRAYSIZE ( name ) , " ##popup_%08x " , id ) ; // Not recycling, so we can close/open during the same frame
bool is_open = ImGui : : Begin ( name , NULL , flags ) ;
if ( ! ( window - > Flags & ImGuiWindowFlags_ShowBorders ) )
@ -4988,8 +4988,7 @@ bool ImGui::Begin(const char* name, bool* p_open, const ImVec2& size_on_first_us
window - > ScrollbarSizes = ImVec2 ( window - > ScrollbarY ? style . ScrollbarSize : 0.0f , window - > ScrollbarX ? style . ScrollbarSize : 0.0f ) ;
window - > BorderSize = ( flags & ImGuiWindowFlags_ShowBorders ) ? 1.0f : 0.0f ;
// Window background
// Default alpha
// Window background, Default Alpha
ImGuiCol bg_color_idx = ImGuiCol_WindowBg ;
if ( ( flags & ImGuiWindowFlags_ComboBox ) ! = 0 )
bg_color_idx = ImGuiCol_ComboBg ;
@ -5002,20 +5001,20 @@ bool ImGui::Begin(const char* name, bool* p_open, const ImVec2& size_on_first_us
bg_color . w = bg_alpha ;
bg_color . w * = style . Alpha ;
if ( bg_color . w > 0.0f )
window - > DrawList - > AddRectFilled ( window - > Pos + ImVec2 ( 0 , window - > TitleBarHeight ( ) ) , window - > Pos + window - > Size , ColorConvertFloat4ToU32 ( bg_color ) , window_rounding , ( flags & ImGuiWindowFlags_NoTitleBar ) ? 15 : 4 | 8 ) ;
window - > DrawList - > AddRectFilled ( window - > Pos + ImVec2 ( 0 , window - > TitleBarHeight ( ) ) , window - > Pos + window - > Size , ColorConvertFloat4ToU32 ( bg_color ) , window_rounding , ( flags & ImGuiWindowFlags_NoTitleBar ) ? ImGuiCorner_All : ImGuiCorner_BottomLeft | ImGuiCorner_BottomRight ) ;
// Title bar
const bool is_focused = g . NavWindow & & window - > RootNonPopupWindow = = g . NavWindow - > RootNonPopupWindow ;
if ( ! ( flags & ImGuiWindowFlags_NoTitleBar ) )
window - > DrawList - > AddRectFilled ( title_bar_rect . GetTL ( ) , title_bar_rect . GetBR ( ) , GetColorU32 ( is_focused ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg ) , window_rounding , 1 | 2 ) ;
window - > DrawList - > AddRectFilled ( title_bar_rect . GetTL ( ) , title_bar_rect . GetBR ( ) , GetColorU32 ( is_focused ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg ) , window_rounding , ImGuiCorner_TopLeft | ImGuiCorner_TopRight ) ;
// Menu bar
if ( flags & ImGuiWindowFlags_MenuBar )
{
ImRect menu_bar_rect = window - > MenuBarRect ( ) ;
window - > DrawList - > AddRectFilled ( menu_bar_rect . GetTL ( ) , menu_bar_rect . GetBR ( ) , GetColorU32 ( ImGuiCol_MenuBarBg ) , ( flags & ImGuiWindowFlags_NoTitleBar ) ? window_rounding : 0.0f , 1 | 2 ) ;
if ( flags & ImGuiWindowFlags_ShowBorders )
window - > DrawList - > AddLine ( menu_bar_rect . GetBL ( ) - ImVec2 ( 0 , 0 ) , menu_bar_rect . GetBR ( ) - ImVec2 ( 0 , 0 ) , GetColorU32 ( ImGuiCol_Border ) ) ;
window - > DrawList - > AddLine ( menu_bar_rect . GetBL ( ) , menu_bar_rect . GetBR ( ) , GetColorU32 ( ImGuiCol_Border ) ) ;
window - > DrawList - > AddRectFilled ( menu_bar_rect . GetTL ( ) , menu_bar_rect . GetBR ( ) , GetColorU32 ( ImGuiCol_MenuBarBg ) , ( flags & ImGuiWindowFlags_NoTitleBar ) ? window_rounding : 0.0f , ImGuiCorner_TopLeft | ImGuiCorner_TopRight ) ;
}
// Scrollbars
@ -5122,7 +5121,7 @@ bool ImGui::Begin(const char* name, bool* p_open, const ImVec2& size_on_first_us
if ( ButtonBehavior ( bb , id , NULL , NULL ) )
window - > CollapseToggleWanted = true ; // Defer collapsing to next frame as we are too far in the Begin() function
RenderNavHighlight ( bb , id ) ;
RenderCollapseTriangle ( window - > Pos + style . FramePadding , ! window - > Collapsed , 1.0f , true );
RenderCollapseTriangle ( window - > Pos + style . FramePadding , ! window - > Collapsed , 1.0f );
}
// Close button
@ -5259,9 +5258,9 @@ static void Scrollbar(ImGuiWindow* window, bool horizontal)
float window_rounding = ( window - > Flags & ImGuiWindowFlags_ChildWindow ) ? style . ChildWindowRounding : style . WindowRounding ;
int window_rounding_corners ;
if ( horizontal )
window_rounding_corners = 8 | ( other_scrollbar ? 0 : 4 ) ;
window_rounding_corners = ImGuiCorner_BottomLeft | ( other_scrollbar ? 0 : ImGuiCorner_BottomRight ) ;
else
window_rounding_corners = ( ( ( window - > Flags & ImGuiWindowFlags_NoTitleBar ) & & ! ( window - > Flags & ImGuiWindowFlags_MenuBar ) ) ? 2 : 0 ) | ( other_scrollbar ? 0 : 4 ) ;
window_rounding_corners = ( ( ( window - > Flags & ImGuiWindowFlags_NoTitleBar ) & & ! ( window - > Flags & ImGuiWindowFlags_MenuBar ) ) ? ImGuiCorner_TopRight : 0 ) | ( other_scrollbar ? 0 : ImGuiCorner_BottomRight ) ;
window - > DrawList - > AddRectFilled ( bb . Min , bb . Max , ImGui : : GetColorU32 ( ImGuiCol_ScrollbarBg ) , window_rounding , window_rounding_corners ) ;
bb . Expand ( ImVec2 ( - ImClamp ( ( float ) ( int ) ( ( bb . Max . x - bb . Min . x - 2.0f ) * 0.5f ) , 0.0f , 3.0f ) , - ImClamp ( ( float ) ( int ) ( ( bb . Max . y - bb . Min . y - 2.0f ) * 0.5f ) , 0.0f , 3.0f ) ) ) ;
@ -6689,8 +6688,7 @@ void ImGui::LogFinish()
}
if ( g . LogClipboard - > size ( ) > 1 )
{
if ( g . IO . SetClipboardTextFn )
g . IO . SetClipboardTextFn ( g . LogClipboard - > begin ( ) ) ;
SetClipboardText ( g . LogClipboard - > begin ( ) ) ;
g . LogClipboard - > clear ( ) ;
}
}
@ -6840,7 +6838,7 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
{
// Framed type
RenderFrame ( bb . Min , bb . Max , col , true , style . FrameRounding ) ;
RenderCollapseTriangle ( bb . Min + padding + ImVec2 ( 0.0f , text_base_offset_y ) , is_open , 1.0f , true );
RenderCollapseTriangle ( bb . Min + padding + ImVec2 ( 0.0f , text_base_offset_y ) , is_open , 1.0f );
if ( g . LogEnabled )
{
// NB: '##' is normally used to hide text (as a library-wide feature), so we need to specify the text range to make sure the ## aren't stripped out here.
@ -6864,7 +6862,7 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
if ( flags & ImGuiTreeNodeFlags_Bullet )
RenderBullet ( bb . Min + ImVec2 ( text_offset_x * 0.5f , g . FontSize * 0.50f + text_base_offset_y ) ) ;
else if ( ! ( flags & ImGuiTreeNodeFlags_Leaf ) )
RenderCollapseTriangle ( bb . Min + ImVec2 ( padding . x , g . FontSize * 0.15f + text_base_offset_y ) , is_open , 0.70f , false );
RenderCollapseTriangle ( bb . Min + ImVec2 ( padding . x , g . FontSize * 0.15f + text_base_offset_y ) , is_open , 0.70f );
if ( g . LogEnabled )
LogRenderedText ( text_pos , " > " ) ;
RenderText ( text_pos , label , label_end , false ) ;
@ -8015,59 +8013,62 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge
RenderFrame ( frame_bb . Min , frame_bb . Max , GetColorU32 ( ImGuiCol_FrameBg ) , true , style . FrameRounding ) ;
int res_w = ImMin ( ( int ) graph_size . x , values_count ) + ( ( plot_type = = ImGuiPlotType_Lines ) ? - 1 : 0 ) ;
int item_count = values_count + ( ( plot_type = = ImGuiPlotType_Lines ) ? - 1 : 0 ) ;
// Tooltip on hover
int v_hovered = - 1 ;
if ( IsHovered ( inner_bb , 0 ) )
if ( values_count > 0 )
{
const float t = ImClamp ( ( g . IO . MousePos . x - inner_bb . Min . x ) / ( inner_bb . Max . x - inner_bb . Min . x ) , 0.0f , 0.9999f ) ;
const int v_idx = ( int ) ( t * item_count ) ;
IM_ASSERT ( v_idx > = 0 & & v_idx < values_count ) ;
int res_w = ImMin ( ( int ) graph_size . x , values_count ) + ( ( plot_type = = ImGuiPlotType_Lines ) ? - 1 : 0 ) ;
int item_count = values_count + ( ( plot_type = = ImGuiPlotType_Lines ) ? - 1 : 0 ) ;
const float v0 = values_getter ( data , ( v_idx + values_offset ) % values_count ) ;
const float v1 = values_getter ( data , ( v_idx + 1 + values_offset ) % values_count ) ;
if ( plot_type = = ImGuiPlotType_Lines )
SetTooltip ( " %d: %8.4g \n %d: %8.4g " , v_idx , v0 , v_idx + 1 , v1 ) ;
else if ( plot_type = = ImGuiPlotType_Histogram )
SetTooltip ( " %d: %8.4g " , v_idx , v0 ) ;
v_hovered = v_idx ;
}
// Tooltip on hover
int v_hovered = - 1 ;
if ( IsHovered ( inner_bb , 0 ) )
{
const float t = ImClamp ( ( g . IO . MousePos . x - inner_bb . Min . x ) / ( inner_bb . Max . x - inner_bb . Min . x ) , 0.0f , 0.9999f ) ;
const int v_idx = ( int ) ( t * item_count ) ;
IM_ASSERT ( v_idx > = 0 & & v_idx < values_count ) ;
const float t_step = 1.0f / ( float ) res_w ;
const float v0 = values_getter ( data , ( v_idx + values_offset ) % values_count ) ;
const float v1 = values_getter ( data , ( v_idx + 1 + values_offset ) % values_count ) ;
if ( plot_type = = ImGuiPlotType_Lines )
SetTooltip ( " %d: %8.4g \n %d: %8.4g " , v_idx , v0 , v_idx + 1 , v1 ) ;
else if ( plot_type = = ImGuiPlotType_Histogram )
SetTooltip ( " %d: %8.4g " , v_idx , v0 ) ;
v_hovered = v_idx ;
}
float v0 = values_getter ( data , ( 0 + values_offset ) % values_count ) ;
float t0 = 0.0f ;
ImVec2 tp0 = ImVec2 ( t0 , 1.0f - ImSaturate ( ( v0 - scale_min ) / ( scale_max - scale_min ) ) ) ; // Point in the normalized space of our target rectangle
const float t_step = 1.0f / ( float ) res_w ;
const ImU32 col_base = GetColorU32 ( ( plot_type = = ImGuiPlotType_Lines ) ? ImGuiCol_PlotLines : ImGuiCol_PlotHistogram ) ;
const ImU32 col_hovered = GetColorU32 ( ( plot_type = = ImGuiPlotType_Lines ) ? ImGuiCol_PlotLinesHovered : ImGuiCol_PlotHistogramHovered ) ;
float v0 = values_getter ( data , ( 0 + values_offset ) % values_count ) ;
float t0 = 0.0f ;
ImVec2 tp0 = ImVec2 ( t0 , 1.0f - ImSaturate ( ( v0 - scale_min ) / ( scale_max - scale_min ) ) ) ; // Point in the normalized space of our target rectangle
for ( int n = 0 ; n < res_w ; n + + )
{
const float t1 = t0 + t_step ;
const int v1_idx = ( int ) ( t0 * item_count + 0.5f ) ;
IM_ASSERT ( v1_idx > = 0 & & v1_idx < values_count ) ;
const float v1 = values_getter ( data , ( v1_idx + values_offset + 1 ) % values_count ) ;
const ImVec2 tp1 = ImVec2 ( t1 , 1.0f - ImSaturate ( ( v1 - scale_min ) / ( scale_max - scale_min ) ) ) ;
const ImU32 col_base = GetColorU32 ( ( plot_type = = ImGuiPlotType_Lines ) ? ImGuiCol_PlotLines : ImGuiCol_PlotHistogram ) ;
const ImU32 col_hovered = GetColorU32 ( ( plot_type = = ImGuiPlotType_Lines ) ? ImGuiCol_PlotLinesHovered : ImGuiCol_PlotHistogramHovered ) ;
// NB: Draw calls are merged together by the DrawList system. Still, we should render our batch are lower level to save a bit of CPU.
ImVec2 pos0 = ImLerp ( inner_bb . Min , inner_bb . Max , tp0 ) ;
ImVec2 pos1 = ImLerp ( inner_bb . Min , inner_bb . Max , ( plot_type = = ImGuiPlotType_Lines ) ? tp1 : ImVec2 ( tp1 . x , 1.0f ) ) ;
if ( plot_type = = ImGuiPlotType_Lines )
{
window - > DrawList - > AddLine ( pos0 , pos1 , v_hovered = = v1_idx ? col_hovered : col_base ) ;
}
else if ( plot_type = = ImGuiPlotType_Histogram )
for ( int n = 0 ; n < res_w ; n + + )
{
if ( pos1 . x > = pos0 . x + 2.0f )
pos1 . x - = 1.0f ;
window - > DrawList - > AddRectFilled ( pos0 , pos1 , v_hovered = = v1_idx ? col_hovered : col_base ) ;
}
const float t1 = t0 + t_step ;
const int v1_idx = ( int ) ( t0 * item_count + 0.5f ) ;
IM_ASSERT ( v1_idx > = 0 & & v1_idx < values_count ) ;
const float v1 = values_getter ( data , ( v1_idx + values_offset + 1 ) % values_count ) ;
const ImVec2 tp1 = ImVec2 ( t1 , 1.0f - ImSaturate ( ( v1 - scale_min ) / ( scale_max - scale_min ) ) ) ;
t0 = t1 ;
tp0 = tp1 ;
// NB: Draw calls are merged together by the DrawList system. Still, we should render our batch are lower level to save a bit of CPU.
ImVec2 pos0 = ImLerp ( inner_bb . Min , inner_bb . Max , tp0 ) ;
ImVec2 pos1 = ImLerp ( inner_bb . Min , inner_bb . Max , ( plot_type = = ImGuiPlotType_Lines ) ? tp1 : ImVec2 ( tp1 . x , 1.0f ) ) ;
if ( plot_type = = ImGuiPlotType_Lines )
{
window - > DrawList - > AddLine ( pos0 , pos1 , v_hovered = = v1_idx ? col_hovered : col_base ) ;
}
else if ( plot_type = = ImGuiPlotType_Histogram )
{
if ( pos1 . x > = pos0 . x + 2.0f )
pos1 . x - = 1.0f ;
window - > DrawList - > AddRectFilled ( pos0 , pos1 , v_hovered = = v1_idx ? col_hovered : col_base ) ;
}
t0 = t1 ;
tp0 = tp1 ;
}
}
// Text overlay
@ -8365,12 +8366,12 @@ static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, STB_TEXTEDIT_STRING* ob
static bool is_separator ( unsigned int c ) { return ImCharIsSpace ( c ) | | c = = ' , ' | | c = = ' ; ' | | c = = ' ( ' | | c = = ' ) ' | | c = = ' { ' | | c = = ' } ' | | c = = ' [ ' | | c = = ' ] ' | | c = = ' | ' ; }
static int is_word_boundary_from_right ( STB_TEXTEDIT_STRING * obj , int idx ) { return idx > 0 ? ( is_separator ( obj - > Text [ idx - 1 ] ) & & ! is_separator ( obj - > Text [ idx ] ) ) : 1 ; }
static int STB_TEXTEDIT_MOVEWORDLEFT_IMPL ( STB_TEXTEDIT_STRING * obj , int idx ) { while ( idx > = 0 & & ! is_word_boundary_from_right ( obj , idx ) ) idx - - ; return idx < 0 ? 0 : idx ; }
static int STB_TEXTEDIT_MOVEWORDLEFT_IMPL ( STB_TEXTEDIT_STRING * obj , int idx ) { idx - - ; while ( idx > = 0 & & ! is_word_boundary_from_right ( obj , idx ) ) idx - - ; return idx < 0 ? 0 : idx ; }
# ifdef __APPLE__ // FIXME: Move setting to IO structure
static int is_word_boundary_from_left ( STB_TEXTEDIT_STRING * obj , int idx ) { return idx > 0 ? ( ! is_separator ( obj - > Text [ idx - 1 ] ) & & is_separator ( obj - > Text [ idx ] ) ) : 1 ; }
static int STB_TEXTEDIT_MOVEWORDRIGHT_IMPL ( STB_TEXTEDIT_STRING * obj , int idx ) { int len = obj - > CurLenW ; while ( idx < len & & ! is_word_boundary_from_left ( obj , idx ) ) idx + + ; return idx > len ? len : idx ; }
static int STB_TEXTEDIT_MOVEWORDRIGHT_IMPL ( STB_TEXTEDIT_STRING * obj , int idx ) { idx + + ; int len = obj - > CurLenW ; while ( idx < len & & ! is_word_boundary_from_left ( obj , idx ) ) idx + + ; return idx > len ? len : idx ; }
# else
static int STB_TEXTEDIT_MOVEWORDRIGHT_IMPL ( STB_TEXTEDIT_STRING * obj , int idx ) { int len = obj - > CurLenW ; while ( idx < len & & ! is_word_boundary_from_right ( obj , idx ) ) idx + + ; return idx > len ? len : idx ; }
static int STB_TEXTEDIT_MOVEWORDRIGHT_IMPL ( STB_TEXTEDIT_STRING * obj , int idx ) { idx + + ; int len = obj - > CurLenW ; while ( idx < len & & ! is_word_boundary_from_right ( obj , idx ) ) idx + + ; return idx > len ? len : idx ; }
# endif
# define STB_TEXTEDIT_MOVEWORDLEFT STB_TEXTEDIT_MOVEWORDLEFT_IMPL // They need to be #define for stb_textedit.h
# define STB_TEXTEDIT_MOVEWORDRIGHT STB_TEXTEDIT_MOVEWORDRIGHT_IMPL
@ -8801,7 +8802,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
const int ie = edit_state . HasSelection ( ) ? ImMax ( edit_state . StbState . select_start , edit_state . StbState . select_end ) : edit_state . CurLenW ;
edit_state . TempTextBuffer . resize ( ( ie - ib ) * 4 + 1 ) ;
ImTextStrToUtf8 ( edit_state . TempTextBuffer . Data , edit_state . TempTextBuffer . Size , edit_state . Text . Data + ib , edit_state . Text . Data + ie ) ;
io. SetClipboardTextFn ( edit_state . TempTextBuffer . Data ) ;
SetClipboardText( edit_state . TempTextBuffer . Data ) ;
}
if ( cut )
@ -8813,7 +8814,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
else if ( is_shortcut_key_only & & IsKeyPressedMap ( ImGuiKey_V ) & & is_editable )
{
// Paste
if ( const char * clipboard = io. GetClipboardTextFn ? io . GetClipboardTextFn ( ) : NULL )
if ( const char * clipboard = GetClipboardText( ) )
{
// Filter pasted buffer
const int clipboard_len = ( int ) strlen ( clipboard ) ;
@ -9198,7 +9199,7 @@ bool ImGui::InputFloat(const char* label, float* v, float step, float step_fast,
if ( decimal_precision < 0 )
strcpy ( display_format , " %f " ) ; // Ideally we'd have a minimum decimal precision of 1 to visually denote that this is a float, while hiding non-significant digits? %f doesn't have a minimum of 1
else
ImFormatString ( display_format , 16 , " %%.%df " , decimal_precision ) ;
ImFormatString ( display_format , IM_ARRAYSIZE ( display_format ) , " %%.%df " , decimal_precision ) ;
return InputScalarEx ( label , ImGuiDataType_Float , ( void * ) v , ( void * ) ( step > 0.0f ? & step : NULL ) , ( void * ) ( step_fast > 0.0f ? & step_fast : NULL ) , display_format , extra_flags ) ;
}
@ -10089,8 +10090,8 @@ void ImGui::Separator()
if ( ! window - > DC . GroupStack . empty ( ) )
x1 + = window - > DC . IndentX ;
const ImRect bb ( ImVec2 ( x1 , window - > DC . CursorPos . y ) , ImVec2 ( x2 , window - > DC . CursorPos . y ) ) ;
ItemSize ( ImVec2 ( 0.0f , 0.0f ) ) ; // NB: we don't provide our width so that it doesn't get feed back into AutoFit // FIXME: Height should be 1.0f not 0.0f ?
const ImRect bb ( ImVec2 ( x1 , window - > DC . CursorPos . y ) , ImVec2 ( x2 , window - > DC . CursorPos . y + 1.0f ) ) ;
ItemSize ( ImVec2 ( 0.0f , 0.0f ) ) ; // NB: we don't provide our width so that it doesn't get feed back into AutoFit , we don't provide height to not alter layout.
if ( ! ItemAdd ( bb , NULL ) )
{
if ( window - > DC . ColumnsCount > 1 )
@ -10098,7 +10099,7 @@ void ImGui::Separator()
return ;
}
window - > DrawList - > AddLine ( bb . Min , bb. Max , GetColorU32 ( ImGuiCol_Border ) ) ;
window - > DrawList - > AddLine ( bb . Min , ImVec2( bb. Max . x , bb . Min . y ) , GetColorU32 ( ImGuiCol_Border ) ) ;
ImGuiContext & g = * GImGui ;
if ( g . LogEnabled )
@ -10562,7 +10563,7 @@ void ImGui::ValueColor(const char* prefix, ImU32 v)
# pragma comment(lib, "user32")
# endif
static const char * GetClipboardTextFn_DefaultImpl ( )
static const char * GetClipboardTextFn_DefaultImpl ( void * )
{
static ImVector < char > buf_local ;
buf_local . clear ( ) ;
@ -10582,7 +10583,7 @@ static const char* GetClipboardTextFn_DefaultImpl()
return buf_local . Data ;
}
static void SetClipboardTextFn_DefaultImpl ( const char * text )
static void SetClipboardTextFn_DefaultImpl ( void * , const char * text )
{
if ( ! OpenClipboard ( NULL ) )
return ;
@ -10601,14 +10602,14 @@ static void SetClipboardTextFn_DefaultImpl(const char* text)
# else
// Local ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers
static const char * GetClipboardTextFn_DefaultImpl ( )
static const char * GetClipboardTextFn_DefaultImpl ( void * )
{
ImGuiContext & g = * GImGui ;
return g . PrivateClipboard . empty ( ) ? NULL : g . PrivateClipboard . begin ( ) ;
}
// Local ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers
static void SetClipboardTextFn_DefaultImpl ( const char * text )
static void SetClipboardTextFn_DefaultImpl ( void * , const char * text )
{
ImGuiContext & g = * GImGui ;
g . PrivateClipboard . clear ( ) ;