Struct List

Source
pub struct List<C, D>
where C: Collection, D: Directional,
{ /* private fields */ }
Expand description

A generic row/column widget

A linear widget over a Collection of widgets.

When the collection uses Vec, various methods to insert/remove elements are available.

The layout direction D may be compile-time fixed (e.g. Right) or run-time mutable (Direction); in the latter case set_direction is available.

§See also

Row and Column are type-defs to List which fix the direction D.

The macros row! and column! also create row/column layouts, but are not fully equivalent:

  • row! and column! generate anonymous layout widgets (or objects). These do not have a set_direction method or support adding or removing elements.
  • row! and column! generate layout objects which, when used within a custom widget, may refer to that widget’s fields.

§Performance

Configuring and resizing elements is O(n) in the number of children. Drawing and event handling is O(log n) in the number of children (assuming only a small number are visible at any one time).

§Example

use kas::collection;

let list = List::right(collection![
    "A checkbox",
    CheckBox::new(|_, state: &bool| *state),
]);

Implementations§

Source§

impl<C, D> List<C, D>

Source

pub fn new(widgets: C) -> List<C, D>

Construct a new instance with default-constructed direction

This constructor is available where the direction is determined by the type: for D: Directional + Default. In other cases, use Self::new_dir.

§Examples

Where widgets have the same type and the length is fixed, an array may be used:

use kas_widgets::{Label, Row};
let _ = Row::new([Label::new("left"), Label::new("right")]);

To support run-time insertion/deletion, use Vec:

use kas_widgets::{AdaptWidget, Button, Row};

#[derive(Clone, Debug)]
enum Msg {
    Add,
    Remove,
}

let _ = Row::new(vec![Button::label_msg("Add", Msg::Add)])
    .on_messages(|cx, row, data| {
        if let Some(msg) = cx.try_pop() {
            match msg {
                Msg::Add => {
                    let button = if row.len() % 2 == 0 {
                        Button::label_msg("Add", Msg::Add)
                    } else {
                        Button::label_msg("Remove", Msg::Remove)
                    };
                    row.push(&mut cx.config_cx(), data, button);
                }
                Msg::Remove => {
                    let _ = row.pop(&mut cx.config_cx());
                }
            }
        }
    });
Source§

impl<C> List<C, Left>
where C: Collection,

Source

pub fn left(widgets: C) -> List<C, Left>

Construct a new instance with fixed direction

Source§

impl<C> List<C, Right>
where C: Collection,

Source

pub fn right(widgets: C) -> List<C, Right>

Construct a new instance with fixed direction

Source§

impl<C> List<C, Up>
where C: Collection,

Source

pub fn up(widgets: C) -> List<C, Up>

Construct a new instance with fixed direction

Source§

impl<C> List<C, Down>
where C: Collection,

Source

pub fn down(widgets: C) -> List<C, Down>

Construct a new instance with fixed direction

Source§

impl<C> List<C, Direction>
where C: Collection,

Source

pub fn set_direction(&mut self, direction: Direction) -> Action

Set the direction of contents

Source§

impl<C, D> List<C, D>
where C: Collection, D: Directional,

Source

pub fn new_dir(widgets: C, direction: D) -> List<C, D>

Construct a new instance with explicit direction

Source

pub fn direction(&self) -> Direction

Get the direction of contents

Source

pub fn layout_storage(&mut self) -> &mut impl RowStorage

Access layout storage

The number of columns/rows is [Self.len].

Source

pub fn is_empty(&self) -> bool

True if there are no child widgets

Source

pub fn len(&self) -> usize

Returns the number of child widgets

Source§

impl<W, D> List<Vec<W>, D>
where W: Widget, D: Directional,

Source

pub fn get(&self, index: usize) -> Option<&W>

Returns a reference to the child, if any

Source

pub fn get_mut(&mut self, index: usize) -> Option<&mut W>

Returns a mutable reference to the child, if any

Source

