如何为我的 egui 应用程序设置新的 FontFamily?

问题描述 投票:0回答:1

所以我尝试了 egui 文档中的示例并且它有效。然而 egui 文档中的示例似乎侧重于覆盖现有的 FontFamily(比例、等宽字体):

let mut fonts = FontDefinitions::default();

// Install my own font (maybe supporting non-latin characters):
fonts.font_data.insert("my_font".to_owned(),
   FontData::from_static(include_bytes!("../../fonts/Ubuntu-Light.ttf"))); // .ttf and .otf supported

// Put my font first (highest priority):
fonts.families.get_mut(&FontFamily::Proportional).unwrap()
    .insert(0, "my_font".to_owned());

// Put my font as last fallback for monospace:
fonts.families.get_mut(&FontFamily::Monospace).unwrap()
    .push("my_font".to_owned());

egui_ctx.set_fonts(fonts);

但是如何在枚举中声明或定义一个全新的家族?

pub enum FontFamily {
    Proportional,
    Monospace,
    Name(Arc<str>),
}

pub enum FontFamily {
    Proportional,
    Monospace,
    my_font, <-- How i put the font here as a new FamilyMember? 
    Name(Arc<str>),
}

我想仅将我自己的

my_font
用于特定标签或字段,如本例所示:

   ui.add(
            egui::TextEdit::singleline(&mut ss)
            .text_color(egui::Color32::LIGHT_RED)
            .font(egui::FontSelection::FontId(FontId::new(
            20.,
            egui::FontFamily::my_font, <--
            ))),
rust egui eframe
1个回答
0
投票

首先下载您需要的TTF或OTF字体。

https://fonts.google.com
是一个很好的来源。

将字体放入

assets/fonts/
(例如font_name.ttf或font_name.otf)

要将字体加载到egui中,可以使用以下代码。 (请注意,include_bytes! 宏将字体数据嵌入到最终编译的二进制文件中。)对于我自己,我创建了一个文件

src/fonts.rs
并使用以下 Rust 代码填充它。您将需要根据您的特定需求更改字体详细信息。请注意,我使用 egui 的 eframe GUI 来显示字体。

use eframe::egui;
use eframe::egui::{FontData, FontDefinitions, FontFamily};
use std::collections::BTreeMap;

pub fn setup_custom_fonts(ctx: &egui::Context) {
    let mut fonts = FontDefinitions::default();

    //
    // Load font =====================================
    //
    fonts.font_data.insert(
        "jost".to_owned(),
        FontData::from_static(include_bytes!("../assets/fonts/Jost-Regular.ttf")),
    );

    let mut newfam = BTreeMap::new();
    newfam.insert(FontFamily::Name("jost".into()), vec!["jost".to_owned()]);
    fonts.families.append(&mut newfam);

    //
    // Load font =====================================
    //
    fonts.font_data.insert(
        "poppins".to_owned(),
        FontData::from_static(include_bytes!("../assets/fonts/Poppins-Regular.ttf")),
    );

    let mut newfam = BTreeMap::new();
    newfam.insert(
        FontFamily::Name("poppins".into()),
        vec!["poppins".to_owned()],
    );
    fonts.families.append(&mut newfam);

    //
    // Load font =====================================
    //
    fonts.font_data.insert(
        "audiowide".to_owned(),
        FontData::from_static(include_bytes!("../assets/fonts/Audiowide-Regular.ttf")),
    );

    let mut newfam = BTreeMap::new();
    newfam.insert(
        FontFamily::Name("audiowide".into()),
        vec!["audiowide".to_owned()],
    );
    fonts.families.append(&mut newfam);

    //
    // Set fonts =====================================
    //
    ctx.set_fonts(fonts);
}

要使您的 Rust 代码能够访问使用

fonts.rs
加载的字体,您需要将
mod fonts;
添加到您的
lib.rs

要使用字体,请将

use egui::{FontFamily, FontId};
添加到
app.rs
(或需要使用字体的其他 Rust 文件)的顶部。然后您可以使用以下命令显示字体。请注意,此代码将字体放置在浅红色按钮内。加载的字体使用
RichText::new
显示,如下所示。

ui.vertical_centered(|ui| {
    if ui
        .add(
            egui::Button::new(
                RichText::new("text")
                    .font(FontId {
                        size: 20.0,
                        family: FontFamily::Name("audiowide".into()),
                    })
                    .strong()
                    .size(20.)
                    .color(Color32::BLACK),
            )
            .rounding(5.)
            .min_size(Vec2 { x: 100., y: 50. })
            .fill(Color32::LIGHT_RED),
        )
        .clicked()
    {
        self.data.button10.set_text("I changed");
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.