mirror of
https://github.com/emilk/egui.git
synced 2026-06-27 07:03:14 -04:00
* Closes <https://github.com/emilk/egui/issues/4490> * [x] I have followed the instructions in the PR template --- Unfortunately, this PR contains a bunch of breaking changes because `Context` no longer has one style, but two. I could try to add some of the methods back if that's desired. The most subtle change is probably that `style_mut` mutates both the dark and the light style (which from the usage in egui itself felt like the right choice but might be surprising to users). I decided to deviate a bit from the data structure suggested in the linked issue. Instead of this: ```rust pub theme: Theme, // Dark or Light pub follow_system_theme: bool, // Change [`Self::theme`] based on `RawInput::system_theme`? ``` I decided to add a `ThemePreference` enum and track the current system theme separately. This has a couple of benefits: * The user's theme choice is not magically overwritten on the next frame. * A widget for changing the theme preference only needs to know the `ThemePreference` and not two values. * Persisting the `theme_preference` is fine (as opposed to persisting the `theme` field which may actually be the system theme). The `small_toggle_button` currently only toggles between dark and light (so you can never get back to following the system). I think it's easy to improve on this in a follow-up PR :) I made the function `pub(crate)` for now because it should eventually be a method on `ThemePreference`, not `Theme`. To showcase the new capabilities I added a new example that uses different "accent" colors in dark and light mode: <img src="https://github.com/user-attachments/assets/0bf728c6-2720-47b0-a908-18bd250d15a6" width="250" alt="A screenshot of egui's widget gallery demo in dark mode using a purple accent color instead of the default blue accent"> <img src="https://github.com/user-attachments/assets/e816b380-3e59-4f11-b841-8c20285988d6" width="250" alt="A screenshot of egui's widget gallery demo in light mode using a green accent color instead of the default blue accent"> --------- Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
74 lines
2.5 KiB
Rust
74 lines
2.5 KiB
Rust
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release
|
|
#![allow(rustdoc::missing_crate_level_docs)] // it's an example
|
|
|
|
use eframe::egui;
|
|
use egui::{FontFamily, FontId, RichText, TextStyle};
|
|
use std::collections::BTreeMap;
|
|
|
|
fn main() -> eframe::Result {
|
|
env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`).
|
|
let options = eframe::NativeOptions::default();
|
|
|
|
eframe::run_native(
|
|
"egui example: global font style",
|
|
options,
|
|
Box::new(|cc| Ok(Box::new(MyApp::new(cc)))),
|
|
)
|
|
}
|
|
|
|
#[inline]
|
|
fn heading2() -> TextStyle {
|
|
TextStyle::Name("Heading2".into())
|
|
}
|
|
|
|
#[inline]
|
|
fn heading3() -> TextStyle {
|
|
TextStyle::Name("ContextHeading".into())
|
|
}
|
|
|
|
fn configure_text_styles(ctx: &egui::Context) {
|
|
use FontFamily::{Monospace, Proportional};
|
|
|
|
let text_styles: BTreeMap<TextStyle, FontId> = [
|
|
(TextStyle::Heading, FontId::new(25.0, Proportional)),
|
|
(heading2(), FontId::new(22.0, Proportional)),
|
|
(heading3(), FontId::new(19.0, Proportional)),
|
|
(TextStyle::Body, FontId::new(16.0, Proportional)),
|
|
(TextStyle::Monospace, FontId::new(12.0, Monospace)),
|
|
(TextStyle::Button, FontId::new(12.0, Proportional)),
|
|
(TextStyle::Small, FontId::new(8.0, Proportional)),
|
|
]
|
|
.into();
|
|
ctx.all_styles_mut(move |style| style.text_styles = text_styles.clone());
|
|
}
|
|
|
|
fn content(ui: &mut egui::Ui) {
|
|
ui.heading("Top Heading");
|
|
ui.add_space(5.);
|
|
ui.label(LOREM_IPSUM);
|
|
ui.add_space(15.);
|
|
ui.label(RichText::new("Sub Heading").text_style(heading2()).strong());
|
|
ui.monospace(LOREM_IPSUM);
|
|
ui.add_space(15.);
|
|
ui.label(RichText::new("Context").text_style(heading3()).strong());
|
|
ui.add_space(5.);
|
|
ui.label(LOREM_IPSUM);
|
|
}
|
|
|
|
struct MyApp;
|
|
|
|
impl MyApp {
|
|
fn new(cc: &eframe::CreationContext<'_>) -> Self {
|
|
configure_text_styles(&cc.egui_ctx);
|
|
Self
|
|
}
|
|
}
|
|
|
|
impl eframe::App for MyApp {
|
|
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
|
|
egui::CentralPanel::default().show(ctx, content);
|
|
}
|
|
}
|
|
|
|
pub const LOREM_IPSUM: &str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
|