Added SetScrollXHere, SetScrollFromPosX: Changelog, demo, comments (#1580).
This commit is contained in:
parent
caf119a982
commit
da29d77253
@ -45,6 +45,7 @@ Other Changes:
|
|||||||
- Window: Fixed InnerClipRect right-most coordinates using wrong padding setting (introduced in 1.71).
|
- Window: Fixed InnerClipRect right-most coordinates using wrong padding setting (introduced in 1.71).
|
||||||
- Word-wrapping: Fixed overzealous word-wrapping when glyph edge lands exactly on the limit. Because
|
- Word-wrapping: Fixed overzealous word-wrapping when glyph edge lands exactly on the limit. Because
|
||||||
of this, auto-fitting exactly unwrapped text would make it wrap. (fixes initial 1.15 commit, 78645a7d).
|
of this, auto-fitting exactly unwrapped text would make it wrap. (fixes initial 1.15 commit, 78645a7d).
|
||||||
|
- Scrolling: Added SetScrollHereX(), SetScrollFromPosX() for completeness. (#1580) [@kevreco]
|
||||||
- Style: Attenuated default opacity of ImGuiCol_Separator in Classic and Light styles.
|
- Style: Attenuated default opacity of ImGuiCol_Separator in Classic and Light styles.
|
||||||
- ImDrawList: Fixed CloneOutput() helper crashing. (#1860) [@gviot]
|
- ImDrawList: Fixed CloneOutput() helper crashing. (#1860) [@gviot]
|
||||||
- ImDrawList::ChannelsSplit(), ImDrawListSplitter: Fixed an issue with merging draw commands between
|
- ImDrawList::ChannelsSplit(), ImDrawListSplitter: Fixed an issue with merging draw commands between
|
||||||
|
@ -30,6 +30,7 @@ It's mostly a bunch of personal notes, probably incomplete. Feel free to query i
|
|||||||
- window/opt: freeze window flag: if not focused/hovered, return false, render with previous ImDrawList. and/or reduce refresh rate. -> this may require enforcing that it is illegal to submit contents if Begin returns false.
|
- window/opt: freeze window flag: if not focused/hovered, return false, render with previous ImDrawList. and/or reduce refresh rate. -> this may require enforcing that it is illegal to submit contents if Begin returns false.
|
||||||
- window/child: the first draw command of a child window could be moved into the current draw command of the parent window (unless child+tooltip?).
|
- window/child: the first draw command of a child window could be moved into the current draw command of the parent window (unless child+tooltip?).
|
||||||
- window/child: border could be emitted in parent as well.
|
- window/child: border could be emitted in parent as well.
|
||||||
|
- window/child: allow SetNextWindowContentSize() to work on child windows.
|
||||||
- window/clipping: some form of clipping when DisplaySize (or corresponding viewport) is zero.
|
- window/clipping: some form of clipping when DisplaySize (or corresponding viewport) is zero.
|
||||||
- window/tab: add a way to signify that a window or docked window requires attention (e.g. blinking title bar).
|
- window/tab: add a way to signify that a window or docked window requires attention (e.g. blinking title bar).
|
||||||
- scrolling: while holding down a scrollbar, try to keep the same contents visible (at least while not moving mouse)
|
- scrolling: while holding down a scrollbar, try to keep the same contents visible (at least while not moving mouse)
|
||||||
|
18
imgui.cpp
18
imgui.cpp
@ -6857,15 +6857,6 @@ void ImGui::SetScrollY(float scroll_y)
|
|||||||
window->ScrollTargetCenterRatio.y = 0.0f;
|
window->ScrollTargetCenterRatio.y = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui::SetScrollFromPosY(float local_y, float center_y_ratio)
|
|
||||||
{
|
|
||||||
// We store a target position so centering can occur on the next frame when we are guaranteed to have a known window size
|
|
||||||
ImGuiWindow* window = GetCurrentWindow();
|
|
||||||
IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f);
|
|
||||||
window->ScrollTarget.y = (float)(int)(local_y + window->Scroll.y);
|
|
||||||
window->ScrollTargetCenterRatio.y = center_y_ratio;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ImGui::SetScrollFromPosX(float local_x, float center_x_ratio)
|
void ImGui::SetScrollFromPosX(float local_x, float center_x_ratio)
|
||||||
{
|
{
|
||||||
// We store a target position so centering can occur on the next frame when we are guaranteed to have a known window size
|
// We store a target position so centering can occur on the next frame when we are guaranteed to have a known window size
|
||||||
@ -6875,6 +6866,15 @@ void ImGui::SetScrollFromPosX(float local_x, float center_x_ratio)
|
|||||||
window->ScrollTargetCenterRatio.x = center_x_ratio;
|
window->ScrollTargetCenterRatio.x = center_x_ratio;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImGui::SetScrollFromPosY(float local_y, float center_y_ratio)
|
||||||
|
{
|
||||||
|
// We store a target position so centering can occur on the next frame when we are guaranteed to have a known window size
|
||||||
|
ImGuiWindow* window = GetCurrentWindow();
|
||||||
|
IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f);
|
||||||
|
window->ScrollTarget.y = (float)(int)(local_y + window->Scroll.y);
|
||||||
|
window->ScrollTargetCenterRatio.y = center_y_ratio;
|
||||||
|
}
|
||||||
|
|
||||||
// center_x_ratio: 0.0f left of last item, 0.5f horizontal center of last item, 1.0f right of last item.
|
// center_x_ratio: 0.0f left of last item, 0.5f horizontal center of last item, 1.0f right of last item.
|
||||||
void ImGui::SetScrollHereX(float center_x_ratio)
|
void ImGui::SetScrollHereX(float center_x_ratio)
|
||||||
{
|
{
|
||||||
|
@ -1744,7 +1744,7 @@ static void ShowDemoWindowLayout()
|
|||||||
// - Using ImGui::GetItemRectMin/Max() to query the "item" state (because the child window is an item from the POV of the parent window)
|
// - Using ImGui::GetItemRectMin/Max() to query the "item" state (because the child window is an item from the POV of the parent window)
|
||||||
// See "Widgets" -> "Querying Status (Active/Focused/Hovered etc.)" section for more details about this.
|
// See "Widgets" -> "Querying Status (Active/Focused/Hovered etc.)" section for more details about this.
|
||||||
{
|
{
|
||||||
ImGui::SetCursorPosX(50);
|
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 10);
|
||||||
ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100));
|
ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100));
|
||||||
ImGui::BeginChild("blah", ImVec2(200, 100), true, ImGuiWindowFlags_None);
|
ImGui::BeginChild("blah", ImVec2(200, 100), true, ImGuiWindowFlags_None);
|
||||||
for (int n = 0; n < 50; n++)
|
for (int n = 0; n < 50; n++)
|
||||||
@ -1957,7 +1957,7 @@ static void ShowDemoWindowLayout()
|
|||||||
|
|
||||||
if (ImGui::TreeNode("Groups"))
|
if (ImGui::TreeNode("Groups"))
|
||||||
{
|
{
|
||||||
HelpMarker("Using ImGui::BeginGroup()/EndGroup() to layout items. BeginGroup() basically locks the horizontal position. EndGroup() bundles the whole group so that you can use functions such as IsItemHovered() on it.");
|
HelpMarker("BeginGroup() basically locks the horizontal position for new line. EndGroup() bundles the whole group so that you can use \"item\" functions such as IsItemHovered()/IsItemActive() or SameLine() etc. on the whole group.");
|
||||||
ImGui::BeginGroup();
|
ImGui::BeginGroup();
|
||||||
{
|
{
|
||||||
ImGui::BeginGroup();
|
ImGui::BeginGroup();
|
||||||
@ -2056,21 +2056,22 @@ static void ShowDemoWindowLayout()
|
|||||||
|
|
||||||
if (ImGui::TreeNode("Scrolling"))
|
if (ImGui::TreeNode("Scrolling"))
|
||||||
{
|
{
|
||||||
HelpMarker("Use SetScrollHereY() or SetScrollFromPosY() to scroll to a given position.");
|
// Vertical scroll functions
|
||||||
|
HelpMarker("Use SetScrollHereY() or SetScrollFromPosY() to scroll to a given vertical position.");
|
||||||
|
|
||||||
static bool track = true;
|
static bool track = true;
|
||||||
static int track_line = 50;
|
static int track_item = 50;
|
||||||
static float scroll_to_off_px = 0.0f;
|
static float scroll_to_off_px = 0.0f;
|
||||||
static float scroll_to_pos_px = 200.0f;
|
static float scroll_to_pos_px = 200.0f;
|
||||||
ImGui::Checkbox("Track", &track);
|
ImGui::Checkbox("Track", &track);
|
||||||
ImGui::PushItemWidth(100);
|
ImGui::PushItemWidth(100);
|
||||||
ImGui::SameLine(140); track |= ImGui::DragInt("##line", &track_line, 0.25f, 0, 99, "Line = %d");
|
ImGui::SameLine(140); track |= ImGui::DragInt("##item", &track_item, 0.25f, 0, 99, "Item = %d");
|
||||||
|
|
||||||
bool scroll_to_off = ImGui::Button("Scroll Offset");
|
bool scroll_to_off = ImGui::Button("Scroll Offset");
|
||||||
ImGui::SameLine(140); scroll_to_off |= ImGui::DragFloat("##off_y", &scroll_to_off_px, 1.00f, 0, 9999, "+%.0f px");
|
ImGui::SameLine(140); scroll_to_off |= ImGui::DragFloat("##off", &scroll_to_off_px, 1.00f, 0, 9999, "+%.0f px");
|
||||||
|
|
||||||
bool scroll_to_pos = ImGui::Button("Scroll To Pos");
|
bool scroll_to_pos = ImGui::Button("Scroll To Pos");
|
||||||
ImGui::SameLine(140); scroll_to_pos |= ImGui::DragFloat("##pos_y", &scroll_to_pos_px, 1.00f, 0, 9999, "Y = %.0f px");
|
ImGui::SameLine(140); scroll_to_pos |= ImGui::DragFloat("##pos", &scroll_to_pos_px, 1.00f, 0, 9999, "X/Y = %.0f px");
|
||||||
|
|
||||||
ImGui::PopItemWidth();
|
ImGui::PopItemWidth();
|
||||||
if (scroll_to_off || scroll_to_pos)
|
if (scroll_to_off || scroll_to_pos)
|
||||||
@ -2078,28 +2079,31 @@ static void ShowDemoWindowLayout()
|
|||||||
|
|
||||||
ImGuiStyle& style = ImGui::GetStyle();
|
ImGuiStyle& style = ImGui::GetStyle();
|
||||||
float child_w = (ImGui::GetContentRegionAvail().x - 4 * style.ItemSpacing.x) / 5;
|
float child_w = (ImGui::GetContentRegionAvail().x - 4 * style.ItemSpacing.x) / 5;
|
||||||
|
if (child_w < 20.0f)
|
||||||
|
child_w = 20.0f;
|
||||||
|
ImGui::PushID("##VerticalScrolling");
|
||||||
for (int i = 0; i < 5; i++)
|
for (int i = 0; i < 5; i++)
|
||||||
{
|
{
|
||||||
if (i > 0) ImGui::SameLine();
|
if (i > 0) ImGui::SameLine();
|
||||||
ImGui::BeginGroup();
|
ImGui::BeginGroup();
|
||||||
ImGui::Text("%s", i == 0 ? "Top" : i == 1 ? "25%" : i == 2 ? "Center" : i == 3 ? "75%" : "Bottom");
|
const char* names[] = { "Top", "25%", "Center", "75%", "Bottom" };
|
||||||
|
ImGui::TextUnformatted(names[i]);
|
||||||
|
|
||||||
ImGuiWindowFlags child_flags = ImGuiWindowFlags_MenuBar;
|
ImGui::BeginChild(ImGui::GetID((void*)(intptr_t)i), ImVec2(child_w, 200.0f), true, ImGuiWindowFlags_None);
|
||||||
ImGui::BeginChild(ImGui::GetID((void*)(intptr_t)i), ImVec2(child_w, 200.0f), true, child_flags);
|
|
||||||
if (scroll_to_off)
|
if (scroll_to_off)
|
||||||
ImGui::SetScrollY(scroll_to_off_px);
|
ImGui::SetScrollY(scroll_to_off_px);
|
||||||
if (scroll_to_pos)
|
if (scroll_to_pos)
|
||||||
ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_pos_px, i * 0.25f);
|
ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_pos_px, i * 0.25f);
|
||||||
for (int line = 0; line < 100; line++)
|
for (int item = 0; item < 100; item++)
|
||||||
{
|
{
|
||||||
if (track && line == track_line)
|
if (track && item == track_item)
|
||||||
{
|
{
|
||||||
ImGui::TextColored(ImVec4(1,1,0,1), "Line %d", line);
|
ImGui::TextColored(ImVec4(1,1,0,1), "Item %d", item);
|
||||||
ImGui::SetScrollHereY(i * 0.25f); // 0.0f:top, 0.5f:center, 1.0f:bottom
|
ImGui::SetScrollHereY(i * 0.25f); // 0.0f:top, 0.5f:center, 1.0f:bottom
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ImGui::Text("Line %d", line);
|
ImGui::Text("Item %d", item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
float scroll_y = ImGui::GetScrollY();
|
float scroll_y = ImGui::GetScrollY();
|
||||||
@ -2108,11 +2112,44 @@ static void ShowDemoWindowLayout()
|
|||||||
ImGui::Text("%.0f/%.0f", scroll_y, scroll_max_y);
|
ImGui::Text("%.0f/%.0f", scroll_y, scroll_max_y);
|
||||||
ImGui::EndGroup();
|
ImGui::EndGroup();
|
||||||
}
|
}
|
||||||
ImGui::TreePop();
|
ImGui::PopID();
|
||||||
}
|
|
||||||
|
|
||||||
if (ImGui::TreeNode("Horizontal Scrolling"))
|
// Horizontal scroll functions
|
||||||
{
|
ImGui::Spacing();
|
||||||
|
HelpMarker("Use SetScrollHereX() or SetScrollFromPosX() to scroll to a given horizontal position.\n\nUsing the \"Scroll To Pos\" button above will make the discontinuity at edges visible: scrolling to the top/bottom/left/right-most item will add an additional WindowPadding to reflect on reaching the edge of the list.\n\nBecause the clipping rectangle of most window hides half worth of WindowPadding on the left/right, using SetScrollFromPosX(+1) will usually result in clipped text whereas the equivalent SetScrollFromPosY(+1) wouldn't.");
|
||||||
|
ImGui::PushID("##HorizontalScrolling");
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
float child_height = ImGui::GetTextLineHeight() + style.ScrollbarSize + style.WindowPadding.y * 2.0f;
|
||||||
|
ImGui::BeginChild(ImGui::GetID((void*)(intptr_t)i), ImVec2(-100, child_height), true, ImGuiWindowFlags_HorizontalScrollbar);
|
||||||
|
if (scroll_to_off)
|
||||||
|
ImGui::SetScrollX(scroll_to_off_px);
|
||||||
|
if (scroll_to_pos)
|
||||||
|
ImGui::SetScrollFromPosX(ImGui::GetCursorStartPos().x + scroll_to_pos_px, i * 0.25f);
|
||||||
|
for (int item = 0; item < 100; item++)
|
||||||
|
{
|
||||||
|
if (track && item == track_item)
|
||||||
|
{
|
||||||
|
ImGui::TextColored(ImVec4(1, 1, 0, 1), "Item %d", item);
|
||||||
|
ImGui::SetScrollHereX(i * 0.25f); // 0.0f:left, 0.5f:center, 1.0f:right
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ImGui::Text("Item %d", item);
|
||||||
|
}
|
||||||
|
ImGui::SameLine();
|
||||||
|
}
|
||||||
|
float scroll_x = ImGui::GetScrollX();
|
||||||
|
float scroll_max_x = ImGui::GetScrollMaxX();
|
||||||
|
ImGui::EndChild();
|
||||||
|
ImGui::SameLine();
|
||||||
|
const char* names[] = { "Left", "25%", "Center", "75%", "Right" };
|
||||||
|
ImGui::Text("%s\n%.0f/%.0f", names[i], scroll_x, scroll_max_x);
|
||||||
|
ImGui::Spacing();
|
||||||
|
}
|
||||||
|
ImGui::PopID();
|
||||||
|
|
||||||
|
// Miscellaneous Horizontal Scrolling Demo
|
||||||
HelpMarker("Horizontal scrolling for a window has to be enabled explicitly via the ImGuiWindowFlags_HorizontalScrollbar flag.\n\nYou may want to explicitly specify content width by calling SetNextWindowContentWidth() before Begin().");
|
HelpMarker("Horizontal scrolling for a window has to be enabled explicitly via the ImGuiWindowFlags_HorizontalScrollbar flag.\n\nYou may want to explicitly specify content width by calling SetNextWindowContentWidth() before Begin().");
|
||||||
static int lines = 7;
|
static int lines = 7;
|
||||||
ImGui::SliderInt("Lines", &lines, 1, 15);
|
ImGui::SliderInt("Lines", &lines, 1, 15);
|
||||||
|
Loading…
Reference in New Issue
Block a user