Skip to main content

ScrollView

Struct ScrollView 

Source
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>

Source

pub fn new() -> Self

An empty scroll view; add content with View::add_with.

Source

pub fn scrollbar(self, style: ScrollbarStyle) -> Self

Draws the scrollbar in style whatever the theme chooses.

Source

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>

Source§

fn set_children(&mut self, children: Vec<Node<Msg>>)

Receives the children built for this widget.
Source§

impl<Msg: 'static> Default for ScrollView<Msg>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<Msg: 'static> Widget<Msg> for ScrollView<Msg>

Source§

fn measure(&self, cx: &mut MeasureCx<'_>, available: Size) -> Size

The size the widget wants when it may use up to available.
Source§

fn paint(&self, cx: &mut PaintCx<'_>, area: Rect)

Draws the widget into area.
Source§

fn event(&self, cx: &mut EventCx<'_, Msg>, event: &Event) -> bool

Handles input. Returns true when the event was used; unused key and scroll events bubble to the parent widget.
Source§

fn focusable(&self) -> bool

Whether the widget can take keyboard focus.
Source§

fn children(&self) -> &[Node<Msg>]

Child nodes, for widgets that contain other widgets.
Source§

fn children_mut(&mut self) -> &mut [Node<Msg>]

Mutable child nodes, used to assign ids.
Source§

fn paint_overlay(&self, _cx: &mut PaintCx<'_>, _anchor: Rect)

Draws the widget’s overlay after the whole view was painted, when it asked for one with 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>
where Vec<Node<Msg>>: Freeze,

§

impl<Msg> Unpin for ScrollView<Msg>
where Vec<Node<Msg>>: Unpin,

§

impl<Msg> UnsafeUnpin for ScrollView<Msg>
where Vec<Node<Msg>>: UnsafeUnpin,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.