mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 07:01:04 +01:00 
			
		
		
		
	Merge branch 'master' into drag_and_drop
This commit is contained in:
		
							
								
								
									
										115
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										115
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -643,8 +643,7 @@ static void             AddDrawListToRenderList(ImVector<ImDrawList*>& out_rende
 | 
				
			|||||||
static void             AddWindowToRenderList(ImVector<ImDrawList*>& out_render_list, ImGuiWindow* window);
 | 
					static void             AddWindowToRenderList(ImVector<ImDrawList*>& out_render_list, ImGuiWindow* window);
 | 
				
			||||||
static void             AddWindowToSortedBuffer(ImVector<ImGuiWindow*>& out_sorted_windows, ImGuiWindow* window);
 | 
					static void             AddWindowToSortedBuffer(ImVector<ImGuiWindow*>& out_sorted_windows, ImGuiWindow* window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ImGuiSettingsWindow* FindWindowSettings(const char* name);
 | 
					static ImGuiWindowSettings* AddWindowSettings(const char* name);
 | 
				
			||||||
static ImGuiSettingsWindow* AddWindowSettings(const char* name);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void             LoadIniSettingsFromDisk(const char* ini_filename);
 | 
					static void             LoadIniSettingsFromDisk(const char* ini_filename);
 | 
				
			||||||
static void             LoadIniSettingsFromMemory(const char* buf);
 | 
					static void             LoadIniSettingsFromMemory(const char* buf);
 | 
				
			||||||
@@ -709,7 +708,7 @@ ImGuiStyle::ImGuiStyle()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    Alpha                   = 1.0f;             // Global alpha applies to everything in ImGui
 | 
					    Alpha                   = 1.0f;             // Global alpha applies to everything in ImGui
 | 
				
			||||||
    WindowPadding           = ImVec2(8,8);      // Padding within a window
 | 
					    WindowPadding           = ImVec2(8,8);      // Padding within a window
 | 
				
			||||||
    WindowRounding          = 9.0f;             // Radius of window corners rounding. Set to 0.0f to have rectangular windows
 | 
					    WindowRounding          = 7.0f;             // Radius of window corners rounding. Set to 0.0f to have rectangular windows
 | 
				
			||||||
    WindowBorderSize        = 0.0f;             // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested.
 | 
					    WindowBorderSize        = 0.0f;             // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested.
 | 
				
			||||||
    WindowMinSize           = ImVec2(32,32);    // Minimum window size
 | 
					    WindowMinSize           = ImVec2(32,32);    // Minimum window size
 | 
				
			||||||
    WindowTitleAlign        = ImVec2(0.0f,0.5f);// Alignment for title bar text
 | 
					    WindowTitleAlign        = ImVec2(0.0f,0.5f);// Alignment for title bar text
 | 
				
			||||||
@@ -1995,7 +1994,7 @@ void ImGui::ItemSize(const ImVec2& size, float text_offset_y)
 | 
				
			|||||||
    window->DC.CursorPosPrevLine = ImVec2(window->DC.CursorPos.x + size.x, window->DC.CursorPos.y);
 | 
					    window->DC.CursorPosPrevLine = ImVec2(window->DC.CursorPos.x + size.x, window->DC.CursorPos.y);
 | 
				
			||||||
    window->DC.CursorPos = ImVec2((float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX), (float)(int)(window->DC.CursorPos.y + line_height + g.Style.ItemSpacing.y));
 | 
					    window->DC.CursorPos = ImVec2((float)(int)(window->Pos.x + window->DC.IndentX + window->DC.ColumnsOffsetX), (float)(int)(window->DC.CursorPos.y + line_height + g.Style.ItemSpacing.y));
 | 
				
			||||||
    window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x);
 | 
					    window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x);
 | 
				
			||||||
    window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y);
 | 
					    window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y);
 | 
				
			||||||
    //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG]
 | 
					    //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    window->DC.PrevLineHeight = line_height;
 | 
					    window->DC.PrevLineHeight = line_height;
 | 
				
			||||||
