Infinite List widget from upstream feature/list-widget-reloaded branch
This commit is contained in:
parent
6829724ac0
commit
0b068e486e
6 changed files with 932 additions and 0 deletions
107
examples/list/src/main.rs
Normal file
107
examples/list/src/main.rs
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
use iced::widget::{
|
||||
button, center, column, container, list, row, scrollable,
|
||||
space::horizontal, text,
|
||||
};
|
||||
use iced::{Alignment, Element, Length, Task, Theme};
|
||||
|
||||
pub fn main() -> iced::Result {
|
||||
iced::application(List::new, List::update, List::view)
|
||||
.title(List::title)
|
||||
.window_size((500.0, 800.0))
|
||||
.theme(List::theme)
|
||||
.run()
|
||||
}
|
||||
|
||||
struct List {
|
||||
content: list::Content<(usize, State)>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
enum Message {
|
||||
Update(usize),
|
||||
Remove(usize),
|
||||
}
|
||||
|
||||
impl List {
|
||||
fn new() -> (Self, Task<Message>) {
|
||||
(Self::default(), Task::none())
|
||||
}
|
||||
|
||||
fn title(&self) -> String {
|
||||
"List - Iced".to_string()
|
||||
}
|
||||
|
||||
fn theme(&self) -> Theme {
|
||||
Theme::TokyoNight
|
||||
}
|
||||
|
||||
fn update(&mut self, message: Message) -> Task<Message> {
|
||||
match message {
|
||||
Message::Update(index) => {
|
||||
if let Some((_id, state)) = self.content.get_mut(index) {
|
||||
*state = State::Updated;
|
||||
}
|
||||
}
|
||||
Message::Remove(index) => {
|
||||
let _ = self.content.remove(index);
|
||||
}
|
||||
}
|
||||
Task::none()
|
||||
}
|
||||
|
||||
fn view(&self) -> Element<'_, Message> {
|
||||
center(
|
||||
scrollable(
|
||||
container(list(&self.content, |index, (id, state)| {
|
||||
row![
|
||||
match state {
|
||||
State::Idle =>
|
||||
Element::from(text(format!("I am item {id}!"))),
|
||||
State::Updated => center(
|
||||
column![
|
||||
text(format!("I am item {id}!")),
|
||||
text("... but different!")
|
||||
]
|
||||
.spacing(20)
|
||||
)
|
||||
.height(300)
|
||||
.into(),
|
||||
},
|
||||
horizontal(),
|
||||
button("Update").on_press_maybe(
|
||||
matches!(state, State::Idle)
|
||||
.then_some(Message::Update(index))
|
||||
),
|
||||
button("Remove")
|
||||
.on_press(Message::Remove(index))
|
||||
.style(button::danger)
|
||||
]
|
||||
.spacing(10)
|
||||
.padding(5)
|
||||
.align_y(Alignment::Center)
|
||||
.into()
|
||||
}))
|
||||
.padding(10),
|
||||
)
|
||||
.width(Length::Fill),
|
||||
)
|
||||
.padding(10)
|
||||
.into()
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for List {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
content: list::Content::from_iter(
|
||||
(0..1_000).map(|id| (id, State::Idle)),
|
||||
),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
enum State {
|
||||
Idle,
|
||||
Updated,
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue