summaryrefslogtreecommitdiffstats
path: root/examples/text_input/src/main.rs
blob: 418593f4fc8dfb197552493bafaa51d15e154481 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
use crate::Message::{StartTimer, TextEditModeChange};
use iced::widget::{button, column, container, row, text, text_input};
use iced::{
    executor, window, Application, Command, Element, Length, Renderer,
    Settings, Theme,
};
use tokio::time::{sleep, Duration};

fn main() -> iced::Result {
    let settings = Settings {
        window: window::Settings {
            size: (700, 100),
            ..window::Settings::default()
        },
        ..Settings::default()
    };

    Example::run(settings)
}

#[derive(Default)]
struct Example {
    data: String,
    text_edit_enabled: bool,
}

#[derive(Debug, Clone)]
enum Message {
    StartTimer,
    TextEditModeChange,
    TextInputChanged(String),
}

impl Application for Example {
    type Executor = executor::Default;
    type Message = Message;
    type Theme = Theme;
    type Flags = ();

    fn new(_flags: Self::Flags) -> (Self, Command<Self::Message>) {
        (Self::default(), Command::none())
    }

    fn title(&self) -> String {
        "TextInput example".into()
    }

    fn update(&mut self, message: Self::Message) -> Command<Self::Message> {
        match message {
            Message::TextEditModeChange => {
                self.text_edit_enabled = !self.text_edit_enabled;
                Command::none()
            }
            Message::TextInputChanged(updated_text) => {
                self.data = updated_text;
                Command::none()
            }
            StartTimer => {
                let timer_f = async {
                    sleep(Duration::from_secs(3)).await;
                };
                Command::perform(timer_f, |_| TextEditModeChange)
            }
        }
    }

    fn view(&self) -> Element<'_, Self::Message, Renderer<Self::Theme>> {
        let placeholder = if self.text_edit_enabled {
            "Enabled TextEdit"
        } else {
            "Disabled TextEdit"
        };

        let mut txt_input = text_input(placeholder, &self.data);

        if self.text_edit_enabled {
            txt_input = txt_input.on_input(Message::TextInputChanged);
        }

        let btn = button("Enable/Disable").on_press(StartTimer);
        let label = text(
            "The mode will be changed after 3s when the button is pressed",
        );

        let content = row![txt_input, btn].spacing(10);
        let content = column![content, label].spacing(10);

        container(content)
            .width(Length::Shrink)
            .height(Length::Shrink)
            .padding(20)
            .into()
    }
}