use crate::RootMessage; use crate::navigation::{NavigatedPage, Page}; use crate::randomizer::RandomizerMessage::{Back, Edit, Start}; use crate::styling::{HALF_SPACING, back_overlay, jl_button}; use iced::Task; use iced::widget::{button, text_editor}; use rand::prelude::SliceRandom; #[derive(Clone, Debug)] pub struct RandomizerState { text: text_editor::Content, list: Vec, } #[derive(Debug, Clone)] pub enum RandomizerMessage { Back, Start, Edit(text_editor::Action), } impl NavigatedPage for RandomizerState { fn navigate(&self, message: &RandomizerMessage) -> Option { if let Back = message { return Some(Page::PreviousPage); } None } fn navigated(&mut self) {} fn update(&mut self, message: RandomizerMessage) -> Task { match message { Edit(action) => { self.text.perform(action); self.list = self .text .text() .split("\n") .map(|s| s.to_string()) .collect(); } Start => { self.list.shuffle(&mut rand::rng()); self.text = text_editor::Content::with_text(self.list.join("\n").as_str()); } _ => {} } Task::none() } fn view(&self) -> iced::Element<'_, RandomizerMessage> { back_overlay( iced::widget::column![ text_editor(&self.text) .on_action(Edit) .width(400) .height(400) .placeholder("Каждый элемент с новой строки"), button("Перемешать").style(jl_button).on_press(Start), ] .spacing(HALF_SPACING) .into(), Back, ) } } impl Default for RandomizerState { fn default() -> Self { Self::new() } } impl RandomizerState { pub fn new() -> RandomizerState { RandomizerState { text: Default::default(), list: vec![], } } }