mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-26 05:27:01 +00:00
Internals: Scroll related, comments & shallow tweaks.
This commit is contained in:
parent
b73305be11
commit
8db94cd992
58
imgui.cpp
58
imgui.cpp
@ -7368,16 +7368,16 @@ static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window)
|
|||||||
ImVec2 scroll = window->Scroll;
|
ImVec2 scroll = window->Scroll;
|
||||||
if (window->ScrollTarget.x < FLT_MAX)
|
if (window->ScrollTarget.x < FLT_MAX)
|
||||||
{
|
{
|
||||||
float cr_x = window->ScrollTargetCenterRatio.x;
|
float center_x_ratio = window->ScrollTargetCenterRatio.x;
|
||||||
float target_x = window->ScrollTarget.x;
|
float scroll_target_x = window->ScrollTarget.x;
|
||||||
scroll.x = target_x - cr_x * (window->SizeFull.x - window->ScrollbarSizes.x);
|
scroll.x = scroll_target_x - center_x_ratio * (window->SizeFull.x - window->ScrollbarSizes.x);
|
||||||
}
|
}
|
||||||
if (window->ScrollTarget.y < FLT_MAX)
|
if (window->ScrollTarget.y < FLT_MAX)
|
||||||
{
|
{
|
||||||
float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight();
|
float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight();
|
||||||
float cr_y = window->ScrollTargetCenterRatio.y;
|
float center_y_ratio = window->ScrollTargetCenterRatio.y;
|
||||||
float target_y = window->ScrollTarget.y;
|
float scroll_target_y = window->ScrollTarget.y;
|
||||||
scroll.y = target_y - cr_y * (window->SizeFull.y - window->ScrollbarSizes.y - decoration_up_height);
|
scroll.y = scroll_target_y - center_y_ratio * (window->SizeFull.y - window->ScrollbarSizes.y - decoration_up_height);
|
||||||
}
|
}
|
||||||
scroll.x = IM_FLOOR(ImMax(scroll.x, 0.0f));
|
scroll.x = IM_FLOOR(ImMax(scroll.x, 0.0f));
|
||||||
scroll.y = IM_FLOOR(ImMax(scroll.y, 0.0f));
|
scroll.y = IM_FLOOR(ImMax(scroll.y, 0.0f));
|
||||||
@ -7443,38 +7443,44 @@ float ImGui::GetScrollMaxY()
|
|||||||
return window->ScrollMax.y;
|
return window->ScrollMax.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::SetScrollX(float scroll_x)
|
void ImGui::SetScrollX(ImGuiWindow* window, float scroll_x)
|
||||||
{
|
{
|
||||||
ImGuiWindow* window = GetCurrentWindow();
|
|
||||||
window->ScrollTarget.x = scroll_x;
|
window->ScrollTarget.x = scroll_x;
|
||||||
window->ScrollTargetCenterRatio.x = 0.0f;
|
window->ScrollTargetCenterRatio.x = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::SetScrollY(float scroll_y)
|
void ImGui::SetScrollY(ImGuiWindow* window, float scroll_y)
|
||||||
{
|
{
|
||||||
ImGuiWindow* window = GetCurrentWindow();
|
|
||||||
window->ScrollTarget.y = scroll_y;
|
window->ScrollTarget.y = scroll_y;
|
||||||
window->ScrollTargetCenterRatio.y = 0.0f;
|
window->ScrollTargetCenterRatio.y = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::SetScrollX(ImGuiWindow* window, float new_scroll_x)
|
void ImGui::SetScrollX(float scroll_x)
|
||||||
{
|
{
|
||||||
window->ScrollTarget.x = new_scroll_x;
|
ImGuiContext& g = *GImGui;
|
||||||
window->ScrollTargetCenterRatio.x = 0.0f;
|
SetScrollX(g.CurrentWindow, scroll_x);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::SetScrollY(ImGuiWindow* window, float new_scroll_y)
|
void ImGui::SetScrollY(float scroll_y)
|
||||||
{
|
{
|
||||||
window->ScrollTarget.y = new_scroll_y;
|
ImGuiContext& g = *GImGui;
|
||||||
window->ScrollTargetCenterRatio.y = 0.0f;
|
SetScrollY(g.CurrentWindow, scroll_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note that a local position will vary depending on initial scroll value
|
// Note that a local position will vary depending on initial scroll value,
|
||||||
// We store a target position so centering can occur on the next frame when we are guaranteed to have a known window size
|
// This is a little bit confusing so bear with us:
|
||||||
|
// - local_pos = (absolution_pos - window->Pos)
|
||||||
|
// - So local_x/local_y are 0.0f for a position at the upper-left corner of a window,
|
||||||
|
// and generally local_x/local_y are >(padding+decoration) && <(size-padding-decoration) when in the visible area.
|
||||||
|
// - They mostly exists because of legacy API.
|
||||||
|
// Following the rules above, when trying to work with scrolling code, consider that:
|
||||||
|
// - SetScrollFromPosY(0.0f) == SetScrollY(0.0f + scroll.y) == has no effect!
|
||||||
|
// - SetScrollFromPosY(-scroll.y) == SetScrollY(-scroll.y + scroll.y) == SetScrollY(0.0f) == reset scroll. Of course writing SetScrollY(0.0f) directly then makes more sense
|
||||||
|
// We store a target position so centering and clamping can occur on the next frame when we are guaranteed to have a known window size
|
||||||
void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio)
|
void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio)
|
||||||
{
|
{
|
||||||
IM_ASSERT(center_x_ratio >= 0.0f && center_x_ratio <= 1.0f);
|
IM_ASSERT(center_x_ratio >= 0.0f && center_x_ratio <= 1.0f);
|
||||||
window->ScrollTarget.x = IM_FLOOR(local_x + window->Scroll.x);
|
window->ScrollTarget.x = IM_FLOOR(local_x + window->Scroll.x); // Convert local position to scroll offset
|
||||||
window->ScrollTargetCenterRatio.x = center_x_ratio;
|
window->ScrollTargetCenterRatio.x = center_x_ratio;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7482,7 +7488,7 @@ void ImGui::SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y
|
|||||||
{
|
{
|
||||||
IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f);
|
IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f);
|
||||||
local_y -= window->TitleBarHeight() + window->MenuBarHeight(); // FIXME: Would be nice to have a more standardized access to our scrollable/client rect
|
local_y -= window->TitleBarHeight() + window->MenuBarHeight(); // FIXME: Would be nice to have a more standardized access to our scrollable/client rect
|
||||||
window->ScrollTarget.y = IM_FLOOR(local_y + window->Scroll.y);
|
window->ScrollTarget.y = IM_FLOOR(local_y + window->Scroll.y); // Convert local position to scroll offset
|
||||||
window->ScrollTargetCenterRatio.y = center_y_ratio;
|
window->ScrollTargetCenterRatio.y = center_y_ratio;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7517,15 +7523,15 @@ void ImGui::SetScrollHereX(float center_x_ratio)
|
|||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
ImGuiWindow* window = g.CurrentWindow;
|
ImGuiWindow* window = g.CurrentWindow;
|
||||||
float spacing_x = g.Style.ItemSpacing.x;
|
float spacing_x = g.Style.ItemSpacing.x;
|
||||||
float target_x = ImLerp(window->DC.LastItemRect.Min.x - spacing_x, window->DC.LastItemRect.Max.x + spacing_x, center_x_ratio);
|
float target_pos_x = ImLerp(window->DC.LastItemRect.Min.x - spacing_x, window->DC.LastItemRect.Max.x + spacing_x, center_x_ratio);
|
||||||
|
|
||||||
// Tweak: snap on edges when aiming at an item very close to the edge
|
// Tweak: snap on edges when aiming at an item very close to the edge
|
||||||
const float snap_x_threshold = ImMax(0.0f, window->WindowPadding.x - spacing_x);
|
const float snap_x_threshold = ImMax(0.0f, window->WindowPadding.x - spacing_x);
|
||||||
const float snap_x_min = window->DC.CursorStartPos.x - window->WindowPadding.x;
|
const float snap_x_min = window->DC.CursorStartPos.x - window->WindowPadding.x;
|
||||||
const float snap_x_max = window->DC.CursorStartPos.x + window->ContentSize.x + window->WindowPadding.x;
|
const float snap_x_max = window->DC.CursorStartPos.x + window->ContentSize.x + window->WindowPadding.x;
|
||||||
target_x = CalcScrollSnap(target_x, snap_x_min, snap_x_max, snap_x_threshold, center_x_ratio);
|
target_pos_x = CalcScrollSnap(target_pos_x, snap_x_min, snap_x_max, snap_x_threshold, center_x_ratio);
|
||||||
|
|
||||||
SetScrollFromPosX(window, target_x - window->Pos.x, center_x_ratio);
|
SetScrollFromPosX(window, target_pos_x - window->Pos.x, center_x_ratio); // Convert from absolute to local pos
|
||||||
}
|
}
|
||||||
|
|
||||||
// center_y_ratio: 0.0f top of last item, 0.5f vertical center of last item, 1.0f bottom of last item.
|
// center_y_ratio: 0.0f top of last item, 0.5f vertical center of last item, 1.0f bottom of last item.
|
||||||
@ -7534,15 +7540,15 @@ void ImGui::SetScrollHereY(float center_y_ratio)
|
|||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
ImGuiWindow* window = g.CurrentWindow;
|
ImGuiWindow* window = g.CurrentWindow;
|
||||||
float spacing_y = g.Style.ItemSpacing.y;
|
float spacing_y = g.Style.ItemSpacing.y;
|
||||||
float target_y = ImLerp(window->DC.CursorPosPrevLine.y - spacing_y, window->DC.CursorPosPrevLine.y + window->DC.PrevLineSize.y + spacing_y, center_y_ratio);
|
float target_pos_y = ImLerp(window->DC.CursorPosPrevLine.y - spacing_y, window->DC.CursorPosPrevLine.y + window->DC.PrevLineSize.y + spacing_y, center_y_ratio);
|
||||||
|
|
||||||
// Tweak: snap on edges when aiming at an item very close to the edge
|
// Tweak: snap on edges when aiming at an item very close to the edge
|
||||||
const float snap_y_threshold = ImMax(0.0f, window->WindowPadding.y - spacing_y);
|
const float snap_y_threshold = ImMax(0.0f, window->WindowPadding.y - spacing_y);
|
||||||
const float snap_y_min = window->DC.CursorStartPos.y - window->WindowPadding.y;
|
const float snap_y_min = window->DC.CursorStartPos.y - window->WindowPadding.y;
|
||||||
const float snap_y_max = window->DC.CursorStartPos.y + window->ContentSize.y + window->WindowPadding.y;
|
const float snap_y_max = window->DC.CursorStartPos.y + window->ContentSize.y + window->WindowPadding.y;
|
||||||
target_y = CalcScrollSnap(target_y, snap_y_min, snap_y_max, snap_y_threshold, center_y_ratio);
|
target_pos_y = CalcScrollSnap(target_pos_y, snap_y_min, snap_y_max, snap_y_threshold, center_y_ratio);
|
||||||
|
|
||||||
SetScrollFromPosY(window, target_y - window->Pos.y, center_y_ratio);
|
SetScrollFromPosY(window, target_pos_y - window->Pos.y, center_y_ratio); // Convert from absolute to local pos
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -1826,10 +1826,10 @@ namespace ImGui
|
|||||||
|
|
||||||
// Scrolling
|
// Scrolling
|
||||||
IMGUI_API void SetNextWindowScroll(const ImVec2& scroll); // Use -1.0f on one axis to leave as-is
|
IMGUI_API void SetNextWindowScroll(const ImVec2& scroll); // Use -1.0f on one axis to leave as-is
|
||||||
IMGUI_API void SetScrollX(ImGuiWindow* window, float new_scroll_x);
|
IMGUI_API void SetScrollX(ImGuiWindow* window, float scroll_x);
|
||||||
IMGUI_API void SetScrollY(ImGuiWindow* window, float new_scroll_y);
|
IMGUI_API void SetScrollY(ImGuiWindow* window, float scroll_y);
|
||||||
IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio = 0.5f);
|
IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio);
|
||||||
IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio = 0.5f);
|
IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio);
|
||||||
IMGUI_API ImVec2 ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect);
|
IMGUI_API ImVec2 ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect);
|
||||||
|
|
||||||
// Basic Accessors
|
// Basic Accessors
|
||||||
|
Loading…
Reference in New Issue
Block a user