@@ -2493,9 +2492,9 @@ void ImGui::NewFrame()
 | 
				
			|||||||
    ImGui::Begin("Debug##Default");
 | 
					    ImGui::Begin("Debug##Default");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void* SettingsHandlerWindow_ReadOpenEntry(ImGuiContext&, const char* name)
 | 
					static void* SettingsHandlerWindow_ReadOpen(ImGuiContext&, const char* name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiSettingsWindow* settings = FindWindowSettings(name);
 | 
					    ImGuiWindowSettings* settings = ImGui::FindWindowSettings(ImHash(name, 0));
 | 
				
			||||||
    if (!settings)
 | 
					    if (!settings)
 | 
				
			||||||
        settings = AddWindowSettings(name);
 | 
					        settings = AddWindowSettings(name);
 | 
				
			||||||
    return (void*)settings;
 | 
					    return (void*)settings;
 | 
				
			||||||
@@ -2503,7 +2502,7 @@ static void* SettingsHandlerWindow_ReadOpenEntry(ImGuiContext&, const char* name
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void SettingsHandlerWindow_ReadLine(ImGuiContext&, void* entry, const char* line)
 | 
					static void SettingsHandlerWindow_ReadLine(ImGuiContext&, void* entry, const char* line)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiSettingsWindow* settings = (ImGuiSettingsWindow*)entry;
 | 
					    ImGuiWindowSettings* settings = (ImGuiWindowSettings*)entry;
 | 
				
			||||||
    float x, y; 
 | 
					    float x, y; 
 | 
				
			||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
    if (sscanf(line, "Pos=%f,%f", &x, &y) == 2)         settings->Pos = ImVec2(x, y);
 | 
					    if (sscanf(line, "Pos=%f,%f", &x, &y) == 2)         settings->Pos = ImVec2(x, y);
 | 
				
			||||||
@@ -2519,9 +2518,9 @@ static void SettingsHandlerWindow_WriteAll(ImGuiContext& g, ImGuiTextBuffer* buf
 | 
				
			|||||||
        ImGuiWindow* window = g.Windows[i];
 | 
					        ImGuiWindow* window = g.Windows[i];
 | 
				
			||||||
        if (window->Flags & ImGuiWindowFlags_NoSavedSettings)
 | 
					        if (window->Flags & ImGuiWindowFlags_NoSavedSettings)
 | 
				
			||||||
            continue;
 | 
					            continue;
 | 
				
			||||||
        ImGuiSettingsWindow* settings = FindWindowSettings(window->Name);
 | 
					        ImGuiWindowSettings* settings = ImGui::FindWindowSettings(window->ID);
 | 
				
			||||||
        if (!settings)  // This will only return NULL in the rare instance where the window was first created with ImGuiWindowFlags_NoSavedSettings then had the flag disabled later on. We don't bind settings in this case (bug #1000).
 | 
					        if (!settings)
 | 
				
			||||||
            continue;
 | 
					            settings = AddWindowSettings(window->Name);
 | 
				
			||||||
        settings->Pos = window->Pos;
 | 
					        settings->Pos = window->Pos;
 | 
				
			||||||
        settings->Size = window->SizeFull;
 | 
					        settings->Size = window->SizeFull;
 | 
				
			||||||
        settings->Collapsed = window->Collapsed;
 | 
					        settings->Collapsed = window->Collapsed;
 | 
				
			||||||
@@ -2532,7 +2531,7 @@ static void SettingsHandlerWindow_WriteAll(ImGuiContext& g, ImGuiTextBuffer* buf
 | 
				
			|||||||
    buf->reserve(buf->size() + g.SettingsWindows.Size * 96); // ballpark reserve
 | 
					    buf->reserve(buf->size() + g.SettingsWindows.Size * 96); // ballpark reserve
 | 
				
			||||||
    for (int i = 0; i != g.SettingsWindows.Size; i++)
 | 
					    for (int i = 0; i != g.SettingsWindows.Size; i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        const ImGuiSettingsWindow* settings = &g.SettingsWindows[i];
 | 
					        const ImGuiWindowSettings* settings = &g.SettingsWindows[i];
 | 
				
			||||||
        if (settings->Pos.x == FLT_MAX)
 | 
					        if (settings->Pos.x == FLT_MAX)
 | 
				
			||||||
            continue;
 | 
					            continue;
 | 
				
			||||||
        const char* name = settings->Name;
 | 
					        const char* name = settings->Name;
 | 
				
			||||||
@@ -2556,7 +2555,7 @@ void ImGui::Initialize()
 | 
				
			|||||||
    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("Window", 0, 0);
 | 
				
			||||||
    ini_handler.ReadOpenEntryFn = SettingsHandlerWindow_ReadOpenEntry;
 | 
					    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;
 | 
				
			||||||
    g.SettingsHandlers.push_front(ini_handler);
 | 
					    g.SettingsHandlers.push_front(ini_handler);
 | 
				
			||||||
@@ -2631,29 +2630,22 @@ void ImGui::Shutdown()
 | 
				
			|||||||
    g.Initialized = false;
 | 
					    g.Initialized = false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ImGuiSettingsWindow* FindWindowSettings(const char* name)
 | 
					ImGuiWindowSettings* ImGui::FindWindowSettings(ImGuiID id)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiContext& g = *GImGui;
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
    ImGuiID id = ImHash(name, 0);
 | 
					 | 
				
			||||||
    for (int i = 0; i != g.SettingsWindows.Size; i++)
 | 
					    for (int i = 0; i != g.SettingsWindows.Size; i++)
 | 
				
			||||||
    {
 | 
					        if (g.SettingsWindows[i].Id == id)
 | 
				
			||||||
        ImGuiSettingsWindow* ini = &g.SettingsWindows[i];
 | 
					            return &g.SettingsWindows[i];
 | 
				
			||||||
        if (ini->Id == id)
 | 
					 | 
				
			||||||
            return ini;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ImGuiSettingsWindow* AddWindowSettings(const char* name)
 | 
					static ImGuiWindowSettings* AddWindowSettings(const char* name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiContext& g = *GImGui;
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
    g.SettingsWindows.resize(g.SettingsWindows.Size + 1);
 | 
					    g.SettingsWindows.push_back(ImGuiWindowSettings());
 | 
				
			||||||
    ImGuiSettingsWindow* 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(name, 0);
 | 
				
			||||||
    settings->Collapsed = false;
 | 
					 | 
				
			||||||
    settings->Pos = ImVec2(FLT_MAX,FLT_MAX);
 | 
					 | 
				
			||||||
    settings->Size = ImVec2(0,0);
 | 
					 | 
				
			||||||
    return settings;
 | 
					    return settings;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -2668,6 +2660,15 @@ static void LoadIniSettingsFromDisk(const char* ini_filename)
 | 
				
			|||||||
    ImGui::MemFree(file_data);
 | 
					    ImGui::MemFree(file_data);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ImGuiSettingsHandler* ImGui::FindSettingsHandler(ImGuiID type_hash)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
 | 
					    for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++)
 | 
				
			||||||
 | 
					        if (g.SettingsHandlers[handler_n].TypeHash == type_hash)
 | 
				
			||||||
 | 
					            return &g.SettingsHandlers[handler_n];
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Zero-tolerance, no error reporting, cheap .ini parsing
 | 
					// Zero-tolerance, no error reporting, cheap .ini parsing
 | 
				
			||||||
static void LoadIniSettingsFromMemory(const char* buf_readonly)
 | 
					static void LoadIniSettingsFromMemory(const char* buf_readonly)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -2709,11 +2710,8 @@ static void LoadIniSettingsFromMemory(const char* buf_readonly)
 | 
				
			|||||||
                name_start++;  // Skip second '['
 | 
					                name_start++;  // Skip second '['
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            const ImGuiID type_hash = ImHash(type_start, 0, 0);
 | 
					            const ImGuiID type_hash = ImHash(type_start, 0, 0);
 | 
				
			||||||
            entry_handler = NULL;
 | 
					            entry_handler = ImGui::FindSettingsHandler(type_hash);
 | 
				
			||||||
            for (int handler_n = 0; handler_n < g.SettingsHandlers.Size && entry_handler == NULL; handler_n++)
 | 
					            entry_data = entry_handler ? entry_handler->ReadOpenFn(g, name_start) : NULL;
 | 
				
			||||||
                if (g.SettingsHandlers[handler_n].TypeHash == type_hash)
 | 
					 | 
				
			||||||
                    entry_handler = &g.SettingsHandlers[handler_n];
 | 
					 | 
				
			||||||
            entry_data = entry_handler ? entry_handler->ReadOpenEntryFn(g, name_start) : NULL;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else if (entry_handler != NULL && entry_data != NULL)
 | 
					        else if (entry_handler != NULL && entry_data != NULL)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -4100,21 +4098,15 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl
 | 
				
			|||||||
        window->PosFloat = ImVec2(60, 60);
 | 
					        window->PosFloat = ImVec2(60, 60);
 | 
				
			||||||
        window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y);
 | 
					        window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ImGuiSettingsWindow* settings = FindWindowSettings(name);
 | 
					        if (ImGuiWindowSettings* settings = ImGui::FindWindowSettings(window->ID))
 | 
				
			||||||
        if (!settings)
 | 
					 | 
				
			||||||
            settings = AddWindowSettings(name);
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (settings->Pos.x != FLT_MAX)
 | 
					 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					            SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false);
 | 
				
			||||||
            window->PosFloat = settings->Pos;
 | 
					            window->PosFloat = settings->Pos;
 | 
				
			||||||
            window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y);
 | 
					            window->Pos = ImVec2((float)(int)window->PosFloat.x, (float)(int)window->PosFloat.y);
 | 
				
			||||||
            window->Collapsed = settings->Collapsed;
 | 
					            window->Collapsed = settings->Collapsed;
 | 
				
			||||||
 | 
					            if (ImLengthSqr(settings->Size) > 0.00001f)
 | 
				
			||||||
 | 
					                size = settings->Size;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (ImLengthSqr(settings->Size) > 0.00001f)
 | 
					 | 
				
			||||||
            size = settings->Size;
 | 
					 | 
				
			||||||
        window->Size = window->SizeFull = size;
 | 
					        window->Size = window->SizeFull = size;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -4176,22 +4168,31 @@ static ImVec2 CalcSizeAutoFit(ImGuiWindow* window)
 | 
				
			|||||||
    if ((flags & ImGuiWindowFlags_Tooltip) != 0)
 | 
					    if ((flags & ImGuiWindowFlags_Tooltip) != 0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // Tooltip always resize. We keep the spacing symmetric on both axises for aesthetic purpose.
 | 
					        // Tooltip always resize. We keep the spacing symmetric on both axises for aesthetic purpose.
 | 
				
			||||||
        size_auto_fit = window->SizeContents + window->WindowPadding - ImVec2(0.0f, style.ItemSpacing.y);
 | 
					        size_auto_fit = window->SizeContents;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // Handling case of auto fit window not fitting on the screen (on either axis): we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than DisplaySize-WindowPadding.
 | 
					        // Handling case of auto fit window not fitting on the screen (on either axis): we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than DisplaySize-WindowPadding.
 | 
				
			||||||
        size_auto_fit = ImClamp(window->SizeContents + window->WindowPadding, style.WindowMinSize, ImMax(style.WindowMinSize, g.IO.DisplaySize - g.Style.DisplaySafeAreaPadding));
 | 
					        size_auto_fit = ImClamp(window->SizeContents, style.WindowMinSize, ImMax(style.WindowMinSize, g.IO.DisplaySize - g.Style.DisplaySafeAreaPadding));
 | 
				
			||||||
        ImVec2 size_auto_fit_after_constraint = CalcSizeFullWithConstraint(window, size_auto_fit);
 | 
					        ImVec2 size_auto_fit_after_constraint = CalcSizeFullWithConstraint(window, size_auto_fit);
 | 
				
			||||||
        if (size_auto_fit_after_constraint.x < window->SizeContents.x && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar))
 | 
					        if (size_auto_fit_after_constraint.x < window->SizeContents.x && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar))
 | 
				
			||||||
            size_auto_fit.y += style.ScrollbarSize;
 | 
					            size_auto_fit.y += style.ScrollbarSize;
 | 
				
			||||||
        if (size_auto_fit_after_constraint.y < window->SizeContents.y && !(flags & ImGuiWindowFlags_NoScrollbar))
 | 
					        if (size_auto_fit_after_constraint.y < window->SizeContents.y && !(flags & ImGuiWindowFlags_NoScrollbar))
 | 
				
			||||||
            size_auto_fit.x += style.ScrollbarSize;
 | 
					            size_auto_fit.x += style.ScrollbarSize;
 | 
				
			||||||
        size_auto_fit.y = ImMax(size_auto_fit.y - style.ItemSpacing.y, 0.0f);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return size_auto_fit;
 | 
					    return size_auto_fit;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static float GetScrollMaxX(ImGuiWindow* window)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return ImMax(0.0f, window->SizeContents.x - (window->SizeFull.x - window->ScrollbarSizes.x));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static float GetScrollMaxY(ImGuiWindow* window)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return ImMax(0.0f, window->SizeContents.y - (window->SizeFull.y - window->ScrollbarSizes.y));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window)
 | 
					static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImVec2 scroll = window->Scroll;
 | 
					    ImVec2 scroll = window->Scroll;
 | 
				
			||||||
@@ -4204,8 +4205,8 @@ static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window)
 | 
				
			|||||||
    scroll = ImMax(scroll, ImVec2(0.0f, 0.0f));
 | 
					    scroll = ImMax(scroll, ImVec2(0.0f, 0.0f));
 | 
				
			||||||
    if (!window->Collapsed && !window->SkipItems)
 | 
					    if (!window->Collapsed && !window->SkipItems)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        scroll.x = ImMin(scroll.x, ImMax(0.0f, window->SizeContents.x - (window->SizeFull.x - window->ScrollbarSizes.x))); // == GetScrollMaxX for that window
 | 
					        scroll.x = ImMin(scroll.x, GetScrollMaxX(window));
 | 
				
			||||||
        scroll.y = ImMin(scroll.y, ImMax(0.0f, window->SizeContents.y - (window->SizeFull.y - window->ScrollbarSizes.y))); // == GetScrollMaxY for that window
 | 
					        scroll.y = ImMin(scroll.y, GetScrollMaxY(window));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return scroll;
 | 
					    return scroll;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -4384,6 +4385,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
 | 
				
			|||||||
        // Update contents size from last frame for auto-fitting (unless explicitly specified)
 | 
					        // Update contents size from last frame for auto-fitting (unless explicitly specified)
 | 
				
			||||||
        window->SizeContents.x = (float)(int)((window->SizeContentsExplicit.x != 0.0f) ? window->SizeContentsExplicit.x : ((window_is_new ? 0.0f : window->DC.CursorMaxPos.x - window->Pos.x) + window->Scroll.x));
 | 
					        window->SizeContents.x = (float)(int)((window->SizeContentsExplicit.x != 0.0f) ? window->SizeContentsExplicit.x : ((window_is_new ? 0.0f : window->DC.CursorMaxPos.x - window->Pos.x) + window->Scroll.x));
 | 
				
			||||||
        window->SizeContents.y = (float)(int)((window->SizeContentsExplicit.y != 0.0f) ? window->SizeContentsExplicit.y : ((window_is_new ? 0.0f : window->DC.CursorMaxPos.y - window->Pos.y) + window->Scroll.y));
 | 
					        window->SizeContents.y = (float)(int)((window->SizeContentsExplicit.y != 0.0f) ? window->SizeContentsExplicit.y : ((window_is_new ? 0.0f : window->DC.CursorMaxPos.y - window->Pos.y) + window->Scroll.y));
 | 
				
			||||||
 | 
					        window->SizeContents += window->WindowPadding;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Hide popup/tooltip window when first appearing while we measure size (because we recycle them)
 | 
					        // Hide popup/tooltip window when first appearing while we measure size (because we recycle them)
 | 
				
			||||||
        if (window->HiddenFrames > 0)
 | 
					        if (window->HiddenFrames > 0)
 | 
				
			||||||
