[Rust] GUI: iced
iced๋ Rust ํ๊ฒฝ์ Desktop GUI ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋๋ค. ํน๋ณํ ์๋๊ฐ๋ค๊ณ ํ๊ธฐ๋ ์ด๋ ต๊ณ , ๊ทธ๋ฅ ๊ทธ ์ค ํ๋๋ค.
ํฌ๋ก์คํ๋ซํผ์ด๋ค.
ํ์ฌ๋ ๋ง๋ผ์ฃฝ์ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ์ธ Elm์ ๋ฒ ๋ ๊ตฌ์กฐ๊ฐ ๊ฐ์ฅ ํฐ ํน์ง์ด๋ค.
๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ฆฌ๋ฉด ์ด๋ ๋ค๊ณ ํ๋ค.
๊ทผ๋ฐ ์ด๊ฑฐ๊น์ง ๋ค ์ ํ์๋ ์๋ ๊ฒ ๊ฐ๋ค.
๊ธฐ๋ณธ ํ๋ก๊ทธ๋จ ์์ฑ
๋๋ ๋ญ ํ๋ ์ผ๋จ ๋์๊ฐ๋ ๊ฒ๋ถํฐ ๋ณด๋๊ฒ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ค.
๋จผ์ ๋ํ๋์๋ฅผ ์ถ๊ฐํ๊ณ

๋ค์ ์ฝ๋๋ฅผ ๋ฃ์ด์ ์คํํ๋ค.
use iced::widget::{button, column, text};
use iced::{Alignment, Element, Sandbox, Settings};
pub fn main() -> iced::Result {
Counter::run(Settings::default())
}
struct Counter {
value: i32,
}
#[derive(Debug, Clone, Copy)]
enum Message {
IncrementPressed,
DecrementPressed,
}
impl Sandbox for Counter {
type Message = Message;
fn new() -> Self {
Self { value: 0 }
}
fn title(&self) -> String {
String::from("Counter - Iced")
}
fn update(&mut self, message: Message) {
match message {
Message::IncrementPressed => {
self.value += 1;
}
Message::DecrementPressed => {
self.value -= 1;
}
}
}
fn view(&self) -> Element<Message> {
column![
button("Increment").on_press(Message::IncrementPressed),
text(self.value).size(50),
button("Decrement").on_press(Message::DecrementPressed)
]
.padding(20)
.align_items(Alignment::Center)
.into()
}
}

๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ด ๊ทธ๋ด๋ฏํ ํ๋ฉด์ ๋ฝ์์ค๋ค.

ํด๋ฆญํ ๋๋ง๋ค ๋์ด๋๊ฑฐ๋ ์ค์ด๋ ๋ค.
์ฝ๋ ๋ถ์ํด๋ณด๊ธฐ
ํ๋์ฉ ๋ฏ์ด๋ณด์.
Counter ๊ตฌ์กฐ์ฒด๋ ์ ์ฑ ์์ฒด์ ์ํ๋ฅผ ๋ณด๊ดํ๋ ์ํ ์ ์ฅ ๊ตฌ์กฐ์ฒด๋ค.
์ฌ๊ธฐ์๋ ์ค์ง์ ์ผ๋ก ์ ์ฐฝ ์ ์ฒด๋ฅผ ์๋ฏธํ๊ธฐ๋ ํ๋ค.
๊ทธ ๋ค์์ ๋ฉ์ธ์ง๋ค. Elm์ ๋ชจ๋ ๋์์ "์ด๋ฒคํธ"๋ฅผ ํตํด์ ์ฐ๊ฒฐํ๊ณ ์ํธ์์ฉํ๋๋ก ํ๋๋ฐ, Elm์ ๋ฒ ๋ iced๋ ๊ทธ๋ฐ ๋ฐฉ๋ฒ์ ์ทจํ๋ค.
๋ณด์ผ๋ฌํ๋ ์ดํธ๊ฐ ๋์ด๋์ ์ฝ๋๋ผ์ธ์ด ๊ธธ์ด์ง๊ธฐ๋ ํ์ง๋ง, ์คํ๋ ค ์ฝ๋๊ฐ ์ ๋๋๊ณ ๊น๋ํด์ง๋ ๋ถ๋ถ๋ ์๋ค.
์, ๊ทธ๋ผ ์ด์ ๋ถํฐ ๋ณธ๊ฒฉ์ ์ธ ๊ธฐ๋ฅ ๊ตฌํ์ด๋ค. ์๋๋ฐ์ค๋ ์ต์์ "์ฐฝ" ์์ฒด์ ๋์์ ์ ์ํ๋ ํธ๋ ์์ด๋ค.
์ด๊ฑธ ๊ตฌํํด์ผ ์ฐฝ์ ๋์ธ ์ ์๋ค.
๋จผ์ ๊ธฐ๋ณธ์ ์ธ ์์ฑ ํจ์๋ถํฐ ๋ง๋ค์ด์ค๋ค. ์ด๊ฑด ํน๋ณํ ๊ฒ ์๋ค.
์ด๊ฑด ์ฐฝ ์ ๋ชฉ์ด๋ค.
์ด๊ฑด ์ด๋ฒคํธ๊ฐ ๋ ๋ผ์์๋ ์ด๋ป๊ฒ ๋์ํ ์ง๋ฅผ ์ ์ํ๋ค.
"Increment" ์ด๋ฒคํธ๊ฐ ๋ ๋ผ์ค๋ฉด ์นด์ดํฐ ๊ฐ์ ๋๋ฆฌ๊ณ , "Decrement" ์ด๋ฒคํธ๊ฐ ๋ ๋ผ์ค๋ฉด ์ค์ธ๋ค.
๊ทธ๋ผ ์ด๊ฑด ์ด๋ป๊ฒ ํธ์ถ๋๋๋?
view์์ UI๋ฅผ ์ ์ํจ๊ณผ ๋์์ ์ก์
๋ํ ์ ์๋๋ค.
๋ฒํผ์ 2๊ฐ ์์ฑํ๊ณ ๊ฐ ๋ฒํผ์ด ๋๋ฆด๋๋ง๋ค ์ด๋ฒคํธ๊ฐ ์ ์ก๋๋๋ก ํ๋ค. ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด update ํจ์๊ฐ ๊ทธ๊ฑธ ๋ฐ์์ ์ฒ๋ฆฌํ๊ณ , ๋ค์ ๋ ๋๋ง์ ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๊ทธ ์ธ์๋ ๋ ์ด์์ ์์ค ์ ์ด๋ค. ํจ๋ฉ ์ฃผ๊ณ , ์ ๋ ฌํ๊ณ ...
๋ค๋ฅธ ํ๋ ์์ํฌ๋ค๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ Counter ๊ตฌ์กฐ์ฒด๋ Sandbox๋ฅผ ๊ตฌํํจ์ผ๋ก ์ฐฝ์ผ๋ก ๋์ธ ์๊ฒฉ์ ์ป๊ฒ ๋์๋ค.
run ํจ์๋ก ์คํํ๋ฉด ์ฐฝ์ด ์คํ๋๋ ๊ฒ์ด๋ค.
์ด๋ฐ ๋๋์ผ๋ก ์ฐ๋ ๊ฒ์ด๋ค.