[Rust] fltk GUI

fltk๋Š” ๊ฒฝ๋Ÿ‰ํ˜•์˜ ํฌ๋กœ์Šคํ”Œ๋žซํผ GUI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.
์›๋ž˜๋Š” C++ ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ๋ฐ, Rust์—๋„ ๋ฐ”์ธ๋”ฉ์ด ์ž˜ ์ œ๊ณต๋˜๋Š” ํŽธ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฌด์—‡๋ณด๋‹ค ๋ฌธ์„œํ™”๋‚˜ ์‚ฌ์šฉ๋ฒ•์ด ๊ฐ„ํŽธํ•ด์„œ ํ•œ๋ฒˆ ์‚ฌ์šฉํ•ด๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด๊ฒƒ์ €๊ฒƒ ๋ญ ๊น”๊ณ  dll ์šฐ๋ฅด๋ฅด ๋ฐ›์„ ํ•„์š” ์—†์ด ๊ทธ๋ƒฅ ๋””ํŽœ๋˜์‹œ ํ•˜๋‚˜๋ฉด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
toml์— ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

fltk = { version = "^1.3", features = ["fltk-bundled"] }

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ์‹์œผ๋กœ ์งœ๋ฉด ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘์€ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
๊ฐ„๋‹จํ•œ ์ฐฝ ํ•˜๋‚˜๋งŒ ๋„์šฐ๋Š” ์ฝ”๋“œ๋‹ค.

use fltk::{app, prelude::*, window::Window};

#[tokio::main]
async fn main() {
    let app = app::App::default();
    let mut wind = Window::new(100, 100, 400, 300, "Hello from rust");
    wind.end();
    wind.show();
    app.run().unwrap();
}

์ž˜ ๋œ๋‹ค.




๋ฒ„ํŠผ ์ถ”๊ฐ€ํ•ด๋ณด๊ธฐ

์ด๋ฒˆ์—๋Š” ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•ด์„œ ๋ญ”๊ฐ€ ๋™์ž‘์€ ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ณด์ž.

๊ธฐ์กด ์œˆ๋„์šฐ์— ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฒ•์€ ๊ฝค๋‚˜ ๊ฐ„๋‹จํ•˜๋‹ค.
end ๋ฉ”์„œ๋“œ๋ฅผ ์ฐ๊ธฐ ์ „์— ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ๋งŒ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉ์ด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฒ„ํŠผ์— ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ๋งŒ ์ฐ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

use fltk::{app, button::Button, prelude::*, window::Window};

fn main() {
    let app = app::App::default();
    let mut wind = Window::new(100, 100, 400, 300, "Hello from rust");
    let mut but = Button::new(160, 210, 80, 40, "Click me!");
    wind.end();
    wind.show();

    but.set_callback(move |_| println!("๋ˆŒ๋ฆผ!")); // the closure capture is mutable borrow to our button
    app.run().unwrap();
}

๋ˆ„๋ฅผ๋•Œ๋งˆ๋‹ค ์ฝ˜์†”๋กœ๊ทธ๊ฐ€ ์ž˜ ์ฐํž ๊ฒƒ์ด๋‹ค.

์ด๋ฒˆ์—๋Š” ์ฝ˜์†”๋งŒ ์ฐ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ๋–„ ๋ญ”๊ฐ€ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋„๋ก ํ•ด๋ณด๊ฒ ๋‹ค.
ํ”„๋ ˆ์ž„์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜๋‚˜ ๊น”๊ณ , ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ๋งŒ ํ…์ŠคํŠธ๊ฐ€ ๋ณด์ด๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.

use fltk::{app, button::Button, frame::Frame, prelude::*, window::Window};

fn main() {
    let app = app::App::default();
    let mut wind = Window::new(100, 100, 400, 300, "Hello from rust");
    let mut frame = Frame::new(0, 0, 400, 200, "");
    let mut but = Button::new(160, 210, 80, 40, "Click me!");
    wind.end();
    wind.show();
    but.set_callback(move |_| frame.set_label("Hello World!")); // the closure capture is mutable borrow to our button
    app.run().unwrap();
}

๊ทธ๋Ÿผ ์ฒ˜์Œ์—๋Š” ๋น„์–ด์žˆ๊ฒ ์ง€๋งŒ

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ ˆ์ด๋ธ”์ด ๊น”๋ฆฌ๋ฉด์„œ ํ…์ŠคํŠธ๊ฐ€ ๋…ธ์ถœ๋œ๋‹ค.

๊ตฌ์กฐ๋Š” ๊ทธ๋Ÿญ์ €๋Ÿญ ๋‚˜์˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™๋‹ค.



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