@@ -4450,10 +4452,10 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
 | 
				
			|||||||
        // Update scrollbar status (based on the Size that was effective during last frame or the auto-resized Size). We need to do this before manual resize (below) is effective.
 | 
					        // Update scrollbar status (based on the Size that was effective during last frame or the auto-resized Size). We need to do this before manual resize (below) is effective.
 | 
				
			||||||
        if (!window->Collapsed)
 | 
					        if (!window->Collapsed)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((window->SizeContents.y > window->SizeFull.y + style.ItemSpacing.y) && !(flags & ImGuiWindowFlags_NoScrollbar));
 | 
					            window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((window->SizeContents.y > window->SizeFull.y) && !(flags & ImGuiWindowFlags_NoScrollbar));
 | 
				
			||||||
            window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((window->SizeContents.x > window->SizeFull.x - (window->ScrollbarY ? style.ScrollbarSize : 0.0f) - window->WindowPadding.x) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar));
 | 
					            window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((window->SizeContents.x > window->SizeFull.x - (window->ScrollbarY ? style.ScrollbarSize : 0.0f) - window->WindowPadding.x) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar));
 | 
				
			||||||
            if (window->ScrollbarX && !window->ScrollbarY)
 | 
					            if (window->ScrollbarX && !window->ScrollbarY)
 | 
				
			||||||
                window->ScrollbarY = (window->SizeContents.y > window->SizeFull.y + style.ItemSpacing.y - style.ScrollbarSize) && !(flags & ImGuiWindowFlags_NoScrollbar);
 | 
					                window->ScrollbarY = (window->SizeContents.y > window->SizeFull.y + style.ScrollbarSize) && !(flags & ImGuiWindowFlags_NoScrollbar);
 | 
				
			||||||
            window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f);
 | 
					            window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -5701,14 +5703,12 @@ float ImGui::GetScrollY()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
