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()
}
}
|