|
@@ -2483,47 +2483,45 @@ void ImGui::NewFrame()
|
|
if (!mouse_avail_to_imgui && !mouse_dragging_extern_payload)
|
|
if (!mouse_avail_to_imgui && !mouse_dragging_extern_payload)
|
|
g.HoveredWindow = g.HoveredRootWindow = NULL;
|
|
g.HoveredWindow = g.HoveredRootWindow = NULL;
|
|
|
|
|
|
- // Scale & Scrolling
|
|
|
|
- if (g.HoveredWindow && g.IO.MouseWheel != 0.0f && !g.HoveredWindow->Collapsed)
|
|
|
|
|
|
+ // Mouse wheel scrolling, scale
|
|
|
|
+ if (g.HoveredWindow && !g.HoveredWindow->Collapsed && (g.IO.MouseWheel != 0.0f || g.IO.MouseWheelH != 0.0f))
|
|
{
|
|
{
|
|
|
|
+ // If a child window has the ImGuiWindowFlags_NoScrollWithMouse flag, we give a chance to scroll its parent (unless either ImGuiWindowFlags_NoInputs or ImGuiWindowFlags_NoScrollbar are also set).
|
|
ImGuiWindow* window = g.HoveredWindow;
|
|
ImGuiWindow* window = g.HoveredWindow;
|
|
- if (g.IO.KeyCtrl && g.IO.FontAllowUserScaling)
|
|
|
|
- {
|
|
|
|
- // Zoom / Scale window
|
|
|
|
- const float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f);
|
|
|
|
- const float scale = new_font_scale / window->FontWindowScale;
|
|
|
|
- window->FontWindowScale = new_font_scale;
|
|
|
|
|
|
+ ImGuiWindow* scroll_window = window;
|
|
|
|
+ while ((scroll_window->Flags & ImGuiWindowFlags_ChildWindow) && (scroll_window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(scroll_window->Flags & ImGuiWindowFlags_NoScrollbar) && !(scroll_window->Flags & ImGuiWindowFlags_NoInputs) && scroll_window->ParentWindow)
|
|
|
|
+ scroll_window = scroll_window->ParentWindow;
|
|
|
|
+ const bool scroll_allowed = !(scroll_window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(scroll_window->Flags & ImGuiWindowFlags_NoInputs);
|
|
|
|
|
|
- const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size;
|
|
|
|
- window->Pos += offset;
|
|
|
|
- window->PosFloat += offset;
|
|
|
|
- window->Size *= scale;
|
|
|
|
- window->SizeFull *= scale;
|
|
|
|
- }
|
|
|
|
- else if (!g.IO.KeyCtrl)
|
|
|
|
|
|
+ if (g.IO.MouseWheel != 0.0f)
|
|
{
|
|
{
|
|
- // Mouse wheel Scrolling
|
|
|
|
- // If a child window has the ImGuiWindowFlags_NoScrollWithMouse flag, we give a chance to scroll its parent (unless either ImGuiWindowFlags_NoInputs or ImGuiWindowFlags_NoScrollbar are also set).
|
|
|
|
- ImGuiWindow* scroll_window = window;
|
|
|
|
- while ((scroll_window->Flags & ImGuiWindowFlags_ChildWindow) && (scroll_window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(scroll_window->Flags & ImGuiWindowFlags_NoScrollbar) && !(scroll_window->Flags & ImGuiWindowFlags_NoInputs) && scroll_window->ParentWindow)
|
|
|
|
- scroll_window = scroll_window->ParentWindow;
|
|
|
|
-
|
|
|
|
- if (!(scroll_window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(scroll_window->Flags & ImGuiWindowFlags_NoInputs))
|
|
|
|
|
|
+ if (g.IO.KeyCtrl && g.IO.FontAllowUserScaling)
|
|
|
|
+ {
|
|
|
|
+ // Zoom / Scale window
|
|
|
|
+ const float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f);
|
|
|
|
+ const float scale = new_font_scale / window->FontWindowScale;
|
|
|
|
+ window->FontWindowScale = new_font_scale;
|
|
|
|
+
|
|
|
|
+ const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size;
|
|
|
|
+ window->Pos += offset;
|
|
|
|
+ window->PosFloat += offset;
|
|
|
|
+ window->Size *= scale;
|
|
|
|
+ window->SizeFull *= scale;
|
|
|
|
+ }
|
|
|
|
+ else if (!g.IO.KeyCtrl && scroll_allowed)
|
|
{
|
|
{
|
|
|
|
+ // Mouse wheel vertical scrolling
|
|
float scroll_amount = 5 * scroll_window->CalcFontSize();
|
|
float scroll_amount = 5 * scroll_window->CalcFontSize();
|
|
scroll_amount = (float)(int)ImMin(scroll_amount, (scroll_window->ContentsRegionRect.GetHeight() + scroll_window->WindowPadding.y * 2.0f) * 0.67f);
|
|
scroll_amount = (float)(int)ImMin(scroll_amount, (scroll_window->ContentsRegionRect.GetHeight() + scroll_window->WindowPadding.y * 2.0f) * 0.67f);
|
|
SetWindowScrollY(scroll_window, scroll_window->Scroll.y - g.IO.MouseWheel * scroll_amount);
|
|
SetWindowScrollY(scroll_window, scroll_window->Scroll.y - g.IO.MouseWheel * scroll_amount);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- }
|
|
|
|
-
|
|
|
|
- // Horizontal wheel scrolling; for consistency, only allowed if Ctrl is not pressed.
|
|
|
|
- if (g.HoveredWindow && g.IO.MouseHorizWheel != 0.0f && !g.HoveredWindow->Collapsed)
|
|
|
|
- {
|
|
|
|
- ImGuiWindow* window = g.HoveredWindow;
|
|
|
|
- if (!g.IO.KeyCtrl && !(window->Flags & ImGuiWindowFlags_NoScrollWithMouse))
|
|
|
|
|
|
+ if (g.IO.MouseWheelH != 0.0f && scroll_allowed)
|
|
{
|
|
{
|
|
- SetWindowScrollX(window, window->Scroll.x - g.IO.MouseHorizWheel * 10.f);
|
|
|
|
|
|
+ // Mouse wheel horizontal scrolling (for hardware that supports it)
|
|
|
|
+ float scroll_amount = scroll_window->CalcFontSize();
|
|
|
|
+ if (!g.IO.KeyCtrl && !(window->Flags & ImGuiWindowFlags_NoScrollWithMouse))
|
|
|
|
+ SetWindowScrollX(window, window->Scroll.x - g.IO.MouseWheelH * scroll_amount);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3040,7 +3038,7 @@ void ImGui::EndFrame()
|
|
g.Windows.swap(g.WindowsSortBuffer);
|
|
g.Windows.swap(g.WindowsSortBuffer);
|
|
|
|
|
|
// Clear Input data for next frame
|
|
// Clear Input data for next frame
|
|
- g.IO.MouseWheel = 0.0f;
|
|
|
|
|
|
+ g.IO.MouseWheel = g.IO.MouseWheelH = 0.0f;
|
|
memset(g.IO.InputCharacters, 0, sizeof(g.IO.InputCharacters));
|
|
memset(g.IO.InputCharacters, 0, sizeof(g.IO.InputCharacters));
|
|
|
|
|
|
g.FrameCountEnded = g.FrameCount;
|
|
g.FrameCountEnded = g.FrameCount;
|