float ImGui::GetScrollMaxX()
 | 
					float ImGui::GetScrollMaxX()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiWindow* window = GetCurrentWindowRead();
 | 
					    return GetScrollMaxX(GImGui->CurrentWindow);
 | 
				
			||||||
    return ImMax(0.0f, window->SizeContents.x - (window->SizeFull.x - window->ScrollbarSizes.x));
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
float ImGui::GetScrollMaxY()
 | 
					float ImGui::GetScrollMaxY()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiWindow* window = GetCurrentWindowRead();
 | 
					    return GetScrollMaxY(GImGui->CurrentWindow);
 | 
				
			||||||
    return ImMax(0.0f, window->SizeContents.y - (window->SizeFull.y - window->ScrollbarSizes.y));
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ImGui::SetScrollX(float scroll_x)
 | 
					void ImGui::SetScrollX(float scroll_x)
 | 
				
			||||||
@@ -5731,9 +5731,13 @@ void ImGui::SetScrollFromPosY(float pos_y, float center_y_ratio)
 | 
				
			|||||||
    ImGuiWindow* window = GetCurrentWindow();
 | 
					    ImGuiWindow* window = GetCurrentWindow();
 | 
				
			||||||
    IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f);
 | 
					    IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f);
 | 
				
			||||||
    window->ScrollTarget.y = (float)(int)(pos_y + window->Scroll.y);
 | 
					    window->ScrollTarget.y = (float)(int)(pos_y + window->Scroll.y);
 | 
				
			||||||
    if (center_y_ratio <= 0.0f && window->ScrollTarget.y <= window->WindowPadding.y)    // Minor hack to make "scroll to top" take account of WindowPadding, else it would scroll to (WindowPadding.y - ItemSpacing.y)
 | 
					 | 
				
			||||||
        window->ScrollTarget.y = 0.0f;
 | 
					 | 
				
			||||||
    window->ScrollTargetCenterRatio.y = center_y_ratio;
 | 
					    window->ScrollTargetCenterRatio.y = center_y_ratio;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Minor hack to to make scrolling to top/bottom of window take account of WindowPadding, it looks more right to the user this way
 | 
				
			||||||
 | 
					    if (center_y_ratio <= 0.0f && window->ScrollTarget.y <= window->WindowPadding.y)
 | 
				
			||||||
 | 
					        window->ScrollTarget.y = 0.0f;
 | 
				
			||||||
 | 
					    else if (center_y_ratio >= 1.0f && window->ScrollTarget.y >= window->SizeContents.y - window->WindowPadding.y + GImGui->Style.ItemSpacing.y)
 | 
				
			||||||
 | 
					        window->ScrollTarget.y = window->SizeContents.y;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// center_y_ratio: 0.0f top of last item, 0.5f vertical center of last item, 1.0f bottom of last item.
 | 
					// center_y_ratio: 0.0f top of last item, 0.5f vertical center of last item, 1.0f bottom of last item.
 | 
				
			||||||
