@ -713,8 +713,8 @@ CODE
you to animate labels . For example you may want to include varying information in a window title bar ,
you to animate labels . For example you may want to include varying information in a window title bar ,
but windows are uniquely identified by their ID . Use " ### " to pass a label that isn ' t part of ID :
but windows are uniquely identified by their ID . Use " ### " to pass a label that isn ' t part of ID :
Button ( " Hello###ID " ) ; // Label = "Hello", ID = hash of (..., " ID")
Button ( " Hello###ID " ) ; // Label = "Hello", ID = hash of (..., " ### ID")
Button ( " World###ID " ) ; // Label = "World", ID = hash of (..., " ID") // Same as above, even though the label looks different
Button ( " World###ID " ) ; // Label = "World", ID = hash of (..., " ### ID") // Same as above, even though the label looks different
sprintf ( buf , " My game (%f FPS)###MyGame " , fps ) ;
sprintf ( buf , " My game (%f FPS)###MyGame " , fps ) ;
Begin ( buf ) ; // Variable title, ID = hash of "MyGame"
Begin ( buf ) ; // Variable title, ID = hash of "MyGame"
@ -1043,7 +1043,7 @@ static void UpdateManualResize(ImGuiWindow* window, const ImVec2& si
static void EndFrameDrawDimmedBackgrounds ( ) ;
static void EndFrameDrawDimmedBackgrounds ( ) ;
// Viewports
// Viewports
const ImGuiID IMGUI_VIEWPORT_DEFAULT_ID = 0x11111111 ; // Using an arbitrary constant instead of e.g. ImHash ("ViewportDefault", 0); so it's easier to spot in the debugger. The exact value doesn't matter.
const ImGuiID IMGUI_VIEWPORT_DEFAULT_ID = 0x11111111 ; // Using an arbitrary constant instead of e.g. ImHash Str ("ViewportDefault", 0); so it's easier to spot in the debugger. The exact value doesn't matter.
static ImGuiViewportP * AddUpdateViewport ( ImGuiWindow * window , ImGuiID id , const ImVec2 & platform_pos , const ImVec2 & size , ImGuiViewportFlags flags ) ;
static ImGuiViewportP * AddUpdateViewport ( ImGuiWindow * window , ImGuiID id , const ImVec2 & platform_pos , const ImVec2 & size , ImGuiViewportFlags flags ) ;
static void UpdateViewportsNewFrame ( ) ;
static void UpdateViewportsNewFrame ( ) ;
static void UpdateViewportsEndFrame ( ) ;
static void UpdateViewportsEndFrame ( ) ;
@ -1458,45 +1458,69 @@ int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args)
}
}
# endif // #ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS
# endif // #ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS
// Pass data_size == 0 for zero-terminated strings, data_size > 0 for non-string data.
// CRC32 needs a 1KB lookup table (not cache friendly)
// Pay attention that data_size==0 will yield different results than passing strlen(data) because the zero-terminated codepath handles ###.
// Although the code to generate the table is simple and shorter than the table itself, using a const table allows us to easily:
// This should technically be split into two distinct functions (ImHashData/ImHashStr), perhaps once we remove the silly static variable.
// - avoid an unnecessary branch/memory tap, - keep the ImHashXXX functions usable by static constructors, - make it thread-safe.
static const ImU32 GCrc32LookupTable [ 256 ] =
{
0x00000000 , 0x77073096 , 0xEE0E612C , 0x990951BA , 0x076DC419 , 0x706AF48F , 0xE963A535 , 0x9E6495A3 , 0x0EDB8832 , 0x79DCB8A4 , 0xE0D5E91E , 0x97D2D988 , 0x09B64C2B , 0x7EB17CBD , 0xE7B82D07 , 0x90BF1D91 ,
0x1DB71064 , 0x6AB020F2 , 0xF3B97148 , 0x84BE41DE , 0x1ADAD47D , 0x6DDDE4EB , 0xF4D4B551 , 0x83D385C7 , 0x136C9856 , 0x646BA8C0 , 0xFD62F97A , 0x8A65C9EC , 0x14015C4F , 0x63066CD9 , 0xFA0F3D63 , 0x8D080DF5 ,
0x3B6E20C8 , 0x4C69105E , 0xD56041E4 , 0xA2677172 , 0x3C03E4D1 , 0x4B04D447 , 0xD20D85FD , 0xA50AB56B , 0x35B5A8FA , 0x42B2986C , 0xDBBBC9D6 , 0xACBCF940 , 0x32D86CE3 , 0x45DF5C75 , 0xDCD60DCF , 0xABD13D59 ,
0x26D930AC , 0x51DE003A , 0xC8D75180 , 0xBFD06116 , 0x21B4F4B5 , 0x56B3C423 , 0xCFBA9599 , 0xB8BDA50F , 0x2802B89E , 0x5F058808 , 0xC60CD9B2 , 0xB10BE924 , 0x2F6F7C87 , 0x58684C11 , 0xC1611DAB , 0xB6662D3D ,
0x76DC4190 , 0x01DB7106 , 0x98D220BC , 0xEFD5102A , 0x71B18589 , 0x06B6B51F , 0x9FBFE4A5 , 0xE8B8D433 , 0x7807C9A2 , 0x0F00F934 , 0x9609A88E , 0xE10E9818 , 0x7F6A0DBB , 0x086D3D2D , 0x91646C97 , 0xE6635C01 ,
0x6B6B51F4 , 0x1C6C6162 , 0x856530D8 , 0xF262004E , 0x6C0695ED , 0x1B01A57B , 0x8208F4C1 , 0xF50FC457 , 0x65B0D9C6 , 0x12B7E950 , 0x8BBEB8EA , 0xFCB9887C , 0x62DD1DDF , 0x15DA2D49 , 0x8CD37CF3 , 0xFBD44C65 ,
0x4DB26158 , 0x3AB551CE , 0xA3BC0074 , 0xD4BB30E2 , 0x4ADFA541 , 0x3DD895D7 , 0xA4D1C46D , 0xD3D6F4FB , 0x4369E96A , 0x346ED9FC , 0xAD678846 , 0xDA60B8D0 , 0x44042D73 , 0x33031DE5 , 0xAA0A4C5F , 0xDD0D7CC9 ,
0x5005713C , 0x270241AA , 0xBE0B1010 , 0xC90C2086 , 0x5768B525 , 0x206F85B3 , 0xB966D409 , 0xCE61E49F , 0x5EDEF90E , 0x29D9C998 , 0xB0D09822 , 0xC7D7A8B4 , 0x59B33D17 , 0x2EB40D81 , 0xB7BD5C3B , 0xC0BA6CAD ,
0xEDB88320 , 0x9ABFB3B6 , 0x03B6E20C , 0x74B1D29A , 0xEAD54739 , 0x9DD277AF , 0x04DB2615 , 0x73DC1683 , 0xE3630B12 , 0x94643B84 , 0x0D6D6A3E , 0x7A6A5AA8 , 0xE40ECF0B , 0x9309FF9D , 0x0A00AE27 , 0x7D079EB1 ,
0xF00F9344 , 0x8708A3D2 , 0x1E01F268 , 0x6906C2FE , 0xF762575D , 0x806567CB , 0x196C3671 , 0x6E6B06E7 , 0xFED41B76 , 0x89D32BE0 , 0x10DA7A5A , 0x67DD4ACC , 0xF9B9DF6F , 0x8EBEEFF9 , 0x17B7BE43 , 0x60B08ED5 ,
0xD6D6A3E8 , 0xA1D1937E , 0x38D8C2C4 , 0x4FDFF252 , 0xD1BB67F1 , 0xA6BC5767 , 0x3FB506DD , 0x48B2364B , 0xD80D2BDA , 0xAF0A1B4C , 0x36034AF6 , 0x41047A60 , 0xDF60EFC3 , 0xA867DF55 , 0x316E8EEF , 0x4669BE79 ,
0xCB61B38C , 0xBC66831A , 0x256FD2A0 , 0x5268E236 , 0xCC0C7795 , 0xBB0B4703 , 0x220216B9 , 0x5505262F , 0xC5BA3BBE , 0xB2BD0B28 , 0x2BB45A92 , 0x5CB36A04 , 0xC2D7FFA7 , 0xB5D0CF31 , 0x2CD99E8B , 0x5BDEAE1D ,
0x9B64C2B0 , 0xEC63F226 , 0x756AA39C , 0x026D930A , 0x9C0906A9 , 0xEB0E363F , 0x72076785 , 0x05005713 , 0x95BF4A82 , 0xE2B87A14 , 0x7BB12BAE , 0x0CB61B38 , 0x92D28E9B , 0xE5D5BE0D , 0x7CDCEFB7 , 0x0BDBDF21 ,
0x86D3D2D4 , 0xF1D4E242 , 0x68DDB3F8 , 0x1FDA836E , 0x81BE16CD , 0xF6B9265B , 0x6FB077E1 , 0x18B74777 , 0x88085AE6 , 0xFF0F6A70 , 0x66063BCA , 0x11010B5C , 0x8F659EFF , 0xF862AE69 , 0x616BFFD3 , 0x166CCF45 ,
0xA00AE278 , 0xD70DD2EE , 0x4E048354 , 0x3903B3C2 , 0xA7672661 , 0xD06016F7 , 0x4969474D , 0x3E6E77DB , 0xAED16A4A , 0xD9D65ADC , 0x40DF0B66 , 0x37D83BF0 , 0xA9BCAE53 , 0xDEBB9EC5 , 0x47B2CF7F , 0x30B5FFE9 ,
0xBDBDF21C , 0xCABAC28A , 0x53B39330 , 0x24B4A3A6 , 0xBAD03605 , 0xCDD70693 , 0x54DE5729 , 0x23D967BF , 0xB3667A2E , 0xC4614AB8 , 0x5D681B02 , 0x2A6F2B94 , 0xB40BBE37 , 0xC30C8EA1 , 0x5A05DF1B , 0x2D02EF8D ,
} ;
// Known size hash
// It is ok to call ImHashData on a string with known length but the ### operator won't be supported.
// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements.
// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements.
ImU32 ImHash ( const void * data , int data_size , ImU32 seed )
ImU32 ImHash Data ( const void * data _p, size_ t data_size , ImU32 seed )
{
{
static ImU32 crc32_lut [ 256 ] = { 0 } ;
ImU32 crc = ~ seed ;
if ( ! crc32_lut [ 1 ] )
const unsigned char * data = ( const unsigned char * ) data_p ;
{
const ImU32 * crc32_lut = GCrc32LookupTable ;
const ImU32 polynomial = 0xEDB88320 ;
while ( data_size - - ! = 0 )
for ( ImU32 i = 0 ; i < 256 ; i + + )
crc = ( crc > > 8 ) ^ crc32_lut [ ( crc & 0xFF ) ^ * data + + ] ;
{
return ~ crc ;
ImU32 crc = i ;
}
for ( ImU32 j = 0 ; j < 8 ; j + + )
crc = ( crc > > 1 ) ^ ( ImU32 ( - int ( crc & 1 ) ) & polynomial ) ;
crc32_lut [ i ] = crc ;
}
}
// Zero-terminated string hash, with support for ### to reset back to seed value
// We support a syntax of "label###id" where only "###id" is included in the hash, and only "label" gets displayed.
// Because this syntax is rarely used we are optimizing for the common case.
// - If we reach ### in the string we discard the hash so far and reset to the seed.
// - We don't do 'current += 2; continue;' after handling ### to keep the code smaller/faster (measured ~10% diff in Debug build)
// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements.
ImU32 ImHashStr ( const char * data , size_t data_size , ImU32 seed )
{
seed = ~ seed ;
seed = ~ seed ;
ImU32 crc = seed ;
ImU32 crc = seed ;
const unsigned char * current = ( const unsigned char * ) data ;
const unsigned char * src = ( const unsigned char * ) data ;
const ImU32 * crc32_lut = GCrc32LookupTable ;
if ( data_size > 0 )
if ( data_size ! = 0 )
{
while ( data_size - - ! = 0 )
{
{
// Known size
unsigned char c = * src + + ;
while ( data_size - - )
if ( c = = ' # ' & & src [ 0 ] = = ' # ' & & src [ 1 ] = = ' # ' )
crc = ( crc > > 8 ) ^ crc32_lut [ ( crc & 0xFF ) ^ * current + + ] ;
crc = seed ;
crc = ( crc > > 8 ) ^ crc32_lut [ ( crc & 0xFF ) ^ c ] ;
}
}
}
else
else
{
{
// Zero-terminated string
while ( unsigned char c = * src + + )
while ( unsigned char c = * current + + )
{
{
// We support a syntax of "label###id" where only "###id" is included in the hash, and only "label" gets displayed.
if ( c = = ' # ' & & src [ 0 ] = = ' # ' & & src [ 1 ] = = ' # ' )
// Because this syntax is rarely used we are optimizing for the common case.
// - If we reach ### in the string we discard the hash so far and reset to the seed.
// - We don't do 'current += 2; continue;' after handling ### to keep the code smaller.
if ( c = = ' # ' & & current [ 0 ] = = ' # ' & & current [ 1 ] = = ' # ' )
crc = seed ;
crc = seed ;
crc = ( crc > > 8 ) ^ crc32_lut [ ( crc & 0xFF ) ^ c ] ;
crc = ( crc > > 8 ) ^ crc32_lut [ ( crc & 0xFF ) ^ c ] ;
}
}
@ -2122,6 +2146,32 @@ bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const
char ImGuiTextBuffer : : EmptyString [ 1 ] = { 0 } ;
char ImGuiTextBuffer : : EmptyString [ 1 ] = { 0 } ;
void ImGuiTextBuffer : : append ( const char * str , const char * str_end )
{
int len = str_end ? ( int ) ( str_end - str ) : ( int ) strlen ( str ) ;
// Add zero-terminator the first time
const int write_off = ( Buf . Size ! = 0 ) ? Buf . Size : 1 ;
const int needed_sz = write_off + len ;
if ( write_off + len > = Buf . Capacity )
{
int new_capacity = Buf . Capacity * 2 ;
Buf . reserve ( needed_sz > new_capacity ? needed_sz : new_capacity ) ;
}
Buf . resize ( needed_sz ) ;
memcpy ( & Buf [ write_off - 1 ] , str , ( size_t ) len ) ;
Buf [ write_off - 1 + len ] = 0 ;
}
void ImGuiTextBuffer : : appendf ( const char * fmt , . . . )
{
va_list args ;
va_start ( args , fmt ) ;
appendfv ( fmt , args ) ;
va_end ( args ) ;
}
// Helper: Text buffer for logging/accumulating text
// Helper: Text buffer for logging/accumulating text
void ImGuiTextBuffer : : appendfv ( const char * fmt , va_list args )
void ImGuiTextBuffer : : appendfv ( const char * fmt , va_list args )
{
{
@ -2140,8 +2190,8 @@ void ImGuiTextBuffer::appendfv(const char* fmt, va_list args)
const int needed_sz = write_off + len ;
const int needed_sz = write_off + len ;
if ( write_off + len > = Buf . Capacity )
if ( write_off + len > = Buf . Capacity )
{
{
int double _capacity = Buf . Capacity * 2 ;
int new _capacity = Buf . Capacity * 2 ;
Buf . reserve ( needed_sz > double_capacity ? needed_sz : double _capacity) ;
Buf . reserve ( needed_sz > new_capacity ? needed_sz : new _capacity) ;
}
}
Buf . resize ( needed_sz ) ;
Buf . resize ( needed_sz ) ;
@ -2149,14 +2199,6 @@ void ImGuiTextBuffer::appendfv(const char* fmt, va_list args)
va_end ( args_copy ) ;
va_end ( args_copy ) ;
}
}
void ImGuiTextBuffer : : appendf ( const char * fmt , . . . )
{
va_list args ;
va_start ( args , fmt ) ;
appendfv ( fmt , args ) ;
va_end ( args ) ;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// [SECTION] ImGuiListClipper
// [SECTION] ImGuiListClipper
// This is currently not as flexible/powerful as it should be, needs some rework (see TODO)
// This is currently not as flexible/powerful as it should be, needs some rework (see TODO)
@ -2475,7 +2517,7 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name)
: DrawListInst ( & context - > DrawListSharedData )
: DrawListInst ( & context - > DrawListSharedData )
{
{
Name = ImStrdup ( name ) ;
Name = ImStrdup ( name ) ;
ID = ImHash ( name , 0 ) ;
ID = ImHash Str ( name , 0 ) ;
IDStack . push_back ( ID ) ;
IDStack . push_back ( ID ) ;
Flags = FlagsPreviousFrame = ImGuiWindowFlags_None ;
Flags = FlagsPreviousFrame = ImGuiWindowFlags_None ;
Viewport = NULL ;
Viewport = NULL ;
@ -2549,7 +2591,7 @@ ImGuiWindow::~ImGuiWindow()
ImGuiID ImGuiWindow : : GetID ( const char * str , const char * str_end )
ImGuiID ImGuiWindow : : GetID ( const char * str , const char * str_end )
{
{
ImGuiID seed = IDStack . back ( ) ;
ImGuiID seed = IDStack . back ( ) ;
ImGuiID id = ImHash ( str , str_end ? ( int ) ( str_end - str ) : 0 , seed ) ;
ImGuiID id = ImHash Str ( str , str_end ? ( str_end - str ) : 0 , seed ) ;
ImGui : : KeepAliveID ( id ) ;
ImGui : : KeepAliveID ( id ) ;
return id ;
return id ;
}
}
@ -2557,7 +2599,7 @@ ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end)
ImGuiID ImGuiWindow : : GetID ( const void * ptr )
ImGuiID ImGuiWindow : : GetID ( const void * ptr )
{
{
ImGuiID seed = IDStack . back ( ) ;
ImGuiID seed = IDStack . back ( ) ;
ImGuiID id = ImHash ( & ptr , sizeof ( void * ) , seed ) ;
ImGuiID id = ImHash Data ( & ptr , sizeof ( void * ) , seed ) ;
ImGui : : KeepAliveID ( id ) ;
ImGui : : KeepAliveID ( id ) ;
return id ;
return id ;
}
}
@ -2565,13 +2607,13 @@ ImGuiID ImGuiWindow::GetID(const void* ptr)
ImGuiID ImGuiWindow : : GetIDNoKeepAlive ( const char * str , const char * str_end )
ImGuiID ImGuiWindow : : GetIDNoKeepAlive ( const char * str , const char * str_end )
{
{
ImGuiID seed = IDStack . back ( ) ;
ImGuiID seed = IDStack . back ( ) ;
return ImHash ( str , str_end ? ( int ) ( str_end - str ) : 0 , seed ) ;
return ImHash Str ( str , str_end ? ( str_end - str ) : 0 , seed ) ;
}
}
ImGuiID ImGuiWindow : : GetIDNoKeepAlive ( const void * ptr )
ImGuiID ImGuiWindow : : GetIDNoKeepAlive ( const void * ptr )
{
{
ImGuiID seed = IDStack . back ( ) ;
ImGuiID seed = IDStack . back ( ) ;
return ImHash ( & ptr , sizeof ( void * ) , seed ) ;
return ImHash Data ( & ptr , sizeof ( void * ) , seed ) ;
}
}
// This is only used in rare/specific situations to manufacture an ID out of nowhere.
// This is only used in rare/specific situations to manufacture an ID out of nowhere.
@ -2579,7 +2621,7 @@ ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs)
{
{
ImGuiID seed = IDStack . back ( ) ;
ImGuiID seed = IDStack . back ( ) ;
const int r_rel [ 4 ] = { ( int ) ( r_abs . Min . x - Pos . x ) , ( int ) ( r_abs . Min . y - Pos . y ) , ( int ) ( r_abs . Max . x - Pos . x ) , ( int ) ( r_abs . Max . y - Pos . y ) } ;
const int r_rel [ 4 ] = { ( int ) ( r_abs . Min . x - Pos . x ) , ( int ) ( r_abs . Min . y - Pos . y ) , ( int ) ( r_abs . Max . x - Pos . x ) , ( int ) ( r_abs . Max . y - Pos . y ) } ;
ImGuiID id = ImHash ( & r_rel , sizeof ( r_rel ) , seed ) ;
ImGuiID id = ImHash Data ( & r_rel , sizeof ( r_rel ) , seed ) ;
ImGui : : KeepAliveID ( id ) ;
ImGui : : KeepAliveID ( id ) ;
return id ;
return id ;
}
}
@ -3636,7 +3678,7 @@ void ImGui::Initialize(ImGuiContext* context)
// Add .ini handle for ImGuiWindow type
// Add .ini handle for ImGuiWindow type
ImGuiSettingsHandler ini_handler ;
ImGuiSettingsHandler ini_handler ;
ini_handler . TypeName = " Window " ;
ini_handler . TypeName = " Window " ;
ini_handler . TypeHash = ImHash ( " Window " , 0 , 0 ) ;
ini_handler . TypeHash = ImHash Str ( " Window " , 0 ) ;
ini_handler . ReadOpenFn = SettingsHandlerWindow_ReadOpen ;
ini_handler . ReadOpenFn = SettingsHandlerWindow_ReadOpen ;
ini_handler . ReadLineFn = SettingsHandlerWindow_ReadLine ;
ini_handler . ReadLineFn = SettingsHandlerWindow_ReadLine ;
ini_handler . WriteAllFn = SettingsHandlerWindow_WriteAll ;
ini_handler . WriteAllFn = SettingsHandlerWindow_WriteAll ;
@ -3891,7 +3933,11 @@ void ImGui::EndFrame()
IM_ASSERT ( g . FrameScopeActive & & " Forgot to call ImGui::NewFrame()? " ) ;
IM_ASSERT ( g . FrameScopeActive & & " Forgot to call ImGui::NewFrame()? " ) ;
// Notify OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME)
// Notify OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME)
< < < < < < < HEAD
if ( g . PlatformIO . Platform_SetImeInputPos & & ImLengthSqr ( g . PlatformImePos - g . PlatformImeLastPos ) > 0.0001f & & g . PlatformImePosViewport & & g . PlatformImePosViewport - > PlatformWindowCreated )
if ( g . PlatformIO . Platform_SetImeInputPos & & ImLengthSqr ( g . PlatformImePos - g . PlatformImeLastPos ) > 0.0001f & & g . PlatformImePosViewport & & g . PlatformImePosViewport - > PlatformWindowCreated )
= = = = = = =
if ( g . IO . ImeSetInputScreenPosFn & & ( g . PlatformImeLastPos . x = = FLT_MAX | | ImLengthSqr ( g . PlatformImeLastPos - g . PlatformImePos ) > 0.0001f ) )
> > > > > > > master
{
{
g . PlatformIO . Platform_SetImeInputPos ( g . PlatformImePosViewport , g . PlatformImePos ) ;
g . PlatformIO . Platform_SetImeInputPos ( g . PlatformImePosViewport , g . PlatformImePos ) ;
g . PlatformImeLastPos = g . PlatformImePos ;
g . PlatformImeLastPos = g . PlatformImePos ;
@ -4604,7 +4650,7 @@ ImGuiWindow* ImGui::FindWindowByID(ImGuiID id)
ImGuiWindow * ImGui : : FindWindowByName ( const char * name )
ImGuiWindow * ImGui : : FindWindowByName ( const char * name )
{
{
ImGuiID id = ImHash ( name , 0 ) ;
ImGuiID id = ImHash Str ( name , 0 ) ;
return FindWindowByID ( id ) ;
return FindWindowByID ( id ) ;
}
}
@ -6727,71 +6773,74 @@ void ImGui::SetItemDefaultFocus()
void ImGui : : SetStateStorage ( ImGuiStorage * tree )
void ImGui : : SetStateStorage ( ImGuiStorage * tree )
{
{
ImGuiWindow * window = G etCurrentWindow( ) ;
ImGuiWindow * window = G ImGui- > CurrentWindow ;
window - > DC . StateStorage = tree ? tree : & window - > StateStorage ;
window - > DC . StateStorage = tree ? tree : & window - > StateStorage ;
}
}
ImGuiStorage * ImGui : : GetStateStorage ( )
ImGuiStorage * ImGui : : GetStateStorage ( )
{
{
ImGuiWindow * window = G etCurrentWindowRead( ) ;
ImGuiWindow * window = G ImGui- > CurrentWindow ;
return window - > DC . StateStorage ;
return window - > DC . StateStorage ;
}
}
void ImGui : : PushID ( const char * str_id )
void ImGui : : PushID ( const char * str_id )
{
{
ImGuiWindow * window = G etCurrentWindowRead( ) ;
ImGuiWindow * window = G ImGui- > CurrentWindow ;
window - > IDStack . push_back ( window - > GetIDNoKeepAlive ( str_id ) ) ;
window - > IDStack . push_back ( window - > GetIDNoKeepAlive ( str_id ) ) ;
}
}
void ImGui : : PushID ( const char * str_id_begin , const char * str_id_end )
void ImGui : : PushID ( const char * str_id_begin , const char * str_id_end )
{
{
ImGuiWindow * window = G etCurrentWindowRead( ) ;
ImGuiWindow * window = G ImGui- > CurrentWindow ;
window - > IDStack . push_back ( window - > GetIDNoKeepAlive ( str_id_begin , str_id_end ) ) ;
window - > IDStack . push_back ( window - > GetIDNoKeepAlive ( str_id_begin , str_id_end ) ) ;
}
}
void ImGui : : PushID ( const void * ptr_id )
void ImGui : : PushID ( const void * ptr_id )
{
{
ImGuiWindow * window = G etCurrentWindowRead( ) ;
ImGuiWindow * window = G ImGui- > CurrentWindow ;
window - > IDStack . push_back ( window - > GetIDNoKeepAlive ( ptr_id ) ) ;
window - > IDStack . push_back ( window - > GetIDNoKeepAlive ( ptr_id ) ) ;
}
}
void ImGui : : PushID ( int int_id )
void ImGui : : PushID ( int int_id )
{
{
const void * ptr_id = ( void * ) ( intptr_t ) int_id ;
const void * ptr_id = ( void * ) ( intptr_t ) int_id ;
ImGuiWindow * window = G etCurrentWindowRead( ) ;
ImGuiWindow * window = G ImGui- > CurrentWindow ;
window - > IDStack . push_back ( window - > GetIDNoKeepAlive ( ptr_id ) ) ;
window - > IDStack . push_back ( window - > GetIDNoKeepAlive ( ptr_id ) ) ;
}
}
void ImGui : : PopID ( )
void ImGui : : PopID ( )
{
{
ImGuiWindow * window = G etCurrentWindowRead( ) ;
ImGuiWindow * window = G ImGui- > CurrentWindow ;
window - > IDStack . pop_back ( ) ;
window - > IDStack . pop_back ( ) ;
}
}
ImGuiID ImGui : : GetID ( const char * str_id )
ImGuiID ImGui : : GetID ( const char * str_id )
{
{
return GImGui - > CurrentWindow - > GetID ( str_id ) ;
ImGuiWindow * window = GImGui - > CurrentWindow ;
return window - > GetID ( str_id ) ;
}
}
ImGuiID ImGui : : GetID ( const char * str_id_begin , const char * str_id_end )
ImGuiID ImGui : : GetID ( const char * str_id_begin , const char * str_id_end )
{
{
return GImGui - > CurrentWindow - > GetID ( str_id_begin , str_id_end ) ;
ImGuiWindow * window = GImGui - > CurrentWindow ;
return window - > GetID ( str_id_begin , str_id_end ) ;
}
}
ImGuiID ImGui : : GetID ( const void * ptr_id )
ImGuiID ImGui : : GetID ( const void * ptr_id )
{
{
return GImGui - > CurrentWindow - > GetID ( ptr_id ) ;
ImGuiWindow * window = GImGui - > CurrentWindow ;
return window - > GetID ( ptr_id ) ;
}
}
bool ImGui : : IsRectVisible ( const ImVec2 & size )
bool ImGui : : IsRectVisible ( const ImVec2 & size )
{
{
ImGuiWindow * window = G etCurrentWindowRead( ) ;
ImGuiWindow * window = G ImGui- > CurrentWindow ; ;
return window - > ClipRect . Overlaps ( ImRect ( window - > DC . CursorPos , window - > DC . CursorPos + size ) ) ;
return window - > ClipRect . Overlaps ( ImRect ( window - > DC . CursorPos , window - > DC . CursorPos + size ) ) ;
}
}
bool ImGui : : IsRectVisible ( const ImVec2 & rect_min , const ImVec2 & rect_max )
bool ImGui : : IsRectVisible ( const ImVec2 & rect_min , const ImVec2 & rect_max )
{
{
ImGuiWindow * window = G etCurrentWindowRead( ) ;
ImGuiWindow * window = G ImGui- > CurrentWindow ; ;
return window - > ClipRect . Overlaps ( ImRect ( rect_min , rect_max ) ) ;
return window - > ClipRect . Overlaps ( ImRect ( rect_min , rect_max ) ) ;
}
}
@ -7920,7 +7969,7 @@ void ImGui::UpdatePlatformWindows()
{
{
const char * title_begin = window_for_title - > Name ;
const char * title_begin = window_for_title - > Name ;
char * title_end = ( char * ) ( intptr_t ) FindRenderedTextEnd ( title_begin ) ;
char * title_end = ( char * ) ( intptr_t ) FindRenderedTextEnd ( title_begin ) ;
const ImGuiID title_hash = ImHash ( title_begin , ( int ) ( title_end - title_begin ) ) ;
const ImGuiID title_hash = ImHash Str ( title_begin , title_end - title_begin ) ;
if ( viewport - > LastNameHash ! = title_hash )
if ( viewport - > LastNameHash ! = title_hash )
{
{
char title_end_backup_c = * title_end ;
char title_end_backup_c = * title_end ;
@ -9501,7 +9550,7 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags)
else
else
{
{
window = NULL ;
window = NULL ;
source_id = ImHash ( " #SourceExtern " , 0 ) ;
source_id = ImHash Str ( " #SourceExtern " , 0 ) ;
source_drag_active = true ;
source_drag_active = true ;
}
}
@ -9916,7 +9965,7 @@ ImGuiWindowSettings* ImGui::CreateNewWindowSettings(const char* name)
g . SettingsWindows . push_back ( ImGuiWindowSettings ( ) ) ;
g . SettingsWindows . push_back ( ImGuiWindowSettings ( ) ) ;
ImGuiWindowSettings * settings = & g . SettingsWindows . back ( ) ;
ImGuiWindowSettings * settings = & g . SettingsWindows . back ( ) ;
settings - > Name = ImStrdup ( name ) ;
settings - > Name = ImStrdup ( name ) ;
settings - > ID = ImHash ( name , 0 ) ;
settings - > ID = ImHash Str ( name , 0 ) ;
return settings ;
return settings ;
}
}
@ -9942,7 +9991,7 @@ void ImGui::LoadIniSettingsFromDisk(const char* ini_filename)
ImGuiSettingsHandler * ImGui : : FindSettingsHandler ( const char * type_name )
ImGuiSettingsHandler * ImGui : : FindSettingsHandler ( const char * type_name )
{
{
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
const ImGuiID type_hash = ImHash ( type_name , 0 , 0 ) ;
const ImGuiID type_hash = ImHash Str ( type_name , 0 ) ;
for ( int handler_n = 0 ; handler_n < g . SettingsHandlers . Size ; handler_n + + )
for ( int handler_n = 0 ; handler_n < g . SettingsHandlers . Size ; handler_n + + )
if ( g . SettingsHandlers [ handler_n ] . TypeHash = = type_hash )
if ( g . SettingsHandlers [ handler_n ] . TypeHash = = type_hash )
return & g . SettingsHandlers [ handler_n ] ;
return & g . SettingsHandlers [ handler_n ] ;
@ -10046,7 +10095,7 @@ const char* ImGui::SaveIniSettingsToMemory(size_t* out_size)
static void * SettingsHandlerWindow_ReadOpen ( ImGuiContext * , ImGuiSettingsHandler * , const char * name )
static void * SettingsHandlerWindow_ReadOpen ( ImGuiContext * , ImGuiSettingsHandler * , const char * name )
{
{
ImGuiWindowSettings * settings = ImGui : : FindWindowSettings ( ImHash ( name , 0 ) ) ;
ImGuiWindowSettings * settings = ImGui : : FindWindowSettings ( ImHash Str ( name , 0 ) ) ;
if ( ! settings )
if ( ! settings )
settings = ImGui : : CreateNewWindowSettings ( name ) ;
settings = ImGui : : CreateNewWindowSettings ( name ) ;
return ( void * ) settings ;
return ( void * ) settings ;