[Rust] GUI: egui
egui๋ Rust์ ์ฃผ์ GUI ํ๊ฒฝ ์ค ํ๋๋ค.
๊ฐ๋จํ๊ณ ๊ฐ๋ฒผ์ด ํํ๋ฅผ ์งํฅํ๋ฉฐ, ์ฑUI์ ์นUI๋ฅผ ๋์์ ์ ๊ณตํ๋ค.
์ด ํฌ์คํธ์์๋ ์ฑ๋ง ๋ค๋ฃฌ๋ค.
์ด ๋ ์์ ๋ฑํ ๋น ๋ฅด๊ฑฐ๋ ๊ฐ๋ ฅํ ๊ตฌ์กฐ๋ฅผ ์งํฅํ๊ณ ๋ง๋ค์ด์ง์ง๋ ์์๋ค. ๋ ๋๋ง์ ๋ํด์๋ ๋ณ๋ค๋ฅธ ์ต์ ํ๋ฅผ ํ์ง๋ ์๊ณ ๋ง๋ ๊ฒ ๊ฐ๋๋ผ. ๋ญ๊ฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์ํธ์์ฉ์ด ๋ฐ์ํ๋ฉด ํญ์ ์ ์ฒด ๋ ์ด์์์ ๋ ๋๋งํ๋ค.
์ค์น
์ฃผ์ ์ข ์์ฑ์ eframe์ด๋ผ๋ ๋ ์์ด๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ข ์์ฑ์ ์ถ๊ฐํด์ค๋ค.
[dependencies]
eframe = { version = "0.26.2", features = [
"default",
"__screenshot", # __screenshot is so we can dump a screenshot using EFRAME_SCREENSHOT_TO
] }
env_logger = { version = "0.10", default-features = false, features = [
"auto-color",
"humantime",
] }Hello World ์์
์๋๋ ์ ์ฒด ์ฝ๋๋ค.
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release
use eframe::egui;
fn main() -> Result<(), eframe::Error> {
env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`).
let options = eframe::NativeOptions {
viewport: egui::ViewportBuilder::default().with_inner_size([320.0, 240.0]),
..Default::default()
};
// Our application state:
let mut name = "Arthur".to_owned();
let mut age = 42;
eframe::run_simple_native("My egui App", options, move |ctx, _frame| {
egui::CentralPanel::default().show(ctx, |ui| {
ui.heading("My egui Application");
ui.horizontal(|ui| {
let name_label = ui.label("Your name: ");
ui.text_edit_singleline(&mut name)
.labelled_by(name_label.id);
});
ui.add(egui::Slider::new(&mut age, 0..=120).text("age"));
if ui.button("Increment").clicked() {
age += 1;
}
ui.label(format!("Hello '{name}', age {age}"));
});
})
}
๋ถ์ฌ๋ฃ์ด์ ์ฐ์ ์คํํด๋ณด์.
๊ทธ๋ผ ์ด๋ ๊ฒ ์ฑ์ด ๋ฐ ๊ฒ์ด๋ค.
๊ตฌ์กฐ ๋ถ์
๋ง ๊ทธ๋ ๊ฒ ๊ตฌ์กฐ๊ฐ ๋ณต์กํ์ง ์๋ค.
์ฐ์ ๊ธฐ๋ณธ ์ฐฝ ํฌ๊ธฐ๋ถํฐ ์ ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ run_simple_native๋ฅผ ํธ์ถํด์ ์ฑ์ ๋์ด๋ค. ์ฌ๊ธฐ์์๋ ์๊น ์ ์ํ ์ต์
๊ณผ Panel ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ ์ฐฝ ์ ๋ณด๋ฅผ ์ ์ํ๋ค.
egui๋ ๋ ๋๋ง ์ต์ ํ๊ฐ ์กฐ๊ธ ๋ชจ์๋ผ๋ค๊ณ ํ์๋ค.
์ด ์ฝ๋๋ฅผ ์ ๋๋ฉ์ด์
์ด๋ User ์ํธ์์ฉ์ด ์์๋๋ง๋ค ํญ์ ๊ทธ๋ฆฐ๋ค.
๊ทธ๋์ ๊ทธ๊ฑธ ์ผ๋์ ๋๊ณ ์ ์ง์ค์ผ ํ๋ค. ์ฌ๊ธฐ์ ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๋ฉด ์๋๋ค.
์๋ฌดํผ ์ ๊ธฐ์ ๋ ์ด์์ ์์๋ค์ ํ๋ํ๋ ์์์ฌ๋ฆฌ๋ ํํ๋ค. ์ ์ํ ์์๋๋ก ์-์๋๋ก ๋ฐฐ์น๋๋ค.
- heading์ผ๋ก ํค๋ ์์ญ์ ๋๊ณ ,
- horizonatal๋ก ๊ฐ๋ก ์์ญ์ ๋๊ณ ๋ผ๋ฒจ๊ณผ ํ ์คํธ ์ ๋ ฅ์ฐฝ์ ๋ง๋ค์๋ค.
- ์์ผ๋ก ์์ง์ฌ์ ๊ฐ์ ์กฐ์ ํ๋ ์ฌ๋ผ์ด๋๋ฅผ ๋ง๋ค์๋ค. ์ด๋ฅผ ํตํด age ๋ณ์๊ฐ์ด ์์ ๋๊ฒ ํ๋ค.
- button์ ์ถ๊ฐํ๊ณ , ๊ทธ๊ฒ ๋๋ ธ์๋๋ง๋ค age ๊ฐ์ 1 ๋๋ฆฌ๊ฒ ํ๋ค.
- ํ ์คํธ label์ ํ๋ ์ถ๊ฐํ๋ค.
๋ค๋ฅธ gui ํ๋ ์์ํฌ๋ค์ ๋นํ๋ฉด ๊ตฌ์กฐ๊ฐ ๊ฝค ์ด์ง์ ์ธ ๋ฉด๋ ์๋ค. ํนํ ์ด๋ฒคํธ ํธ๋ค๋ง์ด ์ฝ๋ฐฑ์ ํตํด ๊ตฌ์ฑ๋์ง ์๋๋ค๋ ์ ์ด ํน์ดํ๋ค. ์ฝ๋์ ๋ณต์ก์ฑ์ ์ค์ด๊ธฐ ์ํจ์ด๋ผ๋.
์๋ฌดํผ ์ด๋ฒคํธ ํธ๋ค๋ง๋ ํ๋ ์ ํ๋ฒ ๋๋๋ง๋ค ์กฐ๊ฑด๋ฌธ์ ๋ค๋ ์์ผ๋ก ๊ตฌ์ฑ์ด ๋๋ค. ์ ๊ธฐ ๋ฒํผ ํธ๋ค๋ง ์ฒ๋ผ ๋ง์ด๋ค.
๋ผ์ดํํ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ผ์ด ์ ์ผ๋ ์ฐ๊ธฐ ์ฌ์ด ๋ถ๋ถ์ ํ์คํ ์๋ ๊ฒ ๊ฐ๋ค.