@@ -10399,7 +10403,7 @@ bool ImGui::SplitterBehavior(ImGuiID id, const ImRect& bb, ImGuiAxis axis, float
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Render
 | 
					    // Render
 | 
				
			||||||
    const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator);
 | 
					    const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator);
 | 
				
			||||||
    RenderFrame(bb_render.Min, bb_render.Max, col, true, g.Style.FrameRounding);
 | 
					    window->DrawList->AddRectFilled(bb_render.Min, bb_render.Max, col, g.Style.FrameRounding);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return held;
 | 
					    return held;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -10469,7 +10473,6 @@ void ImGui::EndGroup()
 | 
				
			|||||||
    ImGuiGroupData& group_data = window->DC.GroupStack.back();
 | 
					    ImGuiGroupData& group_data = window->DC.GroupStack.back();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImRect group_bb(group_data.BackupCursorPos, window->DC.CursorMaxPos);
 | 
					    ImRect group_bb(group_data.BackupCursorPos, window->DC.CursorMaxPos);
 | 
				
			||||||
    group_bb.Max.y -= g.Style.ItemSpacing.y;      // Cancel out last vertical spacing because we are adding one ourselves.
 | 
					 | 
				
			||||||
    group_bb.Max = ImMax(group_bb.Min, group_bb.Max);
 | 
					    group_bb.Max = ImMax(group_bb.Min, group_bb.Max);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    window->DC.CursorPos = group_data.BackupCursorPos;
 | 
					    window->DC.CursorPos = group_data.BackupCursorPos;
 | 
				
			||||||
