82 lines
2.1 KiB
Rust
82 lines
2.1 KiB
Rust
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<String>,
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub enum RandomizerMessage {
|
|
Back,
|
|
Start,
|
|
Edit(text_editor::Action),
|
|
}
|
|
|
|
impl NavigatedPage<RandomizerMessage> for RandomizerState {
|
|
fn navigate(&mut self, message: &RandomizerMessage) -> Option<Page> {
|
|
if let Back = message {
|
|
return Some(Page::PreviousPage);
|
|
}
|
|
None
|
|
}
|
|
|
|
fn navigated(&mut self) {}
|
|
fn update(&mut self, message: RandomizerMessage) -> Task<RootMessage> {
|
|
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![],
|
|
}
|
|
}
|
|
}
|