mirror of
https://github.com/Drezil/imgui.git
synced 2024-12-19 06:26:35 +00:00
Merge branch 'master' into viewport
# Conflicts: # imgui.cpp # imgui_internal.h
This commit is contained in:
commit
df65d4a14f
@ -29,6 +29,24 @@ HOW TO UPDATE?
|
|||||||
- Please report any issue!
|
- 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)
|
VERSION 1.65 (Released 2018-09-06)
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
|
@ -32,5 +32,5 @@ include_directories(${GLFW_DIR}/deps)
|
|||||||
|
|
||||||
file(GLOB sources *.cpp)
|
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})
|
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">
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
@ -153,6 +153,7 @@
|
|||||||
<ClCompile Include="..\..\imgui.cpp" />
|
<ClCompile Include="..\..\imgui.cpp" />
|
||||||
<ClCompile Include="..\..\imgui_demo.cpp" />
|
<ClCompile Include="..\..\imgui_demo.cpp" />
|
||||||
<ClCompile Include="..\..\imgui_draw.cpp" />
|
<ClCompile Include="..\..\imgui_draw.cpp" />
|
||||||
|
<ClCompile Include="..\..\imgui_widgets.cpp" />
|
||||||
<ClCompile Include="..\imgui_impl_glfw.cpp" />
|
<ClCompile Include="..\imgui_impl_glfw.cpp" />
|
||||||
<ClCompile Include="..\imgui_impl_vulkan.cpp" />
|
<ClCompile Include="..\imgui_impl_vulkan.cpp" />
|
||||||
<ClCompile Include="main.cpp" />
|
<ClCompile Include="main.cpp" />
|
||||||
|
@ -28,6 +28,9 @@
|
|||||||
<ClCompile Include="..\imgui_impl_vulkan.cpp">
|
<ClCompile Include="..\imgui_impl_vulkan.cpp">
|
||||||
<Filter>sources</Filter>
|
<Filter>sources</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\imgui_widgets.cpp">
|
||||||
|
<Filter>imgui</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\imconfig.h">
|
<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)
|
// (main code and documentation)
|
||||||
|
|
||||||
// Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code.
|
// 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 ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool snap_on_edges);
|
||||||
|
|
||||||
static void AddDrawListToDrawData(ImVector<ImDrawList*>* out_list, ImDrawList* draw_list);
|
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
|
// Settings
|
||||||
static void* SettingsHandlerWindow_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name);
|
static void* SettingsHandlerWindow_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name);
|
||||||
@ -3358,6 +3358,7 @@ void ImGui::NewFrame()
|
|||||||
g.NavIdTabCounter = INT_MAX;
|
g.NavIdTabCounter = INT_MAX;
|
||||||
|
|
||||||
// Mark all windows as not visible
|
// Mark all windows as not visible
|
||||||
|
IM_ASSERT(g.WindowsFocusOrder.Size == g.Windows.Size);
|
||||||
for (int i = 0; i != g.Windows.Size; i++)
|
for (int i = 0; i != g.Windows.Size; i++)
|
||||||
{
|
{
|
||||||
ImGuiWindow* window = g.Windows[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
|
// Closing the focused window restore focus to the first active root window in descending z-order
|
||||||
if (g.NavWindow && !g.NavWindow->WasActive)
|
if (g.NavWindow && !g.NavWindow->WasActive)
|
||||||
FocusFrontMostActiveWindowIgnoringOne(NULL);
|
FocusPreviousWindowIgnoringOne(NULL);
|
||||||
|
|
||||||
// No window should be open at the beginning of the frame.
|
// 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.
|
// 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)
|
// 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)
|
if (g.SettingsLoaded && g.IO.IniFilename != NULL)
|
||||||
|
{
|
||||||
|
ImGuiContext* backup_context = GImGui;
|
||||||
|
SetCurrentContext(context);
|
||||||
SaveIniSettingsToDisk(g.IO.IniFilename);
|
SaveIniSettingsToDisk(g.IO.IniFilename);
|
||||||
|
SetCurrentContext(backup_context);
|
||||||
|
}
|
||||||
|
|
||||||
// Destroy platform windows
|
// Destroy platform windows
|
||||||
ImGuiContext* backup_context = ImGui::GetCurrentContext();
|
ImGuiContext* backup_context = ImGui::GetCurrentContext();
|
||||||
@ -3436,6 +3442,7 @@ void ImGui::Shutdown(ImGuiContext* context)
|
|||||||
for (int i = 0; i < g.Windows.Size; i++)
|
for (int i = 0; i < g.Windows.Size; i++)
|
||||||
IM_DELETE(g.Windows[i]);
|
IM_DELETE(g.Windows[i]);
|
||||||
g.Windows.clear();
|
g.Windows.clear();
|
||||||
|
g.WindowsFocusOrder.clear();
|
||||||
g.WindowsSortBuffer.clear();
|
g.WindowsSortBuffer.clear();
|
||||||
g.CurrentWindow = NULL;
|
g.CurrentWindow = NULL;
|
||||||
g.CurrentWindowStack.clear();
|
g.CurrentWindowStack.clear();
|
||||||
@ -3485,7 +3492,7 @@ static int IMGUI_CDECL ChildWindowComparer(const void* lhs, const void* rhs)
|
|||||||
return (a->BeginOrderWithinParent - b->BeginOrderWithinParent);
|
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);
|
out_sorted_windows->push_back(window);
|
||||||
if (window->Active)
|
if (window->Active)
|
||||||
@ -3497,7 +3504,7 @@ static void AddWindowToSortedBuffer(ImVector<ImGuiWindow*>* out_sorted_windows,
|
|||||||
{
|
{
|
||||||
ImGuiWindow* child = window->DC.ChildWindows[i];
|
ImGuiWindow* child = window->DC.ChildWindows[i];
|
||||||
if (child->Active)
|
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];
|
ImGuiWindow* window = g.Windows[i];
|
||||||
if (window->Active && (window->Flags & ImGuiWindowFlags_ChildWindow)) // if a child is active its parent will add it
|
if (window->Active && (window->Flags & ImGuiWindowFlags_ChildWindow)) // if a child is active its parent will add it
|
||||||
continue;
|
continue;
|
||||||
AddWindowToSortedBuffer(&g.WindowsSortBuffer, window);
|
AddWindowToSortBuffer(&g.WindowsSortBuffer, window);
|
||||||
}
|
}
|
||||||
|
|
||||||
IM_ASSERT(g.Windows.Size == g.WindowsSortBuffer.Size); // we done something wrong
|
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)
|
if (ImLengthSqr(settings->Size) > 0.00001f)
|
||||||
size = ImFloor(settings->Size);
|
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
|
window->DC.CursorMaxPos = window->Pos; // So first call to CalcSizeContents() doesn't return crazy values
|
||||||
|
|
||||||
if ((flags & ImGuiWindowFlags_AlwaysAutoResize) != 0)
|
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);
|
window->AutoFitOnlyGrows = (window->AutoFitFramesX > 0) || (window->AutoFitFramesY > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g.WindowsFocusOrder.push_back(window);
|
||||||
if (flags & ImGuiWindowFlags_NoBringToFrontOnFocus)
|
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
|
else
|
||||||
g.Windows.push_back(window);
|
g.Windows.push_back(window);
|
||||||
return window;
|
return window;
|
||||||
@ -5450,7 +5458,21 @@ void ImGui::End()
|
|||||||
SetCurrentViewport(g.CurrentWindow, g.CurrentWindow->Viewport);
|
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;
|
ImGuiContext& g = *GImGui;
|
||||||
ImGuiWindow* current_front_window = g.Windows.back();
|
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
|
for (int i = g.Windows.Size - 2; i >= 0; i--) // We can ignore the front most window
|
||||||
if (g.Windows[i] == window)
|
if (g.Windows[i] == window)
|
||||||
{
|
{
|
||||||
g.Windows.erase(g.Windows.Data + i);
|
memmove(&g.Windows[i], &g.Windows[i + 1], (size_t)(g.Windows.Size - i - 1) * sizeof(ImGuiWindow*));
|
||||||
g.Windows.push_back(window);
|
g.Windows[g.Windows.Size - 1] = window;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::BringWindowToBack(ImGuiWindow* window)
|
void ImGui::BringWindowToDisplayBack(ImGuiWindow* window)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
if (g.Windows[0] == window)
|
if (g.Windows[0] == window)
|
||||||
@ -5510,20 +5532,24 @@ void ImGui::FocusWindow(ImGuiWindow* window)
|
|||||||
ClearActiveID();
|
ClearActiveID();
|
||||||
|
|
||||||
// Bring to front
|
// Bring to front
|
||||||
|
BringWindowToFocusFront(window);
|
||||||
if (!(window->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus))
|
if (!(window->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus))
|
||||||
BringWindowToFront(window);
|
BringWindowToDisplayFront(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::FocusFrontMostActiveWindowIgnoringOne(ImGuiWindow* ignore_window)
|
void ImGui::FocusPreviousWindowIgnoringOne(ImGuiWindow* ignore_window)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
for (int i = g.Windows.Size - 1; i >= 0; i--)
|
for (int i = g.WindowsFocusOrder.Size - 1; i >= 0; i--)
|
||||||
if (g.Windows[i] != ignore_window && g.Windows[i]->WasActive && !(g.Windows[i]->Flags & ImGuiWindowFlags_ChildWindow))
|
|
||||||
{
|
{
|
||||||
ImGuiWindow* focus_window = NavRestoreLastChildNavWindow(g.Windows[i]);
|
ImGuiWindow* window = g.WindowsFocusOrder[i];
|
||||||
|
if (window != ignore_window && window->WasActive && !(window->Flags & ImGuiWindowFlags_ChildWindow))
|
||||||
|
{
|
||||||
|
ImGuiWindow* focus_window = NavRestoreLastChildNavWindow(window);
|
||||||
FocusWindow(focus_window);
|
FocusWindow(focus_window);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::PushItemWidth(float item_width)
|
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)
|
if (size.x > 0.0f)
|
||||||
{
|
{
|
||||||
window->AutoFitFramesX = 0;
|
window->AutoFitFramesX = 0;
|
||||||
window->SizeFull.x = size.x;
|
window->SizeFull.x = ImFloor(size.x);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -5994,7 +6020,7 @@ static void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond con
|
|||||||
if (size.y > 0.0f)
|
if (size.y > 0.0f)
|
||||||
{
|
{
|
||||||
window->AutoFitFramesY = 0;
|
window->AutoFitFramesY = 0;
|
||||||
window->SizeFull.y = size.y;
|
window->SizeFull.y = ImFloor(size.y);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -8438,11 +8464,11 @@ static float ImGui::NavUpdatePageUpPageDown(int allowed_dir_flags)
|
|||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int FindWindowIndex(ImGuiWindow* window) // FIXME-OPT O(N)
|
static int FindWindowFocusIndex(ImGuiWindow* window) // FIXME-OPT O(N)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
for (int i = g.Windows.Size-1; i >= 0; i--)
|
for (int i = g.WindowsFocusOrder.Size-1; i >= 0; i--)
|
||||||
if (g.Windows[i] == window)
|
if (g.WindowsFocusOrder[i] == window)
|
||||||
return i;
|
return i;
|
||||||
return -1;
|
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)
|
static ImGuiWindow* FindWindowNavFocusable(int i_start, int i_stop, int dir) // FIXME-OPT O(N)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
for (int i = i_start; i >= 0 && i < g.Windows.Size && i != i_stop; i += dir)
|
for (int i = i_start; i >= 0 && i < g.WindowsFocusOrder.Size && i != i_stop; i += dir)
|
||||||
if (ImGui::IsWindowNavFocusable(g.Windows[i]))
|
if (ImGui::IsWindowNavFocusable(g.WindowsFocusOrder[i]))
|
||||||
return g.Windows[i];
|
return g.WindowsFocusOrder[i];
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8463,10 +8489,10 @@ static void NavUpdateWindowingHighlightWindow(int focus_change_dir)
|
|||||||
if (g.NavWindowingTarget->Flags & ImGuiWindowFlags_Modal)
|
if (g.NavWindowingTarget->Flags & ImGuiWindowFlags_Modal)
|
||||||
return;
|
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);
|
ImGuiWindow* window_target = FindWindowNavFocusable(i_current + focus_change_dir, -INT_MAX, focus_change_dir);
|
||||||
if (!window_target)
|
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
|
if (window_target) // Don't reset windowing target if there's a single window in the list
|
||||||
g.NavWindowingTarget = g.NavWindowingTargetAnim = window_target;
|
g.NavWindowingTarget = g.NavWindowingTargetAnim = window_target;
|
||||||
g.NavWindowingToggleLayer = false;
|
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_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);
|
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 (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.NavWindowingTarget = g.NavWindowingTargetAnim = window;
|
||||||
g.NavWindowingTimer = g.NavWindowingHighlightAlpha = 0.0f;
|
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));
|
SetNextWindowPos(viewport->Pos + viewport->Size * 0.5f, ImGuiCond_Always, ImVec2(0.5f, 0.5f));
|
||||||
PushStyleVar(ImGuiStyleVar_WindowPadding, g.Style.WindowPadding * 2.0f);
|
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);
|
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))
|
if (!IsWindowNavFocusable(window))
|
||||||
continue;
|
continue;
|
||||||
const char* label = window->Name;
|
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)
|
// (headers)
|
||||||
|
|
||||||
// See imgui.cpp file for documentation.
|
// See imgui.cpp file for documentation.
|
||||||
@ -23,8 +23,8 @@
|
|||||||
|
|
||||||
// Version
|
// 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)
|
// (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 "1.66 WIP"
|
||||||
#define IMGUI_VERSION_NUM 16501
|
#define IMGUI_VERSION_NUM 16600
|
||||||
#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert))
|
#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
|
#define IMGUI_HAS_VIEWPORT 1 // Viewport WIP branch
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.65
|
// dear imgui, v1.66 WIP
|
||||||
// (demo code)
|
// (demo code)
|
||||||
|
|
||||||
// Message to the person tempted to delete this file when integrating ImGui into their code base:
|
// Message to the person tempted to delete this file when integrating ImGui into their code base:
|
||||||
@ -207,6 +207,7 @@ void ImGui::ShowDemoWindow(bool* p_open)
|
|||||||
static bool no_collapse = false;
|
static bool no_collapse = false;
|
||||||
static bool no_close = false;
|
static bool no_close = false;
|
||||||
static bool no_nav = false;
|
static bool no_nav = false;
|
||||||
|
static bool no_bring_to_front = false;
|
||||||
|
|
||||||
ImGuiWindowFlags window_flags = 0;
|
ImGuiWindowFlags window_flags = 0;
|
||||||
if (no_titlebar) window_flags |= ImGuiWindowFlags_NoTitleBar;
|
if (no_titlebar) window_flags |= ImGuiWindowFlags_NoTitleBar;
|
||||||
@ -216,6 +217,7 @@ void ImGui::ShowDemoWindow(bool* p_open)
|
|||||||
if (no_resize) window_flags |= ImGuiWindowFlags_NoResize;
|
if (no_resize) window_flags |= ImGuiWindowFlags_NoResize;
|
||||||
if (no_collapse) window_flags |= ImGuiWindowFlags_NoCollapse;
|
if (no_collapse) window_flags |= ImGuiWindowFlags_NoCollapse;
|
||||||
if (no_nav) window_flags |= ImGuiWindowFlags_NoNav;
|
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
|
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.
|
// 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.
|
||||||
@ -369,7 +371,8 @@ void ImGui::ShowDemoWindow(bool* p_open)
|
|||||||
ImGui::Checkbox("No resize", &no_resize); ImGui::SameLine(300);
|
ImGui::Checkbox("No resize", &no_resize); ImGui::SameLine(300);
|
||||||
ImGui::Checkbox("No collapse", &no_collapse);
|
ImGui::Checkbox("No collapse", &no_collapse);
|
||||||
ImGui::Checkbox("No close", &no_close); ImGui::SameLine(150);
|
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"))
|
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 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::Checkbox("Anti-aliased fill", &style.AntiAliasedFill);
|
||||||
ImGui::PushItemWidth(100);
|
ImGui::PushItemWidth(100);
|
||||||
ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, FLT_MAX, NULL, 2.0f);
|
ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, FLT_MAX, "%.2f", 2.0f);
|
||||||
if (style.CurveTessellationTol < 0.0f) style.CurveTessellationTol = 0.10f;
|
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::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::PopItemWidth();
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.65
|
// dear imgui, v1.66 WIP
|
||||||
// (drawing and font code)
|
// (drawing and font code)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.65
|
// dear imgui, v1.66 WIP
|
||||||
// (internal structures/api)
|
// (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!
|
// 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 FrameCountEnded;
|
||||||
int FrameCountPlatformEnded;
|
int FrameCountPlatformEnded;
|
||||||
int FrameCountRendered;
|
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*> WindowsSortBuffer;
|
||||||
ImVector<ImGuiWindow*> CurrentWindowStack;
|
ImVector<ImGuiWindow*> CurrentWindowStack;
|
||||||
ImGuiStorage WindowsById;
|
ImGuiStorage WindowsById;
|
||||||
@ -1170,10 +1171,11 @@ namespace ImGui
|
|||||||
inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; }
|
inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; }
|
||||||
inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; 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 ImGuiWindow* FindWindowByName(const char* name);
|
||||||
IMGUI_API void FocusWindow(ImGuiWindow* window); // FIXME: Rename to SetWindowFocus()
|
IMGUI_API void FocusWindow(ImGuiWindow* window);
|
||||||
IMGUI_API void FocusFrontMostActiveWindowIgnoringOne(ImGuiWindow* ignore_window);
|
IMGUI_API void FocusPreviousWindowIgnoringOne(ImGuiWindow* ignore_window);
|
||||||
IMGUI_API void BringWindowToFront(ImGuiWindow* window);
|
IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window);
|
||||||
IMGUI_API void BringWindowToBack(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 void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window);
|
||||||
IMGUI_API ImVec2 CalcWindowExpectedSize(ImGuiWindow* window);
|
IMGUI_API ImVec2 CalcWindowExpectedSize(ImGuiWindow* window);
|
||||||
IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent);
|
IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// dear imgui, v1.65
|
// dear imgui, v1.66 WIP
|
||||||
// (widgets code)
|
// (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)
|
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;
|
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
|
// 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 && (v_max - v_min < FLT_MAX))
|
||||||
if (v_speed == 0.0f && has_min_max)
|
|
||||||
v_speed = (float)((v_max - v_min) * g.DragSpeedDefaultRatio);
|
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
|
// 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;
|
adjust_delta = g.IO.MouseDelta.x;
|
||||||
if (g.IO.KeyAlt)
|
if (g.IO.KeyAlt)
|
||||||
adjust_delta *= 1.0f/100.0f;
|
adjust_delta *= 1.0f / 100.0f;
|
||||||
if (g.IO.KeyShift)
|
if (g.IO.KeyShift)
|
||||||
adjust_delta *= 10.0f;
|
adjust_delta *= 10.0f;
|
||||||
}
|
}
|
||||||
else if (g.ActiveIdSource == ImGuiInputSource_Nav)
|
else if (g.ActiveIdSource == ImGuiInputSource_Nav)
|
||||||
{
|
{
|
||||||
int decimal_precision = (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) ? ImParseFormatPrecision(format, 3) : 0;
|
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;
|
adjust_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_Keyboard | ImGuiNavDirSourceFlags_PadDPad, ImGuiInputReadMode_RepeatFast, 1.0f / 10.0f, 10.0f).x;
|
||||||
v_speed = ImMax(v_speed, GetMinimumStepAtDecimalPrecision(decimal_precision));
|
v_speed = ImMax(v_speed, GetMinimumStepAtDecimalPrecision(decimal_precision));
|
||||||
}
|
}
|
||||||
adjust_delta *= v_speed;
|
adjust_delta *= v_speed;
|
||||||
@ -1752,7 +1753,7 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const
|
|||||||
TYPE v_cur = *v;
|
TYPE v_cur = *v;
|
||||||
FLOATTYPE v_old_ref_for_accum_remainder = (FLOATTYPE)0.0f;
|
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)
|
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
|
// 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)
|
if (v_cur == (TYPE)-0)
|
||||||
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 != 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;
|
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;
|
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
|
// 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;
|
ImGuiContext& g = *GImGui;
|
||||||
if (g.CurrentWindow == g.NavWindow && g.NavLayer == 0)
|
if (g.CurrentWindow == g.NavWindow && g.NavLayer == 0)
|
||||||
FocusFrontMostActiveWindowIgnoringOne(g.NavWindow);
|
FocusPreviousWindowIgnoringOne(g.NavWindow);
|
||||||
|
|
||||||
End();
|
End();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user