mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Merge branch 'master' into viewport
# Conflicts: # imgui.cpp # imgui_internal.h
This commit is contained in:
		| @@ -29,6 +29,24 @@ HOW TO UPDATE? | ||||
| - Please report any issue! | ||||
|  | ||||
|  | ||||
| ----------------------------------------------------------------------- | ||||
|  VERSION 1.66 (In Progress) | ||||
| ----------------------------------------------------------------------- | ||||
|  | ||||
| Other Changes: | ||||
|  | ||||
| - Fixed calling DestroyContext() always saving .ini data with the current context instead | ||||
|   of the supplied context pointer. (#2066) | ||||
| - Fixed calling SetNextWindowSize()/SetWindowSize() with non-integer values leading to  | ||||
|   accidental alteration of window position. We now round the provided size. (#2067) | ||||
| - Nav, Focus: Fixed ImGuiWindowFlags_NoBringToFrontOnFocus windows not being restoring focus | ||||
|   properly after the main menu bar or last focused window is deactivated. | ||||
| - DragFloat: Fixed a situation where dragging with value rounding enabled or with a power curve  | ||||
|   erroneously wrapped the value to one of the min/max edge. (#2024, #708, #320, #2075). | ||||
| - DragFloat: Disabled using power curve when one edge is FLT_MAX (broken in 1.61). (#2024) | ||||
| - DragFloat: Disabled setting a default drag speed when one edge is FLT_MAX. (#2024) | ||||
|    | ||||
|  | ||||
| ----------------------------------------------------------------------- | ||||
|  VERSION 1.65 (Released 2018-09-06) | ||||
| ----------------------------------------------------------------------- | ||||
|   | ||||
| @@ -32,5 +32,5 @@ include_directories(${GLFW_DIR}/deps) | ||||
|  | ||||
| file(GLOB sources *.cpp) | ||||
|  | ||||
| add_executable(example_glfw_vulkan ${sources} ${IMGUI_DIR}/examples/imgui_impl_glfw.cpp ${IMGUI_DIR}/examples/imgui_impl_vulkan.cpp ${IMGUI_DIR}/imgui.cpp ${IMGUI_DIR}/imgui_draw.cpp ${IMGUI_DIR}/imgui_demo.cpp) | ||||
| add_executable(example_glfw_vulkan ${sources} ${IMGUI_DIR}/examples/imgui_impl_glfw.cpp ${IMGUI_DIR}/examples/imgui_impl_vulkan.cpp ${IMGUI_DIR}/imgui.cpp ${IMGUI_DIR}/imgui_draw.cpp ${IMGUI_DIR}/imgui_demo.cpp ${IMGUI_DIR}/imgui_widgets.cpp) | ||||
| target_link_libraries(example_glfw_vulkan ${LIBRARIES}) | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
|   <ItemGroup Label="ProjectConfigurations"> | ||||
|     <ProjectConfiguration Include="Debug|Win32"> | ||||
| @@ -153,6 +153,7 @@ | ||||
|     <ClCompile Include="..\..\imgui.cpp" /> | ||||
|     <ClCompile Include="..\..\imgui_demo.cpp" /> | ||||
|     <ClCompile Include="..\..\imgui_draw.cpp" /> | ||||
|     <ClCompile Include="..\..\imgui_widgets.cpp" /> | ||||
|     <ClCompile Include="..\imgui_impl_glfw.cpp" /> | ||||
|     <ClCompile Include="..\imgui_impl_vulkan.cpp" /> | ||||
|     <ClCompile Include="main.cpp" /> | ||||
|   | ||||
| @@ -28,6 +28,9 @@ | ||||
|     <ClCompile Include="..\imgui_impl_vulkan.cpp"> | ||||
|       <Filter>sources</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\imgui_widgets.cpp"> | ||||
|       <Filter>imgui</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="..\..\imconfig.h"> | ||||
|   | ||||
							
								
								
									
										86
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										86
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| // dear imgui, v1.65 | ||||
| // dear imgui, v1.66 WIP | ||||
| // (main code and documentation) | ||||
|  | ||||
| // Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code. | ||||
| @@ -917,7 +917,7 @@ static void             CheckStacksSize(ImGuiWindow* window, bool write); | ||||
| static ImVec2           CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool snap_on_edges); | ||||
|  | ||||
| static void             AddDrawListToDrawData(ImVector<ImDrawList*>* out_list, ImDrawList* draw_list); | ||||
| static void             AddWindowToSortedBuffer(ImVector<ImGuiWindow*>* out_sorted_windows, ImGuiWindow* window); | ||||
| static void             AddWindowToSortBuffer(ImVector<ImGuiWindow*>* out_sorted_windows, ImGuiWindow* window); | ||||
|  | ||||
| // Settings | ||||
| static void*            SettingsHandlerWindow_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name); | ||||
| @@ -3358,6 +3358,7 @@ void ImGui::NewFrame() | ||||
|     g.NavIdTabCounter = INT_MAX; | ||||
|  | ||||
|     // Mark all windows as not visible | ||||
|     IM_ASSERT(g.WindowsFocusOrder.Size == g.Windows.Size); | ||||
|     for (int i = 0; i != g.Windows.Size; i++) | ||||
|     { | ||||
|         ImGuiWindow* window = g.Windows[i]; | ||||
| @@ -3369,7 +3370,7 @@ void ImGui::NewFrame() | ||||
|  | ||||
|     // Closing the focused window restore focus to the first active root window in descending z-order | ||||
|     if (g.NavWindow && !g.NavWindow->WasActive) | ||||
|         FocusFrontMostActiveWindowIgnoringOne(NULL); | ||||
|         FocusPreviousWindowIgnoringOne(NULL); | ||||
|  | ||||
|     // No window should be open at the beginning of the frame. | ||||
|     // But in order to allow the user to call NewFrame() multiple times without calling Render(), we are doing an explicit clear. | ||||
| @@ -3424,7 +3425,12 @@ void ImGui::Shutdown(ImGuiContext* context) | ||||
|  | ||||
|     // Save settings (unless we haven't attempted to load them: CreateContext/DestroyContext without a call to NewFrame shouldn't save an empty file) | ||||
|     if (g.SettingsLoaded && g.IO.IniFilename != NULL) | ||||
|     { | ||||
|         ImGuiContext* backup_context = GImGui; | ||||
|         SetCurrentContext(context); | ||||
|         SaveIniSettingsToDisk(g.IO.IniFilename); | ||||
|         SetCurrentContext(backup_context); | ||||
|     } | ||||
|  | ||||
|     // Destroy platform windows | ||||
|     ImGuiContext* backup_context = ImGui::GetCurrentContext(); | ||||
| @@ -3436,6 +3442,7 @@ void ImGui::Shutdown(ImGuiContext* context) | ||||
|     for (int i = 0; i < g.Windows.Size; i++) | ||||
|         IM_DELETE(g.Windows[i]); | ||||
|     g.Windows.clear(); | ||||
|     g.WindowsFocusOrder.clear(); | ||||
|     g.WindowsSortBuffer.clear(); | ||||
|     g.CurrentWindow = NULL; | ||||
|     g.CurrentWindowStack.clear(); | ||||
| @@ -3485,7 +3492,7 @@ static int IMGUI_CDECL ChildWindowComparer(const void* lhs, const void* rhs) | ||||
|     return (a->BeginOrderWithinParent - b->BeginOrderWithinParent); | ||||
| } | ||||
|  | ||||
| static void AddWindowToSortedBuffer(ImVector<ImGuiWindow*>* out_sorted_windows, ImGuiWindow* window) | ||||
| static void AddWindowToSortBuffer(ImVector<ImGuiWindow*>* out_sorted_windows, ImGuiWindow* window) | ||||
| { | ||||
|     out_sorted_windows->push_back(window); | ||||
|     if (window->Active) | ||||
| @@ -3497,7 +3504,7 @@ static void AddWindowToSortedBuffer(ImVector<ImGuiWindow*>* out_sorted_windows, | ||||
|         { | ||||
|             ImGuiWindow* child = window->DC.ChildWindows[i]; | ||||
|             if (child->Active) | ||||
|                 AddWindowToSortedBuffer(out_sorted_windows, child); | ||||
|                 AddWindowToSortBuffer(out_sorted_windows, child); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -3731,7 +3738,7 @@ void ImGui::EndFrame() | ||||
|         ImGuiWindow* window = g.Windows[i]; | ||||
|         if (window->Active && (window->Flags & ImGuiWindowFlags_ChildWindow))       // if a child is active its parent will add it | ||||
|             continue; | ||||
|         AddWindowToSortedBuffer(&g.WindowsSortBuffer, window); | ||||
|         AddWindowToSortBuffer(&g.WindowsSortBuffer, window); | ||||
|     } | ||||
|  | ||||
|     IM_ASSERT(g.Windows.Size == g.WindowsSortBuffer.Size);  // we done something wrong | ||||
| @@ -4391,7 +4398,7 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl | ||||
|             if (ImLengthSqr(settings->Size) > 0.00001f) | ||||
|                 size = ImFloor(settings->Size); | ||||
|         } | ||||
|     window->Size = window->SizeFull = window->SizeFullAtLastBegin = size; | ||||
|     window->Size = window->SizeFull = window->SizeFullAtLastBegin = ImFloor(size); | ||||
|     window->DC.CursorMaxPos = window->Pos; // So first call to CalcSizeContents() doesn't return crazy values | ||||
|  | ||||
|     if ((flags & ImGuiWindowFlags_AlwaysAutoResize) != 0) | ||||
| @@ -4408,8 +4415,9 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl | ||||
|         window->AutoFitOnlyGrows = (window->AutoFitFramesX > 0) || (window->AutoFitFramesY > 0); | ||||
|     } | ||||
|  | ||||
|     g.WindowsFocusOrder.push_back(window); | ||||
|     if (flags & ImGuiWindowFlags_NoBringToFrontOnFocus) | ||||
|         g.Windows.insert(g.Windows.begin(), window); // Quite slow but rare and only once | ||||
|         g.Windows.push_front(window); // Quite slow but rare and only once | ||||
|     else | ||||
|         g.Windows.push_back(window); | ||||
|     return window; | ||||
| @@ -5450,7 +5458,21 @@ void ImGui::End() | ||||
|         SetCurrentViewport(g.CurrentWindow, g.CurrentWindow->Viewport); | ||||
| } | ||||
|  | ||||
| void ImGui::BringWindowToFront(ImGuiWindow* window) | ||||
| void ImGui::BringWindowToFocusFront(ImGuiWindow* window) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     if (g.WindowsFocusOrder.back() == window) | ||||
|         return; | ||||
|     for (int i = g.WindowsFocusOrder.Size - 2; i >= 0; i--) // We can ignore the front most window | ||||
|         if (g.WindowsFocusOrder[i] == window) | ||||
|         { | ||||
|             memmove(&g.WindowsFocusOrder[i], &g.WindowsFocusOrder[i + 1], (size_t)(g.WindowsFocusOrder.Size - i - 1) * sizeof(ImGuiWindow*)); | ||||
|             g.WindowsFocusOrder[g.WindowsFocusOrder.Size - 1] = window; | ||||
|             break; | ||||
|         } | ||||
| } | ||||
|  | ||||
| void ImGui::BringWindowToDisplayFront(ImGuiWindow* window) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     ImGuiWindow* current_front_window = g.Windows.back(); | ||||
| @@ -5459,13 +5481,13 @@ void ImGui::BringWindowToFront(ImGuiWindow* window) | ||||
|     for (int i = g.Windows.Size - 2; i >= 0; i--) // We can ignore the front most window | ||||
|         if (g.Windows[i] == window) | ||||
|         { | ||||
|             g.Windows.erase(g.Windows.Data + i); | ||||
|             g.Windows.push_back(window); | ||||
|             memmove(&g.Windows[i], &g.Windows[i + 1], (size_t)(g.Windows.Size - i - 1) * sizeof(ImGuiWindow*)); | ||||
|             g.Windows[g.Windows.Size - 1] = window; | ||||
|             break; | ||||
|         } | ||||
| } | ||||
|  | ||||
| void ImGui::BringWindowToBack(ImGuiWindow* window) | ||||
| void ImGui::BringWindowToDisplayBack(ImGuiWindow* window) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     if (g.Windows[0] == window) | ||||
| @@ -5510,20 +5532,24 @@ void ImGui::FocusWindow(ImGuiWindow* window) | ||||
|             ClearActiveID(); | ||||
|  | ||||
|     // Bring to front | ||||
|     BringWindowToFocusFront(window); | ||||
|     if (!(window->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) | ||||
|         BringWindowToFront(window); | ||||
|         BringWindowToDisplayFront(window); | ||||
| } | ||||
|  | ||||
| void ImGui::FocusFrontMostActiveWindowIgnoringOne(ImGuiWindow* ignore_window) | ||||
| void ImGui::FocusPreviousWindowIgnoringOne(ImGuiWindow* ignore_window) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     for (int i = g.Windows.Size - 1; i >= 0; i--) | ||||
|         if (g.Windows[i] != ignore_window && g.Windows[i]->WasActive && !(g.Windows[i]->Flags & ImGuiWindowFlags_ChildWindow)) | ||||
|     for (int i = g.WindowsFocusOrder.Size - 1; i >= 0; i--) | ||||
|     { | ||||
|         ImGuiWindow* window = g.WindowsFocusOrder[i]; | ||||
|         if (window != ignore_window && window->WasActive && !(window->Flags & ImGuiWindowFlags_ChildWindow)) | ||||
|         { | ||||
|             ImGuiWindow* focus_window = NavRestoreLastChildNavWindow(g.Windows[i]); | ||||
|             ImGuiWindow* focus_window = NavRestoreLastChildNavWindow(window); | ||||
|             FocusWindow(focus_window); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| void ImGui::PushItemWidth(float item_width) | ||||
| @@ -5984,7 +6010,7 @@ static void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond con | ||||
|     if (size.x > 0.0f) | ||||
|     { | ||||
|         window->AutoFitFramesX = 0; | ||||
|         window->SizeFull.x = size.x; | ||||
|         window->SizeFull.x = ImFloor(size.x); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
| @@ -5994,7 +6020,7 @@ static void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond con | ||||
|     if (size.y > 0.0f) | ||||
|     { | ||||
|         window->AutoFitFramesY = 0; | ||||
|         window->SizeFull.y = size.y; | ||||
|         window->SizeFull.y = ImFloor(size.y); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
| @@ -8438,11 +8464,11 @@ static float ImGui::NavUpdatePageUpPageDown(int allowed_dir_flags) | ||||
|     return 0.0f; | ||||
| } | ||||
|  | ||||
| static int FindWindowIndex(ImGuiWindow* window) // FIXME-OPT O(N) | ||||
| static int FindWindowFocusIndex(ImGuiWindow* window) // FIXME-OPT O(N) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     for (int i = g.Windows.Size-1; i >= 0; i--) | ||||
|         if (g.Windows[i] == window) | ||||
|     for (int i = g.WindowsFocusOrder.Size-1; i >= 0; i--) | ||||
|         if (g.WindowsFocusOrder[i] == window) | ||||
|             return i; | ||||
|     return -1; | ||||
| } | ||||
| @@ -8450,9 +8476,9 @@ static int FindWindowIndex(ImGuiWindow* window) // FIXME-OPT O(N) | ||||
| static ImGuiWindow* FindWindowNavFocusable(int i_start, int i_stop, int dir) // FIXME-OPT O(N) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     for (int i = i_start; i >= 0 && i < g.Windows.Size && i != i_stop; i += dir) | ||||
|         if (ImGui::IsWindowNavFocusable(g.Windows[i])) | ||||
|             return g.Windows[i]; | ||||
|     for (int i = i_start; i >= 0 && i < g.WindowsFocusOrder.Size && i != i_stop; i += dir) | ||||
|         if (ImGui::IsWindowNavFocusable(g.WindowsFocusOrder[i])) | ||||
|             return g.WindowsFocusOrder[i]; | ||||
|     return NULL; | ||||
| } | ||||
|  | ||||
| @@ -8463,10 +8489,10 @@ static void NavUpdateWindowingHighlightWindow(int focus_change_dir) | ||||
|     if (g.NavWindowingTarget->Flags & ImGuiWindowFlags_Modal) | ||||
|         return; | ||||
|  | ||||
|     const int i_current = FindWindowIndex(g.NavWindowingTarget); | ||||
|     const int i_current = FindWindowFocusIndex(g.NavWindowingTarget); | ||||
|     ImGuiWindow* window_target = FindWindowNavFocusable(i_current + focus_change_dir, -INT_MAX, focus_change_dir); | ||||
|     if (!window_target) | ||||
|         window_target = FindWindowNavFocusable((focus_change_dir < 0) ? (g.Windows.Size - 1) : 0, i_current, focus_change_dir); | ||||
|         window_target = FindWindowNavFocusable((focus_change_dir < 0) ? (g.WindowsFocusOrder.Size - 1) : 0, i_current, focus_change_dir); | ||||
|     if (window_target) // Don't reset windowing target if there's a single window in the list | ||||
|         g.NavWindowingTarget = g.NavWindowingTargetAnim = window_target; | ||||
|     g.NavWindowingToggleLayer = false; | ||||
| @@ -8498,7 +8524,7 @@ static void ImGui::NavUpdateWindowing() | ||||
|     bool start_windowing_with_gamepad = !g.NavWindowingTarget && IsNavInputPressed(ImGuiNavInput_Menu, ImGuiInputReadMode_Pressed); | ||||
|     bool start_windowing_with_keyboard = !g.NavWindowingTarget && g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab) && (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard); | ||||
|     if (start_windowing_with_gamepad || start_windowing_with_keyboard) | ||||
|         if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavFocusable(g.Windows.Size - 1, -INT_MAX, -1)) | ||||
|         if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavFocusable(g.WindowsFocusOrder.Size - 1, -INT_MAX, -1)) | ||||
|         { | ||||
|             g.NavWindowingTarget = g.NavWindowingTargetAnim = window; | ||||
|             g.NavWindowingTimer = g.NavWindowingHighlightAlpha = 0.0f; | ||||
| @@ -8631,9 +8657,9 @@ void ImGui::NavUpdateWindowingList() | ||||
|     SetNextWindowPos(viewport->Pos + viewport->Size * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f)); | ||||
|     PushStyleVar(ImGuiStyleVar_WindowPadding, g.Style.WindowPadding * 2.0f); | ||||
|     Begin("###NavWindowingList", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings); | ||||
|     for (int n = g.Windows.Size - 1; n >= 0; n--) | ||||
|     for (int n = g.WindowsFocusOrder.Size - 1; n >= 0; n--) | ||||
|     { | ||||
|         ImGuiWindow* window = g.Windows[n]; | ||||
|         ImGuiWindow* window = g.WindowsFocusOrder[n]; | ||||
|         if (!IsWindowNavFocusable(window)) | ||||
|             continue; | ||||
|         const char* label = window->Name; | ||||
|   | ||||
							
								
								
									
										6
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| // dear imgui, v1.65 | ||||
| // dear imgui, v1.66 WIP | ||||
| // (headers) | ||||
|  | ||||
| // See imgui.cpp file for documentation. | ||||
| @@ -23,8 +23,8 @@ | ||||
|  | ||||
| // Version | ||||
| // (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY00 then bounced up to XYY01 when release tagging happens) | ||||
| #define IMGUI_VERSION               "1.65" | ||||
| #define IMGUI_VERSION_NUM           16501 | ||||
| #define IMGUI_VERSION               "1.66 WIP" | ||||
| #define IMGUI_VERSION_NUM           16600 | ||||
| #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert)) | ||||
| #define IMGUI_HAS_VIEWPORT          1 // Viewport WIP branch | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| // dear imgui, v1.65 | ||||
| // dear imgui, v1.66 WIP | ||||
| // (demo code) | ||||
|  | ||||
| // Message to the person tempted to delete this file when integrating ImGui into their code base: | ||||
| @@ -207,16 +207,18 @@ void ImGui::ShowDemoWindow(bool* p_open) | ||||
|     static bool no_collapse = false; | ||||
|     static bool no_close = false; | ||||
|     static bool no_nav = false; | ||||
|  | ||||
|     static bool no_bring_to_front = false; | ||||
|      | ||||
|     ImGuiWindowFlags window_flags = 0; | ||||
|     if (no_titlebar)  window_flags |= ImGuiWindowFlags_NoTitleBar; | ||||
|     if (no_scrollbar) window_flags |= ImGuiWindowFlags_NoScrollbar; | ||||
|     if (!no_menu)     window_flags |= ImGuiWindowFlags_MenuBar; | ||||
|     if (no_move)      window_flags |= ImGuiWindowFlags_NoMove; | ||||
|     if (no_resize)    window_flags |= ImGuiWindowFlags_NoResize; | ||||
|     if (no_collapse)  window_flags |= ImGuiWindowFlags_NoCollapse; | ||||
|     if (no_nav)       window_flags |= ImGuiWindowFlags_NoNav; | ||||
|     if (no_close)     p_open = NULL; // Don't pass our bool* to Begin | ||||
|     if (no_titlebar)        window_flags |= ImGuiWindowFlags_NoTitleBar; | ||||
|     if (no_scrollbar)       window_flags |= ImGuiWindowFlags_NoScrollbar; | ||||
|     if (!no_menu)           window_flags |= ImGuiWindowFlags_MenuBar; | ||||
|     if (no_move)            window_flags |= ImGuiWindowFlags_NoMove; | ||||
|     if (no_resize)          window_flags |= ImGuiWindowFlags_NoResize; | ||||
|     if (no_collapse)        window_flags |= ImGuiWindowFlags_NoCollapse; | ||||
|     if (no_nav)             window_flags |= ImGuiWindowFlags_NoNav; | ||||
|     if (no_bring_to_front)  window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus; | ||||
|     if (no_close)           p_open = NULL; // Don't pass our bool* to Begin | ||||
|  | ||||
|     // We specify a default position/size in case there's no data in the .ini file. Typically this isn't required! We only do it to make the Demo applications a little more welcoming. | ||||
|     ImVec2 main_viewport_pos = ImGui::GetMainViewport()->Pos; | ||||
| @@ -369,7 +371,8 @@ void ImGui::ShowDemoWindow(bool* p_open) | ||||
|         ImGui::Checkbox("No resize", &no_resize); ImGui::SameLine(300); | ||||
|         ImGui::Checkbox("No collapse", &no_collapse); | ||||
|         ImGui::Checkbox("No close", &no_close); ImGui::SameLine(150); | ||||
|         ImGui::Checkbox("No nav", &no_nav); | ||||
|         ImGui::Checkbox("No nav", &no_nav); ImGui::SameLine(300); | ||||
|         ImGui::Checkbox("No bring to front", &no_bring_to_front); | ||||
|     } | ||||
|  | ||||
|     if (ImGui::CollapsingHeader("Widgets")) | ||||
| @@ -2484,8 +2487,8 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref) | ||||
|         ImGui::Checkbox("Anti-aliased lines", &style.AntiAliasedLines); ImGui::SameLine(); ShowHelpMarker("When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well."); | ||||
|         ImGui::Checkbox("Anti-aliased fill", &style.AntiAliasedFill); | ||||
|         ImGui::PushItemWidth(100); | ||||
|         ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, FLT_MAX, NULL, 2.0f); | ||||
|         if (style.CurveTessellationTol < 0.0f) style.CurveTessellationTol = 0.10f; | ||||
|         ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, FLT_MAX, "%.2f", 2.0f); | ||||
|         if (style.CurveTessellationTol < 0.10f) style.CurveTessellationTol = 0.10f; | ||||
|         ImGui::DragFloat("Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f, "%.2f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero. | ||||
|         ImGui::PopItemWidth(); | ||||
|         ImGui::TreePop(); | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| // dear imgui, v1.65 | ||||
| // dear imgui, v1.66 WIP | ||||
| // (drawing and font code) | ||||
|  | ||||
| /* | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| // dear imgui, v1.65 | ||||
| // dear imgui, v1.66 WIP | ||||
| // (internal structures/api) | ||||
|  | ||||
| // You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility! | ||||
| @@ -686,7 +686,8 @@ struct ImGuiContext | ||||
|     int                     FrameCountEnded; | ||||
|     int                     FrameCountPlatformEnded; | ||||
|     int                     FrameCountRendered; | ||||
|     ImVector<ImGuiWindow*>  Windows; | ||||
|     ImVector<ImGuiWindow*>  Windows;                            // Windows, sorted in display order, back to front | ||||
|     ImVector<ImGuiWindow*>  WindowsFocusOrder;                  // Windows, sorted in focus order, back to front | ||||
|     ImVector<ImGuiWindow*>  WindowsSortBuffer; | ||||
|     ImVector<ImGuiWindow*>  CurrentWindowStack; | ||||
|     ImGuiStorage            WindowsById; | ||||
| @@ -1170,10 +1171,11 @@ namespace ImGui | ||||
|     inline    ImGuiWindow*  GetCurrentWindowRead()      { ImGuiContext& g = *GImGui; return g.CurrentWindow; } | ||||
|     inline    ImGuiWindow*  GetCurrentWindow()          { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; } | ||||
|     IMGUI_API ImGuiWindow*  FindWindowByName(const char* name); | ||||
|     IMGUI_API void          FocusWindow(ImGuiWindow* window); // FIXME: Rename to SetWindowFocus() | ||||
|     IMGUI_API void          FocusFrontMostActiveWindowIgnoringOne(ImGuiWindow* ignore_window); | ||||
|     IMGUI_API void          BringWindowToFront(ImGuiWindow* window); | ||||
|     IMGUI_API void          BringWindowToBack(ImGuiWindow* window); | ||||
|     IMGUI_API void          FocusWindow(ImGuiWindow* window); | ||||
|     IMGUI_API void          FocusPreviousWindowIgnoringOne(ImGuiWindow* ignore_window); | ||||
|     IMGUI_API void          BringWindowToFocusFront(ImGuiWindow* window); | ||||
|     IMGUI_API void          BringWindowToDisplayFront(ImGuiWindow* window); | ||||
|     IMGUI_API void          BringWindowToDisplayBack(ImGuiWindow* window); | ||||
|     IMGUI_API void          UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window); | ||||
|     IMGUI_API ImVec2        CalcWindowExpectedSize(ImGuiWindow* window); | ||||
|     IMGUI_API bool          IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent); | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| // dear imgui, v1.65 | ||||
| // dear imgui, v1.66 WIP | ||||
| // (widgets code) | ||||
|  | ||||
| /* | ||||
| @@ -1707,10 +1707,11 @@ template<typename TYPE, typename SIGNEDTYPE, typename FLOATTYPE> | ||||
| bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const TYPE v_min, const TYPE v_max, const char* format, float power) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     const bool is_decimal = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); | ||||
|     const bool has_min_max = (v_min != v_max); | ||||
|  | ||||
|     // Default tweak speed | ||||
|     bool has_min_max = (v_min != v_max) && (v_max - v_max < FLT_MAX); | ||||
|     if (v_speed == 0.0f && has_min_max) | ||||
|     if (v_speed == 0.0f && has_min_max && (v_max - v_min < FLT_MAX)) | ||||
|         v_speed = (float)((v_max - v_min) * g.DragSpeedDefaultRatio); | ||||
|  | ||||
|     // Inputs accumulates into g.DragCurrentAccum, which is flushed into the current value as soon as it makes a difference with our precision settings | ||||
| @@ -1719,14 +1720,14 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const | ||||
|     { | ||||
|         adjust_delta = g.IO.MouseDelta.x; | ||||
|         if (g.IO.KeyAlt) | ||||
|             adjust_delta *= 1.0f/100.0f; | ||||
|             adjust_delta *= 1.0f / 100.0f; | ||||
|         if (g.IO.KeyShift) | ||||
|             adjust_delta *= 10.0f; | ||||
|     } | ||||
|     else if (g.ActiveIdSource == ImGuiInputSource_Nav) | ||||
|     { | ||||
|         int decimal_precision = (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) ? ImParseFormatPrecision(format, 3) : 0; | ||||
|         adjust_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_Keyboard|ImGuiNavDirSourceFlags_PadDPad, ImGuiInputReadMode_RepeatFast, 1.0f/10.0f, 10.0f).x; | ||||
|         int decimal_precision = is_decimal ? ImParseFormatPrecision(format, 3) : 0; | ||||
|         adjust_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_Keyboard | ImGuiNavDirSourceFlags_PadDPad, ImGuiInputReadMode_RepeatFast, 1.0f / 10.0f, 10.0f).x; | ||||
|         v_speed = ImMax(v_speed, GetMinimumStepAtDecimalPrecision(decimal_precision)); | ||||
|     } | ||||
|     adjust_delta *= v_speed; | ||||
| @@ -1752,7 +1753,7 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const | ||||
|     TYPE v_cur = *v; | ||||
|     FLOATTYPE v_old_ref_for_accum_remainder = (FLOATTYPE)0.0f; | ||||
|  | ||||
|     const bool is_power = (power != 1.0f && (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) && has_min_max); | ||||
|     const bool is_power = (power != 1.0f && is_decimal && has_min_max && (v_max - v_min < FLT_MAX)); | ||||
|     if (is_power) | ||||
|     { | ||||
|         // Offset + round to user desired precision, with a curve on the v_min..v_max range to get more precision on one side of the range | ||||
| @@ -1785,12 +1786,12 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const | ||||
|     if (v_cur == (TYPE)-0) | ||||
|         v_cur = (TYPE)0; | ||||
|  | ||||
|     // Clamp values (handle overflow/wrap-around) | ||||
|     // Clamp values (+ handle overflow/wrap-around for integer types) | ||||
|     if (*v != v_cur && has_min_max) | ||||
|     { | ||||
|         if (v_cur < v_min || (v_cur > *v && adjust_delta < 0.0f)) | ||||
|         if (v_cur < v_min || (v_cur > *v && adjust_delta < 0.0f && !is_decimal)) | ||||
|             v_cur = v_min; | ||||
|         if (v_cur > v_max || (v_cur < *v && adjust_delta > 0.0f)) | ||||
|         if (v_cur > v_max || (v_cur < *v && adjust_delta > 0.0f && !is_decimal)) | ||||
|             v_cur = v_max; | ||||
|     } | ||||
|  | ||||
| @@ -5449,7 +5450,7 @@ void ImGui::EndMainMenuBar() | ||||
|     // When the user has left the menu layer (typically: closed menus through activation of an item), we restore focus to the previous window | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     if (g.CurrentWindow == g.NavWindow && g.NavLayer == 0) | ||||
|         FocusFrontMostActiveWindowIgnoringOne(g.NavWindow); | ||||
|         FocusPreviousWindowIgnoringOne(g.NavWindow); | ||||
|  | ||||
|     End(); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user