Struct kas_widgets::Stack
source · pub struct Stack<W: Widget> { /* private fields */ }
Expand description
A stack of widgets
A stack consists a set of child widgets, “pages”, all of equal size.
Only a single page is visible at a time. The page is “turned” by calling
Self::set_active
.
This may only be parametrised with a single widget type, thus usually
it will be necessary to box children (this is what BoxStack
is).
Configuring is O(n)
in the number of pages n
. Resizing may be O(n)
or may be limited: see Self::set_size_limit
. Drawing is O(1)
, and
so is event handling in the expected case.
Implementations§
source§impl<W: Widget> Stack<W>
impl<W: Widget> Stack<W>
sourcepub fn new_vec(widgets: Vec<W>) -> Self
pub fn new_vec(widgets: Vec<W>) -> Self
Construct a new instance
Initially, the first page (if any) will be shown. Use
Self::with_active
to change this.
sourcepub fn edit<F: FnOnce(&mut Vec<W>)>(&mut self, f: F) -> Action
pub fn edit<F: FnOnce(&mut Vec<W>)>(&mut self, f: F) -> Action
Edit the list of children directly
This may be used to edit pages 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
).
sourcepub fn set_size_limit(&mut self, limit: usize)
pub fn set_size_limit(&mut self, limit: usize)
Limit the number of pages considered by Layout::size_rules
By default, this is usize::MAX
: all pages affect the result. If
this is set to 1 then only the active page will affect the result. If
this is n > 1
, then min(n, num_pages)
pages (including active)
will be used. (If this is set to 0 it is silently replaced with 1.)
Using a limit lower than the number of pages has two effects:
(1) resizing is faster and (2) calling Self::set_active
may cause a
full-window resize.
sourcepub fn with_active(self, active: usize) -> Self
pub fn with_active(self, active: usize) -> Self
Set the active widget (inline)
Unlike Self::set_active
, this does not update anything; it is
assumed that sizing happens afterwards.
sourcepub fn set_active(&mut self, mgr: &mut ConfigMgr<'_>, index: usize)
pub fn set_active(&mut self, mgr: &mut ConfigMgr<'_>, index: usize)
Set the active page
Behaviour depends on whether SizeRules
were already solved for
index
(see Self::set_size_limit
and note that methods like
Self::push
do not solve rules for new pages). Case:
index >= num_pages
: no page displayedindex == active
andSizeRules
were solved: nothing happensSizeRules
were solved: set layout (Layout::set_rect
) and update mouse-cursor target (Action::REGION_MOVED
)- Otherwise: resize the whole window (
Action::RESIZE
)
sourcepub fn get_active(&self) -> Option<&W>
pub fn get_active(&self) -> Option<&W>
Get a direct reference to the active child widget, if any
sourcepub fn get_mut(&mut self, index: usize) -> Option<&mut W>
pub fn get_mut(&mut self, index: usize) -> Option<&mut W>
Returns a mutable reference to the page, if any
sourcepub fn push(&mut self, mgr: &mut ConfigMgr<'_>, widget: W) -> usize
pub fn push(&mut self, mgr: &mut ConfigMgr<'_>, widget: W) -> usize
Append a page
The new page is configured immediately. If it becomes the active page
and then Action::RESIZE
will be triggered.
Returns the new page’s index.
sourcepub fn pop(&mut self, mgr: &mut ConfigMgr<'_>) -> Option<W>
pub fn pop(&mut self, mgr: &mut ConfigMgr<'_>) -> Option<W>
Remove the last child widget (if any) and return
If this page was active then the previous page becomes active.
sourcepub fn insert(&mut self, mgr: &mut ConfigMgr<'_>, index: usize, widget: W)
pub fn insert(&mut self, mgr: &mut ConfigMgr<'_>, index: usize, widget: W)
Inserts a child widget position index
Panics if index > len
.
The new child is configured immediately. The active page does not change.
sourcepub fn remove(&mut self, mgr: &mut ConfigMgr<'_>, index: usize) -> W
pub fn remove(&mut self, mgr: &mut ConfigMgr<'_>, index: usize) -> W
Removes the child widget at position index
Panics if index
is out of bounds.
If the active page is removed then the previous page (if any) becomes active.
sourcepub fn replace(&mut self, mgr: &mut ConfigMgr<'_>, index: usize, w: W) -> W
pub fn replace(&mut self, mgr: &mut ConfigMgr<'_>, index: usize, w: W) -> W
Replace the child at index
Panics if index
is out of bounds.
The new child is configured immediately. If it replaces the active page,
then Action::RESIZE
is triggered.
sourcepub fn extend<T: IntoIterator<Item = W>>(
&mut self,
mgr: &mut ConfigMgr<'_>,
iter: T
)
pub fn extend<T: IntoIterator<Item = W>>( &mut self, mgr: &mut ConfigMgr<'_>, iter: T )
Append child widgets from an iterator
New children are configured immediately. If a new page becomes active,
then Action::RESIZE
is triggered.
sourcepub fn resize_with<F: Fn(usize) -> W>(
&mut self,
mgr: &mut ConfigMgr<'_>,
len: usize,
f: F
)
pub fn resize_with<F: Fn(usize) -> W>( &mut self, mgr: &mut ConfigMgr<'_>, len: usize, f: F )
Resize, using the given closure to construct new widgets
New children are configured immediately. If a new page becomes active,
then Action::RESIZE
is triggered.
Trait Implementations§
source§impl<W: Widget> FromIterator<W> for Stack<W>
impl<W: Widget> FromIterator<W> for Stack<W>
source§fn from_iter<T>(iter: T) -> Selfwhere
T: IntoIterator<Item = W>,
fn from_iter<T>(iter: T) -> Selfwhere T: IntoIterator<Item = W>,
source§impl<W: Widget> Layout for Stack<W>
impl<W: Widget> Layout for Stack<W>
source§impl<W: Widget> Widget for Stack<W>
impl<W: Widget> Widget for Stack<W>
source§fn translation(&self) -> Offset
fn translation(&self) -> Offset
source§fn steal_event(
&mut self,
mgr: &mut EventMgr<'_>,
id: &WidgetId,
event: &Event
) -> Response
fn steal_event( &mut self, mgr: &mut EventMgr<'_>, id: &WidgetId, event: &Event ) -> Response
source§fn handle_unused(&mut self, mgr: &mut EventMgr<'_>, event: Event) -> Response
fn handle_unused(&mut self, mgr: &mut EventMgr<'_>, event: Event) -> Response
index
but left unhandled Read moresource§fn handle_message(&mut self, mgr: &mut EventMgr<'_>)
fn handle_message(&mut self, mgr: &mut EventMgr<'_>)
source§impl<W: Widget> WidgetChildren for Stack<W>
impl<W: Widget> WidgetChildren for Stack<W>
source§fn num_children(&self) -> usize
fn num_children(&self) -> usize
source§fn get_child(&self, index: usize) -> Option<&dyn Widget>
fn get_child(&self, index: usize) -> Option<&dyn Widget>
None
if the index is
out of bounds. Read moresource§fn get_child_mut(&mut self, index: usize) -> Option<&mut dyn Widget>
fn get_child_mut(&mut self, index: usize) -> Option<&mut dyn Widget>
source§impl<W: Widget> WidgetCore for Stack<W>
impl<W: Widget> WidgetCore for Stack<W>
source§fn widget_name(&self) -> &'static str
fn widget_name(&self) -> &'static str
source§fn as_widget_mut(&mut self) -> &mut dyn Widget
fn as_widget_mut(&mut self) -> &mut dyn Widget
Auto Trait Implementations§
impl<W> RefUnwindSafe for Stack<W>where W: RefUnwindSafe,
impl<W> !Send for Stack<W>
impl<W> !Sync for Stack<W>
impl<W> Unpin for Stack<W>where W: Unpin,
impl<W> UnwindSafe for Stack<W>where W: UnwindSafe,
Blanket Implementations§
§impl<S, T> Cast<T> for Swhere
T: Conv<S>,
impl<S, T> Cast<T> for Swhere T: Conv<S>,
§impl<S, T> CastApprox<T> for Swhere
T: ConvApprox<S>,
impl<S, T> CastApprox<T> for Swhere T: ConvApprox<S>,
§fn try_cast_approx(self) -> Result<T, Error>
fn try_cast_approx(self) -> Result<T, Error>
§fn cast_approx(self) -> T
fn cast_approx(self) -> T
§impl<S, T> CastFloat<T> for Swhere
T: ConvFloat<S>,
impl<S, T> CastFloat<T> for Swhere T: ConvFloat<S>,
§fn cast_trunc(self) -> T
fn cast_trunc(self) -> T
§fn cast_nearest(self) -> T
fn cast_nearest(self) -> T
§fn cast_floor(self) -> T
fn cast_floor(self) -> T
§fn try_cast_trunc(self) -> Result<T, Error>
fn try_cast_trunc(self) -> Result<T, Error>
§fn try_cast_nearest(self) -> Result<T, Error>
fn try_cast_nearest(self) -> Result<T, Error>
§fn try_cast_floor(self) -> Result<T, Error>
fn try_cast_floor(self) -> Result<T, Error>
§fn try_cast_ceil(self) -> Result<T, Error>
fn try_cast_ceil(self) -> Result<T, Error>
source§impl<W> WidgetExt for Wwhere
W: Widget + ?Sized,
impl<W> WidgetExt for Wwhere W: Widget + ?Sized,
source§fn eq_id<T>(&self, rhs: T) -> boolwhere
WidgetId: PartialEq<T>,
fn eq_id<T>(&self, rhs: T) -> boolwhere WidgetId: PartialEq<T>,
source§fn identify(&self) -> IdentifyWidget
fn identify(&self) -> IdentifyWidget
source§fn is_ancestor_of(&self, id: &WidgetId) -> bool
fn is_ancestor_of(&self, id: &WidgetId) -> bool
id
is self or a descendant Read moresource§fn is_strict_ancestor_of(&self, id: &WidgetId) -> bool
fn is_strict_ancestor_of(&self, id: &WidgetId) -> bool
id
is not self and is a descendant Read more