ボタン処理の実装を行っていきます。
ライブラリはicedを使用しています。
use iced::{
button, executor, Align, Application, Button, Column, Command, Element, Font,
HorizontalAlignment, Length, Row, Settings, Subscription, Text,
};
const FONT: Font = Font::External {
name: "PixelMplus12-Regular",
bytes: include_bytes!("../rsc/PixelMplus12-Regular.ttf"),
};
#[derive(Debug, Clone)]
pub enum Message {
Start,
Stop,
Reset,
}
pub enum TickState {
Stopped,
Ticking,
}
struct GUI {
tick_state: TickState,
start_stop_button_state: button::State,
reset_button_state: button::State,
}
impl Application for GUI {
type Executor = executor::Null;
type Message = Message;
type Flags = ();
fn new(_flags: ()) -> (GUI, Command<Self::Message>) {
(
GUI {
tick_state: TickState::Stopped,
start_stop_button_state: button::State::new(),
reset_button_state: button::State::new(),
},
Command::none(),
)
}
fn title(&self) -> String {
String::from("DEMO")
}
fn update(&mut self, message: Self::Message) -> Command<Self::Message> {
match message {
Message::Start => {
self.tick_state = TickState::Ticking;
}
Message::Stop => {
self.tick_state = TickState::Stopped;
}
Message::Reset => {}
}
Command::none()
}
fn view(&mut self) -> Element<Self::Message> {
let duration_text = "00:00:00.00";
let start_stop_text = match self.tick_state {
TickState::Stopped => Text::new("Start")
.horizontal_alignment(HorizontalAlignment::Center)
.font(FONT),
TickState::Ticking => Text::new("Stop")
.horizontal_alignment(HorizontalAlignment::Center)
.font(FONT),
};
let start_stop_message = match self.tick_state {
TickState::Stopped => Message::Start,
TickState::Ticking => Message::Stop,
};
let tick_text = Text::new("00:00:00.00").font(FONT).size(60);
let start_stop_button = Button::new(&mut self.start_stop_button_state, start_stop_text)
.min_width(80)
.on_press(start_stop_message);
let reset_button = Button::new(
&mut self.reset_button_state,
Text::new("Reset")
.horizontal_alignment(HorizontalAlignment::Center)
.font(FONT),
)
.min_width(80)
.on_press(Message::Reset);
Column::new()
.push(tick_text)
.push(
Row::new()
.push(start_stop_button)
.push(reset_button)
.spacing(10),
)
.spacing(10)
.padding(10)
.width(Length::Fill)
.height(Length::Fill)
.align_items(Align::Center)
.into()
}
}
fn main() {
let mut settings = Settings::default();
settings.window.size = (400u32, 120u32);
GUI::run(settings);
}
Messageの定義とTickStateの定義を追加しています。
またアプリケーションの状態として、tick_stateを追加しています。
型はTickStateです。
viewの処理に追加し、tick_stateの状態でボタンに表示するテキストstart_stop_textを決めています。
また、ボタン処理に飛ばすメッセージstart_stop_messageの値も決めています。
そして、ボタン押下時にstart_stop_messageを飛ばし、
それをupdate()で受け取って、tick_stateの値を変えています。