|
@@ -1280,9 +1280,9 @@ bool Element::DispatchEvent(EventId id, const Dictionary& parameters)
|
|
|
void Element::ScrollIntoView(const ScrollIntoViewOptions options)
|
|
void Element::ScrollIntoView(const ScrollIntoViewOptions options)
|
|
|
{
|
|
{
|
|
|
const Vector2f size = main_box.GetSize(Box::BORDER);
|
|
const Vector2f size = main_box.GetSize(Box::BORDER);
|
|
|
|
|
+ ScrollBehavior scroll_behavior = options.behavior;
|
|
|
|
|
|
|
|
- Element* scroll_parent = parent;
|
|
|
|
|
- while (scroll_parent != nullptr)
|
|
|
|
|
|
|
+ for (Element* scroll_parent = parent; scroll_parent; scroll_parent = scroll_parent->GetParentNode())
|
|
|
{
|
|
{
|
|
|
using Style::Overflow;
|
|
using Style::Overflow;
|
|
|
const ComputedValues& computed = scroll_parent->GetComputedValues();
|
|
const ComputedValues& computed = scroll_parent->GetComputedValues();
|
|
@@ -1302,17 +1302,16 @@ void Element::ScrollIntoView(const ScrollIntoViewOptions options)
|
|
|
const Vector2f delta_scroll_offset_start = parent_client_offset - relative_offset;
|
|
const Vector2f delta_scroll_offset_start = parent_client_offset - relative_offset;
|
|
|
const Vector2f delta_scroll_offset_end = delta_scroll_offset_start + size - parent_client_size;
|
|
const Vector2f delta_scroll_offset_end = delta_scroll_offset_start + size - parent_client_size;
|
|
|
|
|
|
|
|
- Vector2f new_scroll_offset = old_scroll_offset;
|
|
|
|
|
- new_scroll_offset.x += GetScrollOffsetDelta(options.horizontal, delta_scroll_offset_start.x, delta_scroll_offset_end.x);
|
|
|
|
|
- new_scroll_offset.y += GetScrollOffsetDelta(options.vertical, delta_scroll_offset_start.y, delta_scroll_offset_end.y);
|
|
|
|
|
|
|
+ Vector2f scroll_delta = {
|
|
|
|
|
+ scrollable_box_x ? GetScrollOffsetDelta(options.horizontal, delta_scroll_offset_start.x, delta_scroll_offset_end.x) : 0.f,
|
|
|
|
|
+ scrollable_box_y ? GetScrollOffsetDelta(options.vertical, delta_scroll_offset_start.y, delta_scroll_offset_end.y) : 0.f,
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
- if (scrollable_box_x)
|
|
|
|
|
- scroll_parent->SetScrollLeft(new_scroll_offset.x);
|
|
|
|
|
- if (scrollable_box_y)
|
|
|
|
|
- scroll_parent->SetScrollTop(new_scroll_offset.y);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ scroll_parent->ScrollTo(old_scroll_offset + scroll_delta, scroll_behavior);
|
|
|
|
|
|
|
|
- scroll_parent = scroll_parent->GetParentNode();
|
|
|
|
|
|
|
+ // Currently, only a single scrollable parent can be smooth scrolled at a time, so any other parents must be instant scrolled.
|
|
|
|
|
+ scroll_behavior = ScrollBehavior::Instant;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|