[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 ํ•จ์ˆ˜๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ฐฝ์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฐ ๋А๋‚Œ์œผ๋กœ ์“ฐ๋Š” ๊ฒƒ์ด๋‹ค.



์ฐธ์กฐ
https://github.com/iced-rs/iced