Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

eguiクレートをつかってRustでGUIをつくってみる その2:フォントを使って日本語を表示

実際のところ

フォントの追加

$ cd projecthome
$ mkdir assets
$ cd assets

で、ここに
Google Fonts
からNotoSansJpをいれます。
zip形式なので

$  unzip Noto_Sans_JP.zip 

toml

[package]
name = "guiproject"
version = "0.1.0"
edition = "2021"

[dependencies]
eframe = "0.24.0"

[build]
include = ["assets/*"]

スクリプト

use eframe::egui;

fn main() -> Result<(), eframe::Error> {
    let options = eframe::NativeOptions {
        viewport: egui::ViewportBuilder::default()
            .with_inner_size([200.0, 200.0]),
        ..Default::default()
    };

    eframe::run_native(
        "ひらがなカウンター",
        options,
        Box::new(|cc| {
            let mut fonts = egui::FontDefinitions::default();
            
            fonts.font_data.insert(
                "notosans".to_owned(),
                egui::FontData::from_static(include_bytes!("../assets/static/NotoSansJP-Regular.ttf")),
            );
            
            fonts.families
                .get_mut(&egui::FontFamily::Proportional)
                .unwrap()
                .insert(0, "notosans".to_owned());
            
            cc.egui_ctx.set_fonts(fonts);
            Box::new(CharCounterApp::default())
        }),
    )
}

struct CharCounterApp {
    current_char_index: usize,
    chars: Vec<char>,
}

impl Default for CharCounterApp {
    fn default() -> Self {
        Self {
            current_char_index: 0,
            chars: vec![
                'あ', 'い', 'う', 'え', 'お',
                'か', 'き', 'く', 'け', 'こ',
                'さ', 'し', 'す', 'せ', 'そ',
                'た', 'ち', 'つ', 'て', 'と',
                'な', 'に', 'ぬ', 'ね', 'の',
                'は', 'ひ', 'ふ', 'へ', 'ほ',
                'ま', 'み', 'む', 'め', 'も',
                'や', 'ゆ', 'よ',
                'ら', 'り', 'る', 'れ', 'ろ',
                'わ', 'を', 'ん'
            ],
        }
    }
}

impl eframe::App for CharCounterApp {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        egui::CentralPanel::default().show(ctx, |ui| {
            ui.vertical_centered(|ui| {
                ui.add_space(50.0);
                
                // 現在の文字を大きく表示
                ui.heading(self.chars[self.current_char_index].to_string());
                
                // 何文字目かを表示
                ui.label(format!("{} / {}", self.current_char_index + 1, self.chars.len()));
                
                ui.add_space(20.0);
                
                if ui.button("次へ").clicked() {
                    // 最後の文字を超えたら最初に戻る
                    self.current_char_index = 
                        if self.current_char_index >= self.chars.len() - 1 {
                            0
                        } else {
                            self.current_char_index + 1
                        };
                }
            });
        });
    }
}

実行結果


参考もと

egui - Rust