@@ -11342,7 +11345,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
 | 
				
			|||||||
                ImGui::BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), SizeContents (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->SizeContents.x, window->SizeContents.y);
 | 
					                ImGui::BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), SizeContents (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->SizeContents.x, window->SizeContents.y);
 | 
				
			||||||
                if (ImGui::IsItemHovered())
 | 
					                if (ImGui::IsItemHovered())
 | 
				
			||||||
                    GImGui->OverlayDrawList.AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255,255,0,255));
 | 
					                    GImGui->OverlayDrawList.AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255,255,0,255));
 | 
				
			||||||
                ImGui::BulletText("Scroll: (%.2f,%.2f)", window->Scroll.x, window->Scroll.y);
 | 
					                ImGui::BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f)", window->Scroll.x, GetScrollMaxX(window), window->Scroll.y, GetScrollMaxY(window));
 | 
				
			||||||
                ImGui::BulletText("Active: %d, WriteAccessed: %d", window->Active, window->WriteAccessed);
 | 
					                ImGui::BulletText("Active: %d, WriteAccessed: %d", window->Active, window->WriteAccessed);
 | 
				
			||||||
                if (window->RootWindow != window) NodeWindow(window->RootWindow, "RootWindow");
 | 
					                if (window->RootWindow != window) NodeWindow(window->RootWindow, "RootWindow");
 | 
				
			||||||
                if (window->DC.ChildWindows.Size > 0) NodeWindows(window->DC.ChildWindows, "ChildWindows");
 | 
					                if (window->DC.ChildWindows.Size > 0) NodeWindows(window->DC.ChildWindows, "ChildWindows");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2480,7 +2480,7 @@ struct ExampleAppConsole
 | 
				
			|||||||
        ImGui::PopStyleVar();
 | 
					        ImGui::PopStyleVar();
 | 
				
			||||||
        ImGui::Separator();
 | 
					        ImGui::Separator();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ImGui::BeginChild("ScrollingRegion", ImVec2(0,-ImGui::GetItemsLineHeightWithSpacing()), false, ImGuiWindowFlags_HorizontalScrollbar);
 | 
					        ImGui::BeginChild("ScrollingRegion", ImVec2(0, -ImGui::GetStyle().ItemSpacing.y - ImGui::GetItemsLineHeightWithSpacing()), false, ImGuiWindowFlags_HorizontalScrollbar); // Leave room for 1 separator + 1 InputText
 | 
				
			||||||
        if (ImGui::BeginPopupContextWindow())
 | 
					        if (ImGui::BeginPopupContextWindow())
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (ImGui::Selectable("Clear")) ClearLog();
 | 
					            if (ImGui::Selectable("Clear")) ClearLog();
 | 
				
			||||||
@@ -2807,11 +2807,9 @@ static void ShowExampleAppLayout(bool* p_open)
 | 
				
			|||||||
                ImGui::Separator();
 | 
					                ImGui::Separator();
 | 
				
			||||||
                ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ");
 | 
					                ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ");
 | 
				
			||||||
            ImGui::EndChild();
 | 
					            ImGui::EndChild();
 | 
				
			||||||
            ImGui::BeginChild("buttons");
 | 
					            if (ImGui::Button("Revert")) {}
 | 
				
			||||||
                if (ImGui::Button("Revert")) {}
 | 
					            ImGui::SameLine();
 | 
				
			||||||
                ImGui::SameLine();
 | 
					            if (ImGui::Button("Save")) {}
 | 
				
			||||||
                if (ImGui::Button("Save")) {}
 | 
					 | 
				
			||||||
            ImGui::EndChild();
 | 
					 | 
				
			||||||
        ImGui::EndGroup();
 | 
					        ImGui::EndGroup();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ImGui::End();
 | 
					    ImGui::End();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -203,8 +203,8 @@ void ImGui::StyleColorsDark(ImGuiStyle* dst)
 | 
				
			|||||||
    colors[ImGuiCol_HeaderHovered]          = ImVec4(0.26f, 0.59f, 0.98f, 0.80f);
 | 
					    colors[ImGuiCol_HeaderHovered]          = ImVec4(0.26f, 0.59f, 0.98f, 0.80f);
 | 
				
			||||||
    colors[ImGuiCol_HeaderActive]           = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);
 | 
					    colors[ImGuiCol_HeaderActive]           = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);
 | 
				
			||||||
    colors[ImGuiCol_Separator]              = colors[ImGuiCol_Border];//ImVec4(0.61f, 0.61f, 0.61f, 1.00f);
 | 
					    colors[ImGuiCol_Separator]              = colors[ImGuiCol_Border];//ImVec4(0.61f, 0.61f, 0.61f, 1.00f);
 | 
				
			||||||
    colors[ImGuiCol_SeparatorHovered]       = ImVec4(0.26f, 0.59f, 0.98f, 0.78f);
 | 
					    colors[ImGuiCol_SeparatorHovered]       = ImVec4(0.10f, 0.40f, 0.75f, 0.78f);
 | 
				
			||||||
    colors[ImGuiCol_SeparatorActive]        = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);
 | 
					    colors[ImGuiCol_SeparatorActive]        = ImVec4(0.10f, 0.40f, 0.75f, 1.00f);
 | 
				
			||||||
    colors[ImGuiCol_ResizeGrip]             = ImVec4(0.26f, 0.59f, 0.98f, 0.25f);
 | 
					    colors[ImGuiCol_ResizeGrip]             = ImVec4(0.26f, 0.59f, 0.98f, 0.25f);
 | 
				
			||||||
    colors[ImGuiCol_ResizeGripHovered]      = ImVec4(0.26f, 0.59f, 0.98f, 0.67f);
 | 
					    colors[ImGuiCol_ResizeGripHovered]      = ImVec4(0.26f, 0.59f, 0.98f, 0.67f);
 | 
				
			||||||
    colors[ImGuiCol_ResizeGripActive]       = ImVec4(0.26f, 0.59f, 0.98f, 0.95f);
 | 
					    colors[ImGuiCol_ResizeGripActive]       = ImVec4(0.26f, 0.59f, 0.98f, 0.95f);
 | 
				
			||||||
