`gpui_web` currently embeds IBM Plex Sans and Lilex into every browser application during platform construction. Applications such as Delta already provide their own fonts, so those binaries contain overlapping font bundles and register the same faces twice. This change starts the web platform with an empty font database, matching the ownership boundary used by native applications: the application selects and registers its fonts before opening a window. Delta already follows that sequence. GPUI's browser-capable examples now load the former eight-face bundle explicitly through shared example support, while the standalone `hello_web` example demonstrates registering a minimal application font directly. Testing performed: - `cargo check -p gpui --examples --target wasm32-unknown-unknown` - `cargo check -p gpui --examples` - `cargo check -p gpui_web --target wasm32-unknown-unknown` - `cargo check --manifest-path crates/gpui_web/examples/hello_web/Cargo.toml --target wasm32-unknown-unknown` - `./script/clippy -p gpui_web --target wasm32-unknown-unknown` - `cargo fmt -p gpui -p gpui_web --check` Release Notes: - N/A
135 lines
3.5 KiB
Rust
135 lines
3.5 KiB
Rust
#![cfg_attr(target_family = "wasm", no_main)]
|
|
|
|
#[path = "example_support/fonts.rs"]
|
|
mod example_support;
|
|
|
|
use gpui::{
|
|
App, Context, Global, Menu, MenuItem, SharedString, SystemMenuType, Window, WindowOptions,
|
|
actions, div, prelude::*,
|
|
};
|
|
use gpui_platform::application;
|
|
|
|
struct SetMenus;
|
|
|
|
impl Render for SetMenus {
|
|
fn render(&mut self, _window: &mut Window, _cx: &mut Context<Self>) -> impl IntoElement {
|
|
div()
|
|
.flex()
|
|
.bg(gpui::white())
|
|
.size_full()
|
|
.justify_center()
|
|
.items_center()
|
|
.text_xl()
|
|
.text_color(gpui::black())
|
|
.child("Set Menus Example")
|
|
}
|
|
}
|
|
|
|
fn run_example() {
|
|
application().run(|cx: &mut App| {
|
|
if !example_support::load_fonts(cx) {
|
|
return;
|
|
}
|
|
cx.set_global(AppState::new());
|
|
|
|
// Bring the menu bar to the foreground (so you can see the menu bar)
|
|
cx.activate(true);
|
|
// Register the `quit` function so it can be referenced
|
|
// by the `MenuItem::action` in the menu bar
|
|
cx.on_action(quit);
|
|
cx.on_action(toggle_check);
|
|
// Add menu items
|
|
set_app_menus(cx);
|
|
cx.open_window(WindowOptions::default(), |_, cx| cx.new(|_| SetMenus {}))
|
|
.unwrap();
|
|
});
|
|
}
|
|
|
|
#[cfg(not(target_family = "wasm"))]
|
|
fn main() {
|
|
run_example();
|
|
}
|
|
|
|
#[cfg(target_family = "wasm")]
|
|
#[wasm_bindgen::prelude::wasm_bindgen(start)]
|
|
pub fn start() {
|
|
gpui_platform::web_init();
|
|
run_example();
|
|
}
|
|
|
|
#[derive(PartialEq)]
|
|
enum ViewMode {
|
|
List,
|
|
Grid,
|
|
}
|
|
|
|
impl ViewMode {
|
|
fn toggle(&mut self) {
|
|
*self = match self {
|
|
ViewMode::List => ViewMode::Grid,
|
|
ViewMode::Grid => ViewMode::List,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Into<SharedString> for ViewMode {
|
|
fn into(self) -> SharedString {
|
|
match self {
|
|
ViewMode::List => "List",
|
|
ViewMode::Grid => "Grid",
|
|
}
|
|
.into()
|
|
}
|
|
}
|
|
|
|
struct AppState {
|
|
view_mode: ViewMode,
|
|
}
|
|
|
|
impl AppState {
|
|
fn new() -> Self {
|
|
Self {
|
|
view_mode: ViewMode::List,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Global for AppState {}
|
|
|
|
fn set_app_menus(cx: &mut App) {
|
|
let app_state = cx.global::<AppState>();
|
|
cx.set_menus([Menu::new("set_menus").items([
|
|
MenuItem::os_submenu("Services", SystemMenuType::Services),
|
|
MenuItem::separator(),
|
|
MenuItem::action("Disabled Item", gpui::NoAction).disabled(true),
|
|
MenuItem::submenu(Menu::new("Disabled Submenu").disabled(true)),
|
|
MenuItem::separator(),
|
|
MenuItem::action("List Mode", ToggleCheck).checked(app_state.view_mode == ViewMode::List),
|
|
MenuItem::submenu(
|
|
Menu::new("Mode").items([
|
|
MenuItem::action(ViewMode::List, ToggleCheck)
|
|
.checked(app_state.view_mode == ViewMode::List),
|
|
MenuItem::action(ViewMode::Grid, ToggleCheck)
|
|
.checked(app_state.view_mode == ViewMode::Grid),
|
|
]),
|
|
),
|
|
MenuItem::separator(),
|
|
MenuItem::action("Quit", Quit),
|
|
])]);
|
|
}
|
|
|
|
// Associate actions using the `actions!` macro (or `Action` derive macro)
|
|
actions!(set_menus, [Quit, ToggleCheck]);
|
|
|
|
// Define the quit function that is registered with the App
|
|
fn quit(_: &Quit, cx: &mut App) {
|
|
println!("Gracefully quitting the application...");
|
|
cx.quit();
|
|
}
|
|
|
|
fn toggle_check(_: &ToggleCheck, cx: &mut App) {
|
|
let app_state = cx.global_mut::<AppState>();
|
|
app_state.view_mode.toggle();
|
|
set_app_menus(cx);
|
|
}
|