diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index 4ec5e140..751604d4 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -21,8 +21,7 @@ use crate::{ input_state::{InputState, MultiTouchInfo, PointerEvent}, interaction, layers::GraphicLayers, - load, - load::{Bytes, Loaders, SizedTexture}, + load::{self, Bytes, Loaders, SizedTexture}, memory::{Options, Theme}, os::OperatingSystem, output::FullOutput, @@ -32,10 +31,10 @@ use crate::{ viewport::ViewportClass, Align2, CursorIcon, DeferredViewportUiCallback, FontDefinitions, Grid, Id, ImmediateViewport, ImmediateViewportRendererCallback, Key, KeyboardShortcut, Label, LayerId, Memory, - ModifierNames, NumExt as _, Order, Painter, RawInput, Response, RichText, ScrollArea, Sense, - Style, TextStyle, TextureHandle, TextureOptions, Ui, ViewportBuilder, ViewportCommand, - ViewportId, ViewportIdMap, ViewportIdPair, ViewportIdSet, ViewportOutput, Widget as _, - WidgetRect, WidgetText, + ModifierNames, Modifiers, NumExt as _, Order, Painter, RawInput, Response, RichText, + ScrollArea, Sense, Style, TextStyle, TextureHandle, TextureOptions, Ui, ViewportBuilder, + ViewportCommand, ViewportId, ViewportIdMap, ViewportIdPair, ViewportIdSet, ViewportOutput, + Widget as _, WidgetRect, WidgetText, }; #[cfg(feature = "accesskit")] @@ -1484,35 +1483,48 @@ impl Context { self.send_cmd(crate::OutputCommand::CopyImage(image)); } + fn can_show_modifier_symbols(&self) -> bool { + let ModifierNames { + alt, + ctrl, + shift, + mac_cmd, + .. + } = ModifierNames::SYMBOLS; + + let font_id = TextStyle::Body.resolve(&self.style()); + self.fonts(|f| { + let mut lock = f.lock(); + let font = lock.fonts.font(&font_id); + font.has_glyphs(alt) + && font.has_glyphs(ctrl) + && font.has_glyphs(shift) + && font.has_glyphs(mac_cmd) + }) + } + + /// Format the given modifiers in a human-readable way (e.g. `Ctrl+Shift+X`). + pub fn format_modifiers(&self, modifiers: Modifiers) -> String { + let os = self.os(); + + let is_mac = os.is_mac(); + + if is_mac && self.can_show_modifier_symbols() { + ModifierNames::SYMBOLS.format(&modifiers, is_mac) + } else { + ModifierNames::NAMES.format(&modifiers, is_mac) + } + } + /// Format the given shortcut in a human-readable way (e.g. `Ctrl+Shift+X`). /// /// Can be used to get the text for [`crate::Button::shortcut_text`]. pub fn format_shortcut(&self, shortcut: &KeyboardShortcut) -> String { let os = self.os(); - let is_mac = matches!(os, OperatingSystem::Mac | OperatingSystem::IOS); + let is_mac = os.is_mac(); - let can_show_symbols = || { - let ModifierNames { - alt, - ctrl, - shift, - mac_cmd, - .. - } = ModifierNames::SYMBOLS; - - let font_id = TextStyle::Body.resolve(&self.style()); - self.fonts(|f| { - let mut lock = f.lock(); - let font = lock.fonts.font(&font_id); - font.has_glyphs(alt) - && font.has_glyphs(ctrl) - && font.has_glyphs(shift) - && font.has_glyphs(mac_cmd) - }) - }; - - if is_mac && can_show_symbols() { + if is_mac && self.can_show_modifier_symbols() { shortcut.format(&ModifierNames::SYMBOLS, is_mac) } else { shortcut.format(&ModifierNames::NAMES, is_mac)