|
@@ -485,7 +485,7 @@ CODE
|
|
- 2024/10/03 (1.91.3) - drags: treat v_min==v_max as a valid clamping range when != 0.0f. Zero is a still special value due to legacy reasons, unless using ImGuiSliderFlags_ClampZeroRange. (#7968, #3361, #76)
|
|
- 2024/10/03 (1.91.3) - drags: treat v_min==v_max as a valid clamping range when != 0.0f. Zero is a still special value due to legacy reasons, unless using ImGuiSliderFlags_ClampZeroRange. (#7968, #3361, #76)
|
|
- drags: extended behavior of ImGuiSliderFlags_AlwaysClamp to include _ClampZeroRange. It considers v_min==v_max==0.0f as a valid clamping range (aka edits not allowed).
|
|
- drags: extended behavior of ImGuiSliderFlags_AlwaysClamp to include _ClampZeroRange. It considers v_min==v_max==0.0f as a valid clamping range (aka edits not allowed).
|
|
although unlikely, it you wish to only clamp on text input but want v_min==v_max==0.0f to mean unclamped drags, you can use _ClampOnInput instead of _AlwaysClamp. (#7968, #3361, #76)
|
|
although unlikely, it you wish to only clamp on text input but want v_min==v_max==0.0f to mean unclamped drags, you can use _ClampOnInput instead of _AlwaysClamp. (#7968, #3361, #76)
|
|
- - 2024/09/10 (1.91.2) - internals: using multiple overlayed ButtonBehavior() with same ID will now have io.ConfigDebugHighlightIdConflicts=true feature emit a warning. (#8030)
|
|
|
|
|
|
+ - 2024/09/10 (1.91.2) - internals: using multiple overlaid ButtonBehavior() with same ID will now have io.ConfigDebugHighlightIdConflicts=true feature emit a warning. (#8030)
|
|
it was one of the rare case where using same ID is legal. workarounds: (1) use single ButtonBehavior() call with multiple _MouseButton flags, or (2) surround the calls with PushItemFlag(ImGuiItemFlags_AllowDuplicateId, true); ... PopItemFlag()
|
|
it was one of the rare case where using same ID is legal. workarounds: (1) use single ButtonBehavior() call with multiple _MouseButton flags, or (2) surround the calls with PushItemFlag(ImGuiItemFlags_AllowDuplicateId, true); ... PopItemFlag()
|
|
- 2024/08/23 (1.91.1) - renamed ImGuiChildFlags_Border to ImGuiChildFlags_Borders for consistency. kept inline redirection flag.
|
|
- 2024/08/23 (1.91.1) - renamed ImGuiChildFlags_Border to ImGuiChildFlags_Borders for consistency. kept inline redirection flag.
|
|
- 2024/08/22 (1.91.1) - moved some functions from ImGuiIO to ImGuiPlatformIO structure:
|
|
- 2024/08/22 (1.91.1) - moved some functions from ImGuiIO to ImGuiPlatformIO structure:
|
|
@@ -678,7 +678,7 @@ CODE
|
|
- 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(), ImGui::IsKeyDown(). Removed GetKeyIndex(), now unnecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details.
|
|
- 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(), ImGui::IsKeyDown(). Removed GetKeyIndex(), now unnecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details.
|
|
- IsKeyPressed(MY_NATIVE_KEY_XXX) -> use IsKeyPressed(ImGuiKey_XXX)
|
|
- IsKeyPressed(MY_NATIVE_KEY_XXX) -> use IsKeyPressed(ImGuiKey_XXX)
|
|
- IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX)
|
|
- IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX)
|
|
- - Backend writing to io.KeyMap[],io.KeysDown[] -> backend should call io.AddKeyEvent() (+ call io.SetKeyEventNativeData() if you want legacy user code to stil function with legacy key codes).
|
|
|
|
|
|
+ - Backend writing to io.KeyMap[],io.KeysDown[] -> backend should call io.AddKeyEvent() (+ call io.SetKeyEventNativeData() if you want legacy user code to still function with legacy key codes).
|
|
- Backend writing to io.KeyCtrl, io.KeyShift.. -> backend should call io.AddKeyEvent() with ImGuiMod_XXX values. *IF YOU PULLED CODE BETWEEN 2021/01/10 and 2021/01/27: We used to have a io.AddKeyModsEvent() function which was now replaced by io.AddKeyEvent() with ImGuiMod_XXX values.*
|
|
- Backend writing to io.KeyCtrl, io.KeyShift.. -> backend should call io.AddKeyEvent() with ImGuiMod_XXX values. *IF YOU PULLED CODE BETWEEN 2021/01/10 and 2021/01/27: We used to have a io.AddKeyModsEvent() function which was now replaced by io.AddKeyEvent() with ImGuiMod_XXX values.*
|
|
- one case won't work with backward compatibility: if your custom backend used ImGuiKey as mock native indices (e.g. "io.KeyMap[ImGuiKey_A] = ImGuiKey_A") because those values are now larger than the legacy KeyDown[] array. Will assert.
|
|
- one case won't work with backward compatibility: if your custom backend used ImGuiKey as mock native indices (e.g. "io.KeyMap[ImGuiKey_A] = ImGuiKey_A") because those values are now larger than the legacy KeyDown[] array. Will assert.
|
|
- inputs: added ImGuiKey_ModCtrl/ImGuiKey_ModShift/ImGuiKey_ModAlt/ImGuiKey_ModSuper values to submit keyboard modifiers using io.AddKeyEvent(), instead of writing directly to io.KeyCtrl, io.KeyShift, io.KeyAlt, io.KeySuper.
|
|
- inputs: added ImGuiKey_ModCtrl/ImGuiKey_ModShift/ImGuiKey_ModAlt/ImGuiKey_ModSuper values to submit keyboard modifiers using io.AddKeyEvent(), instead of writing directly to io.KeyCtrl, io.KeyShift, io.KeyAlt, io.KeySuper.
|
|
@@ -887,7 +887,7 @@ CODE
|
|
- renamed IsMouseHoveringAnyWindow() to IsAnyWindowHovered() for consistency. Kept inline redirection function (will obsolete).
|
|
- renamed IsMouseHoveringAnyWindow() to IsAnyWindowHovered() for consistency. Kept inline redirection function (will obsolete).
|
|
- renamed IsMouseHoveringWindow() to IsWindowRectHovered() for consistency. Kept inline redirection function (will obsolete).
|
|
- renamed IsMouseHoveringWindow() to IsWindowRectHovered() for consistency. Kept inline redirection function (will obsolete).
|
|
- 2017/08/20 (1.51) - renamed GetStyleColName() to GetStyleColorName() for consistency.
|
|
- 2017/08/20 (1.51) - renamed GetStyleColName() to GetStyleColorName() for consistency.
|
|
- - 2017/08/20 (1.51) - added PushStyleColor(ImGuiCol idx, ImU32 col) overload, which _might_ cause an "ambiguous call" compilation error if you are using ImColor() with implicit cast. Cast to ImU32 or ImVec4 explicily to fix.
|
|
|
|
|
|
+ - 2017/08/20 (1.51) - added PushStyleColor(ImGuiCol idx, ImU32 col) overload, which _might_ cause an "ambiguous call" compilation error if you are using ImColor() with implicit cast. Cast to ImU32 or ImVec4 explicitly to fix.
|
|
- 2017/08/15 (1.51) - marked the weird IMGUI_ONCE_UPON_A_FRAME helper macro as obsolete. prefer using the more explicit ImGuiOnceUponAFrame type.
|
|
- 2017/08/15 (1.51) - marked the weird IMGUI_ONCE_UPON_A_FRAME helper macro as obsolete. prefer using the more explicit ImGuiOnceUponAFrame type.
|
|
- 2017/08/15 (1.51) - changed parameter order for BeginPopupContextWindow() from (const char*,int buttons,bool also_over_items) to (const char*,int buttons,bool also_over_items). Note that most calls relied on default parameters completely.
|
|
- 2017/08/15 (1.51) - changed parameter order for BeginPopupContextWindow() from (const char*,int buttons,bool also_over_items) to (const char*,int buttons,bool also_over_items). Note that most calls relied on default parameters completely.
|
|
- 2017/08/13 (1.51) - renamed ImGuiCol_Column to ImGuiCol_Separator, ImGuiCol_ColumnHovered to ImGuiCol_SeparatorHovered, ImGuiCol_ColumnActive to ImGuiCol_SeparatorActive. Kept redirection enums (will obsolete).
|
|
- 2017/08/13 (1.51) - renamed ImGuiCol_Column to ImGuiCol_Separator, ImGuiCol_ColumnHovered to ImGuiCol_SeparatorHovered, ImGuiCol_ColumnActive to ImGuiCol_SeparatorActive. Kept redirection enums (will obsolete).
|
|
@@ -1787,7 +1787,7 @@ void ImGuiIO::AddMouseButtonEvent(int mouse_button, bool down)
|
|
// On MacOS X: Convert Ctrl(Super)+Left click into Right-click: handle held button.
|
|
// On MacOS X: Convert Ctrl(Super)+Left click into Right-click: handle held button.
|
|
if (ConfigMacOSXBehaviors && mouse_button == 0 && MouseCtrlLeftAsRightClick)
|
|
if (ConfigMacOSXBehaviors && mouse_button == 0 && MouseCtrlLeftAsRightClick)
|
|
{
|
|
{
|
|
- // Order of both statements matterns: this event will still release mouse button 1
|
|
|
|
|
|
+ // Order of both statements matters: this event will still release mouse button 1
|
|
mouse_button = 1;
|
|
mouse_button = 1;
|
|
if (!down)
|
|
if (!down)
|
|
MouseCtrlLeftAsRightClick = false;
|
|
MouseCtrlLeftAsRightClick = false;
|
|
@@ -3705,7 +3705,7 @@ void ImGui::RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end
|
|
|
|
|
|
// Default clip_rect uses (pos_min,pos_max)
|
|
// Default clip_rect uses (pos_min,pos_max)
|
|
// Handle clipping on CPU immediately (vs typically let the GPU clip the triangles that are overlapping the clipping rectangle edges)
|
|
// Handle clipping on CPU immediately (vs typically let the GPU clip the triangles that are overlapping the clipping rectangle edges)
|
|
-// FIXME-OPT: Since we have or calculate text_size we could coarse clip whole block immediately, especally for text above draw_list->DrawList.
|
|
|
|
|
|
+// FIXME-OPT: Since we have or calculate text_size we could coarse clip whole block immediately, especially for text above draw_list->DrawList.
|
|
// Effectively as this is called from widget doing their own coarse clipping it's not very valuable presently. Next time function will take
|
|
// Effectively as this is called from widget doing their own coarse clipping it's not very valuable presently. Next time function will take
|
|
// better advantage of the render function taking size into account for coarse clipping.
|
|
// better advantage of the render function taking size into account for coarse clipping.
|
|
void ImGui::RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_display_end, const ImVec2* text_size_if_known, const ImVec2& align, const ImRect* clip_rect)
|
|
void ImGui::RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_display_end, const ImVec2* text_size_if_known, const ImVec2& align, const ImRect* clip_rect)
|
|
@@ -4094,9 +4094,11 @@ ImGuiContext::ImGuiContext(ImFontAtlas* shared_font_atlas)
|
|
|
|
|
|
// All platforms use Ctrl+Tab but Ctrl<>Super are swapped on Mac...
|
|
// All platforms use Ctrl+Tab but Ctrl<>Super are swapped on Mac...
|
|
// FIXME: Because this value is stored, it annoyingly interfere with toggling io.ConfigMacOSXBehaviors updating this..
|
|
// FIXME: Because this value is stored, it annoyingly interfere with toggling io.ConfigMacOSXBehaviors updating this..
|
|
|
|
+ ConfigNavWindowingWithGamepad = true;
|
|
ConfigNavWindowingKeyNext = IO.ConfigMacOSXBehaviors ? (ImGuiMod_Super | ImGuiKey_Tab) : (ImGuiMod_Ctrl | ImGuiKey_Tab);
|
|
ConfigNavWindowingKeyNext = IO.ConfigMacOSXBehaviors ? (ImGuiMod_Super | ImGuiKey_Tab) : (ImGuiMod_Ctrl | ImGuiKey_Tab);
|
|
ConfigNavWindowingKeyPrev = IO.ConfigMacOSXBehaviors ? (ImGuiMod_Super | ImGuiMod_Shift | ImGuiKey_Tab) : (ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab);
|
|
ConfigNavWindowingKeyPrev = IO.ConfigMacOSXBehaviors ? (ImGuiMod_Super | ImGuiMod_Shift | ImGuiKey_Tab) : (ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab);
|
|
NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL;
|
|
NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL;
|
|
|
|
+ NavWindowingInputSource = ImGuiInputSource_None;
|
|
NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f;
|
|
NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f;
|
|
NavWindowingToggleLayer = false;
|
|
NavWindowingToggleLayer = false;
|
|
NavWindowingToggleKey = ImGuiKey_None;
|
|
NavWindowingToggleKey = ImGuiKey_None;
|
|
@@ -5236,7 +5238,7 @@ static bool IsWindowActiveAndVisible(ImGuiWindow* window)
|
|
}
|
|
}
|
|
|
|
|
|
// The reason this is exposed in imgui_internal.h is: on touch-based system that don't have hovering, we want to dispatch inputs to the right target (imgui vs imgui+app)
|
|
// The reason this is exposed in imgui_internal.h is: on touch-based system that don't have hovering, we want to dispatch inputs to the right target (imgui vs imgui+app)
|
|
-void ImGui::UpdateHoveredWindowAndCaptureFlags()
|
|
|
|
|
|
+void ImGui::UpdateHoveredWindowAndCaptureFlags(const ImVec2& mouse_pos)
|
|
{
|
|
{
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiIO& io = g.IO;
|
|
ImGuiIO& io = g.IO;
|
|
@@ -5250,7 +5252,7 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags()
|
|
// - When moving a window we can skip the search, which also conveniently bypasses the fact that window->WindowRectClipped is lagging as this point of the frame.
|
|
// - When moving a window we can skip the search, which also conveniently bypasses the fact that window->WindowRectClipped is lagging as this point of the frame.
|
|
// - We also support the moved window toggling the NoInputs flag after moving has started in order to be able to detect windows below it, which is useful for e.g. docking mechanisms.
|
|
// - We also support the moved window toggling the NoInputs flag after moving has started in order to be able to detect windows below it, which is useful for e.g. docking mechanisms.
|
|
bool clear_hovered_windows = false;
|
|
bool clear_hovered_windows = false;
|
|
- FindHoveredWindowEx(g.IO.MousePos, false, &g.HoveredWindow, &g.HoveredWindowUnderMovingWindow);
|
|
|
|
|
|
+ FindHoveredWindowEx(mouse_pos, false, &g.HoveredWindow, &g.HoveredWindowUnderMovingWindow);
|
|
IM_ASSERT(g.HoveredWindow == NULL || g.HoveredWindow == g.MovingWindow || g.HoveredWindow->Viewport == g.MouseViewport);
|
|
IM_ASSERT(g.HoveredWindow == NULL || g.HoveredWindow == g.MovingWindow || g.HoveredWindow->Viewport == g.MouseViewport);
|
|
g.HoveredWindowBeforeClear = g.HoveredWindow;
|
|
g.HoveredWindowBeforeClear = g.HoveredWindow;
|
|
|
|
|
|
@@ -5532,7 +5534,7 @@ void ImGui::NewFrame()
|
|
// Find hovered window
|
|
// Find hovered window
|
|
// (needs to be before UpdateMouseMovingWindowNewFrame so we fill g.HoveredWindowUnderMovingWindow on the mouse release frame)
|
|
// (needs to be before UpdateMouseMovingWindowNewFrame so we fill g.HoveredWindowUnderMovingWindow on the mouse release frame)
|
|
// (currently needs to be done after the WasActive=Active loop and FindHoveredWindowEx uses ->Active)
|
|
// (currently needs to be done after the WasActive=Active loop and FindHoveredWindowEx uses ->Active)
|
|
- UpdateHoveredWindowAndCaptureFlags();
|
|
|
|
|
|
+ UpdateHoveredWindowAndCaptureFlags(g.IO.MousePos);
|
|
|
|
|
|
// Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering)
|
|
// Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering)
|
|
UpdateMouseMovingWindowNewFrame();
|
|
UpdateMouseMovingWindowNewFrame();
|
|
@@ -5726,7 +5728,7 @@ static void InitViewportDrawData(ImGuiViewportP* viewport)
|
|
// - If the code here changes, may need to update code of functions like NextColumn() and PushColumnClipRect():
|
|
// - If the code here changes, may need to update code of functions like NextColumn() and PushColumnClipRect():
|
|
// some frequently called functions which to modify both channels and clipping simultaneously tend to use the
|
|
// some frequently called functions which to modify both channels and clipping simultaneously tend to use the
|
|
// more specialized SetWindowClipRectBeforeSetChannel() to avoid extraneous updates of underlying ImDrawCmds.
|
|
// more specialized SetWindowClipRectBeforeSetChannel() to avoid extraneous updates of underlying ImDrawCmds.
|
|
-// - This is analoguous to PushFont()/PopFont() in the sense that are a mixing a global stack and a window stack,
|
|
|
|
|
|
+// - This is analogous to PushFont()/PopFont() in the sense that are a mixing a global stack and a window stack,
|
|
// which in the case of ClipRect is not so problematic but tends to be more restrictive for fonts.
|
|
// which in the case of ClipRect is not so problematic but tends to be more restrictive for fonts.
|
|
void ImGui::PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect)
|
|
void ImGui::PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect)
|
|
{
|
|
{
|
|
@@ -5969,7 +5971,7 @@ void ImGui::EndFrame()
|
|
}
|
|
}
|
|
|
|
|
|
// Prepare the data for rendering so you can call GetDrawData()
|
|
// Prepare the data for rendering so you can call GetDrawData()
|
|
-// (As with anything within the ImGui:: namspace this doesn't touch your GPU or graphics API at all:
|
|
|
|
|
|
+// (As with anything within the ImGui:: namespace this doesn't touch your GPU or graphics API at all:
|
|
// it is the role of the ImGui_ImplXXXX_RenderDrawData() function provided by the renderer backend)
|
|
// it is the role of the ImGui_ImplXXXX_RenderDrawData() function provided by the renderer backend)
|
|
void ImGui::Render()
|
|
void ImGui::Render()
|
|
{
|
|
{
|
|
@@ -8433,7 +8435,7 @@ void ImGui::SetCurrentFont(ImFont* font)
|
|
g.DrawListSharedData.FontScale = g.FontScale;
|
|
g.DrawListSharedData.FontScale = g.FontScale;
|
|
}
|
|
}
|
|
|
|
|
|
-// Use ImDrawList::_SetTextureID(), making our shared g.FontStack[] authorative against window-local ImDrawList.
|
|
|
|
|
|
+// Use ImDrawList::_SetTextureID(), making our shared g.FontStack[] authoritative against window-local ImDrawList.
|
|
// - Whereas ImDrawList::PushTextureID()/PopTextureID() is not to be used across Begin() calls.
|
|
// - Whereas ImDrawList::PushTextureID()/PopTextureID() is not to be used across Begin() calls.
|
|
// - Note that we don't propagate current texture id when e.g. Begin()-ing into a new window, we never really did...
|
|
// - Note that we don't propagate current texture id when e.g. Begin()-ing into a new window, we never really did...
|
|
// - Some code paths never really fully worked with multiple atlas textures.
|
|
// - Some code paths never really fully worked with multiple atlas textures.
|
|
@@ -8807,8 +8809,10 @@ void ImGui::SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond co
|
|
return;
|
|
return;
|
|
window->SetWindowCollapsedAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing);
|
|
window->SetWindowCollapsedAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing);
|
|
|
|
|
|
- // Set
|
|
|
|
- window->Collapsed = collapsed;
|
|
|
|
|
|
+ // Queue applying in Begin()
|
|
|
|
+ if (window->WantCollapseToggle)
|
|
|
|
+ window->Collapsed ^= 1;
|
|
|
|
+ window->WantCollapseToggle = (window->Collapsed != collapsed);
|
|
}
|
|
}
|
|
|
|
|
|
void ImGui::SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size)
|
|
void ImGui::SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size)
|
|
@@ -10494,12 +10498,16 @@ void ImGui::UpdateInputEvents(bool trickle_fast_inputs)
|
|
if (trickle_interleaved_nonchar_keys_and_text && (text_inputted && !key_is_potentially_for_char_input))
|
|
if (trickle_interleaved_nonchar_keys_and_text && (text_inputted && !key_is_potentially_for_char_input))
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ if (key_data->Down != e->Key.Down) // Analog change only do not trigger this, so it won't block e.g. further mouse pos events testing key_changed.
|
|
|
|
+ {
|
|
|
|
+ key_changed = true;
|
|
|
|
+ key_changed_mask.SetBit(key_data_index);
|
|
|
|
+ if (trickle_interleaved_nonchar_keys_and_text && !key_is_potentially_for_char_input)
|
|
|
|
+ key_changed_nonchar = true;
|
|
|
|
+ }
|
|
|
|
+
|
|
key_data->Down = e->Key.Down;
|
|
key_data->Down = e->Key.Down;
|
|
key_data->AnalogValue = e->Key.AnalogValue;
|
|
key_data->AnalogValue = e->Key.AnalogValue;
|
|
- key_changed = true;
|
|
|
|
- key_changed_mask.SetBit(key_data_index);
|
|
|
|
- if (trickle_interleaved_nonchar_keys_and_text && !key_is_potentially_for_char_input)
|
|
|
|
- key_changed_nonchar = true;
|
|
|
|
}
|
|
}
|
|
else if (e->Type == ImGuiInputEventType_Text)
|
|
else if (e->Type == ImGuiInputEventType_Text)
|
|
{
|
|
{
|
|
@@ -12021,7 +12029,7 @@ bool ImGui::BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags ext
|
|
// - offset visibility to increase visibility around mouse.
|
|
// - offset visibility to increase visibility around mouse.
|
|
// - never clamp within outer viewport boundary.
|
|
// - never clamp within outer viewport boundary.
|
|
// We call SetNextWindowPos() to enforce position and disable clamping.
|
|
// We call SetNextWindowPos() to enforce position and disable clamping.
|
|
- // See FindBestWindowPosForPopup() for positionning logic of other tooltips (not drag and drop ones).
|
|
|
|
|
|
+ // See FindBestWindowPosForPopup() for positioning logic of other tooltips (not drag and drop ones).
|
|
//ImVec2 tooltip_pos = g.IO.MousePos - g.ActiveIdClickOffset - g.Style.WindowPadding;
|
|
//ImVec2 tooltip_pos = g.IO.MousePos - g.ActiveIdClickOffset - g.Style.WindowPadding;
|
|
const bool is_touchscreen = (g.IO.MouseSource == ImGuiMouseSource_TouchScreen);
|
|
const bool is_touchscreen = (g.IO.MouseSource == ImGuiMouseSource_TouchScreen);
|
|
if ((g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasPos) == 0)
|
|
if ((g.NextWindowData.HasFlags & ImGuiNextWindowDataFlags_HasPos) == 0)
|
|
@@ -14477,17 +14485,18 @@ static void ImGui::NavUpdateWindowing()
|
|
const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0;
|
|
const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0;
|
|
const bool keyboard_next_window = allow_windowing && g.ConfigNavWindowingKeyNext && Shortcut(g.ConfigNavWindowingKeyNext, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways, owner_id);
|
|
const bool keyboard_next_window = allow_windowing && g.ConfigNavWindowingKeyNext && Shortcut(g.ConfigNavWindowingKeyNext, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways, owner_id);
|
|
const bool keyboard_prev_window = allow_windowing && g.ConfigNavWindowingKeyPrev && Shortcut(g.ConfigNavWindowingKeyPrev, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways, owner_id);
|
|
const bool keyboard_prev_window = allow_windowing && g.ConfigNavWindowingKeyPrev && Shortcut(g.ConfigNavWindowingKeyPrev, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways, owner_id);
|
|
- const bool start_windowing_with_gamepad = allow_windowing && nav_gamepad_active && !g.NavWindowingTarget && IsKeyPressed(ImGuiKey_NavGamepadMenu, ImGuiInputFlags_None);
|
|
|
|
|
|
+ const bool start_windowing_with_gamepad = allow_windowing && nav_gamepad_active && !g.NavWindowingTarget && Shortcut(ImGuiKey_NavGamepadMenu, ImGuiInputFlags_RouteAlways, owner_id);
|
|
const bool start_windowing_with_keyboard = allow_windowing && !g.NavWindowingTarget && (keyboard_next_window || keyboard_prev_window); // Note: enabled even without NavEnableKeyboard!
|
|
const bool start_windowing_with_keyboard = allow_windowing && !g.NavWindowingTarget && (keyboard_next_window || keyboard_prev_window); // Note: enabled even without NavEnableKeyboard!
|
|
bool just_started_windowing_from_null_focus = false;
|
|
bool just_started_windowing_from_null_focus = false;
|
|
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.WindowsFocusOrder.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->RootWindow; // Current location
|
|
|
|
|
|
+ if (start_windowing_with_keyboard || g.ConfigNavWindowingWithGamepad)
|
|
|
|
+ g.NavWindowingTarget = g.NavWindowingTargetAnim = window->RootWindow; // Current location
|
|
g.NavWindowingTimer = g.NavWindowingHighlightAlpha = 0.0f;
|
|
g.NavWindowingTimer = g.NavWindowingHighlightAlpha = 0.0f;
|
|
g.NavWindowingAccumDeltaPos = g.NavWindowingAccumDeltaSize = ImVec2(0.0f, 0.0f);
|
|
g.NavWindowingAccumDeltaPos = g.NavWindowingAccumDeltaSize = ImVec2(0.0f, 0.0f);
|
|
g.NavWindowingToggleLayer = start_windowing_with_gamepad ? true : false; // Gamepad starts toggling layer
|
|
g.NavWindowingToggleLayer = start_windowing_with_gamepad ? true : false; // Gamepad starts toggling layer
|
|
- g.NavInputSource = start_windowing_with_keyboard ? ImGuiInputSource_Keyboard : ImGuiInputSource_Gamepad;
|
|
|
|
|
|
+ g.NavWindowingInputSource = g.NavInputSource = start_windowing_with_keyboard ? ImGuiInputSource_Keyboard : ImGuiInputSource_Gamepad;
|
|
if (g.NavWindow == NULL)
|
|
if (g.NavWindow == NULL)
|
|
just_started_windowing_from_null_focus = true;
|
|
just_started_windowing_from_null_focus = true;
|
|
|
|
|
|
@@ -14497,18 +14506,22 @@ static void ImGui::NavUpdateWindowing()
|
|
}
|
|
}
|
|
|
|
|
|
// Gamepad update
|
|
// Gamepad update
|
|
- g.NavWindowingTimer += io.DeltaTime;
|
|
|
|
- if (g.NavWindowingTarget && g.NavInputSource == ImGuiInputSource_Gamepad)
|
|
|
|
|
|
+ if ((g.NavWindowingTarget || g.NavWindowingToggleLayer) && g.NavWindowingInputSource == ImGuiInputSource_Gamepad)
|
|
{
|
|
{
|
|
- // Highlight only appears after a brief time holding the button, so that a fast tap on PadMenu (to toggle NavLayer) doesn't add visual noise
|
|
|
|
- g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f));
|
|
|
|
-
|
|
|
|
- // Select window to focus
|
|
|
|
- const int focus_change_dir = (int)IsKeyPressed(ImGuiKey_GamepadL1) - (int)IsKeyPressed(ImGuiKey_GamepadR1);
|
|
|
|
- if (focus_change_dir != 0 && !just_started_windowing_from_null_focus)
|
|
|
|
|
|
+ if (g.NavWindowingTarget != NULL)
|
|
{
|
|
{
|
|
- NavUpdateWindowingTarget(focus_change_dir);
|
|
|
|
- g.NavWindowingHighlightAlpha = 1.0f;
|
|
|
|
|
|
+ // Highlight only appears after a brief time holding the button, so that a fast tap on ImGuiKey_NavGamepadMenu (to toggle NavLayer) doesn't add visual noise
|
|
|
|
+ // However inputs are accepted immediately, so you press ImGuiKey_NavGamepadMenu + L1/R1 fast.
|
|
|
|
+ g.NavWindowingTimer += io.DeltaTime;
|
|
|
|
+ g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f));
|
|
|
|
+
|
|
|
|
+ // Select window to focus
|
|
|
|
+ const int focus_change_dir = (int)IsKeyPressed(ImGuiKey_GamepadL1) - (int)IsKeyPressed(ImGuiKey_GamepadR1);
|
|
|
|
+ if (focus_change_dir != 0 && !just_started_windowing_from_null_focus)
|
|
|
|
+ {
|
|
|
|
+ NavUpdateWindowingTarget(focus_change_dir);
|
|
|
|
+ g.NavWindowingHighlightAlpha = 1.0f;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
// Single press toggles NavLayer, long press with L/R apply actual focus on release (until then the window was merely rendered top-most)
|
|
// Single press toggles NavLayer, long press with L/R apply actual focus on release (until then the window was merely rendered top-most)
|
|
@@ -14520,15 +14533,17 @@ static void ImGui::NavUpdateWindowing()
|
|
else if (!g.NavWindowingToggleLayer)
|
|
else if (!g.NavWindowingToggleLayer)
|
|
apply_focus_window = g.NavWindowingTarget;
|
|
apply_focus_window = g.NavWindowingTarget;
|
|
g.NavWindowingTarget = NULL;
|
|
g.NavWindowingTarget = NULL;
|
|
|
|
+ g.NavWindowingToggleLayer = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Keyboard: Focus
|
|
// Keyboard: Focus
|
|
- if (g.NavWindowingTarget && g.NavInputSource == ImGuiInputSource_Keyboard)
|
|
|
|
|
|
+ if (g.NavWindowingTarget && g.NavWindowingInputSource == ImGuiInputSource_Keyboard)
|
|
{
|
|
{
|
|
// Visuals only appears after a brief time after pressing TAB the first time, so that a fast CTRL+TAB doesn't add visual noise
|
|
// Visuals only appears after a brief time after pressing TAB the first time, so that a fast CTRL+TAB doesn't add visual noise
|
|
ImGuiKeyChord shared_mods = ((g.ConfigNavWindowingKeyNext ? g.ConfigNavWindowingKeyNext : ImGuiMod_Mask_) & (g.ConfigNavWindowingKeyPrev ? g.ConfigNavWindowingKeyPrev : ImGuiMod_Mask_)) & ImGuiMod_Mask_;
|
|
ImGuiKeyChord shared_mods = ((g.ConfigNavWindowingKeyNext ? g.ConfigNavWindowingKeyNext : ImGuiMod_Mask_) & (g.ConfigNavWindowingKeyPrev ? g.ConfigNavWindowingKeyPrev : ImGuiMod_Mask_)) & ImGuiMod_Mask_;
|
|
IM_ASSERT(shared_mods != 0); // Next/Prev shortcut currently needs a shared modifier to "hold", otherwise Prev actions would keep cycling between two windows.
|
|
IM_ASSERT(shared_mods != 0); // Next/Prev shortcut currently needs a shared modifier to "hold", otherwise Prev actions would keep cycling between two windows.
|
|
|
|
+ g.NavWindowingTimer += io.DeltaTime;
|
|
g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f)); // 1.0f
|
|
g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f)); // 1.0f
|
|
if ((keyboard_next_window || keyboard_prev_window) && !just_started_windowing_from_null_focus)
|
|
if ((keyboard_next_window || keyboard_prev_window) && !just_started_windowing_from_null_focus)
|
|
NavUpdateWindowingTarget(keyboard_next_window ? -1 : +1);
|
|
NavUpdateWindowingTarget(keyboard_next_window ? -1 : +1);
|
|
@@ -14546,10 +14561,10 @@ static void ImGui::NavUpdateWindowing()
|
|
windowing_toggle_layer_start = true;
|
|
windowing_toggle_layer_start = true;
|
|
g.NavWindowingToggleLayer = true;
|
|
g.NavWindowingToggleLayer = true;
|
|
g.NavWindowingToggleKey = windowing_toggle_key;
|
|
g.NavWindowingToggleKey = windowing_toggle_key;
|
|
- g.NavInputSource = ImGuiInputSource_Keyboard;
|
|
|
|
|
|
+ g.NavWindowingInputSource = g.NavInputSource = ImGuiInputSource_Keyboard;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- if (g.NavWindowingToggleLayer && g.NavInputSource == ImGuiInputSource_Keyboard)
|
|
|
|
|
|
+ if (g.NavWindowingToggleLayer && g.NavWindowingInputSource == ImGuiInputSource_Keyboard)
|
|
{
|
|
{
|
|
// We cancel toggling nav layer when any text has been typed (generally while holding Alt). (See #370)
|
|
// We cancel toggling nav layer when any text has been typed (generally while holding Alt). (See #370)
|
|
// We cancel toggling nav layer when other modifiers are pressed. (See #4439)
|
|
// We cancel toggling nav layer when other modifiers are pressed. (See #4439)
|