1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Formspec: fix clamped scroll offset of scroll_containers larger than 1000px

This commit is contained in:
SmallJoker 2025-03-30 18:15:38 +02:00 committed by GitHub
parent 882f132062
commit 309c0a0cb6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 11 additions and 10 deletions

View file

@ -695,7 +695,9 @@ void GUIFormSpecMenu::parseScrollBar(parserData* data, const std::string &elemen
e->setMax(max); e->setMax(max);
e->setMin(min); e->setMin(min);
e->setPos(stoi(value)); // Preserve for min/max values defined by `scroll_container[]`.
spec.aux_f32 = stoi(value); // scroll position
e->setPos(spec.aux_f32);
e->setSmallStep(data->scrollbar_options.small_step); e->setSmallStep(data->scrollbar_options.small_step);
e->setLargeStep(data->scrollbar_options.large_step); e->setLargeStep(data->scrollbar_options.large_step);
@ -2198,7 +2200,6 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data, const std::string &
spec_btn.ftype = f_Button; spec_btn.ftype = f_Button;
rect += data->basepos-padding; rect += data->basepos-padding;
spec_btn.rect = rect;
m_fields.push_back(spec_btn); m_fields.push_back(spec_btn);
} }
@ -3235,6 +3236,8 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
for (const std::pair<FieldSpec, GUIScrollBar *> &b : m_scrollbars) { for (const std::pair<FieldSpec, GUIScrollBar *> &b : m_scrollbars) {
if (c.first == b.first.fname) { if (c.first == b.first.fname) {
c.second->setScrollBar(b.second); c.second->setScrollBar(b.second);
b.second->setPos(b.first.aux_f32); // scroll position
c.second->updateScrolling();
break; break;
} }
} }

View file

@ -129,9 +129,9 @@ class GUIFormSpecMenu : public GUIModalMenu
bool is_exit; bool is_exit;
// Draw priority for formspec version < 3 // Draw priority for formspec version < 3
int priority; int priority;
core::rect<s32> rect;
gui::ECURSOR_ICON fcursor_icon; gui::ECURSOR_ICON fcursor_icon;
std::string sound; std::string sound;
f32 aux_f32 = 0;
}; };
struct TooltipSpec struct TooltipSpec

View file

@ -249,7 +249,7 @@ void GUIScrollBar::updatePos()
setPosRaw(scroll_pos); setPosRaw(scroll_pos);
} }
void GUIScrollBar::setPosRaw(const s32 &pos) void GUIScrollBar::setPosRaw(const s32 pos)
{ {
s32 thumb_area = 0; s32 thumb_area = 0;
s32 thumb_min = 0; s32 thumb_min = 0;
@ -275,7 +275,7 @@ void GUIScrollBar::setPosRaw(const s32 &pos)
border_size; border_size;
} }
void GUIScrollBar::setPos(const s32 &pos) void GUIScrollBar::setPos(const s32 pos)
{ {
setPosRaw(pos); setPosRaw(pos);
target_pos = std::nullopt; target_pos = std::nullopt;

View file

@ -54,7 +54,7 @@ public:
void setLargeStep(const s32 &step); void setLargeStep(const s32 &step);
//! Sets a position immediately, aborting any ongoing interpolation. //! Sets a position immediately, aborting any ongoing interpolation.
// setPos does not send EGET_SCROLL_BAR_CHANGED events for you. // setPos does not send EGET_SCROLL_BAR_CHANGED events for you.
void setPos(const s32 &pos); void setPos(const s32 pos);
//! The same as setPos, but it takes care of sending EGET_SCROLL_BAR_CHANGED events. //! The same as setPos, but it takes care of sending EGET_SCROLL_BAR_CHANGED events.
void setPosAndSend(const s32 &pos); void setPosAndSend(const s32 &pos);
//! Sets a target position for interpolation. //! Sets a target position for interpolation.
@ -94,7 +94,7 @@ private:
ISimpleTextureSource *m_tsrc; ISimpleTextureSource *m_tsrc;
void setPosRaw(const s32 &pos); void setPosRaw(const s32 pos);
void updatePos(); void updatePos();
std::optional<s32> target_pos; std::optional<s32> target_pos;
u32 last_time_ms = 0; u32 last_time_ms = 0;

View file

@ -92,8 +92,6 @@ void GUIScrollContainer::setScrollBar(GUIScrollBar *scrollbar)
m_scrollbar->setPageSize((total_content_px * scrollbar_px) / visible_content_px); m_scrollbar->setPageSize((total_content_px * scrollbar_px) / visible_content_px);
} }
updateScrolling();
} }
void GUIScrollContainer::updateScrolling() void GUIScrollContainer::updateScrolling()

View file

@ -29,6 +29,7 @@ public:
} }
void setScrollBar(GUIScrollBar *scrollbar); void setScrollBar(GUIScrollBar *scrollbar);
void updateScrolling();
private: private:
enum OrientationEnum enum OrientationEnum
@ -43,5 +44,4 @@ private:
f32 m_scrollfactor; //< scrollbar pos * scrollfactor = scroll offset in pixels f32 m_scrollfactor; //< scrollbar pos * scrollfactor = scroll offset in pixels
std::optional<s32> m_content_padding_px; //< in pixels std::optional<s32> m_content_padding_px; //< in pixels
void updateScrolling();
}; };