pub struct ListView<T: 'static> { /* private fields */ }Expand description
A virtualized scrollable list backed by a ListModel<T> or ListDataSource.
See the module-level documentation for the full feature overview.
Implementations§
Source§impl<T: 'static> ListView<T>
impl<T: 'static> ListView<T>
Sourcepub fn new(
model: ListModel<T>,
delegate: impl Fn(usize, &T, bool) -> Box<dyn Widget> + 'static,
) -> Self
pub fn new( model: ListModel<T>, delegate: impl Fn(usize, &T, bool) -> Box<dyn Widget> + 'static, ) -> Self
Create a new ListView backed by a ListModel<T>.
The delegate closure receives (index, &item, selected) and returns
a boxed widget for that item.
Sourcepub fn from_source<S: ListDataSource<Item = T>>(
source: S,
delegate: impl Fn(usize, &T, bool) -> Box<dyn Widget> + 'static,
) -> Self
pub fn from_source<S: ListDataSource<Item = T>>( source: S, delegate: impl Fn(usize, &T, bool) -> Box<dyn Widget> + 'static, ) -> Self
Create a ListView backed by a custom ListDataSource.
Use this for large or external datasets that cannot fit in memory.
The source must implement ListDataSource<Item = T>.
Sourcepub fn from_source_keyed<S: ListDataSource<Item = T>>(
source: S,
keyed: KeyedSelectionModel<S::Key>,
delegate: impl Fn(usize, &T, bool) -> Box<dyn Widget> + 'static,
) -> Self
pub fn from_source_keyed<S: ListDataSource<Item = T>>( source: S, keyed: KeyedSelectionModel<S::Key>, delegate: impl Fn(usize, &T, bool) -> Box<dyn Widget> + 'static, ) -> Self
Create a ListView backed by a custom ListDataSource with keyed
selection. The KeyedSelectionModel<S::Key> tracks selection by source
identity, so it survives reorders, filters, lazy window-slides, and
stays consistent across two views of the same source. The view stays
key-less (ListView<T>) — the index↔key mapping is captured from the
concrete source here. Mutually exclusive with
selection (the last one set wins).
Sourcepub fn enabled(self, enabled: impl Into<Prop<bool>>) -> Self
pub fn enabled(self, enabled: impl Into<Prop<bool>>) -> Self
Enable or disable the whole view. A disabled view greys out and stops accepting focus / selection / keyboard input (arena-gated).
Sourcepub fn overscroll_behavior(self, behavior: OverscrollBehavior) -> Self
pub fn overscroll_behavior(self, behavior: OverscrollBehavior) -> Self
Set the scroll-chaining behavior at the boundary (default
OverscrollBehavior::Chain; Contain
disables chaining to an ancestor scrollable).
Sourcepub fn smooth_scrolling(self, enabled: bool) -> Self
pub fn smooth_scrolling(self, enabled: bool) -> Self
Enable or disable animated wheel scrolling (enabled by default).
Sourcepub fn smooth_scroll_duration(self, duration: Duration) -> Self
pub fn smooth_scroll_duration(self, duration: Duration) -> Self
Duration of the smooth scroll animation (default 150 ms).
Sourcepub fn scroll_bar_style(self, style: ScrollBarMode) -> Self
pub fn scroll_bar_style(self, style: ScrollBarMode) -> Self
How the scroll bar is displayed (default Permanent). Overlay
and Thin float the bar over the content instead of reserving a
layout column, mirroring ScrollArea::scroll_bar_style.
Sourcepub fn item_height(self, height: f32) -> Self
pub fn item_height(self, height: f32) -> Self
Set the fixed height per item (default 32.0) — the uniform fast
path. Mutually exclusive with item_height_fn
and auto_item_height; the last mode
setter wins.
Sourcepub fn item_height_fn(self, f: impl Fn(usize) -> f32 + 'static) -> Self
pub fn item_height_fn(self, f: impl Fn(usize) -> f32 + 'static) -> Self
Per-item heights from a callback. The callback must be pure (same index + same data → same height); it is re-swept from the first changed index on every model change. No measurement pass runs — this is the deterministic variable-height path.
Sourcepub fn auto_item_height(self, estimated: f32) -> Self
pub fn auto_item_height(self, estimated: f32) -> Self
Auto-measured item heights: each realized row is measured at the
list’s content width (height-for-width), unrealized rows assume
estimated. Scroll anchoring keeps content above the viewport
stationary as estimates are corrected. estimated should be a
typical row height — a wrong estimate only costs realization
churn while measurements settle, never incorrect layout.
Sourcepub fn spacing(self, spacing: f32) -> Self
pub fn spacing(self, spacing: f32) -> Self
Set spacing between items (default 0.0). With
sections it also separates a section’s last item
from the next header; a header sits directly on its first item.
Sourcepub fn sections<P: SectionProvider>(self, provider: P) -> Self
pub fn sections<P: SectionProvider>(self, provider: P) -> Self
Group the items into sections, with a full-width header row above each
one. Takes the same provider as GridView::sections:
grouping_sections partitions runs of
equal keys, or implement SectionProvider yourself.
Headers are rows of the scrolled content: they are virtualized with the
items, counted in the scroll extent, and compose with all three
row-height modes. They are not items. Every index the view takes or
reports — selection, on_activate, type-ahead,
scroll_to_index, drag and drop — is still an
index into the model, and the arrow keys step from item to item over
the headers.
A drop on a header inserts at the boundary before its section’s first
item, as a drop on the lower half of the row above the header does:
one index, two places on screen. Which section the dropped rows join is
the provider’s decision, made when it next counts. The insertion line
assumes the counts survive the drop, as they do for
grouping_sections and for any provider that does not read the items.
Rows of this list dragged down from above the boundary then close the
section before the header, since the source takes them out before
putting them back, and the line is drawn above it. Rows dragged up from
below, and rows dropped from another view, open the section after it,
and the line is drawn under the header. A provider that groups by the
items’ content, such as the ByArtist provider below, puts a moved
item in the section of its own key wherever it is dropped. With such a
provider the line at a section boundary shows where in the list the
rows go, not which section they join.
The view reads the provider’s counts again after every change the
model reports, so a provider that derives them from the live model
follows inserts, removals and resets. grouping_sections groups the
model as it is when called; for a model that changes, derive the counts
on demand instead:
struct Song { artist: String, title: String }
/// Runs of songs by the same artist, read from the model each time.
struct ByArtist(ListModel<Song>);
impl ByArtist {
fn runs(&self) -> Vec<(String, usize)> {
let mut runs: Vec<(String, usize)> = Vec::new();
for i in 0..self.0.len() {
let artist = self.0.with_item(i, |s| s.artist.clone()).unwrap_or_default();
match runs.last_mut() {
Some((last, count)) if *last == artist => *count += 1,
_ => runs.push((artist, 1)),
}
}
runs
}
}
impl SectionProvider for ByArtist {
fn section_count(&self) -> usize { self.runs().len() }
fn items_in_section(&self, s: usize) -> usize { self.runs()[s].1 }
fn section_title(&self, s: usize) -> String { self.runs()[s].0.clone() }
fn section_counts(&self) -> Vec<usize> {
self.runs().into_iter().map(|(_, count)| count).collect()
}
}
let songs = ListModel::from_vec(vec![
Song { artist: "Ada".into(), title: "One".into() },
Song { artist: "Ada".into(), title: "Two".into() },
Song { artist: "Bea".into(), title: "Three".into() },
]);
let _list = ListView::new(songs.clone(), |_i, song, _selected| {
Box::new(TextWidget::new(lit!(&song.title)))
})
.sections(ByArtist(songs))
.pinned_section_headers(true);Sourcepub fn section_header_delegate(
self,
f: impl Fn(usize, &str) -> Box<dyn Widget> + 'static,
) -> Self
pub fn section_header_delegate( self, f: impl Fn(usize, &str) -> Box<dyn Widget> + 'static, ) -> Self
Build each section’s header row from (section_index, title), the
title being the provider’s. Without it a header is the title as plain
text. The same signature as
GridView::section_header_delegate.
Whatever it builds, the row is published to assistive technology as a
heading named by the title, so a text label in it that repeats the
title should be hidden
(TextWidget::a11y_hidden)
or it is read twice; the default header hides its own.
A control inside it is a Tab stop while the header is on screen. A
control in a row is not, because the list’s cursor reaches it (Space
runs its keyboard toggle), and the cursor steps over headers. Tab then
goes from the list to the controls of the headers in view, top to
bottom. The pinned copy is a picture
of the header and takes no Tab stop, and neither does the header it
covers; arrowing to the section’s first item brings that header back
into view.
Sourcepub fn section_header_height(self, height: f32) -> Self
pub fn section_header_height(self, height: f32) -> Self
Height of each section header row (default 28, as in GridView).
Headers are not measured, in any row-height mode: the delegate’s
widget is given exactly this height.
Sourcepub fn pinned_section_headers(self, enabled: bool) -> Self
pub fn pinned_section_headers(self, enabled: bool) -> Self
Keep the header of the section holding the top of the viewport pinned
there while its rows scroll beneath it; the next section’s header
pushes it up as it arrives. Rows revealed by the keyboard, by
ensure_index_visible and by
scroll_to_index stop below it.
The pinned copy is drawn on an opaque surface and is hidden from
assistive technology, which reads the section’s own header instead. A
drop on it is a drop on that header, and a control in it takes no Tab
stop (see section_header_delegate).
Sourcepub fn selection(self, sel: SelectionModel) -> Self
pub fn selection(self, sel: SelectionModel) -> Self
Set the index-based selection model (positions). For identity-based
selection that survives reorder / filter / window-slide, build the view
with from_source_keyed instead.
Sourcepub fn realized_row_ids(&self) -> Rc<RefCell<Vec<(usize, WidgetId)>>>
pub fn realized_row_ids(&self) -> Rc<RefCell<Vec<(usize, WidgetId)>>>
A shared handle to the live (model index → row node id) map of the
realized rows, rewritten at the end of every build.
The id is the row’s Role::ListBoxOption wrapper — the node an
active_descendant has to point at. Take the handle before moving the
view into the tree; it is populated on the first build.
This exists for the ARIA combobox / listbox pattern, where keyboard
focus stays on a text field while the arrow keys move a highlight
through this list (a command palette, a type-ahead picker). The field’s
AT node publishes active_descendant pointing here, so a screen reader
announces each row as the highlight moves without focus ever leaving
the input.
A ListView that holds focus itself does not need this handle: it
publishes its own active_descendant from accessibility(), pointing
at whichever row the keyboard is on. It used to publish none, on the
assumption that holding focus was enough, and that assumption is what
made every Teksilo list silent to NVDA.
Only realized rows are present — a row scrolled outside the
virtualization window has no widget, so look-ups for it return None.
Callers should scroll_to_index the row they intend to announce.
Sourcepub fn reorderable(self, enabled: bool) -> Self
pub fn reorderable(self, enabled: bool) -> Self
Enable intra-widget drag reordering.
When enabled, rows can be dragged within this ListView to reorder them.
The move is routed through the source’s accept_drop — a ListModel
reorders in place, an external source routes the move to its store. The
hover indicator reflects the source’s can_accept verdict, so a
forbidden drop shows no insertion line. Keyboard equivalent:
Alt+ArrowUp/Down.
Sourcepub fn exportable(self, mode: DragTransferMode) -> Selfwhere
T: Clone,
pub fn exportable(self, mode: DragTransferMode) -> Selfwhere
T: Clone,
Make rows droppable outside this view — on a
DropTarget, another data view, or the OS.
A dragged row (or the whole selection, when the pressed row is part of a
multi-selection) carries clones of its items in a public
RowDragData<T>, so a foreign receiver can pull
them out with payload.get_typed::<RowDragData<T>>() /
DropTarget::on_drop_typed::<RowDragData<T>>() — no serialization. This
also makes rows a drag source even without reorderable.
mode chooses what happens to the origin rows once a foreign target
accepts them: DragTransferMode::Move removes them (via the source’s
on_drag_out, or on_rows_transferred_out),
DragTransferMode::Copy leaves them. A same-view reorder is never a
transfer, so mode never affects it. Requires T: Clone.
Move caveats. The row is removed only when the drop is accepted by an
in-app target in the same window (DropOutcome::InApp { accepted: true })
or the OS reports a genuine move. Shipped OS backends advertise copy
only, so a drag exported to another application — or to another window
of the same app — is treated as a copy: the origin row is kept and the
receiver must own its own copy semantics. Also, for a ListModel-backed
view (whose key is the row index) the move-out removes by the indices
captured at drag-start; if a shared handle to the same model is mutated
while the drag is in flight, those indices can point at different rows —
use a keyed source, or on_rows_transferred_out
with your own stable identity, for models that change mid-drag.
Sourcepub fn export_external(
self,
f: impl Fn(&[T]) -> Vec<(String, Vec<u8>)> + 'static,
) -> Selfwhere
T: Clone,
pub fn export_external(
self,
f: impl Fn(&[T]) -> Vec<(String, Vec<u8>)> + 'static,
) -> Selfwhere
T: Clone,
Additionally advertise the dragged rows as MIME data so they can be
dropped on a DropZone or exported to another
application / window via the OS. f maps the dragged items to
(mime_type, bytes) pairs (e.g. text/plain, text/uri-list, an
app-specific application/x-…). Implies exportable
(defaulting to DragTransferMode::Move if not already set). Requires
T: Clone.
Sourcepub fn on_rows_transferred_out(
self,
f: impl Fn(&[usize], &mut EventContext<'_>) + 'static,
) -> Self
pub fn on_rows_transferred_out( self, f: impl Fn(&[usize], &mut EventContext<'_>) + 'static, ) -> Self
Override how rows moved out to a foreign target are removed from this
view. Receives the dragged rows’ indices (descending-safe) and the live
context. Without this, an exportable
Move drag removes them through the source’s
on_drag_out (works out of the box for a ListModel).
Sourcepub fn accept_foreign_rows(self, accept: bool) -> Self
pub fn accept_foreign_rows(self, accept: bool) -> Self
Accept exported rows dropped from a different view or source without
writing a custom ListDataSource. Pair with
on_rows_received, which is handed the dropped
items and the insertion index. (Same-view reorder is
reorderable; a custom ListDataSource can still
accept foreign drops through its can_accept/accept_drop instead.)
Sourcepub fn on_rows_received(
self,
f: impl Fn(Vec<T>, usize, &mut EventContext<'_>) + 'static,
) -> Self
pub fn on_rows_received( self, f: impl Fn(Vec<T>, usize, &mut EventContext<'_>) + 'static, ) -> Self
Handler for rows accepted via accept_foreign_rows:
(items, insertion_index, ctx). Insert them into your model at the
index.
Sourcepub fn on_activate(
self,
f: impl Fn(usize, &mut EventContext<'_>) + 'static,
) -> Self
pub fn on_activate( self, f: impl Fn(usize, &mut EventContext<'_>) + 'static, ) -> Self
Set the row-activation handler — invoked with the flat row index and
the live EventContext on a click
(per activate_on) or Enter on the focused row.
The context lets the handler open a modal, toast, or dispatch an intent —
matching TableView::on_row_activate
/ GridView::on_tile_activate.
Distinct from selection: arrow-key navigation and Space move /
toggle the selection but do not activate.
Sourcepub fn activate_on(self, mode: ActivateOn) -> Self
pub fn activate_on(self, mode: ActivateOn) -> Self
Choose single- vs double-click activation (default
ActivateOn::DoubleClick). Enter activates in
either mode.
Sourcepub fn row_tooltip_sticky(self, on: bool) -> Self
pub fn row_tooltip_sticky(self, on: bool) -> Self
Enable type-ahead (“type to jump”): with this set, typing a
printable character while the list has keyboard focus jumps the
selection to the next row whose label starts with the accumulated
search term, wrapping around (Qt keyboardSearch / macOS &
Windows type-select). label(&item) yields the searchable text for
a row; matching is case-insensitive (a Unicode fold, so an accented
label is reachable). A pause longer than the
type_ahead_timeout starts a fresh term.
Whether a composite row tooltip offers dwell-to-sticky promotion.
Default true.
Turn it off for a read-only row card: with nothing to reach into there is nothing to pin, so the countdown indicator would promise an interaction that does not exist and the surface would outlive the pointer for no reason.
Sourcepub fn row_tooltip(
self,
f: impl Fn(usize, &T) -> Option<LocalizedString> + 'static,
) -> Self
pub fn row_tooltip( self, f: impl Fn(usize, &T) -> Option<LocalizedString> + 'static, ) -> Self
Per-row plain tooltip: one line of text for the row under the pointer.
The resolver receives the row’s flat index and its item; returning
None leaves that row without a tip. Mutually exclusive with
row_rich_tooltip and
row_composite_tooltip — last setter
wins, matching the per-widget tooltip matrix.
Opens to the row’s trailing side, never below it: rows stack vertically, so a tip below would cover the next row.
Sourcepub fn row_rich_tooltip(
self,
f: impl Fn(usize, &T) -> Option<RichTooltipSource> + 'static,
) -> Self
pub fn row_rich_tooltip( self, f: impl Fn(usize, &T) -> Option<RichTooltipSource> + 'static, ) -> Self
Per-row rich tooltip — a registry key or inline
TooltipContent. See
row_tooltip for the shared semantics.
Sourcepub fn row_composite_tooltip(
self,
f: impl Fn(usize, &T) -> Option<Box<dyn Widget>> + 'static,
) -> Self
pub fn row_composite_tooltip( self, f: impl Fn(usize, &T) -> Option<Box<dyn Widget>> + 'static, ) -> Self
Per-row composite tooltip — an arbitrary widget tree describing the row.
The body is built for every realized row (the virtualization window)
and rebuilt with it, so keep the resolver cheap and defer anything
costly to the body’s own first paint, which only runs if the tip is
actually shown. See row_tooltip for the rest.
pub fn type_ahead_label(self, label: impl Fn(&T) -> String + 'static) -> Self
Sourcepub fn type_ahead_timeout(self, timeout: Duration) -> Self
pub fn type_ahead_timeout(self, timeout: Duration) -> Self
Reset window between keystrokes before the type-ahead search term clears (default 500 ms). A zero duration disables type-ahead.
Sourcepub fn show_scrollbar(self, show: bool) -> Self
pub fn show_scrollbar(self, show: bool) -> Self
Suppress the internal scroll bar. Use when the caller wants to
mount its own ScrollBar outside the ListView (keeping it alive
across rebuilds so a thumb drag isn’t torn down when the visible
range shifts past the buffer). The caller is expected to wire
the external bar up to the signals returned by
scroll_y_signal,
max_scroll_y_signal and
viewport_ratio_y_signal.
Sourcepub fn scroll_y_signal(&self) -> &Signal<f32>
pub fn scroll_y_signal(&self) -> &Signal<f32>
The current vertical scroll offset, in logical pixels. Drives the
viewport position and the scroll bar thumb. Exposed so external
logic (e.g. a parent widget implementing custom scroll-into-view)
can read or drive the scroll directly — prefer
scroll_to_index /
ensure_index_visible when possible.
Sourcepub fn max_scroll_y_signal(&self) -> &Signal<f32>
pub fn max_scroll_y_signal(&self) -> &Signal<f32>
The maximum scroll offset, content_height - viewport_height.
Updated during layout. Exposed for callers that mount their own
external scrollbar via show_scrollbar(false).
Sourcepub fn viewport_ratio_y_signal(&self) -> &Signal<f32>
pub fn viewport_ratio_y_signal(&self) -> &Signal<f32>
The vertical viewport-to-content ratio (0.0..1.0). Drives the thumb size on any external scrollbar.
Sourcepub fn scroll_to_index(&self, index: usize)
pub fn scroll_to_index(&self, index: usize)
Scroll so the given model index is aligned to the top of the viewport, now, against the scroll range and row offsets of the last layout pass.
The offset is computed and clamped when this is called, to the
max_scroll_y that pass wrote. Before the
view has been laid out that range is 0, so the call scrolls to the
top and does nothing more; after a model change in the same turn the
range still describes the old list. On a list that is already mounted,
or to scroll before the first layout, use a handle,
which defers the computation to the next layout pass.
With sections, the first item of a section brings
its header to the top with it, and with
pinned_section_headers every item
stops below the pinned header.
Sourcepub fn ensure_index_visible(&self, index: usize)
pub fn ensure_index_visible(&self, index: usize)
Scroll the minimum distance needed to bring the given model
index fully into view. No-op if already visible. Sections are
honoured as in scroll_to_index.
Like scroll_to_index, this computes the offset when it is called,
against the viewport and scroll range of the last layout pass; a
handle defers it to the next one.
Sourcepub fn handle(&self) -> ListViewHandle
pub fn handle(&self) -> ListViewHandle
A handle that scrolls this list once it is mounted.
Take it while describing the tree, before the view is handed to
ctx.add(...); it stays attached to the view across rebuilds. See
ListViewHandle.
Trait Implementations§
Source§impl<T: 'static> Widget for ListView<T>
impl<T: 'static> Widget for ListView<T>
Source§fn post_paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext<'_>)
fn post_paint(&self, bounds: Rect, canvas: &mut Canvas, ctx: &PaintContext<'_>)
The insertion line and the container focus ring, drawn over the children.
Not in paint, which runs before them: the pinned section header is
an opaque child over the top of the viewport, and would cover the top
edge of the ring and a line drawn along or under it. A row that paints
its own background covers a line the same way.
The context-menu key opens the current row’s menu, not the list’s.
A ListView is focusable and its rows deliberately are not — the
container owns focus and set_selected is what tells assistive
technology which row is current (see list_item_a11y). So the
dispatcher’s default of “the focused widget” would open the list’s own
menu, in the widget family where a per-row menu matters most.
The row the user means is the keyboard cursor if they have navigated
(focused_index), else the first selected row. Both are indices into
the model, and only realized rows have a widget, so a cursor scrolled
outside the virtualization window resolves to nothing and the menu falls
back to the list — which is the right answer, since there is no row on
screen for it to be about.
Source§fn build(&mut self, ctx: &mut BuildContext<'_>) -> Vec<WidgetId>
fn build(&mut self, ctx: &mut BuildContext<'_>) -> Vec<WidgetId>
BindingLevel::Rebuild binding, rebuild_single_widget, or a density
switch. A theme or locale switch does not rebuild: set_theme and
set_locale mark layout + paint dirty and leave the built subtree
standing, so anything derived from the theme or the locale must be read
per pass or bound to a signal rather than captured here.
Takes &mut self — store child IDs, signal handles, any state needed later.
Returns the list of root child IDs (empty for leaf widgets).Source§fn layout_response(
&self,
proposal: SizeProposal,
_ctx: &LayoutContext<'_>,
) -> LayoutResponse
fn layout_response( &self, proposal: SizeProposal, _ctx: &LayoutContext<'_>, ) -> LayoutResponse
LayoutResponse]). Read moreSource§fn place_children(
&self,
bounds: Rect,
_proposal: SizeProposal,
children: &mut [WidgetPlacement],
_ctx: &LayoutContext<'_>,
)
fn place_children( &self, bounds: Rect, _proposal: SizeProposal, children: &mut [WidgetPlacement], _ctx: &LayoutContext<'_>, )
Source§fn wants_post_paint(&self) -> bool
fn wants_post_paint(&self) -> bool
post_paint
hook to fire each frame. Returning false (the default) saves a
virtual call per widget per frame for the vast majority of widgets
that don’t draw a foreground over their children. Read moreSource§fn accessibility(&self, builder: &mut AccessNodeBuilder)
fn accessibility(&self, builder: &mut AccessNodeBuilder)
Source§fn as_any(&self) -> Option<&dyn Any>
fn as_any(&self) -> Option<&dyn Any>
None; concrete
widgets override with Some(self) when they want to expose
their concrete type to test-level introspection or reflection.
The trait already bounds on std::any::Any so concrete types
satisfy the 'static requirement.Source§fn clips_children(&self) -> bool
fn clips_children(&self) -> bool
§fn type_name(&self) -> &'static str
fn type_name(&self) -> &'static str
"teksilo_widgets::button::Button"). The default implementation
resolves at the impl site via std::any::type_name::<Self>(),
so calls through &dyn Widget correctly dispatch to the
monomorphized fn for the concrete type — getting the
concrete name through the vtable without per-impl boilerplate. Read more§fn cacheable_layout(&self) -> bool
fn cacheable_layout(&self) -> bool
layout_response may be
memoized by the per-pass layout cache. Defaults to true. Read more§fn paint(&self, _bounds: Rect, _canvas: &mut Canvas, _ctx: &PaintContext<'_>)
fn paint(&self, _bounds: Rect, _canvas: &mut Canvas, _ctx: &PaintContext<'_>)
§fn wants_after_paint(&self) -> bool
fn wants_after_paint(&self) -> bool
after_paint
hook to fire each frame. Returning false (the default) saves
a virtual call per widget per frame for the vast majority of
widgets that don’t aggregate descendant geometry. Read more§fn after_paint(&self, _view: &WidgetTreeView<'_>, _ctx: &PaintContext<'_>)
fn after_paint(&self, _view: &WidgetTreeView<'_>, _ctx: &PaintContext<'_>)
TitleBar aggregates its drag region and control-button
rects into a single HitRegions payload for the Windows
backend’s WM_NCHITTEST. Read more§fn wants_descendant_redirects(&self) -> bool
fn wants_descendant_redirects(&self) -> bool
a11y_redirect_descendant
hook for every descendant during AT tree emission, not
just its direct arena children. Read more§fn culls_children(&self) -> bool
fn culls_children(&self) -> bool
§fn a11y_redirect_descendant(
&self,
_self_id: WidgetId,
_descendant: WidgetId,
) -> Option<NodeId>
fn a11y_redirect_descendant( &self, _self_id: WidgetId, _descendant: WidgetId, ) -> Option<NodeId>
§fn accessible_title_hint(&self) -> Option<String>
fn accessible_title_hint(&self) -> Option<String>
§fn accessible_title_node(&self) -> Option<WidgetId>
fn accessible_title_node(&self) -> Option<WidgetId>
§fn initial_focus_hint(&self) -> Option<WidgetId>
fn initial_focus_hint(&self) -> Option<WidgetId>
§fn accessibility_proxy(&self) -> Option<WidgetId>
fn accessibility_proxy(&self) -> Option<WidgetId>
§fn accessibility_children(&self) -> Option<Vec<WidgetId>>
fn accessibility_children(&self) -> Option<Vec<WidgetId>>
§fn as_any_mut(&mut self) -> Option<&mut (dyn Any + 'static)>
fn as_any_mut(&mut self) -> Option<&mut (dyn Any + 'static)>
as_any. Default
returns None; widgets that want to expose mutable state to
tests (e.g. so a test can mutate a Scene inside a
SceneView post-layout) override with Some(self). Should
follow the same opt-in pattern as as_any: only widgets
that opt into & introspection should opt into &mut.§fn focus_reveal_rect(&self, _bounds: Rect) -> Option<Rect>
fn focus_reveal_rect(&self, _bounds: Rect) -> Option<Rect>
None (the default) reveals the widget’s whole
bounds — correct for most controls. Read more§fn hit_shape(&self, _local_point: Point, _bounds: Rect) -> bool
fn hit_shape(&self, _local_point: Point, _bounds: Rect) -> bool
false for a point that is inside
the bounding box makes the widget transparent to the click there,
so it falls through to whatever sibling is painted underneath
(the same machinery as a fully pass-through node, but shape-aware). Read more§fn accepts_child_hit(&self, _child: WidgetId, _point: Point) -> bool
fn accepts_child_hit(&self, _child: WidgetId, _point: Point) -> bool
§fn hit_outset(&self, _kind: PointerKind, _tokens: &InputTokens) -> EdgeInsets
fn hit_outset(&self, _kind: PointerKind, _tokens: &InputTokens) -> EdgeInsets
§fn hit_slop(&self, _kind: PointerKind, _tokens: &InputTokens) -> Option<HitSlop>
fn hit_slop(&self, _kind: PointerKind, _tokens: &InputTokens) -> Option<HitSlop>
§fn hit_distance(&self, local_point: Point, bounds: Rect) -> Option<f32>
fn hit_distance(&self, local_point: Point, bounds: Rect) -> Option<f32>
§fn target_regions(&self, _bounds: Rect) -> Vec<TargetRegion>
fn target_regions(&self, _bounds: Rect) -> Vec<TargetRegion>
§fn preserves_children_on_rebuild(&self) -> bool
fn preserves_children_on_rebuild(&self) -> bool
rebuild_single_widget treats this widget’s existing children
when re-running its build(). Read more§fn tooltip_has_content(&self) -> bool
fn tooltip_has_content(&self) -> bool
§fn declare_shortcuts(&self) -> Vec<Shortcut>
fn declare_shortcuts(&self) -> Vec<Shortcut>
build()) and at certain lazy
boundaries (e.g. Switcher walks declarations on its
not-yet-mounted Pending slots), so settings UIs and the
ShortcutRegistry see the keystrokes the moment the owning
container mounts — even if build() hasn’t run. Read more§fn take_handler_set(&mut self) -> Option<HandlerSet>
fn take_handler_set(&mut self) -> Option<HandlerSet>
WidgetWithHandlers wrapper.
Called during arena insertion to transfer handlers to the WidgetNode.
Default: returns None (no attached handlers).Auto Trait Implementations§
impl<T> !RefUnwindSafe for ListView<T>
impl<T> !Send for ListView<T>
impl<T> !Sync for ListView<T>
impl<T> !UnwindSafe for ListView<T>
impl<T> Freeze for ListView<T>
impl<T> Unpin for ListView<T>
impl<T> UnsafeUnpin for ListView<T>
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.impl<T> ErasedDestructor for Twhere
T: 'static,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
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§impl<W> IntoTeksiChild for Wwhere
W: Widget + 'static,
impl<W> IntoTeksiChild for Wwhere
W: Widget + 'static,
fn into_pending(self) -> PendingChild
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
§impl<W> WidgetBuilder for Wwhere
W: Widget + 'static,
impl<W> WidgetBuilder for Wwhere
W: Widget + 'static,
fn on_tap( self, f: impl FnMut(&TapEvent, &mut EventContext<'_>) + 'static, ) -> WidgetWithHandlers<Self>
fn on_double_tap( self, f: impl FnMut(&TapEvent, &mut EventContext<'_>) + 'static, ) -> WidgetWithHandlers<Self>
fn on_triple_tap( self, f: impl FnMut(&TapEvent, &mut EventContext<'_>) + 'static, ) -> WidgetWithHandlers<Self>
fn on_long_press( self, f: impl FnMut(&TapEvent, &mut EventContext<'_>) + 'static, ) -> WidgetWithHandlers<Self>
on_tap. Default is [ButtonMask::PRIMARY]. Read moreon_double_tap. Default [ButtonMask::PRIMARY]. Read moreon_triple_tap. Default [ButtonMask::PRIMARY]. Read moreon_long_press. Default [ButtonMask::PRIMARY]. Read morefn on_drag( self, f: impl FnMut(DragPhase, &mut EventContext<'_>) + 'static, ) -> WidgetWithHandlers<Self>
fn on_swipe( self, f: impl FnMut(SwipeDirection, f32, &mut EventContext<'_>) + 'static, ) -> WidgetWithHandlers<Self>
fn on_pinch( self, f: impl FnMut(PinchPhase, &mut EventContext<'_>) + 'static, ) -> WidgetWithHandlers<Self>
fn on_focus( self, f: impl FnMut(bool, &mut EventContext<'_>) + 'static, ) -> WidgetWithHandlers<Self>
fn on_key( self, f: impl FnMut(&WidgetEvent, &mut EventContext<'_>) -> EventResponse + 'static, ) -> WidgetWithHandlers<Self>
§fn on_key_preview(
self,
f: impl FnMut(&WidgetEvent, &mut EventContext<'_>) -> EventResponse + 'static,
) -> WidgetWithHandlers<Self>
fn on_key_preview( self, f: impl FnMut(&WidgetEvent, &mut EventContext<'_>) -> EventResponse + 'static, ) -> WidgetWithHandlers<Self>
HandlerSet::on_key_preview].fn on_pointer_event( self, f: impl FnMut(&WidgetEvent, &mut EventContext<'_>) -> EventResponse + 'static, ) -> WidgetWithHandlers<Self>
fn on_hover( self, f: impl FnMut(bool, &mut EventContext<'_>) + 'static, ) -> WidgetWithHandlers<Self>
fn on_scroll( self, f: impl FnMut(&WidgetEvent, &mut EventContext<'_>) -> EventResponse + 'static, ) -> WidgetWithHandlers<Self>
fn on_access_action( self, f: impl FnMut(Action, &mut EventContext<'_>) -> EventResponse + 'static, ) -> WidgetWithHandlers<Self>
fn focusable(self, focusable: bool) -> WidgetWithHandlers<Self>
fn tab_index(self, index: i32) -> WidgetWithHandlers<Self>
fn cursor(self, cursor: CursorIcon) -> WidgetWithHandlers<Self>
fn clips_children_on(self, clips: bool) -> WidgetWithHandlers<Self>
§fn ime_input(self, ctx: ImeContext) -> WidgetWithHandlers<Self>
fn ime_input(self, ctx: ImeContext) -> WidgetWithHandlers<Self>
ctx’s purpose) while it is focused. See [crate::ime].§fn event_pass_through(self, pass_through: bool) -> WidgetWithHandlers<Self>
fn event_pass_through(self, pass_through: bool) -> WidgetWithHandlers<Self>
HandlerSet::event_pass_through].§fn gesture_dead_zone(self, dead_zone: bool) -> WidgetWithHandlers<Self>
fn gesture_dead_zone(self, dead_zone: bool) -> WidgetWithHandlers<Self>
HandlerSet::gesture_dead_zone].§fn long_press_role(self, role: LongPressRole) -> WidgetWithHandlers<Self>
fn long_press_role(self, role: LongPressRole) -> WidgetWithHandlers<Self>
HandlerSet::long_press_role].§fn touch_action(self, action: TouchAction) -> WidgetWithHandlers<Self>
fn touch_action(self, action: TouchAction) -> WidgetWithHandlers<Self>
HandlerSet::touch_action].§fn scroll_container(self, axes: PanAxes) -> WidgetWithHandlers<Self>
fn scroll_container(self, axes: PanAxes) -> WidgetWithHandlers<Self>
axes, kinetic, direct pointers
only. See [HandlerSet::scroll_container].§fn pan_claim(self, claim: PanClaim) -> WidgetWithHandlers<Self>
fn pan_claim(self, claim: PanClaim) -> WidgetWithHandlers<Self>
PanClaim]. See
[HandlerSet::pan_claim].§fn overscroll_behavior(
self,
behavior: OverscrollBehavior,
) -> WidgetWithHandlers<Self>
fn overscroll_behavior( self, behavior: OverscrollBehavior, ) -> WidgetWithHandlers<Self>
HandlerSet::overscroll_behavior].§fn drag_activation(self, activation: DragActivation) -> WidgetWithHandlers<Self>
fn drag_activation(self, activation: DragActivation) -> WidgetWithHandlers<Self>
HandlerSet::drag_activation].§fn multi_contact(self, policy: MultiContact) -> WidgetWithHandlers<Self>
fn multi_contact(self, policy: MultiContact) -> WidgetWithHandlers<Self>
MultiContact::First] — the second finger on a single-contact control
is terminated there rather than reaching an ancestor.§fn keyboard_capture(self, capture: bool) -> WidgetWithHandlers<Self>
fn keyboard_capture(self, capture: bool) -> WidgetWithHandlers<Self>
KeyDowns bypass shortcut resolution.
See [HandlerSet::keyboard_capture].§fn hit_transparent(self, transparent: bool) -> WidgetWithHandlers<Self>
fn hit_transparent(self, transparent: bool) -> WidgetWithHandlers<Self>
HandlerSet::hit_transparent].§fn hit_slop(self, slop: HitSlop) -> WidgetWithHandlers<Self>
fn hit_slop(self, slop: HitSlop) -> WidgetWithHandlers<Self>
HandlerSet::hit_slop].§fn no_hit_slop(self) -> WidgetWithHandlers<Self>
fn no_hit_slop(self) -> WidgetWithHandlers<Self>
Widget::hit_outset. See [HandlerSet::no_hit_slop].HandlerSet::context_menu] for the full contract.§fn focus_within(self, signal: Signal<bool>) -> WidgetWithHandlers<Self>
fn focus_within(self, signal: Signal<bool>) -> WidgetWithHandlers<Self>
Signal<bool> the framework writes when a strict
descendant has focus. See [HandlerSet::focus_within].§fn hover_within(self, signal: Signal<bool>) -> WidgetWithHandlers<Self>
fn hover_within(self, signal: Signal<bool>) -> WidgetWithHandlers<Self>
Signal<bool> the framework writes when a strict
descendant is hovered. See [HandlerSet::hover_within].§fn visible_when(self, state: impl Into<Prop<bool>>) -> WidgetWithHandlers<Self>
fn visible_when(self, state: impl Into<Prop<bool>>) -> WidgetWithHandlers<Self>
bool / Signal<bool> / Prop<bool>) as
a builder property, so teksu! can write visible_when: sig. Equivalent
to ctx.visible_when(id, ..). See [HandlerSet::visible_when].fn on_drag_hover( self, f: impl FnMut(&DragPayload, Point, &mut EventContext<'_>) -> DropFeedback + 'static, ) -> WidgetWithHandlers<Self>
fn on_drag_leave( self, f: impl FnMut(&mut EventContext<'_>) + 'static, ) -> WidgetWithHandlers<Self>
fn on_drag_tick( self, f: impl FnMut(Point, &mut EventContext<'_>) + 'static, ) -> WidgetWithHandlers<Self>
§fn on_pointer_cancel(
self,
f: impl FnMut(&PointerInfo, CancelReason, &mut EventContext<'_>) + 'static,
) -> WidgetWithHandlers<Self>
fn on_pointer_cancel( self, f: impl FnMut(&PointerInfo, CancelReason, &mut EventContext<'_>) + 'static, ) -> WidgetWithHandlers<Self>
HandlerSet::on_pointer_cancel].fn on_drop( self, f: impl FnMut(DragPayload, Point, &mut EventContext<'_>) -> bool + 'static, ) -> WidgetWithHandlers<Self>
§fn on_drag_ended(
self,
f: impl FnMut(DropOutcome, &mut EventContext<'_>) + 'static,
) -> WidgetWithHandlers<Self>
fn on_drag_ended( self, f: impl FnMut(DropOutcome, &mut EventContext<'_>) + 'static, ) -> WidgetWithHandlers<Self>
HandlerSet::on_drag_ended].