53 lines
2.2 KiB
Rust
53 lines
2.2 KiB
Rust
//! Use widgets that can provide hints to ensure continuity.
|
|
//!
|
|
//! # What is continuity?
|
|
//! Continuity is the feeling of persistence of state.
|
|
//!
|
|
//! In a graphical user interface, users expect widgets to have a
|
|
//! certain degree of continuous state. For instance, a text input
|
|
//! that is focused should stay focused even if the widget tree
|
|
//! changes slightly.
|
|
//!
|
|
//! Continuity is tricky in `iced` and the Elm Architecture because
|
|
//! the whole widget tree is rebuilt during every `view` call. This is
|
|
//! very convenient from a developer perspective because you can build
|
|
//! extremely dynamic interfaces without worrying about changing state.
|
|
//!
|
|
//! However, the tradeoff is that determining what changed becomes hard
|
|
//! for `iced`. If you have a list of things, adding an element at the
|
|
//! top may cause a loss of continuity on every element on the list!
|
|
//!
|
|
//! # How can we keep continuity?
|
|
//! The good news is that user interfaces generally have a static widget
|
|
//! structure. This structure can be relied on to ensure some degree of
|
|
//! continuity. `iced` already does this.
|
|
//!
|
|
//! However, sometimes you have a certain part of your interface that is
|
|
//! quite dynamic. For instance, a list of things where items may be added
|
|
//! or removed at any place.
|
|
//!
|
|
//! There are different ways to mitigate this during the reconciliation
|
|
//! stage, but they involve comparing trees at certain depths and
|
|
//! backtracking... Quite computationally expensive.
|
|
//!
|
|
//! One approach that is cheaper consists in letting the user provide some hints
|
|
//! about the identities of the different widgets so that they can be compared
|
|
//! directly without going deeper.
|
|
//!
|
|
//! The widgets in this module will all ask for a "hint" of some sort. In order
|
|
//! to help them keep continuity, you need to make sure the hint stays the same
|
|
//! for the same items in your user interface between `view` calls.
|
|
pub mod column;
|
|
|
|
pub use column::Column;
|
|
|
|
/// Creates a [`Column`] with the given children.
|
|
#[macro_export]
|
|
macro_rules! keyed_column {
|
|
() => (
|
|
$crate::Column::new()
|
|
);
|
|
($($x:expr),+ $(,)?) => (
|
|
$crate::keyed::Column::with_children(vec![$($crate::core::Element::from($x)),+])
|
|
);
|
|
}
|