@@ -230,7 +230,7 @@ void ImGui::StyleColorsLight(ImGuiStyle* dst)
 | 
				
			|||||||
    //colors[ImGuiCol_TextActive]           = ImVec4(1.00f, 1.00f, 0.00f, 1.00f);
 | 
					    //colors[ImGuiCol_TextActive]           = ImVec4(1.00f, 1.00f, 0.00f, 1.00f);
 | 
				
			||||||
    colors[ImGuiCol_WindowBg]               = ImVec4(0.94f, 0.94f, 0.94f, 1.00f);
 | 
					    colors[ImGuiCol_WindowBg]               = ImVec4(0.94f, 0.94f, 0.94f, 1.00f);
 | 
				
			||||||
    colors[ImGuiCol_ChildBg]                = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
 | 
					    colors[ImGuiCol_ChildBg]                = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
 | 
				
			||||||
    colors[ImGuiCol_PopupBg]                = ImVec4(1.00f, 1.00f, 1.00f, 0.94f);
 | 
					    colors[ImGuiCol_PopupBg]                = ImVec4(1.00f, 1.00f, 1.00f, 0.98f);
 | 
				
			||||||
    colors[ImGuiCol_Border]                 = ImVec4(0.00f, 0.00f, 0.00f, 0.30f);
 | 
					    colors[ImGuiCol_Border]                 = ImVec4(0.00f, 0.00f, 0.00f, 0.30f);
 | 
				
			||||||
    colors[ImGuiCol_BorderShadow]           = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
 | 
					    colors[ImGuiCol_BorderShadow]           = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
 | 
				
			||||||
    colors[ImGuiCol_FrameBg]                = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
 | 
					    colors[ImGuiCol_FrameBg]                = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
 | 
				
			||||||
@@ -254,8 +254,8 @@ void ImGui::StyleColorsLight(ImGuiStyle* dst)
 | 
				
			|||||||
    colors[ImGuiCol_HeaderHovered]          = ImVec4(0.26f, 0.59f, 0.98f, 0.80f);
 | 
					    colors[ImGuiCol_HeaderHovered]          = ImVec4(0.26f, 0.59f, 0.98f, 0.80f);
 | 
				
			||||||
    colors[ImGuiCol_HeaderActive]           = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);
 | 
					    colors[ImGuiCol_HeaderActive]           = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);
 | 
				
			||||||
    colors[ImGuiCol_Separator]              = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);
 | 
					    colors[ImGuiCol_Separator]              = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);
 | 
				
			||||||
    colors[ImGuiCol_SeparatorHovered]       = ImVec4(0.26f, 0.59f, 0.98f, 0.78f);
 | 
					    colors[ImGuiCol_SeparatorHovered]       = ImVec4(0.14f, 0.44f, 0.80f, 0.78f);
 | 
				
			||||||
    colors[ImGuiCol_SeparatorActive]        = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);
 | 
					    colors[ImGuiCol_SeparatorActive]        = ImVec4(0.14f, 0.44f, 0.80f, 1.00f);
 | 
				
			||||||
    colors[ImGuiCol_ResizeGrip]             = ImVec4(0.80f, 0.80f, 0.80f, 0.56f);
 | 
					    colors[ImGuiCol_ResizeGrip]             = ImVec4(0.80f, 0.80f, 0.80f, 0.56f);
 | 
				
			||||||
    colors[ImGuiCol_ResizeGripHovered]      = ImVec4(0.26f, 0.59f, 0.98f, 0.67f);
 | 
					    colors[ImGuiCol_ResizeGripHovered]      = ImVec4(0.26f, 0.59f, 0.98f, 0.67f);
 | 
				
			||||||
    colors[ImGuiCol_ResizeGripActive]       = ImVec4(0.26f, 0.59f, 0.98f, 0.95f);
 | 
					    colors[ImGuiCol_ResizeGripActive]       = ImVec4(0.26f, 0.59f, 0.98f, 0.95f);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,10 +38,10 @@ struct ImGuiGroupData;
 | 
				
			|||||||
struct ImGuiSimpleColumns;
 | 
					struct ImGuiSimpleColumns;
 | 
				
			||||||
struct ImGuiDrawContext;
 | 
					struct ImGuiDrawContext;
 | 
				
			||||||
struct ImGuiTextEditState;
 | 
					struct ImGuiTextEditState;
 | 
				
			||||||
struct ImGuiSettingsWindow;
 | 
					 | 
				
			||||||
struct ImGuiMouseCursorData;
 | 
					struct ImGuiMouseCursorData;
 | 
				
			||||||
struct ImGuiPopupRef;
 | 
					struct ImGuiPopupRef;
 | 
				
			||||||
struct ImGuiWindow;
 | 
					struct ImGuiWindow;
 | 
				
			||||||
 | 
					struct ImGuiWindowSettings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef int ImGuiLayoutType;        // enum: horizontal or vertical             // enum ImGuiLayoutType_
 | 
					typedef int ImGuiLayoutType;        // enum: horizontal or vertical             // enum ImGuiLayoutType_
 | 
				
			||||||
typedef int ImGuiButtonFlags;       // flags: for ButtonEx(), ButtonBehavior()  // enum ImGuiButtonFlags_
 | 
					typedef int ImGuiButtonFlags;       // flags: for ButtonEx(), ButtonBehavior()  // enum ImGuiButtonFlags_
 | 
				
			||||||