pub fn edit<F>(&mut self, f: F) -> Action
where F: FnOnce(&mut Vec<W>),

Edit the list of children directly

This may be used to edit children before window construction. It may also be used from a running UI, but in this case a full reconfigure of the window’s widgets is required (triggered by the the return value, Action::RECONFIGURE).

Source

pub fn clear(&mut self)

Remove all child widgets

Source

pub fn push( &mut self, cx: &mut ConfigCx<'_>, data: &<W as Widget>::Data, widget: W, ) -> usize

Append a child widget

The new child is configured immediately. Action::RESIZE is triggered.

Returns the new element’s index.

Source

pub fn pop(&mut self, cx: &mut EventState) -> Option<W>

Remove the last child widget (if any) and return

Triggers Action::RESIZE.

Source

pub fn insert( &mut self, cx: &mut ConfigCx<'_>, data: &<W as Widget>::Data, index: usize, widget: W, )

Inserts a child widget position index

Panics if index > len.

The new child is configured immediately. Triggers Action::RESIZE.

Source

pub fn remove(&mut self, cx: &mut EventState, index: usize) -> W

Removes the child widget at position index

Panics if index is out of bounds.

Triggers Action::RESIZE.

Source

pub fn replace( &mut self, cx: &mut ConfigCx<'_>, data: &<W as Widget>::Data, index: usize, w: W, ) -> W

Replace the child at index

Panics if index is out of bounds.

The new child is configured immediately. Triggers Action::RESIZE.

Source

pub fn extend<T>( &mut self, cx: &mut ConfigCx<'_>, data: &<W as Widget>::Data, iter: T, )
where T: IntoIterator<Item = W>,

Append child widgets from an iterator

New children are configured immediately. Triggers Action::RESIZE.

Source

pub fn resize_with<F>( &mut self, cx: &mut ConfigCx<'_>, data: &<W as Widget>::Data, len: usize, f: F, )
where F: Fn(usize) -> W,

Resize, using the given closure to construct new widgets

New children are configured immediately. Triggers Action::RESIZE.

Source

pub fn iter(&self) -> impl Iterator<Item = &W>

Iterate over childern

Source

pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut W>

Mutably iterate over childern

Trait Implementations§

Source§

impl<C, D> Default for List<C, D>

Source§

fn default() -> List<C, D>

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

impl<C, D> Events for List<C, D>
where C: Collection, D: Directional,

Source§

fn make_child_id(&mut self, index: usize) -> Id

Make a fresh id based on self.next then insert into self.id_map

Source§

fn configure(&mut self, _: &mut ConfigCx<'_>)

Configure self Read more
Source§

fn handle_event( &mut self, _: &mut EventCx<'_>, _: &<List<C, D> as Widget>::Data, _: Event, ) -> IsUsed

Handle an Event Read more
Source§

fn configure_recurse(&mut self, cx: &mut ConfigCx<'_>, data: &Self::Data)

Configure children Read more
Source§

fn update(&mut self, cx: &mut ConfigCx<'_>, data: &Self::Data)

Update self using input data Read more
Source§

fn update_recurse(&mut self, cx: &mut ConfigCx<'_>, data: &Self::Data)

Update children Read more
Source§

fn navigable(&self) -> bool

Is this widget navigable via Tab key? Read more
Source§

fn handle_hover(&mut self, cx: &mut EventCx<'_>, state: bool)

Mouse focus handler Read more
Source§

fn handle_messages(&mut self, cx: &mut EventCx<'_>, data: &Self::Data)

Handler for messages from children/descendants Read more
Source§

fn handle_scroll( &mut self, cx: &mut EventCx<'_>, data: &Self::Data, scroll: Scroll, )

Handler for scrolling Read more
Source§

impl<W, D> Index<usize> for List<Vec<W>, D>
where W: Widget, D: Directional,

Source§

type Output = W

The returned type after indexing.
Source§

fn index(&self, index: usize) -> &<List<Vec<W>, D> as Index<usize>>::Output

Performs the indexing (container[index]) operation. Read more
Source§

impl<W, D> IndexMut<usize> for List<Vec<W>, D>
where W: Widget, D: Directional,

Source§

fn index_mut( &mut self, index: usize, ) -> &mut <List<Vec<W>, D> as Index<usize>>::Output

Performs the mutable indexing (container[index]) operation. Read more
Source§

impl<C, D> Layout for List<C, D>
where C: Collection, D: Directional,

Source§

fn num_children(&self) -> usize

Get the number of child widgets Read more
Source§

fn get_child(&self, index: usize) -> Option<&dyn Layout>

Access a child as a dyn Layout Read more
Source§

fn find_child_index(&self, id: &Id) -> Option<usize>

Find the child which is an ancestor of this id, if any Read more
Source§

fn size_rules(&mut self, sizer: SizeCx<'_>, axis: AxisInfo) -> SizeRules

Get size rules for the given axis Read more
Source§

fn set_rect(&mut self, cx: &mut ConfigCx<'_>, rect: Rect, hints: AlignHints)

Set size and position Read more
Source§

fn find_id(&mut self, coord: Coord) -> Option<Id>

Translate a coordinate to an Id Read more
Source§

fn draw(&mut self, draw: DrawCx<'_>)

Draw a widget and its children Read more
Source§

fn as_layout(&self) -> &dyn Layout

Get as a dyn Layout Read more
Source§

fn id_ref(&self) -> &Id

Get the widget’s identifier Read more
Source§

fn rect(&self) -> Rect

Get the widget’s region, relative to its parent. Read more
Source§

fn widget_name(&self) -> &'static str

Get the name of the widget struct Read more
Source§

fn nav_next(&self, reverse: bool, from: Option<usize>) -> Option<usize>

Navigation in spatial order Read more
Source§

fn translation(&self) -> Offset

Get translation of children relative to this widget Read more
Source§

impl<C, D> Widget for List<C, D>
where C: Collection, D: Directional,

Source§

type Data = <C as Collection>::Data

Input data type Read more
Source§

fn for_child_node( &mut self, data: &<C as Collection>::Data, index: usize, closure: Box<dyn FnOnce(Node<'_>) + '_>, )

Call closure on child with given index, if index < self.num_children(). Read more
Source§

fn as_node<'a>(&'a mut self, data: &'a <List<C, D> as Widget>::Data) -> Node<'a>

Erase type Read more

Auto Trait Implementations§

§

impl<C, D> Freeze for List<C, D>
where C: Freeze, D: Freeze,

§

impl<C, D> RefUnwindSafe for List<C, D>

§

impl<C, D> !Send for List<C, D>

§

impl<C, D> !Sync for List<C, D>

§

impl<C, D> Unpin for List<C, D>
where C: Unpin, D: Unpin,

§

impl<C, D> UnwindSafe for List<C, D>
where C: UnwindSafe, D: UnwindSafe,

Blanket Implementations§

Source§

impl<W> AdaptWidget for W
where W: Widget,

Source§

fn align(self, hints: AlignHints) -> Align<Self>

Apply an alignment hint Read more
Source§

fn pack(self, hints: AlignHints) -> Pack<Self>

Apply an alignment hint, squash and align the result Read more
Source§

fn margins(self, dirs: Directions, style: MarginStyle) -> Margins<Self>

Specify margins Read more
Source§

fn map<A, F>(self, f: F) -> Map<A, Self, F>
where F: for<'a> Fn(&'a A) -> &'a Self::Data,

Map data type via a function Read more
Source§

fn on_configure<F>(self, f: F) -> AdaptEvents<Self>
where F: Fn(&mut AdaptConfigCx<'_, '_>, &mut Self) + 'static,

Call the given closure on Events::configure Read more
Source§

fn on_update<F>(self, f: F) -> AdaptEvents<Self>
where F: Fn(&mut AdaptConfigCx<'_, '_>, &mut Self, &Self::Data) + 'static,

Call the given closure on Events::update Read more
Source§

fn on_message<M, H>(self, handler: H) -> AdaptEvents<Self>
where M: Debug + 'static, H: Fn(&mut AdaptEventCx<'_, '_>, &mut Self, M) + 'static,

Add a handler on message of type M Read more
Source§

fn map_message<M, N, H>(self, handler: H) -> AdaptEvents<Self>
where M: Debug + 'static, N: Debug + 'static, H: Fn(usize, M) -> N + 'static,

Add a child handler to map messages of type M to N Read more
Source§

fn on_messages<H>(self, handler: H) -> AdaptEvents<Self>
where H: Fn(&mut AdaptEventCx<'_, '_>, &mut Self, &Self::Data) + 'static,

Add a generic message handler Read more
Source§

fn with_min_size_px(self, w: i32, h: i32) -> Reserve<Self>

Construct a wrapper, setting minimum size in pixels Read more
Source§

fn with_min_size_em(self, w: f32, h: f32) -> Reserve<Self>

Construct a wrapper, setting minimum size in Em Read more
Source§

fn with_label<D, T>(self, direction: D, label: T) -> WithLabel<Self, D>

Construct a wrapper widget adding a label Read more
Source§

impl<W> AdaptWidgetAny for W
where W: Widget<Data = ()>,

Source§

fn map_any<A>(self) -> MapAny<A, Self>

Map any input data to () Read more
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<S, T> Cast<T> for S
where T: Conv<S>,

Source§

fn cast(self) -> T

Cast from Self to T Read more
Source§

fn try_cast(self) -> Result<T, Error>

Try converting from Self to T Read more
Source§

impl<S, T> CastApprox<T> for S
where T: ConvApprox<S>,

Source§

fn try_cast_approx(self) -> Result<T, Error>

Try approximate conversion from Self to T Read more
Source§

fn cast_approx(self) -> T

Cast approximately from Self to T Read more
Source§

impl<S, T> CastFloat<T> for S
where T: ConvFloat<S>,

Source§

fn cast_trunc(self) -> T

Cast to integer, truncating Read more
Source§

fn cast_nearest(self) -> T

Cast to the nearest integer Read more
Source§

fn cast_floor(self) -> T

Cast the floor to an integer Read more
Source§

fn cast_ceil(self) -> T

Cast the ceiling to an integer Read more
Source§

fn try_cast_trunc(self) -> Result<T, Error>

Try converting to integer with truncation Read more
Source§

fn try_cast_nearest(self) -> Result<T, Error>

Try converting to the nearest integer Read more
Source§

fn try_cast_floor(self) -> Result<T, Error>

Try converting the floor to an integer Read more
Source§

fn try_cast_ceil(self) -> Result<T, Error>

Try convert the ceiling to an integer Read more
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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<W> LayoutExt for W
where W: Layout + ?Sized,

Source§

fn id(&self) -> Id

Get the widget’s identifier Read more
Source§

fn eq_id<T>(&self, rhs: T) -> bool
where Id: PartialEq<T>,

Test widget identifier for equality Read more
Source§

fn identify(&self) -> IdentifyWidget<'_>

Display as “StructName#Id”
Source§

fn is_ancestor_of(&self, id: &Id) -> bool

Check whether id is self or a descendant Read more
Source§

fn is_strict_ancestor_of(&self, id: &Id) -> bool

Check whether id is not self and is a descendant Read more
Source§

fn for_children(&self, f: impl FnMut(&dyn Layout))

Run a closure on all children
Source§

fn for_children_try<E>( &self, f: impl FnMut(&dyn Layout) -> Result<(), E>, ) -> Result<(), E>

Run a fallible closure on all children Read more
Source§

fn find_widget(&self, id: &Id) -> Option<&dyn Layout>

Find the descendant with this id, if any Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<R, P> ReadPrimitive<R> for P
where R: Read + ReadEndian<P>, P: Default,

Source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
Source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
Source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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

impl<T> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more