pub struct ScrollView<Msg> { /* private fields */ }Expand description
Shows content taller than its area and scrolls it with the wheel, the scrollbar or the
keyboard (↑/↓, PgUp/PgDn, Home/End while focused). When focus moves to a widget inside that
is out of view, the view scrolls to it. When a widget inside asks to show a part of itself
with PaintCx::reveal, such as a code view going to a line, the view glides just far
enough to show it, or jumps there when motion is reduced.
With ScrollView::follow_end the view keeps the end of growing content in view, for a
conversation or command output that arrives while the person watches.
Style keys: scrollbar (style, track, thumb) with hover, and scrollbar.<style>;
log-more for the rows-below note of a view that stopped following. Framework string:
quvyta.log.below.
Implementations§
Source§impl<Msg: 'static> ScrollView<Msg>
impl<Msg: 'static> ScrollView<Msg>
Sourcepub fn new() -> Self
pub fn new() -> Self
An empty scroll view; add content with View::add_with.
Sourcepub fn scrollbar(self, style: ScrollbarStyle) -> Self
pub fn scrollbar(self, style: ScrollbarStyle) -> Self
Draws the scrollbar in style whatever the theme chooses.
Sourcepub fn follow_end(self, follow: bool) -> Self
pub fn follow_end(self, follow: bool) -> Self
Keeps the end of the content in view while it grows, as long as the person is at the end.
The first frame opens at the end. When the content grows, the view glides to the new end
over the theme’s page duration, or jumps there when motion is reduced. Scrolling up with
the wheel, the keys or the scrollbar stops following, and a faint note at the bottom
counts the rows below; End, scrolling back to the bottom or a click on the note follows
again. Content that fits the view always counts as at the end.
Focus keeps its usual pull: a widget inside that takes focus is scrolled into view. When that move leaves the end, it stops following just as scrolling up does, so focusing something earlier in the content holds it in view; when the focused widget sits at the end, such as a reply field below a conversation, the view keeps following and the field stays in view as the content grows. An area a widget asks to reveal follows the same rule.
use qframe::prelude::*;
use qframe::widgets::ScrollView;
struct Chat(Vec<String>);
impl App for Chat {
type Msg = String;
fn update(&mut self, line: String) -> Command<String> {
self.0.push(line);
Command::none()
}
fn view(&self, ui: &mut View<'_, String>) {
ui.add_with(ScrollView::new().follow_end(true), |ui| {
for line in &self.0 {
ui.add(Text::new(line.clone()));
}
})
.fill();
}
}
let lines = (1..=9).map(|n| format!("line {n}")).collect();
let mut h = Harness::new(Chat(lines), 20, 3);
assert!(h.screen().contains("line 9"), "the first frame opens at the end");
h.set_reduced_motion(true).send("line 10".to_owned());
assert!(h.screen().contains("line 10"));Trait Implementations§
Source§impl<Msg: 'static> Container<Msg> for ScrollView<Msg>
impl<Msg: 'static> Container<Msg> for ScrollView<Msg>
Source§fn set_children(&mut self, children: Vec<Node<Msg>>)
fn set_children(&mut self, children: Vec<Node<Msg>>)
Source§impl<Msg: 'static> Default for ScrollView<Msg>
impl<Msg: 'static> Default for ScrollView<Msg>
Source§impl<Msg: 'static> Widget<Msg> for ScrollView<Msg>
impl<Msg: 'static> Widget<Msg> for ScrollView<Msg>
Source§fn measure(&self, cx: &mut MeasureCx<'_>, available: Size) -> Size
fn measure(&self, cx: &mut MeasureCx<'_>, available: Size) -> Size
available.Source§fn event(&self, cx: &mut EventCx<'_, Msg>, event: &Event) -> bool
fn event(&self, cx: &mut EventCx<'_, Msg>, event: &Event) -> bool
true when the event was used; unused key and scroll events
bubble to the parent widget.Source§fn children_mut(&mut self) -> &mut [Node<Msg>]
fn children_mut(&mut self) -> &mut [Node<Msg>]
Source§fn paint_overlay(&self, _cx: &mut PaintCx<'_>, _anchor: Rect)
fn paint_overlay(&self, _cx: &mut PaintCx<'_>, _anchor: Rect)
PaintCx::request_overlay. anchor is the area the widget was painted in.Auto Trait Implementations§
impl<Msg> !RefUnwindSafe for ScrollView<Msg>
impl<Msg> !Send for ScrollView<Msg>
impl<Msg> !Sync for ScrollView<Msg>
impl<Msg> !UnwindSafe for ScrollView<Msg>
impl<Msg> Freeze for ScrollView<Msg>
impl<Msg> Unpin for ScrollView<Msg>
impl<Msg> UnsafeUnpin for ScrollView<Msg>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more