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,
   })
}

参考

https://github.com/emilk/egui/discussions/1574
https://github.com/rust-windowing/winit/blob/master/examples/window_icon.rs

くろぐろくろぐろ

TextEdit の背景色と枠を変更する

編集不可の TextEdit は背景色が透明かつ枠線なしとなっている. これが気に食わないので変更したい.
egui にはContext::set_styleウィジェットの外観を変更できる仕組みがあるが, 実装を見ると immutable な TextEdit の背景色は style によらず透明にされているため (383行), これでは変更できない. (そもそもこのやり方では TextEdit 以外も変更されてしまう.)

https://github.com/emilk/egui/blob/f94187ab718e8513084e591fcef73356a4971d6b/crates/egui/src/widgets/text_edit/builder.rs#L336-L392

よって, 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,
      }
   },
);