diff --git a/Cargo.lock b/Cargo.lock index 6b2db86..1a3ee97 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,9 +20,9 @@ checksum = "b2187590a23ab1e3df8681afdf0987c48504d80291f002fcdb651f0ef5e25169" [[package]] name = "accesskit" -version = "0.17.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d3b8f9bae46a948369bc4a03e815d4ed6d616bd00de4051133a5019dc31c5a" +checksum = "e25ae84c0260bdf5df07796d7cc4882460de26a2b406ec0e6c42461a723b271b" dependencies = [ "enumn", "serde", @@ -702,10 +702,11 @@ dependencies = [ [[package]] name = "codespan-reporting" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" dependencies = [ + "serde", "termcolor", "unicode-width", ] @@ -948,9 +949,9 @@ dependencies = [ [[package]] name = "ecolor" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc4feb366740ded31a004a0e4452fbf84e80ef432ecf8314c485210229672fd1" +checksum = "4a631732d995184114016fab22fc7e3faf73d6841c2d7650395fe251fbcd9285" dependencies = [ "bytemuck", "emath", @@ -959,9 +960,9 @@ dependencies = [ [[package]] name = "egui" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd34cec49ab55d85ebf70139cb1ccd29c977ef6b6ba4fe85489d6877ee9ef3" +checksum = "8470210c95a42cc985d9ffebfd5067eea55bdb1c3f7611484907db9639675e28" dependencies = [ "accesskit", "ahash", @@ -972,22 +973,24 @@ dependencies = [ "nohash-hasher", "profiling", "serde", + "smallvec", + "unicode-segmentation", ] [[package]] -name = "egui-toast" -version = "0.17.0" +name = "egui-notify" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "366a31eb8c905835c85a36baff26d7a003a9fd6631a04b1f15f42d9cb20d11ad" +checksum = "3cd148c4c3fe05be0d9facf90add19a1531c1d7bfb9c7e4dbc179cfb31844d49" dependencies = [ "egui", ] [[package]] name = "egui-wgpu" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d319dfef570f699b6e9114e235e862a2ddcf75f0d1a061de9e1328d92146d820" +checksum = "14de9942d8b9e99e2d830403c208ab1a6e052e925a7456a4f6f66d567d90de1d" dependencies = [ "ahash", "bytemuck", @@ -1005,9 +1008,9 @@ dependencies = [ [[package]] name = "egui-winit" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d9dfbb78fe4eb9c3a39ad528b90ee5915c252e77bbab9d4ebc576541ab67e13" +checksum = "c490804a035cec9c826082894a3e1ecf4198accd3817deb10f7919108ebafab0" dependencies = [ "ahash", "arboard", @@ -1024,9 +1027,9 @@ dependencies = [ [[package]] name = "egui_extras" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624659a2e972a46f4d5f646557906c55f1cd5a0836eddbe610fdf1afba1b4226" +checksum = "0f791a5937f518249016b276b3639ad2aa3824048b6f2161ec2b431ab325880a" dependencies = [ "ahash", "egui", @@ -1045,9 +1048,9 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "emath" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e4cadcff7a5353ba72b7fea76bf2122b5ebdbc68e8155aa56dfdea90083fe1b" +checksum = "45f057b141e7e46340c321400be74b793543b1b213036f0f989c35d35957c32e" dependencies = [ "bytemuck", "serde", @@ -1066,7 +1069,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" dependencies = [ "enum-map-derive", - "serde", ] [[package]] @@ -1114,9 +1116,9 @@ dependencies = [ [[package]] name = "epaint" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fcc0f5a7c613afd2dee5e4b30c3e6acafb8ad6f0edb06068811f708a67c562" +checksum = "94cca02195f0552c17cabdc02f39aa9ab6fbd815dac60ab1cd3d5b0aa6f9551c" dependencies = [ "ab_glyph", "ahash", @@ -1133,9 +1135,9 @@ dependencies = [ [[package]] name = "epaint_default_fonts" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7e7a64c02cf7a5b51e745a9e45f60660a286f151c238b9d397b3e923f5082f" +checksum = "e8495e11ed527dff39663b8c36b6c2b2799d7e4287fb90556e455d72eca0b4d3" [[package]] name = "equivalent" @@ -1505,6 +1507,7 @@ checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", + "num-traits", ] [[package]] @@ -1826,7 +1829,7 @@ dependencies = [ "cpal", "directories", "egui", - "egui-toast", + "egui-notify", "egui-wgpu", "egui-winit", "egui_extras", @@ -1870,6 +1873,12 @@ dependencies = [ "windows-targets 0.53.3", ] +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + [[package]] name = "libredox" version = "0.1.9" @@ -2044,24 +2053,27 @@ dependencies = [ [[package]] name = "naga" -version = "24.0.0" +version = "25.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e380993072e52eef724eddfcde0ed013b0c023c3f0417336ed041aa9f076994e" +checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632" dependencies = [ "arrayvec", "bit-set", "bitflags 2.9.1", "cfg_aliases", "codespan-reporting", + "half", + "hashbrown", "hexf-parse", "indexmap", "log", + "num-traits", + "once_cell", "rustc-hash 1.1.0", "spirv", "strum", - "termcolor", "thiserror 2.0.12", - "unicode-xid", + "unicode-ident", ] [[package]] @@ -2204,6 +2216,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2774,6 +2787,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + [[package]] name = "potential_utf" version = "0.1.2" @@ -3214,9 +3233,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -3716,15 +3735,9 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.1.14" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" [[package]] name = "url" @@ -4033,18 +4046,20 @@ checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" [[package]] name = "wgpu" -version = "24.0.5" +version = "25.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b0b3436f0729f6cdf2e6e9201f3d39dc95813fad61d826c1ed07918b4539353" +checksum = "ec8fb398f119472be4d80bc3647339f56eb63b2a331f6a3d16e25d8144197dd9" dependencies = [ "arrayvec", "bitflags 2.9.1", "cfg_aliases", "document-features", + "hashbrown", "js-sys", "log", "naga", "parking_lot", + "portable-atomic", "profiling", "raw-window-handle", "smallvec", @@ -4059,34 +4074,67 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "24.0.5" +version = "25.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f0aa306497a238d169b9dc70659105b4a096859a34894544ca81719242e1499" +checksum = "f7b882196f8368511d613c6aeec80655160db6646aebddf8328879a88d54e500" dependencies = [ "arrayvec", + "bit-set", "bit-vec", "bitflags 2.9.1", "cfg_aliases", "document-features", + "hashbrown", "indexmap", "log", "naga", "once_cell", "parking_lot", + "portable-atomic", "profiling", "raw-window-handle", "rustc-hash 1.1.0", "smallvec", "thiserror 2.0.12", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-windows-linux-android", "wgpu-hal", "wgpu-types", ] [[package]] -name = "wgpu-hal" -version = "24.0.4" +name = "wgpu-core-deps-apple" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f112f464674ca69f3533248508ee30cb84c67cf06c25ff6800685f5e0294e259" +checksum = "cfd488b3239b6b7b185c3b045c39ca6bf8af34467a4c5de4e0b1a564135d093d" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09ad7aceb3818e52539acc679f049d3475775586f3f4e311c30165cf2c00445" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cba5fb5f7f9c98baa7c889d444f63ace25574833df56f5b817985f641af58e46" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-hal" +version = "25.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f968767fe4d3d33747bbd1473ccd55bf0f6451f55d733b5597e67b5deab4ad17" dependencies = [ "android_system_properties", "arrayvec", @@ -4095,6 +4143,7 @@ dependencies = [ "bitflags 2.9.1", "block", "bytemuck", + "cfg-if", "cfg_aliases", "core-graphics-types", "glow", @@ -4102,6 +4151,7 @@ dependencies = [ "gpu-alloc", "gpu-allocator", "gpu-descriptor", + "hashbrown", "js-sys", "khronos-egl", "libc", @@ -4111,14 +4161,13 @@ dependencies = [ "naga", "ndk-sys 0.5.0+25.2.9519653", "objc", - "once_cell", "ordered-float", "parking_lot", + "portable-atomic", "profiling", "range-alloc", "raw-window-handle", "renderdoc-sys", - "rustc-hash 1.1.0", "smallvec", "thiserror 2.0.12", "wasm-bindgen", @@ -4130,13 +4179,15 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c" +checksum = "2aa49460c2a8ee8edba3fca54325540d904dd85b2e086ada762767e17d06e8bc" dependencies = [ "bitflags 2.9.1", + "bytemuck", "js-sys", "log", + "thiserror 2.0.12", "web-sys", ] diff --git a/Cargo.toml b/Cargo.toml index 5e256e9..942418e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,11 +16,11 @@ bytemuck = { version = "1", features = ["derive"] } clap = { version = "4", features = ["derive"] } cpal = { git = "https://github.com/sidit77/cpal.git", rev = "66ed6be" } directories = "6" -egui = { version = "0.31", features = ["serde"] } -egui_extras = { version = "0.31", features = ["image"] } -egui-toast = "0.17" -egui-winit = "0.31" -egui-wgpu = { version = "0.31", features = ["winit"] } +egui = { version = "0.32", features = ["serde"] } +egui_extras = { version = "0.32", features = ["image"] } +egui-notify = "0.20" +egui-winit = "0.32" +egui-wgpu = { version = "0.32", features = ["winit"] } fixed = { version = "1.28", features = ["num-traits"] } gilrs = { version = "0.11", features = ["serde-serialize"] } hex = "0.4" @@ -39,7 +39,7 @@ thread-priority = "1" tokio = { version = "1", features = ["io-util", "macros", "net", "rt", "sync", "time"] } tracing = { version = "0.1", features = ["release_max_level_info"] } tracing-subscriber = { version = "0.3", features = ["env-filter"] } -wgpu = "24" +wgpu = "25" winit = { version = "0.30", features = ["serde"] } [target.'cfg(windows)'.dependencies] @@ -57,3 +57,6 @@ name = "Lemur" identifier = "com.virtual-boy.Lemur" icon = ["assets/lemur-256x256.png"] category = "games" + +#[patch.crates-io] +#egui = "0.32" \ No newline at end of file diff --git a/src/app.rs b/src/app.rs index 1dfb008..6efd9dd 100644 --- a/src/app.rs +++ b/src/app.rs @@ -334,12 +334,9 @@ impl WgpuState { })) .expect("could not create adapter"); - let trace_path = std::env::var("WGPU_TRACE"); - let (device, queue) = pollster::block_on(adapter.request_device( - &(*device_descriptor)(&adapter), - trace_path.ok().as_ref().map(std::path::Path::new), - )) - .expect("could not request device"); + let (device, queue) = + pollster::block_on(adapter.request_device(&(*device_descriptor)(&adapter))) + .expect("could not request device"); Self { instance, adapter, diff --git a/src/emulator.rs b/src/emulator.rs index 6e8dd0d..9c55d06 100644 --- a/src/emulator.rs +++ b/src/emulator.rs @@ -9,12 +9,13 @@ use std::{ atomic::{AtomicBool, Ordering}, mpsc::{self, RecvError, TryRecvError}, }, + time::Duration, }; use anyhow::Result; use atomic::Atomic; use bytemuck::NoUninit; -use egui_toast::{Toast, ToastKind, ToastOptions}; +use egui_notify::Toast; use tracing::{error, warn}; use crate::{ @@ -726,10 +727,8 @@ impl Emulator { .get(&sim_id) .or_else(|| self.messages.get(&SimId::Player1)); if let Some(msg) = messages { - let toast = Toast::new() - .kind(ToastKind::Error) - .options(ToastOptions::default().duration_in_seconds(5.0)) - .text(&message); + let mut toast = Toast::error(&message); + toast.duration(Some(Duration::from_secs(5))); if msg.send(toast).is_ok() { return; } diff --git a/src/images.rs b/src/images.rs index 8da126a..0866d16 100644 --- a/src/images.rs +++ b/src/images.rs @@ -193,8 +193,8 @@ struct ImageState { impl ImageState { fn new(size: [usize; 2]) -> Self { let buffers = [ - Arc::new(ColorImage::new(size, Color32::BLACK)), - Arc::new(ColorImage::new(size, Color32::BLACK)), + Arc::new(ColorImage::filled(size, Color32::BLACK)), + Arc::new(ColorImage::filled(size, Color32::BLACK)), ]; let sink = buffers[0].clone(); Self { diff --git a/src/window/game.rs b/src/window/game.rs index a62c995..51b6d24 100644 --- a/src/window/game.rs +++ b/src/window/game.rs @@ -1,4 +1,4 @@ -use std::sync::mpsc; +use std::{sync::mpsc, time::Duration}; use crate::{ app::UserEvent, @@ -8,10 +8,10 @@ use crate::{ }; use anyhow::Context as _; use egui::{ - Align2, Button, CentralPanel, Color32, Context, Direction, Frame, TopBottomPanel, Ui, Vec2, - ViewportBuilder, ViewportCommand, ViewportId, Window, menu, + Align2, Button, CentralPanel, Color32, Context, Frame, MenuBar, TopBottomPanel, Ui, Vec2, + ViewportBuilder, ViewportCommand, ViewportId, Window, }; -use egui_toast::{Toast, ToastKind, ToastOptions, Toasts}; +use egui_notify::{Anchor, Toast, Toasts}; use serde::{Deserialize, Serialize}; use winit::event_loop::EventLoopProxy; @@ -43,6 +43,7 @@ pub struct GameWindow { shortcuts: ShortcutProvider, sim_id: SimId, config: GameConfig, + toasts: Toasts, screen: Option, messages: Option>, color_picker: Option, @@ -57,6 +58,10 @@ impl GameWindow { sim_id: SimId, ) -> Self { let config = load_config(&persistence, sim_id); + let toasts = Toasts::new() + .with_anchor(Anchor::BottomLeft) + .with_margin((10.0, 10.0).into()) + .reverse(true); Self { client, proxy, @@ -64,13 +69,14 @@ impl GameWindow { shortcuts, sim_id, config, + toasts, screen: None, messages: None, color_picker: None, } } - fn show_menu(&mut self, ctx: &Context, ui: &mut Ui, toasts: &mut Toasts) { + fn show_menu(&mut self, ctx: &Context, ui: &mut Ui) { let state = self.client.emulator_state(); let is_ready = self.client.sim_state(self.sim_id) == SimState::Ready; let can_pause = is_ready && state == EmulatorState::Running; @@ -119,7 +125,7 @@ impl GameWindow { if autopause { self.client.send_command(EmulatorCommand::Pause); } - pollster::block_on(self.take_screenshot(toasts)); + pollster::block_on(self.take_screenshot()); if autopause { self.client.send_command(EmulatorCommand::Resume); } @@ -139,7 +145,6 @@ impl GameWindow { self.client .send_command(EmulatorCommand::LoadGame(self.sim_id, path)); } - ui.close_menu(); } if ui .add(self.button_for(ui.ctx(), "Quit", Command::Quit)) @@ -158,7 +163,6 @@ impl GameWindow { .clicked() { self.client.send_command(EmulatorCommand::Pause); - ui.close_menu(); } } else if ui .add_enabled( @@ -168,7 +172,6 @@ impl GameWindow { .clicked() { self.client.send_command(EmulatorCommand::Resume); - ui.close_menu(); } if ui .add_enabled(is_ready, self.button_for(ui.ctx(), "Reset", Command::Reset)) @@ -176,7 +179,6 @@ impl GameWindow { { self.client .send_command(EmulatorCommand::Reset(self.sim_id)); - ui.close_menu(); } ui.separator(); if ui @@ -187,7 +189,6 @@ impl GameWindow { .clicked() { self.client.send_command(EmulatorCommand::FrameAdvance); - ui.close_menu(); } ui.separator(); if ui @@ -197,8 +198,7 @@ impl GameWindow { ) .clicked() { - pollster::block_on(self.take_screenshot(toasts)); - ui.close_menu(); + pollster::block_on(self.take_screenshot()); } }); ui.menu_button("Options", |ui| self.show_options_menu(ctx, ui)); @@ -211,17 +211,14 @@ impl GameWindow { self.client .send_command(EmulatorCommand::StartSecondSim(None)); self.proxy.send_event(UserEvent::OpenPlayer2).unwrap(); - ui.close_menu(); } if has_player_2 { let linked = self.client.are_sims_linked(); if linked && ui.button("Unlink").clicked() { self.client.send_command(EmulatorCommand::Unlink); - ui.close_menu(); } if !linked && ui.button("Link").clicked() { self.client.send_command(EmulatorCommand::Link); - ui.close_menu(); } } }); @@ -230,78 +227,63 @@ impl GameWindow { self.proxy .send_event(UserEvent::OpenTerminal(self.sim_id)) .unwrap(); - ui.close_menu(); } if ui.button("GDB Server").clicked() { self.proxy .send_event(UserEvent::OpenDebugger(self.sim_id)) .unwrap(); - ui.close_menu(); } ui.separator(); if ui.button("Character Data").clicked() { self.proxy .send_event(UserEvent::OpenCharacterData(self.sim_id)) .unwrap(); - ui.close_menu(); } if ui.button("Background Maps").clicked() { self.proxy .send_event(UserEvent::OpenBgMap(self.sim_id)) .unwrap(); - ui.close_menu(); } if ui.button("Objects").clicked() { self.proxy .send_event(UserEvent::OpenObjects(self.sim_id)) .unwrap(); - ui.close_menu(); } if ui.button("Worlds").clicked() { self.proxy .send_event(UserEvent::OpenWorlds(self.sim_id)) .unwrap(); - ui.close_menu(); } if ui.button("Frame Buffers").clicked() { self.proxy .send_event(UserEvent::OpenFrameBuffers(self.sim_id)) .unwrap(); - ui.close_menu(); } if ui.button("Registers").clicked() { self.proxy .send_event(UserEvent::OpenRegisters(self.sim_id)) .unwrap(); - ui.close_menu(); } }); ui.menu_button("Help", |ui| { if ui.button("About").clicked() { self.proxy.send_event(UserEvent::OpenAbout).unwrap(); - ui.close_menu(); } }); } - async fn take_screenshot(&self, toasts: &mut Toasts) { + async fn take_screenshot(&mut self) { match self.try_take_screenshot().await { Ok(Some(path)) => { - toasts.add( - Toast::new() - .kind(ToastKind::Info) - .options(ToastOptions::default().duration_in_seconds(5.0)) - .text(format!("Saved to {path}")), - ); + let mut toast = Toast::info(format!("Saved to {path}")); + toast.duration(Some(Duration::from_secs(5))); + self.toasts.add(toast); } Ok(None) => {} Err(error) => { - toasts.add( - Toast::new() - .kind(ToastKind::Error) - .options(ToastOptions::default().duration_in_seconds(5.0)) - .text(format!("{error:#}")), - ); + let mut toast = Toast::error(format!("{error:#}")); + toast.duration(Some(Duration::from_secs(5))); + self.toasts.add(toast); } } } @@ -348,7 +330,6 @@ impl GameWindow { .clicked() { ctx.send_viewport_cmd(ViewportCommand::InnerSize(dims)); - ui.close_menu(); } } }); @@ -385,13 +366,11 @@ impl GameWindow { c.display_mode = display_mode; c.dimensions = current_dims * scale; }); - ui.close_menu(); }); ui.menu_button("Colors", |ui| { for preset in COLOR_PRESETS { if ui.color_pair_button(preset[0], preset[1]).clicked() { self.update_config(|c| c.colors = preset); - ui.close_menu(); } } ui.with_layout(ui.layout().with_cross_align(egui::Align::Center), |ui| { @@ -412,7 +391,6 @@ impl GameWindow { just_opened: true, unpause_on_close: is_running, }); - ui.close_menu(); } }); }); @@ -423,23 +401,19 @@ impl GameWindow { if ui.selectable_button(p1_enabled, "Player 1").clicked() { self.client .send_command(EmulatorCommand::SetAudioEnabled(!p1_enabled, p2_enabled)); - ui.close_menu(); } if ui.selectable_button(p2_enabled, "Player 2").clicked() { self.client .send_command(EmulatorCommand::SetAudioEnabled(p1_enabled, !p2_enabled)); - ui.close_menu(); } }); ui.menu_button("Input", |ui| { if ui.button("Bind Inputs").clicked() { self.proxy.send_event(UserEvent::OpenInput).unwrap(); - ui.close_menu(); } }); if ui.button("Hotkeys").clicked() { self.proxy.send_event(UserEvent::OpenHotkeys).unwrap(); - ui.close_menu(); } } @@ -535,19 +509,16 @@ impl AppWindow for GameWindow { }; self.update_config(|c| c.dimensions = dimensions); - let mut toasts = Toasts::new() - .anchor(Align2::LEFT_BOTTOM, (10.0, 10.0)) - .direction(Direction::BottomUp); if let Some(messages) = self.messages.as_mut() { while let Ok(toast) = messages.try_recv() { - toasts.add(toast); + self.toasts.add(toast); } } TopBottomPanel::top("menubar") .exact_height(22.0) .show(ctx, |ui| { - menu::bar(ui, |ui| { - self.show_menu(ctx, ui, &mut toasts); + MenuBar::new().ui(ui, |ui| { + self.show_menu(ctx, ui); }); }); if self.color_picker.is_some() { @@ -566,7 +537,7 @@ impl AppWindow for GameWindow { ui.add(screen); } }); - toasts.show(ctx); + self.toasts.show(ctx); } fn on_init(&mut self, _ctx: &Context, render_state: &egui_wgpu::RenderState) { diff --git a/src/window/utils.rs b/src/window/utils.rs index 4c21b65..938eafe 100644 --- a/src/window/utils.rs +++ b/src/window/utils.rs @@ -49,7 +49,7 @@ impl UiExt for Ui { let old_rect = res.response.rect; let mut text_rect = old_rect; text_rect.min.x += 6.0; - self.allocate_new_ui(UiBuilder::new().max_rect(text_rect), |ui| ui.label(text)); + self.scope_builder(UiBuilder::new().max_rect(text_rect), |ui| ui.label(text)); if old_rect.width() > 0.0 { self.advance_cursor_after_rect(old_rect); }