Open3
Rust の GUI ライブラリ egui 覚書
ピン留めされたアイテム
環境
- rustc 1.67.1
- egui 0.21.0
- eframe 0.21.0
基本的に Windows 10 のネイティブアプリのみで動作確認している.
アイコンを設定する
image クレートを使う.
main.rs
mod app;
use eframe::{IconData, NativeOptions};
fn main() -> eframe::Result<()> {
let native_options = NativeOptions {
icon_data: load_icon(include_bytes!("../icon.png")),
..eframe::NativeOptions::default()
};
eframe::run_native(
"App",
native_options,
Box::new(|cc| Box::new(app::App::new(cc))),
)
}
fn load_icon(bytes: &[u8]) -> Option<IconData> {
let image = match image::load_from_memory(bytes) {
Ok(x) => x.into_rgba8(),
Err(_) => return None,
};
let (width, height) = image.dimensions();
let rgba = image.into_raw();
Some(IconData {
rgba,
width,
height,
})
}
参考
TextEdit の背景色と枠を変更する
編集不可の TextEdit は背景色が透明かつ枠線なしとなっている. これが気に食わないので変更したい.
egui にはContext::set_style
でウィジェットの外観を変更できる仕組みがあるが, 実装を見ると immutable な TextEdit の背景色は style によらず透明にされているため (383行), これでは変更できない. (そもそもこのやり方では TextEdit 以外も変更されてしまう.)
よって, painter で上から図形を貼る方法をとる. TextEdit の実装からそのまま持ってきて少し手を加えるだけで良い筈.
let background_idx = ui.painter().add(Shape::Noop); // TextEdit を表示する前にプレースホルダを追加しないと図形で文字が隠れる.
let TextEditOutput { response, .. } = TextEdit::singleline(&mut str).show(ui);
let visuals = ui.style().interact(&response);
ui.painter().set(
background_idx,
if response.has_focus() {
RectShape {
rect: response.rect,
rounding: visuals.rounding,
fill: ui.visuals().extreme_bg_color,
stroke: ui.visuals().selection.stroke,
}
} else {
RectShape {
rect: response.srect,
rounding: visuals.rounding,
fill: ui.visuals().extreme_bg_color,
stroke: visuals.bg_stroke,
}
},
);
-
ui.style().interact(&response)
はインタラクション(activeやhover)に応じたスタイルを返す. (https://docs.rs/egui/latest/egui/style/struct.Widgets.html)