mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Merge remote-tracking branch 'origin' into 2015-03-antialiased-primitives
This commit is contained in:
		| @@ -22,6 +22,9 @@ | |||||||
| //#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS | //#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS | ||||||
| //#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCS | //#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCS | ||||||
|  |  | ||||||
|  | //---- Don't implement help and test window functionality (ShowUserGuide()/ShowStyleEditor()/ShowTestWindow() methods will be empty) | ||||||
|  | //#define IMGUI_DISABLE_TEST_WINDOWS | ||||||
|  |  | ||||||
| //---- Include imgui_user.inl at the end of imgui.cpp so you can include code that extends ImGui using its private data/functions. | //---- Include imgui_user.inl at the end of imgui.cpp so you can include code that extends ImGui using its private data/functions. | ||||||
| //#define IMGUI_INCLUDE_IMGUI_USER_INL | //#define IMGUI_INCLUDE_IMGUI_USER_INL | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										198
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										198
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -406,6 +406,8 @@ namespace IMGUI_STB_NAMESPACE | |||||||
| #endif | #endif | ||||||
| #include "stb_truetype.h" | #include "stb_truetype.h" | ||||||
|  |  | ||||||
|  | #undef STB_TEXTEDIT_STRING | ||||||
|  | #undef STB_TEXTEDIT_CHARTYPE | ||||||
| #define STB_TEXTEDIT_STRING    ImGuiTextEditState | #define STB_TEXTEDIT_STRING    ImGuiTextEditState | ||||||
| #define STB_TEXTEDIT_CHARTYPE  ImWchar | #define STB_TEXTEDIT_CHARTYPE  ImWchar | ||||||
| #include "stb_textedit.h" | #include "stb_textedit.h" | ||||||
| @@ -583,6 +585,7 @@ ImGuiIO::ImGuiIO() | |||||||
|     MousePosPrev = ImVec2(-1,-1); |     MousePosPrev = ImVec2(-1,-1); | ||||||
|     MouseDoubleClickTime = 0.30f; |     MouseDoubleClickTime = 0.30f; | ||||||
|     MouseDoubleClickMaxDist = 6.0f; |     MouseDoubleClickMaxDist = 6.0f; | ||||||
|  |     MouseDragThreshold = 6.0f; | ||||||
|     UserData = NULL; |     UserData = NULL; | ||||||
|  |  | ||||||
|     // User functions |     // User functions | ||||||
| @@ -1084,6 +1087,7 @@ struct ImGuiState | |||||||
|     // Render |     // Render | ||||||
|     ImVector<ImDrawList*>   RenderDrawLists; |     ImVector<ImDrawList*>   RenderDrawLists; | ||||||
|     ImVector<ImGuiWindow*>  RenderSortedWindows; |     ImVector<ImGuiWindow*>  RenderSortedWindows; | ||||||
|  |     ImDrawList              CursorDrawList; | ||||||
|  |  | ||||||
|     // Widget state |     // Widget state | ||||||
|     ImGuiTextEditState      InputTextState; |     ImGuiTextEditState      InputTextState; | ||||||
| @@ -1175,6 +1179,7 @@ struct ImGuiWindow | |||||||
|     float                   NextScrollY; |     float                   NextScrollY; | ||||||
|     bool                    ScrollbarY; |     bool                    ScrollbarY; | ||||||
|     bool                    Visible;                            // Set to true on Begin() |     bool                    Visible;                            // Set to true on Begin() | ||||||
|  |     bool                    Accessed;                           // Set to true when any widget access the current window | ||||||
|     bool                    Collapsed;                          // Set when collapsing window to become only title-bar |     bool                    Collapsed;                          // Set when collapsing window to become only title-bar | ||||||
|     bool                    SkipItems;                          // == Visible && !Collapsed |     bool                    SkipItems;                          // == Visible && !Collapsed | ||||||
|     int                     AutoFitFrames; |     int                     AutoFitFrames; | ||||||
| @@ -1209,7 +1214,6 @@ public: | |||||||
|     ImGuiID     GetID(const char* str); |     ImGuiID     GetID(const char* str); | ||||||
|     ImGuiID     GetID(const void* ptr); |     ImGuiID     GetID(const void* ptr); | ||||||
|  |  | ||||||
|     void        AddToRenderList(); |  | ||||||
|     bool        FocusItemRegister(bool is_active, bool tab_stop = true);      // Return true if focus is requested |     bool        FocusItemRegister(bool is_active, bool tab_stop = true);      // Return true if focus is requested | ||||||
|     void        FocusItemUnregister(); |     void        FocusItemUnregister(); | ||||||
|  |  | ||||||
| @@ -1226,8 +1230,9 @@ public: | |||||||
|  |  | ||||||
| static inline ImGuiWindow* GetCurrentWindow() | static inline ImGuiWindow* GetCurrentWindow() | ||||||
| { | { | ||||||
|  |     // If this ever crash it probably means that ImGui::NewFrame() hasn't been called. We should always have a CurrentWindow in the stack (there is an implicit "Debug" window) | ||||||
|     ImGuiState& g = *GImGui; |     ImGuiState& g = *GImGui; | ||||||
|     IM_ASSERT(g.CurrentWindow != NULL);    // ImGui::NewFrame() hasn't been called yet? |     g.CurrentWindow->Accessed = true; | ||||||
|     return g.CurrentWindow; |     return g.CurrentWindow; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1516,6 +1521,7 @@ ImGuiWindow::ImGuiWindow(const char* name) | |||||||
|     NextScrollY = 0.0f; |     NextScrollY = 0.0f; | ||||||
|     ScrollbarY = false; |     ScrollbarY = false; | ||||||
|     Visible = false; |     Visible = false; | ||||||
|  |     Accessed = false; | ||||||
|     Collapsed = false; |     Collapsed = false; | ||||||
|     SkipItems = false; |     SkipItems = false; | ||||||
|     AutoFitFrames = -1; |     AutoFitFrames = -1; | ||||||
| @@ -1600,21 +1606,24 @@ void ImGuiWindow::FocusItemUnregister() | |||||||
|     FocusIdxTabCounter--; |     FocusIdxTabCounter--; | ||||||
| } | } | ||||||
|  |  | ||||||
| void ImGuiWindow::AddToRenderList() | static inline void AddDrawListToRenderList(ImDrawList* draw_list) | ||||||
| { | { | ||||||
|     ImGuiState& g = *GImGui; |     if (!draw_list->commands.empty() && !draw_list->vtx_buffer.empty()) | ||||||
|  |  | ||||||
|     if (!DrawList->commands.empty() && !DrawList->vtx_buffer.empty()) |  | ||||||
|     { |     { | ||||||
|         if (DrawList->commands.back().vtx_count == 0) |         if (draw_list->commands.back().vtx_count == 0) | ||||||
|             DrawList->commands.pop_back(); |             draw_list->commands.pop_back(); | ||||||
|         g.RenderDrawLists.push_back(DrawList); |         GImGui->RenderDrawLists.push_back(draw_list); | ||||||
|     } |     } | ||||||
|     for (size_t i = 0; i < DC.ChildWindows.size(); i++) | } | ||||||
|  |  | ||||||
|  | static void AddWindowToRenderList(ImGuiWindow* window) | ||||||
|  | { | ||||||
|  |     AddDrawListToRenderList(window->DrawList); | ||||||
|  |     for (size_t i = 0; i < window->DC.ChildWindows.size(); i++) | ||||||
|     { |     { | ||||||
|         ImGuiWindow* child = DC.ChildWindows[i]; |         ImGuiWindow* child = window->DC.ChildWindows[i]; | ||||||
|         if (child->Visible)                 // clipped children may have been marked not Visible |         if (child->Visible)                 // clipped children may have been marked not Visible | ||||||
|             child->AddToRenderList(); |             AddWindowToRenderList(child); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1841,8 +1850,13 @@ void ImGui::NewFrame() | |||||||
|             else |             else | ||||||
|             { |             { | ||||||
|                 g.IO.MouseClickedTime[i] = g.Time; |                 g.IO.MouseClickedTime[i] = g.Time; | ||||||
|                 g.IO.MouseClickedPos[i] = g.IO.MousePos; |  | ||||||
|             } |             } | ||||||
|  |             g.IO.MouseClickedPos[i] = g.IO.MousePos; | ||||||
|  |             g.IO.MouseDragMaxDistanceSqr[i] = 0.0f; | ||||||
|  |         } | ||||||
|  |         else if (g.IO.MouseDown[i]) | ||||||
|  |         { | ||||||
|  |             g.IO.MouseDragMaxDistanceSqr[i] = ImMax(g.IO.MouseDragMaxDistanceSqr[i], ImLengthSqr(g.IO.MousePos - g.IO.MouseClickedPos[i])); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     for (size_t i = 0; i < IM_ARRAYSIZE(g.IO.KeysDown); i++) |     for (size_t i = 0; i < IM_ARRAYSIZE(g.IO.KeysDown); i++) | ||||||
| @@ -1940,6 +1954,7 @@ void ImGui::NewFrame() | |||||||
|     { |     { | ||||||
|         ImGuiWindow* window = g.Windows[i]; |         ImGuiWindow* window = g.Windows[i]; | ||||||
|         window->Visible = false; |         window->Visible = false; | ||||||
|  |         window->Accessed = false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // No window should be open at the beginning of the frame. |     // No window should be open at the beginning of the frame. | ||||||
| @@ -1966,7 +1981,6 @@ void ImGui::Shutdown() | |||||||
|     } |     } | ||||||
|     g.Windows.clear(); |     g.Windows.clear(); | ||||||
|     g.CurrentWindowStack.clear(); |     g.CurrentWindowStack.clear(); | ||||||
|     g.RenderDrawLists.clear(); |  | ||||||
|     g.FocusedWindow = NULL; |     g.FocusedWindow = NULL; | ||||||
|     g.HoveredWindow = NULL; |     g.HoveredWindow = NULL; | ||||||
|     g.HoveredRootWindow = NULL; |     g.HoveredRootWindow = NULL; | ||||||
| @@ -1979,26 +1993,29 @@ void ImGui::Shutdown() | |||||||
|     g.ColorModifiers.clear(); |     g.ColorModifiers.clear(); | ||||||
|     g.StyleModifiers.clear(); |     g.StyleModifiers.clear(); | ||||||
|     g.FontStack.clear(); |     g.FontStack.clear(); | ||||||
|  |     g.RenderDrawLists.clear(); | ||||||
|  |     g.RenderSortedWindows.clear(); | ||||||
|  |     g.CursorDrawList.ClearFreeMemory(); | ||||||
|     g.ColorEditModeStorage.Clear(); |     g.ColorEditModeStorage.Clear(); | ||||||
|     if (g.LogFile && g.LogFile != stdout) |  | ||||||
|     { |  | ||||||
|         fclose(g.LogFile); |  | ||||||
|         g.LogFile = NULL; |  | ||||||
|     } |  | ||||||
|     g.IO.Fonts->Clear(); |  | ||||||
|  |  | ||||||
|     if (g.PrivateClipboard) |     if (g.PrivateClipboard) | ||||||
|     { |     { | ||||||
|         ImGui::MemFree(g.PrivateClipboard); |         ImGui::MemFree(g.PrivateClipboard); | ||||||
|         g.PrivateClipboard = NULL; |         g.PrivateClipboard = NULL; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     if (g.LogFile && g.LogFile != stdout) | ||||||
|  |     { | ||||||
|  |         fclose(g.LogFile); | ||||||
|  |         g.LogFile = NULL; | ||||||
|  |     } | ||||||
|     if (g.LogClipboard) |     if (g.LogClipboard) | ||||||
|     { |     { | ||||||
|         g.LogClipboard->~ImGuiTextBuffer(); |         g.LogClipboard->~ImGuiTextBuffer(); | ||||||
|         ImGui::MemFree(g.LogClipboard); |         ImGui::MemFree(g.LogClipboard); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     g.IO.Fonts->Clear(); | ||||||
|  |  | ||||||
|     g.Initialized = false; |     g.Initialized = false; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -2066,9 +2083,8 @@ void ImGui::Render() | |||||||
|     { |     { | ||||||
|         // Hide implicit window if it hasn't been used |         // Hide implicit window if it hasn't been used | ||||||
|         IM_ASSERT(g.CurrentWindowStack.size() == 1);    // Mismatched Begin/End  |         IM_ASSERT(g.CurrentWindowStack.size() == 1);    // Mismatched Begin/End  | ||||||
|         if (ImGuiWindow* window = g.CurrentWindow) |         if (g.CurrentWindow && !g.CurrentWindow->Accessed) | ||||||
|             if (ImLengthSqr(window->DC.CursorMaxPos - window->DC.CursorStartPos) < 0.001f) |             g.CurrentWindow->Visible = false; | ||||||
|                 g.CurrentWindow->Visible = false; |  | ||||||
|         ImGui::End(); |         ImGui::End(); | ||||||
|  |  | ||||||
|         // Select window for move/focus when we're done with all our widgets (we use the root window ID here) |         // Select window for move/focus when we're done with all our widgets (we use the root window ID here) | ||||||
| @@ -2118,13 +2134,13 @@ void ImGui::Render() | |||||||
|         { |         { | ||||||
|             ImGuiWindow* window = g.Windows[i]; |             ImGuiWindow* window = g.Windows[i]; | ||||||
|             if (window->Visible && (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip)) == 0) |             if (window->Visible && (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip)) == 0) | ||||||
|                 window->AddToRenderList(); |                 AddWindowToRenderList(window); | ||||||
|         } |         } | ||||||
|         for (size_t i = 0; i != g.Windows.size(); i++) |         for (size_t i = 0; i != g.Windows.size(); i++) | ||||||
|         { |         { | ||||||
|             ImGuiWindow* window = g.Windows[i]; |             ImGuiWindow* window = g.Windows[i]; | ||||||
|             if (window->Visible && (window->Flags & ImGuiWindowFlags_Tooltip)) |             if (window->Visible && (window->Flags & ImGuiWindowFlags_Tooltip)) | ||||||
|                 window->AddToRenderList(); |                 AddWindowToRenderList(window); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (g.IO.MouseDrawCursor) |         if (g.IO.MouseDrawCursor) | ||||||
| @@ -2133,13 +2149,14 @@ void ImGui::Render() | |||||||
|             const ImVec2 size = TEX_ATLAS_SIZE_MOUSE_CURSOR; |             const ImVec2 size = TEX_ATLAS_SIZE_MOUSE_CURSOR; | ||||||
|             const ImTextureID tex_id = g.IO.Fonts->TexID; |             const ImTextureID tex_id = g.IO.Fonts->TexID; | ||||||
|             const ImVec2 tex_uv_scale(1.0f/g.IO.Fonts->TexWidth, 1.0f/g.IO.Fonts->TexHeight); |             const ImVec2 tex_uv_scale(1.0f/g.IO.Fonts->TexWidth, 1.0f/g.IO.Fonts->TexHeight); | ||||||
|             static ImDrawList draw_list; |             g.CursorDrawList.Clear(); | ||||||
|             draw_list.Clear(); |             g.CursorDrawList.PushTextureID(tex_id); | ||||||
|             draw_list.AddImage(tex_id, pos+ImVec2(1,0), pos+ImVec2(1,0) + size, TEX_ATLAS_POS_MOUSE_CURSOR_BLACK * tex_uv_scale, (TEX_ATLAS_POS_MOUSE_CURSOR_BLACK + size) * tex_uv_scale, 0x30000000); // Shadow |             g.CursorDrawList.AddImage(tex_id, pos+ImVec2(1,0), pos+ImVec2(1,0) + size, TEX_ATLAS_POS_MOUSE_CURSOR_BLACK * tex_uv_scale, (TEX_ATLAS_POS_MOUSE_CURSOR_BLACK + size) * tex_uv_scale, 0x30000000); // Shadow | ||||||
|             draw_list.AddImage(tex_id, pos+ImVec2(2,0), pos+ImVec2(2,0) + size, TEX_ATLAS_POS_MOUSE_CURSOR_BLACK * tex_uv_scale, (TEX_ATLAS_POS_MOUSE_CURSOR_BLACK + size) * tex_uv_scale, 0x30000000); // Shadow |             g.CursorDrawList.AddImage(tex_id, pos+ImVec2(2,0), pos+ImVec2(2,0) + size, TEX_ATLAS_POS_MOUSE_CURSOR_BLACK * tex_uv_scale, (TEX_ATLAS_POS_MOUSE_CURSOR_BLACK + size) * tex_uv_scale, 0x30000000); // Shadow | ||||||
|             draw_list.AddImage(tex_id, pos,             pos + size,             TEX_ATLAS_POS_MOUSE_CURSOR_BLACK * tex_uv_scale, (TEX_ATLAS_POS_MOUSE_CURSOR_BLACK + size) * tex_uv_scale, 0xFF000000); // Black border |             g.CursorDrawList.AddImage(tex_id, pos,             pos + size,             TEX_ATLAS_POS_MOUSE_CURSOR_BLACK * tex_uv_scale, (TEX_ATLAS_POS_MOUSE_CURSOR_BLACK + size) * tex_uv_scale, 0xFF000000); // Black border | ||||||
|             draw_list.AddImage(tex_id, pos,             pos + size,             TEX_ATLAS_POS_MOUSE_CURSOR_WHITE * tex_uv_scale, (TEX_ATLAS_POS_MOUSE_CURSOR_WHITE + size) * tex_uv_scale, 0xFFFFFFFF); // White fill |             g.CursorDrawList.AddImage(tex_id, pos,             pos + size,             TEX_ATLAS_POS_MOUSE_CURSOR_WHITE * tex_uv_scale, (TEX_ATLAS_POS_MOUSE_CURSOR_WHITE + size) * tex_uv_scale, 0xFFFFFFFF); // White fill | ||||||
|             g.RenderDrawLists.push_back(&draw_list); |             g.CursorDrawList.PopTextureID(); | ||||||
|  |             AddDrawListToRenderList(&g.CursorDrawList); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Render |         // Render | ||||||
| @@ -2541,11 +2558,32 @@ bool ImGui::IsMouseDoubleClicked(int button) | |||||||
|     return g.IO.MouseDoubleClicked[button]; |     return g.IO.MouseDoubleClicked[button]; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | bool ImGui::IsMouseDragging(int button, float lock_threshold) | ||||||
|  | { | ||||||
|  |     ImGuiState& g = *GImGui; | ||||||
|  |     IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); | ||||||
|  |     if (lock_threshold < 0.0f) | ||||||
|  |         lock_threshold = g.IO.MouseDragThreshold; | ||||||
|  |     return g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold; | ||||||
|  | } | ||||||
|  |  | ||||||
| ImVec2 ImGui::GetMousePos() | ImVec2 ImGui::GetMousePos() | ||||||
| { | { | ||||||
|     return GImGui->IO.MousePos; |     return GImGui->IO.MousePos; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | ImVec2 ImGui::GetMouseDragDelta(int button, float lock_threshold) | ||||||
|  | { | ||||||
|  |     ImGuiState& g = *GImGui; | ||||||
|  |     IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); | ||||||
|  |     if (lock_threshold < 0.0f) | ||||||
|  |         lock_threshold = g.IO.MouseDragThreshold; | ||||||
|  |     if (g.IO.MouseDown[button]) | ||||||
|  |         if (g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold) | ||||||
|  |             return g.IO.MousePos - g.IO.MouseClickedPos[button];     // Assume we can only get active with left-mouse button (at the moment). | ||||||
|  |     return ImVec2(0.0f, 0.0f); | ||||||
|  | } | ||||||
|  |  | ||||||
| bool ImGui::IsItemHovered() | bool ImGui::IsItemHovered() | ||||||
| { | { | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
| @@ -2575,17 +2613,6 @@ bool ImGui::IsAnyItemActive() | |||||||
|     return g.ActiveId != 0; |     return g.ActiveId != 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| ImVec2 ImGui::GetItemActiveDragDelta() |  | ||||||
| { |  | ||||||
|     if (ImGui::IsItemActive()) |  | ||||||
|     { |  | ||||||
|         ImGuiState& g = *GImGui; |  | ||||||
|         if (g.IO.MouseDown[0]) |  | ||||||
|             return g.IO.MousePos - g.IO.MouseClickedPos[0];     // Assume we can only get active with left-mouse button (at the moment). |  | ||||||
|     } |  | ||||||
|     return ImVec2(0.0f, 0.0f); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ImVec2 ImGui::GetItemRectMin() | ImVec2 ImGui::GetItemRectMin() | ||||||
| { | { | ||||||
|     ImGuiWindow* window = GetCurrentWindow(); |     ImGuiWindow* window = GetCurrentWindow(); | ||||||
| @@ -2707,12 +2734,13 @@ void ImGui::EndChild() | |||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         // When using auto-filling child window, we don't provide the width/height to ItemSize so that it doesn't feed back into automatic size-fitting. |         // When using auto-filling child window, we don't provide full width/height to ItemSize so that it doesn't feed back into automatic size-fitting. | ||||||
|  |         ImGuiState& g = *GImGui; | ||||||
|         ImVec2 sz = ImGui::GetWindowSize(); |         ImVec2 sz = ImGui::GetWindowSize(); | ||||||
|         if (window->Flags & ImGuiWindowFlags_ChildWindowAutoFitX) |         if (window->Flags & ImGuiWindowFlags_ChildWindowAutoFitX) | ||||||
|             sz.x = 0; |             sz.x = ImMax(g.Style.WindowMinSize.x, sz.x - g.Style.AutoFitPadding.x); | ||||||
|         if (window->Flags & ImGuiWindowFlags_ChildWindowAutoFitY) |         if (window->Flags & ImGuiWindowFlags_ChildWindowAutoFitY) | ||||||
|             sz.y = 0; |             sz.y = ImMax(g.Style.WindowMinSize.y, sz.y - g.Style.AutoFitPadding.y); | ||||||
|          |          | ||||||
|         ImGui::End(); |         ImGui::End(); | ||||||
|  |  | ||||||
| @@ -3053,6 +3081,7 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size, float bg | |||||||
|                         window->SizeFull = size_auto_fit; |                         window->SizeFull = size_auto_fit; | ||||||
|                         if (!(window->Flags & ImGuiWindowFlags_NoSavedSettings)) |                         if (!(window->Flags & ImGuiWindowFlags_NoSavedSettings)) | ||||||
|                             MarkSettingsDirty(); |                             MarkSettingsDirty(); | ||||||
|  |                         SetActiveId(0); | ||||||
|                     } |                     } | ||||||
|                     else if (held) |                     else if (held) | ||||||
|                     { |                     { | ||||||
| @@ -3185,6 +3214,10 @@ bool ImGui::Begin(const char* name, bool* p_opened, const ImVec2& size, float bg | |||||||
|         clip_rect.z -= style.ScrollbarWidth; |         clip_rect.z -= style.ScrollbarWidth; | ||||||
|     PushClipRect(clip_rect); |     PushClipRect(clip_rect); | ||||||
|  |  | ||||||
|  |     // Clear 'accessed' flag last thing | ||||||
|  |     if (first_begin_of_the_frame) | ||||||
|  |         window->Accessed = false; | ||||||
|  |  | ||||||
|     // Child window can be out of sight and have "negative" clip windows. |     // Child window can be out of sight and have "negative" clip windows. | ||||||
|     // Mark them as collapsed so commands are skipped earlier (we can't manually collapse because they have no title bar). |     // Mark them as collapsed so commands are skipped earlier (we can't manually collapse because they have no title bar). | ||||||
|     if (flags & ImGuiWindowFlags_ChildWindow) |     if (flags & ImGuiWindowFlags_ChildWindow) | ||||||
| @@ -5522,24 +5555,22 @@ static bool STB_TEXTEDIT_INSERTCHARS(STB_TEXTEDIT_STRING* obj, int pos, const Im | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| enum | // We don't use an enum so we can build even with conflicting symbols (if another user of stb_textedit.h leak their STB_TEXTEDIT_K_* symbols) | ||||||
| { | #define STB_TEXTEDIT_K_LEFT         0x10000 // keyboard input to move cursor left | ||||||
|     STB_TEXTEDIT_K_LEFT = 1 << 16,  // keyboard input to move cursor left | #define STB_TEXTEDIT_K_RIGHT        0x10001 // keyboard input to move cursor right | ||||||
|     STB_TEXTEDIT_K_RIGHT,           // keyboard input to move cursor right | #define STB_TEXTEDIT_K_UP           0x10002 // keyboard input to move cursor up | ||||||
|     STB_TEXTEDIT_K_UP,              // keyboard input to move cursor up | #define STB_TEXTEDIT_K_DOWN         0x10003 // keyboard input to move cursor down | ||||||
|     STB_TEXTEDIT_K_DOWN,            // keyboard input to move cursor down | #define STB_TEXTEDIT_K_LINESTART    0x10004 // keyboard input to move cursor to start of line | ||||||
|     STB_TEXTEDIT_K_LINESTART,       // keyboard input to move cursor to start of line | #define STB_TEXTEDIT_K_LINEEND      0x10005 // keyboard input to move cursor to end of line | ||||||
|     STB_TEXTEDIT_K_LINEEND,         // keyboard input to move cursor to end of line | #define STB_TEXTEDIT_K_TEXTSTART    0x10006 // keyboard input to move cursor to start of text | ||||||
|     STB_TEXTEDIT_K_TEXTSTART,       // keyboard input to move cursor to start of text | #define STB_TEXTEDIT_K_TEXTEND      0x10007 // keyboard input to move cursor to end of text | ||||||
|     STB_TEXTEDIT_K_TEXTEND,         // keyboard input to move cursor to end of text | #define STB_TEXTEDIT_K_DELETE       0x10008 // keyboard input to delete selection or character under cursor | ||||||
|     STB_TEXTEDIT_K_DELETE,          // keyboard input to delete selection or character under cursor | #define STB_TEXTEDIT_K_BACKSPACE    0x10009 // keyboard input to delete selection or character left of cursor | ||||||
|     STB_TEXTEDIT_K_BACKSPACE,       // keyboard input to delete selection or character left of cursor | #define STB_TEXTEDIT_K_UNDO         0x1000A // keyboard input to perform undo | ||||||
|     STB_TEXTEDIT_K_UNDO,            // keyboard input to perform undo | #define STB_TEXTEDIT_K_REDO         0x1000B // keyboard input to perform redo | ||||||
|     STB_TEXTEDIT_K_REDO,            // keyboard input to perform redo | #define STB_TEXTEDIT_K_WORDLEFT     0x1000C // keyboard input to move cursor left one word | ||||||
|     STB_TEXTEDIT_K_WORDLEFT,        // keyboard input to move cursor left one word | #define STB_TEXTEDIT_K_WORDRIGHT    0x1000D // keyboard input to move cursor right one word | ||||||
|     STB_TEXTEDIT_K_WORDRIGHT,       // keyboard input to move cursor right one word | #define STB_TEXTEDIT_K_SHIFT        0x20000 | ||||||
|     STB_TEXTEDIT_K_SHIFT = 1 << 17 |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| #ifdef IMGUI_STB_NAMESPACE | #ifdef IMGUI_STB_NAMESPACE | ||||||
| namespace IMGUI_STB_NAMESPACE | namespace IMGUI_STB_NAMESPACE | ||||||
| @@ -7215,6 +7246,15 @@ void ImDrawList::Clear() | |||||||
|     texture_id_stack.resize(0); |     texture_id_stack.resize(0); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void ImDrawList::ClearFreeMemory() | ||||||
|  | { | ||||||
|  |     commands.clear(); | ||||||
|  |     vtx_buffer.clear(); | ||||||
|  |     vtx_write = NULL; | ||||||
|  |     clip_rect_stack.clear(); | ||||||
|  |     texture_id_stack.clear(); | ||||||
|  | } | ||||||
|  |  | ||||||
| void ImDrawList::AddDrawCmd() | void ImDrawList::AddDrawCmd() | ||||||
| { | { | ||||||
|     ImDrawCmd draw_cmd; |     ImDrawCmd draw_cmd; | ||||||
| @@ -7663,6 +7703,7 @@ void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& a, const Im | |||||||
|     if ((col >> 24) == 0) |     if ((col >> 24) == 0) | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|  |     // FIXME-OPT: This is wasting draw calls. | ||||||
|     const bool push_texture_id = texture_id_stack.empty() || user_texture_id != texture_id_stack.back(); |     const bool push_texture_id = texture_id_stack.empty() || user_texture_id != texture_id_stack.back(); | ||||||
|     if (push_texture_id) |     if (push_texture_id) | ||||||
|         PushTextureID(user_texture_id); |         PushTextureID(user_texture_id); | ||||||
| @@ -8882,6 +8923,14 @@ static void ImeSetInputScreenPosFn_DefaultImpl(int x, int y) | |||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifdef IMGUI_DISABLE_TEST_WINDOWS | ||||||
|  |  | ||||||
|  | void ImGui::ShowUserGuide() {} | ||||||
|  | void ImGui::ShowStyleEditor() {} | ||||||
|  | void ImGui::ShowTestWindow() {} | ||||||
|  |  | ||||||
|  | #else | ||||||
|  |  | ||||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||||
| // HELP | // HELP | ||||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||||
| @@ -9505,11 +9554,13 @@ void ImGui::ShowTestWindow(bool* opened) | |||||||
|         if (ImGui::TreeNode("Dragging")) |         if (ImGui::TreeNode("Dragging")) | ||||||
|         { |         { | ||||||
|             // You can use ImGui::GetItemActiveDragDelta() to query for the dragged amount on any widget. |             // You can use ImGui::GetItemActiveDragDelta() to query for the dragged amount on any widget. | ||||||
|             static ImVec2 value(0.0f, 0.0f); |             static ImVec2 value_raw(0.0f, 0.0f); | ||||||
|  |             static ImVec2 value_with_lock_threshold(0.0f, 0.0f); | ||||||
|             ImGui::Button("Drag Me"); |             ImGui::Button("Drag Me"); | ||||||
|             if (ImGui::IsItemActive()) |             if (ImGui::IsItemActive()) | ||||||
|             { |             { | ||||||
|                 value = ImGui::GetItemActiveDragDelta(); |                 value_raw = ImGui::GetMouseDragDelta(0, 0.0f); | ||||||
|  |                 value_with_lock_threshold = ImGui::GetMouseDragDelta(0); | ||||||
|                 //ImGui::SetTooltip("Delta: %.1f, %.1f", value.x, value.y); |                 //ImGui::SetTooltip("Delta: %.1f, %.1f", value.x, value.y); | ||||||
|  |  | ||||||
|                 // Draw a line between the button and the mouse cursor |                 // Draw a line between the button and the mouse cursor | ||||||
| @@ -9518,7 +9569,7 @@ void ImGui::ShowTestWindow(bool* opened) | |||||||
|                 draw_list->AddLine(ImGui::CalcItemRectClosestPoint(ImGui::GetIO().MousePos, true, -2.0f), ImGui::GetIO().MousePos, ImColor(ImGui::GetStyle().Colors[ImGuiCol_Button]), 2.0f); |                 draw_list->AddLine(ImGui::CalcItemRectClosestPoint(ImGui::GetIO().MousePos, true, -2.0f), ImGui::GetIO().MousePos, ImColor(ImGui::GetStyle().Colors[ImGuiCol_Button]), 2.0f); | ||||||
|                 draw_list->PopClipRect(); |                 draw_list->PopClipRect(); | ||||||
|             } |             } | ||||||
|             ImGui::SameLine(); ImGui::Text("Value: %.1f, %.1f", value.x, value.y); |             ImGui::SameLine(); ImGui::Text("Raw (%.1f, %.1f), WithLockThresold (%.1f, %.1f)", value_raw.x, value_raw.y, value_with_lock_threshold.x, value_with_lock_threshold.y); | ||||||
|             ImGui::TreePop(); |             ImGui::TreePop(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -10412,6 +10463,7 @@ static void ShowExampleAppLongText(bool* opened) | |||||||
| } | } | ||||||
|  |  | ||||||
| // End of Sample code | // End of Sample code | ||||||
|  | #endif | ||||||
|  |  | ||||||
| //----------------------------------------------------------------------------- | //----------------------------------------------------------------------------- | ||||||
| // FONT DATA | // FONT DATA | ||||||
| @@ -10439,7 +10491,7 @@ static unsigned char *stb__dout; | |||||||
| static void stb__match(unsigned char *data, unsigned int length) | static void stb__match(unsigned char *data, unsigned int length) | ||||||
| { | { | ||||||
|     // INVERSE of memmove... write each byte before copying the next... |     // INVERSE of memmove... write each byte before copying the next... | ||||||
|     assert (stb__dout + length <= stb__barrier); |     IM_ASSERT (stb__dout + length <= stb__barrier); | ||||||
|     if (stb__dout + length > stb__barrier) { stb__dout += length; return; } |     if (stb__dout + length > stb__barrier) { stb__dout += length; return; } | ||||||
|     if (data < stb__barrier4) { stb__dout = stb__barrier+1; return; } |     if (data < stb__barrier4) { stb__dout = stb__barrier+1; return; } | ||||||
|     while (length--) *stb__dout++ = *data++; |     while (length--) *stb__dout++ = *data++; | ||||||
| @@ -10447,7 +10499,7 @@ static void stb__match(unsigned char *data, unsigned int length) | |||||||
|  |  | ||||||
| static void stb__lit(unsigned char *data, unsigned int length) | static void stb__lit(unsigned char *data, unsigned int length) | ||||||
| { | { | ||||||
|     assert (stb__dout + length <= stb__barrier); |     IM_ASSERT (stb__dout + length <= stb__barrier); | ||||||
|     if (stb__dout + length > stb__barrier) { stb__dout += length; return; } |     if (stb__dout + length > stb__barrier) { stb__dout += length; return; } | ||||||
|     if (data < stb__barrier2) { stb__dout = stb__barrier+1; return; } |     if (data < stb__barrier2) { stb__dout = stb__barrier+1; return; } | ||||||
|     memcpy(stb__dout, data, length); |     memcpy(stb__dout, data, length); | ||||||
| @@ -10524,17 +10576,17 @@ static unsigned int stb_decompress(unsigned char *output, unsigned char *i, unsi | |||||||
|         i = stb_decompress_token(i); |         i = stb_decompress_token(i); | ||||||
|         if (i == old_i) { |         if (i == old_i) { | ||||||
|             if (*i == 0x05 && i[1] == 0xfa) { |             if (*i == 0x05 && i[1] == 0xfa) { | ||||||
|                 assert(stb__dout == output + olen); |                 IM_ASSERT(stb__dout == output + olen); | ||||||
|                 if (stb__dout != output + olen) return 0; |                 if (stb__dout != output + olen) return 0; | ||||||
|                 if (stb_adler32(1, output, olen) != (unsigned int) stb__in4(2)) |                 if (stb_adler32(1, output, olen) != (unsigned int) stb__in4(2)) | ||||||
|                     return 0; |                     return 0; | ||||||
|                 return olen; |                 return olen; | ||||||
|             } else { |             } else { | ||||||
|                 assert(0); /* NOTREACHED */ |                 IM_ASSERT(0); /* NOTREACHED */ | ||||||
|                 return 0; |                 return 0; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         assert(stb__dout <= output + olen);  |         IM_ASSERT(stb__dout <= output + olen);  | ||||||
|         if (stb__dout > output + olen) |         if (stb__dout > output + olen) | ||||||
|             return 0; |             return 0; | ||||||
|     } |     } | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -355,7 +355,6 @@ namespace ImGui | |||||||
|     IMGUI_API bool          IsItemHoveredRectOnly();                                            // was the last item hovered by mouse? even if another item is active while we are hovering this. |     IMGUI_API bool          IsItemHoveredRectOnly();                                            // was the last item hovered by mouse? even if another item is active while we are hovering this. | ||||||
|     IMGUI_API bool          IsItemActive();                                                     // was the last item active? (e.g. button being held, text field being edited- items that don't interact will always return false) |     IMGUI_API bool          IsItemActive();                                                     // was the last item active? (e.g. button being held, text field being edited- items that don't interact will always return false) | ||||||
|     IMGUI_API bool          IsAnyItemActive();                                                  //  |     IMGUI_API bool          IsAnyItemActive();                                                  //  | ||||||
|     IMGUI_API ImVec2        GetItemActiveDragDelta();                                           // mouse delta from the time the item first got active |  | ||||||
|     IMGUI_API ImVec2        GetItemRectMin();                                                   // get bounding rect of last item |     IMGUI_API ImVec2        GetItemRectMin();                                                   // get bounding rect of last item | ||||||
|     IMGUI_API ImVec2        GetItemRectMax();                                                   // " |     IMGUI_API ImVec2        GetItemRectMax();                                                   // " | ||||||
|     IMGUI_API ImVec2        GetItemRectSize();                                                  // " |     IMGUI_API ImVec2        GetItemRectSize();                                                  // " | ||||||
| @@ -369,8 +368,10 @@ namespace ImGui | |||||||
|     IMGUI_API bool          IsMouseHoveringWindow();                                            // is mouse hovering current window ("window" in API names always refer to current window) |     IMGUI_API bool          IsMouseHoveringWindow();                                            // is mouse hovering current window ("window" in API names always refer to current window) | ||||||
|     IMGUI_API bool          IsMouseHoveringAnyWindow();                                         // is mouse hovering any active imgui window |     IMGUI_API bool          IsMouseHoveringAnyWindow();                                         // is mouse hovering any active imgui window | ||||||
|     IMGUI_API bool          IsMouseHoveringRect(const ImVec2& rect_min, const ImVec2& rect_max);// is mouse hovering given bounding rect |     IMGUI_API bool          IsMouseHoveringRect(const ImVec2& rect_min, const ImVec2& rect_max);// is mouse hovering given bounding rect | ||||||
|  |     IMGUI_API bool          IsMouseDragging(int button = 0, float lock_threshold = -1.0f);      // is mouse dragging. if lock_threshold < -1.0f uses io.MouseDraggingThreshold. | ||||||
|     IMGUI_API bool          IsPosHoveringAnyWindow(const ImVec2& pos);                          // is given position hovering any active imgui window |     IMGUI_API bool          IsPosHoveringAnyWindow(const ImVec2& pos);                          // is given position hovering any active imgui window | ||||||
|     IMGUI_API ImVec2        GetMousePos();                                                      // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls |     IMGUI_API ImVec2        GetMousePos();                                                      // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls | ||||||
|  |     IMGUI_API ImVec2        GetMouseDragDelta(int button = 0, float lock_threshold = -1.0f);    // dragging amount, also see: GetItemActiveDragDelta(). if lock_threshold < -1.0f uses io.MouseDraggingThreshold. | ||||||
|     IMGUI_API float         GetTime(); |     IMGUI_API float         GetTime(); | ||||||
|     IMGUI_API int           GetFrameCount(); |     IMGUI_API int           GetFrameCount(); | ||||||
|     IMGUI_API const char*   GetStyleColName(ImGuiCol idx); |     IMGUI_API const char*   GetStyleColName(ImGuiCol idx); | ||||||
| @@ -580,6 +581,7 @@ struct ImGuiIO | |||||||
|     const char*   LogFilename;              // = "imgui_log.txt"    // Path to .log file (default parameter to ImGui::LogToFile when no file is specified). |     const char*   LogFilename;              // = "imgui_log.txt"    // Path to .log file (default parameter to ImGui::LogToFile when no file is specified). | ||||||
|     float         MouseDoubleClickTime;     // = 0.30f              // Time for a double-click, in seconds. |     float         MouseDoubleClickTime;     // = 0.30f              // Time for a double-click, in seconds. | ||||||
|     float         MouseDoubleClickMaxDist;  // = 6.0f               // Distance threshold to stay in to validate a double-click, in pixels. |     float         MouseDoubleClickMaxDist;  // = 6.0f               // Distance threshold to stay in to validate a double-click, in pixels. | ||||||
|  |     float         MouseDragThreshold;       // = 6.0f               // Distance threshold before considering we are dragging | ||||||
|     int           KeyMap[ImGuiKey_COUNT];   // <unset>              // Map of indices into the KeysDown[512] entries array |     int           KeyMap[ImGuiKey_COUNT];   // <unset>              // Map of indices into the KeysDown[512] entries array | ||||||
|     void*         UserData;                 // = NULL               // Store your own data for retrieval by callbacks. |     void*         UserData;                 // = NULL               // Store your own data for retrieval by callbacks. | ||||||
|  |  | ||||||
| @@ -649,6 +651,7 @@ struct ImGuiIO | |||||||
|     bool        MouseDoubleClicked[5];      // Has mouse button been double-clicked? |     bool        MouseDoubleClicked[5];      // Has mouse button been double-clicked? | ||||||
|     bool        MouseDownOwned[5];          // Track if button was clicked inside a window. We don't request mouse capture from the application if click started outside ImGui bounds. |     bool        MouseDownOwned[5];          // Track if button was clicked inside a window. We don't request mouse capture from the application if click started outside ImGui bounds. | ||||||
|     float       MouseDownTime[5];           // Time the mouse button has been down |     float       MouseDownTime[5];           // Time the mouse button has been down | ||||||
|  |     float       MouseDragMaxDistanceSqr[5]; // Squared maximum distance of how much mouse has traveled from the click point | ||||||
|     float       KeysDownTime[512];          // Time the keyboard key has been down |     float       KeysDownTime[512];          // Time the keyboard key has been down | ||||||
|  |  | ||||||
|     IMGUI_API   ImGuiIO(); |     IMGUI_API   ImGuiIO(); | ||||||
| @@ -863,6 +866,7 @@ struct ImDrawList | |||||||
|  |  | ||||||
|     ImDrawList() { Clear(); } |     ImDrawList() { Clear(); } | ||||||
|     IMGUI_API void  Clear(); |     IMGUI_API void  Clear(); | ||||||
|  |     IMGUI_API void  ClearFreeMemory(); | ||||||
|     IMGUI_API void  PushClipRect(const ImVec4& clip_rect);          // Scissoring. The values are x1, y1, x2, y2. |     IMGUI_API void  PushClipRect(const ImVec4& clip_rect);          // Scissoring. The values are x1, y1, x2, y2. | ||||||
|     IMGUI_API void  PushClipRectFullScreen(); |     IMGUI_API void  PushClipRectFullScreen(); | ||||||
|     IMGUI_API void  PopClipRect(); |     IMGUI_API void  PopClipRect(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user