@@ -287,6 +287,7 @@ struct IMGUI_API ImRect
 | 
				
			|||||||
    void        Translate(const ImVec2& v)      { Min.x += v.x; Min.y += v.y; Max.x += v.x; Max.y += v.y; }
 | 
					    void        Translate(const ImVec2& v)      { Min.x += v.x; Min.y += v.y; Max.x += v.x; Max.y += v.y; }
 | 
				
			||||||
    void        ClipWith(const ImRect& clip)    { if (Min.x < clip.Min.x) Min.x = clip.Min.x; if (Min.y < clip.Min.y) Min.y = clip.Min.y; if (Max.x > clip.Max.x) Max.x = clip.Max.x; if (Max.y > clip.Max.y) Max.y = clip.Max.y; }
 | 
					    void        ClipWith(const ImRect& clip)    { if (Min.x < clip.Min.x) Min.x = clip.Min.x; if (Min.y < clip.Min.y) Min.y = clip.Min.y; if (Max.x > clip.Max.x) Max.x = clip.Max.x; if (Max.y > clip.Max.y) Max.y = clip.Max.y; }
 | 
				
			||||||
    void        Floor()                         { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }
 | 
					    void        Floor()                         { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }
 | 
				
			||||||
 | 
					    bool        IsFinite() const                { return Min.x != FLT_MAX; }
 | 
				
			||||||
    ImVec2      GetClosestPoint(ImVec2 p, bool on_edge) const
 | 
					    ImVec2      GetClosestPoint(ImVec2 p, bool on_edge) const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (!on_edge && Contains(p))
 | 
					        if (!on_edge && Contains(p))
 | 
				
			||||||
@@ -377,7 +378,7 @@ struct IMGUI_API ImGuiTextEditState
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Data saved in imgui.ini file
 | 
					// Data saved in imgui.ini file
 | 
				
			||||||
struct ImGuiSettingsWindow
 | 
					struct ImGuiWindowSettings
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    char*       Name;
 | 
					    char*       Name;
 | 
				
			||||||
    ImGuiID     Id;
 | 
					    ImGuiID     Id;
 | 
				
			||||||
@@ -385,14 +386,14 @@ struct ImGuiSettingsWindow
 | 
				
			|||||||
    ImVec2      Size;
 | 
					    ImVec2      Size;
 | 
				
			||||||
    bool        Collapsed;
 | 
					    bool        Collapsed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ImGuiSettingsWindow() { Name = NULL; Id = 0; Pos = Size = ImVec2(0,0); Collapsed = false; }
 | 
					    ImGuiWindowSettings() { Name = NULL; Id = 0; Pos = Size = ImVec2(0,0); Collapsed = false; }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ImGuiSettingsHandler
 | 
					struct ImGuiSettingsHandler
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const char* TypeName;   // Short description stored in .ini file. Disallowed characters: '[' ']'  
 | 
					    const char* TypeName;   // Short description stored in .ini file. Disallowed characters: '[' ']'  
 | 
				
			||||||
    ImGuiID     TypeHash;   // == ImHash(TypeName, 0, 0)
 | 
					    ImGuiID     TypeHash;   // == ImHash(TypeName, 0, 0)
 | 
				
			||||||
    void*       (*ReadOpenEntryFn)(ImGuiContext& ctx, const char* name);
 | 
					    void*       (*ReadOpenFn)(ImGuiContext& ctx, const char* name);
 | 
				
			||||||
    void        (*ReadLineFn)(ImGuiContext& ctx, void* entry, const char* line);
 | 
					    void        (*ReadLineFn)(ImGuiContext& ctx, void* entry, const char* line);
 | 
				
			||||||
    void        (*WriteAllFn)(ImGuiContext& ctx, ImGuiTextBuffer* out_buf);
 | 
					    void        (*WriteAllFn)(ImGuiContext& ctx, ImGuiTextBuffer* out_buf);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -520,7 +521,7 @@ struct ImGuiContext
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Settings
 | 
					    // Settings
 | 
				
			||||||
    float                          SettingsDirtyTimer;          // Save .ini Settings on disk when time reaches zero
 | 
					    float                          SettingsDirtyTimer;          // Save .ini Settings on disk when time reaches zero
 | 
				
			||||||
    ImVector<ImGuiSettingsWindow>  SettingsWindows;             // .ini settings for ImGuiWindow
 | 
					    ImVector<ImGuiWindowSettings>  SettingsWindows;             // .ini settings for ImGuiWindow
 | 
				
			||||||
    ImVector<ImGuiSettingsHandler> SettingsHandlers;            // List of .ini settings handlers
 | 
					    ImVector<ImGuiSettingsHandler> SettingsHandlers;            // List of .ini settings handlers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Logging
 | 
					    // Logging
 | 
				
			||||||
@@ -832,7 +833,9 @@ namespace ImGui
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    IMGUI_API void          Initialize();
 | 
					    IMGUI_API void          Initialize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    IMGUI_API void          MarkIniSettingsDirty();
 | 
					    IMGUI_API void                  MarkIniSettingsDirty();
 | 
				
			||||||
 | 
					    IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(ImGuiID type_id);
 | 
				
			||||||
 | 
					    IMGUI_API ImGuiWindowSettings*  FindWindowSettings(ImGuiID id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    IMGUI_API void          SetActiveID(ImGuiID id, ImGuiWindow* window);
 | 
					    IMGUI_API void          SetActiveID(ImGuiID id, ImGuiWindow* window);
 | 
				
			||||||
    IMGUI_API void          ClearActiveID();
 | 
					    IMGUI_API void          ClearActiveID();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user