Upgrade deps #6

Merged
SonicSwordcane merged 5 commits from upgrade-deps into main 2025-08-03 21:42:34 +00:00
7 changed files with 144 additions and 123 deletions
Showing only changes of commit 110a31870f - Show all commits

151
Cargo.lock generated
View File

@ -20,9 +20,9 @@ checksum = "b2187590a23ab1e3df8681afdf0987c48504d80291f002fcdb651f0ef5e25169"
[[package]] [[package]]
name = "accesskit" name = "accesskit"
version = "0.17.1" version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3d3b8f9bae46a948369bc4a03e815d4ed6d616bd00de4051133a5019dc31c5a" checksum = "e25ae84c0260bdf5df07796d7cc4882460de26a2b406ec0e6c42461a723b271b"
dependencies = [ dependencies = [
"enumn", "enumn",
"serde", "serde",
@ -702,10 +702,11 @@ dependencies = [
[[package]] [[package]]
name = "codespan-reporting" name = "codespan-reporting"
version = "0.11.1" version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81"
dependencies = [ dependencies = [
"serde",
"termcolor", "termcolor",
"unicode-width", "unicode-width",
] ]
@ -948,9 +949,9 @@ dependencies = [
[[package]] [[package]]
name = "ecolor" name = "ecolor"
version = "0.31.1" version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc4feb366740ded31a004a0e4452fbf84e80ef432ecf8314c485210229672fd1" checksum = "4a631732d995184114016fab22fc7e3faf73d6841c2d7650395fe251fbcd9285"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"emath", "emath",
@ -959,9 +960,9 @@ dependencies = [
[[package]] [[package]]
name = "egui" name = "egui"
version = "0.31.1" version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25dd34cec49ab55d85ebf70139cb1ccd29c977ef6b6ba4fe85489d6877ee9ef3" checksum = "8470210c95a42cc985d9ffebfd5067eea55bdb1c3f7611484907db9639675e28"
dependencies = [ dependencies = [
"accesskit", "accesskit",
"ahash", "ahash",
@ -972,22 +973,24 @@ dependencies = [
"nohash-hasher", "nohash-hasher",
"profiling", "profiling",
"serde", "serde",
"smallvec",
"unicode-segmentation",
] ]
[[package]] [[package]]
name = "egui-toast" name = "egui-notify"
version = "0.17.0" version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "366a31eb8c905835c85a36baff26d7a003a9fd6631a04b1f15f42d9cb20d11ad" checksum = "3cd148c4c3fe05be0d9facf90add19a1531c1d7bfb9c7e4dbc179cfb31844d49"
dependencies = [ dependencies = [
"egui", "egui",
] ]
[[package]] [[package]]
name = "egui-wgpu" name = "egui-wgpu"
version = "0.31.1" version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d319dfef570f699b6e9114e235e862a2ddcf75f0d1a061de9e1328d92146d820" checksum = "14de9942d8b9e99e2d830403c208ab1a6e052e925a7456a4f6f66d567d90de1d"
dependencies = [ dependencies = [
"ahash", "ahash",
"bytemuck", "bytemuck",
@ -1005,9 +1008,9 @@ dependencies = [
[[package]] [[package]]
name = "egui-winit" name = "egui-winit"
version = "0.31.1" version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d9dfbb78fe4eb9c3a39ad528b90ee5915c252e77bbab9d4ebc576541ab67e13" checksum = "c490804a035cec9c826082894a3e1ecf4198accd3817deb10f7919108ebafab0"
dependencies = [ dependencies = [
"ahash", "ahash",
"arboard", "arboard",
@ -1024,9 +1027,9 @@ dependencies = [
[[package]] [[package]]
name = "egui_extras" name = "egui_extras"
version = "0.31.1" version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "624659a2e972a46f4d5f646557906c55f1cd5a0836eddbe610fdf1afba1b4226" checksum = "0f791a5937f518249016b276b3639ad2aa3824048b6f2161ec2b431ab325880a"
dependencies = [ dependencies = [
"ahash", "ahash",
"egui", "egui",
@ -1045,9 +1048,9 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
[[package]] [[package]]
name = "emath" name = "emath"
version = "0.31.1" version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e4cadcff7a5353ba72b7fea76bf2122b5ebdbc68e8155aa56dfdea90083fe1b" checksum = "45f057b141e7e46340c321400be74b793543b1b213036f0f989c35d35957c32e"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"serde", "serde",
@ -1066,7 +1069,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9"
dependencies = [ dependencies = [
"enum-map-derive", "enum-map-derive",
"serde",
] ]
[[package]] [[package]]
@ -1114,9 +1116,9 @@ dependencies = [
[[package]] [[package]]
name = "epaint" name = "epaint"
version = "0.31.1" version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41fcc0f5a7c613afd2dee5e4b30c3e6acafb8ad6f0edb06068811f708a67c562" checksum = "94cca02195f0552c17cabdc02f39aa9ab6fbd815dac60ab1cd3d5b0aa6f9551c"
dependencies = [ dependencies = [
"ab_glyph", "ab_glyph",
"ahash", "ahash",
@ -1133,9 +1135,9 @@ dependencies = [
[[package]] [[package]]
name = "epaint_default_fonts" name = "epaint_default_fonts"
version = "0.31.1" version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc7e7a64c02cf7a5b51e745a9e45f60660a286f151c238b9d397b3e923f5082f" checksum = "e8495e11ed527dff39663b8c36b6c2b2799d7e4287fb90556e455d72eca0b4d3"
[[package]] [[package]]
name = "equivalent" name = "equivalent"
@ -1505,6 +1507,7 @@ checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"crunchy", "crunchy",
"num-traits",
] ]
[[package]] [[package]]
@ -1826,7 +1829,7 @@ dependencies = [
"cpal", "cpal",
"directories", "directories",
"egui", "egui",
"egui-toast", "egui-notify",
"egui-wgpu", "egui-wgpu",
"egui-winit", "egui-winit",
"egui_extras", "egui_extras",
@ -1870,6 +1873,12 @@ dependencies = [
"windows-targets 0.53.3", "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]] [[package]]
name = "libredox" name = "libredox"
version = "0.1.9" version = "0.1.9"
@ -2044,24 +2053,27 @@ dependencies = [
[[package]] [[package]]
name = "naga" name = "naga"
version = "24.0.0" version = "25.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e380993072e52eef724eddfcde0ed013b0c023c3f0417336ed041aa9f076994e" checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632"
dependencies = [ dependencies = [
"arrayvec", "arrayvec",
"bit-set", "bit-set",
"bitflags 2.9.1", "bitflags 2.9.1",
"cfg_aliases", "cfg_aliases",
"codespan-reporting", "codespan-reporting",
"half",
"hashbrown",
"hexf-parse", "hexf-parse",
"indexmap", "indexmap",
"log", "log",
"num-traits",
"once_cell",
"rustc-hash 1.1.0", "rustc-hash 1.1.0",
"spirv", "spirv",
"strum", "strum",
"termcolor",
"thiserror 2.0.12", "thiserror 2.0.12",
"unicode-xid", "unicode-ident",
] ]
[[package]] [[package]]
@ -2204,6 +2216,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [ dependencies = [
"autocfg", "autocfg",
"libm",
] ]
[[package]] [[package]]
@ -2774,6 +2787,12 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3"
[[package]]
name = "portable-atomic"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
[[package]] [[package]]
name = "potential_utf" name = "potential_utf"
version = "0.1.2" version = "0.1.2"
@ -3214,9 +3233,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]] [[package]]
name = "signal-hook-registry" name = "signal-hook-registry"
version = "1.4.5" version = "1.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b"
dependencies = [ dependencies = [
"libc", "libc",
] ]
@ -3716,15 +3735,9 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
[[package]] [[package]]
name = "unicode-width" name = "unicode-width"
version = "0.1.14" version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c"
[[package]]
name = "unicode-xid"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
[[package]] [[package]]
name = "url" name = "url"
@ -4033,18 +4046,20 @@ checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3"
[[package]] [[package]]
name = "wgpu" name = "wgpu"
version = "24.0.5" version = "25.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6b0b3436f0729f6cdf2e6e9201f3d39dc95813fad61d826c1ed07918b4539353" checksum = "ec8fb398f119472be4d80bc3647339f56eb63b2a331f6a3d16e25d8144197dd9"
dependencies = [ dependencies = [
"arrayvec", "arrayvec",
"bitflags 2.9.1", "bitflags 2.9.1",
"cfg_aliases", "cfg_aliases",
"document-features", "document-features",
"hashbrown",
"js-sys", "js-sys",
"log", "log",
"naga", "naga",
"parking_lot", "parking_lot",
"portable-atomic",
"profiling", "profiling",
"raw-window-handle", "raw-window-handle",
"smallvec", "smallvec",
@ -4059,34 +4074,67 @@ dependencies = [
[[package]] [[package]]
name = "wgpu-core" name = "wgpu-core"
version = "24.0.5" version = "25.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f0aa306497a238d169b9dc70659105b4a096859a34894544ca81719242e1499" checksum = "f7b882196f8368511d613c6aeec80655160db6646aebddf8328879a88d54e500"
dependencies = [ dependencies = [
"arrayvec", "arrayvec",
"bit-set",
"bit-vec", "bit-vec",
"bitflags 2.9.1", "bitflags 2.9.1",
"cfg_aliases", "cfg_aliases",
"document-features", "document-features",
"hashbrown",
"indexmap", "indexmap",
"log", "log",
"naga", "naga",
"once_cell", "once_cell",
"parking_lot", "parking_lot",
"portable-atomic",
"profiling", "profiling",
"raw-window-handle", "raw-window-handle",
"rustc-hash 1.1.0", "rustc-hash 1.1.0",
"smallvec", "smallvec",
"thiserror 2.0.12", "thiserror 2.0.12",
"wgpu-core-deps-apple",
"wgpu-core-deps-emscripten",
"wgpu-core-deps-windows-linux-android",
"wgpu-hal", "wgpu-hal",
"wgpu-types", "wgpu-types",
] ]
[[package]] [[package]]
name = "wgpu-hal" name = "wgpu-core-deps-apple"
version = "24.0.4" version = "25.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" 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 = [ dependencies = [
"android_system_properties", "android_system_properties",
"arrayvec", "arrayvec",
@ -4095,6 +4143,7 @@ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.1",
"block", "block",
"bytemuck", "bytemuck",
"cfg-if",
"cfg_aliases", "cfg_aliases",
"core-graphics-types", "core-graphics-types",
"glow", "glow",
@ -4102,6 +4151,7 @@ dependencies = [
"gpu-alloc", "gpu-alloc",
"gpu-allocator", "gpu-allocator",
"gpu-descriptor", "gpu-descriptor",
"hashbrown",
"js-sys", "js-sys",
"khronos-egl", "khronos-egl",
"libc", "libc",
@ -4111,14 +4161,13 @@ dependencies = [
"naga", "naga",
"ndk-sys 0.5.0+25.2.9519653", "ndk-sys 0.5.0+25.2.9519653",
"objc", "objc",
"once_cell",
"ordered-float", "ordered-float",
"parking_lot", "parking_lot",
"portable-atomic",
"profiling", "profiling",
"range-alloc", "range-alloc",
"raw-window-handle", "raw-window-handle",
"renderdoc-sys", "renderdoc-sys",
"rustc-hash 1.1.0",
"smallvec", "smallvec",
"thiserror 2.0.12", "thiserror 2.0.12",
"wasm-bindgen", "wasm-bindgen",
@ -4130,13 +4179,15 @@ dependencies = [
[[package]] [[package]]
name = "wgpu-types" name = "wgpu-types"
version = "24.0.0" version = "25.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c" checksum = "2aa49460c2a8ee8edba3fca54325540d904dd85b2e086ada762767e17d06e8bc"
dependencies = [ dependencies = [
"bitflags 2.9.1", "bitflags 2.9.1",
"bytemuck",
"js-sys", "js-sys",
"log", "log",
"thiserror 2.0.12",
"web-sys", "web-sys",
] ]

View File

@ -16,11 +16,11 @@ bytemuck = { version = "1", features = ["derive"] }
clap = { version = "4", features = ["derive"] } clap = { version = "4", features = ["derive"] }
cpal = { git = "https://github.com/sidit77/cpal.git", rev = "66ed6be" } cpal = { git = "https://github.com/sidit77/cpal.git", rev = "66ed6be" }
directories = "6" directories = "6"
egui = { version = "0.31", features = ["serde"] } egui = { version = "0.32", features = ["serde"] }
egui_extras = { version = "0.31", features = ["image"] } egui_extras = { version = "0.32", features = ["image"] }
egui-toast = "0.17" egui-notify = "0.20"
egui-winit = "0.31" egui-winit = "0.32"
egui-wgpu = { version = "0.31", features = ["winit"] } egui-wgpu = { version = "0.32", features = ["winit"] }
fixed = { version = "1.28", features = ["num-traits"] } fixed = { version = "1.28", features = ["num-traits"] }
gilrs = { version = "0.11", features = ["serde-serialize"] } gilrs = { version = "0.11", features = ["serde-serialize"] }
hex = "0.4" hex = "0.4"
@ -39,7 +39,7 @@ thread-priority = "1"
tokio = { version = "1", features = ["io-util", "macros", "net", "rt", "sync", "time"] } tokio = { version = "1", features = ["io-util", "macros", "net", "rt", "sync", "time"] }
tracing = { version = "0.1", features = ["release_max_level_info"] } tracing = { version = "0.1", features = ["release_max_level_info"] }
tracing-subscriber = { version = "0.3", features = ["env-filter"] } tracing-subscriber = { version = "0.3", features = ["env-filter"] }
wgpu = "24" wgpu = "25"
winit = { version = "0.30", features = ["serde"] } winit = { version = "0.30", features = ["serde"] }
[target.'cfg(windows)'.dependencies] [target.'cfg(windows)'.dependencies]
@ -57,3 +57,6 @@ name = "Lemur"
identifier = "com.virtual-boy.Lemur" identifier = "com.virtual-boy.Lemur"
icon = ["assets/lemur-256x256.png"] icon = ["assets/lemur-256x256.png"]
category = "games" category = "games"
#[patch.crates-io]
#egui = "0.32"

View File

@ -334,12 +334,9 @@ impl WgpuState {
})) }))
.expect("could not create adapter"); .expect("could not create adapter");
let trace_path = std::env::var("WGPU_TRACE"); let (device, queue) =
let (device, queue) = pollster::block_on(adapter.request_device( pollster::block_on(adapter.request_device(&(*device_descriptor)(&adapter)))
&(*device_descriptor)(&adapter), .expect("could not request device");
trace_path.ok().as_ref().map(std::path::Path::new),
))
.expect("could not request device");
Self { Self {
instance, instance,
adapter, adapter,

View File

@ -9,12 +9,13 @@ use std::{
atomic::{AtomicBool, Ordering}, atomic::{AtomicBool, Ordering},
mpsc::{self, RecvError, TryRecvError}, mpsc::{self, RecvError, TryRecvError},
}, },
time::Duration,
}; };
use anyhow::Result; use anyhow::Result;
use atomic::Atomic; use atomic::Atomic;
use bytemuck::NoUninit; use bytemuck::NoUninit;
use egui_toast::{Toast, ToastKind, ToastOptions}; use egui_notify::Toast;
use tracing::{error, warn}; use tracing::{error, warn};
use crate::{ use crate::{
@ -726,10 +727,8 @@ impl Emulator {
.get(&sim_id) .get(&sim_id)
.or_else(|| self.messages.get(&SimId::Player1)); .or_else(|| self.messages.get(&SimId::Player1));
if let Some(msg) = messages { if let Some(msg) = messages {
let toast = Toast::new() let mut toast = Toast::error(&message);
.kind(ToastKind::Error) toast.duration(Some(Duration::from_secs(5)));
.options(ToastOptions::default().duration_in_seconds(5.0))
.text(&message);
if msg.send(toast).is_ok() { if msg.send(toast).is_ok() {
return; return;
} }

View File

@ -193,8 +193,8 @@ struct ImageState {
impl ImageState { impl ImageState {
fn new(size: [usize; 2]) -> Self { fn new(size: [usize; 2]) -> Self {
let buffers = [ let buffers = [
Arc::new(ColorImage::new(size, Color32::BLACK)), Arc::new(ColorImage::filled(size, Color32::BLACK)),
Arc::new(ColorImage::new(size, Color32::BLACK)), Arc::new(ColorImage::filled(size, Color32::BLACK)),
]; ];
let sink = buffers[0].clone(); let sink = buffers[0].clone();
Self { Self {

View File

@ -1,4 +1,4 @@
use std::sync::mpsc; use std::{sync::mpsc, time::Duration};
use crate::{ use crate::{
app::UserEvent, app::UserEvent,
@ -8,10 +8,10 @@ use crate::{
}; };
use anyhow::Context as _; use anyhow::Context as _;
use egui::{ use egui::{
Align2, Button, CentralPanel, Color32, Context, Direction, Frame, TopBottomPanel, Ui, Vec2, Align2, Button, CentralPanel, Color32, Context, Frame, MenuBar, TopBottomPanel, Ui, Vec2,
ViewportBuilder, ViewportCommand, ViewportId, Window, menu, ViewportBuilder, ViewportCommand, ViewportId, Window,
}; };
use egui_toast::{Toast, ToastKind, ToastOptions, Toasts}; use egui_notify::{Anchor, Toast, Toasts};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use winit::event_loop::EventLoopProxy; use winit::event_loop::EventLoopProxy;
@ -43,6 +43,7 @@ pub struct GameWindow {
shortcuts: ShortcutProvider, shortcuts: ShortcutProvider,
sim_id: SimId, sim_id: SimId,
config: GameConfig, config: GameConfig,
toasts: Toasts,
screen: Option<GameScreen>, screen: Option<GameScreen>,
messages: Option<mpsc::Receiver<Toast>>, messages: Option<mpsc::Receiver<Toast>>,
color_picker: Option<ColorPickerState>, color_picker: Option<ColorPickerState>,
@ -57,6 +58,10 @@ impl GameWindow {
sim_id: SimId, sim_id: SimId,
) -> Self { ) -> Self {
let config = load_config(&persistence, sim_id); 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 { Self {
client, client,
proxy, proxy,
@ -64,13 +69,14 @@ impl GameWindow {
shortcuts, shortcuts,
sim_id, sim_id,
config, config,
toasts,
screen: None, screen: None,
messages: None, messages: None,
color_picker: 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 state = self.client.emulator_state();
let is_ready = self.client.sim_state(self.sim_id) == SimState::Ready; let is_ready = self.client.sim_state(self.sim_id) == SimState::Ready;
let can_pause = is_ready && state == EmulatorState::Running; let can_pause = is_ready && state == EmulatorState::Running;
@ -119,7 +125,7 @@ impl GameWindow {
if autopause { if autopause {
self.client.send_command(EmulatorCommand::Pause); self.client.send_command(EmulatorCommand::Pause);
} }
pollster::block_on(self.take_screenshot(toasts)); pollster::block_on(self.take_screenshot());
if autopause { if autopause {
self.client.send_command(EmulatorCommand::Resume); self.client.send_command(EmulatorCommand::Resume);
} }
@ -139,7 +145,6 @@ impl GameWindow {
self.client self.client
.send_command(EmulatorCommand::LoadGame(self.sim_id, path)); .send_command(EmulatorCommand::LoadGame(self.sim_id, path));
} }
ui.close_menu();
} }
if ui if ui
.add(self.button_for(ui.ctx(), "Quit", Command::Quit)) .add(self.button_for(ui.ctx(), "Quit", Command::Quit))
@ -158,7 +163,6 @@ impl GameWindow {
.clicked() .clicked()
{ {
self.client.send_command(EmulatorCommand::Pause); self.client.send_command(EmulatorCommand::Pause);
ui.close_menu();
} }
} else if ui } else if ui
.add_enabled( .add_enabled(
@ -168,7 +172,6 @@ impl GameWindow {
.clicked() .clicked()
{ {
self.client.send_command(EmulatorCommand::Resume); self.client.send_command(EmulatorCommand::Resume);
ui.close_menu();
} }
if ui if ui
.add_enabled(is_ready, self.button_for(ui.ctx(), "Reset", Command::Reset)) .add_enabled(is_ready, self.button_for(ui.ctx(), "Reset", Command::Reset))
@ -176,7 +179,6 @@ impl GameWindow {
{ {
self.client self.client
.send_command(EmulatorCommand::Reset(self.sim_id)); .send_command(EmulatorCommand::Reset(self.sim_id));
ui.close_menu();
} }
ui.separator(); ui.separator();
if ui if ui
@ -187,7 +189,6 @@ impl GameWindow {
.clicked() .clicked()
{ {
self.client.send_command(EmulatorCommand::FrameAdvance); self.client.send_command(EmulatorCommand::FrameAdvance);
ui.close_menu();
} }
ui.separator(); ui.separator();
if ui if ui
@ -197,8 +198,7 @@ impl GameWindow {
) )
.clicked() .clicked()
{ {
pollster::block_on(self.take_screenshot(toasts)); pollster::block_on(self.take_screenshot());
ui.close_menu();
} }
}); });
ui.menu_button("Options", |ui| self.show_options_menu(ctx, ui)); ui.menu_button("Options", |ui| self.show_options_menu(ctx, ui));
@ -211,17 +211,14 @@ impl GameWindow {
self.client self.client
.send_command(EmulatorCommand::StartSecondSim(None)); .send_command(EmulatorCommand::StartSecondSim(None));
self.proxy.send_event(UserEvent::OpenPlayer2).unwrap(); self.proxy.send_event(UserEvent::OpenPlayer2).unwrap();
ui.close_menu();
} }
if has_player_2 { if has_player_2 {
let linked = self.client.are_sims_linked(); let linked = self.client.are_sims_linked();
if linked && ui.button("Unlink").clicked() { if linked && ui.button("Unlink").clicked() {
self.client.send_command(EmulatorCommand::Unlink); self.client.send_command(EmulatorCommand::Unlink);
ui.close_menu();
} }
if !linked && ui.button("Link").clicked() { if !linked && ui.button("Link").clicked() {
self.client.send_command(EmulatorCommand::Link); self.client.send_command(EmulatorCommand::Link);
ui.close_menu();
} }
} }
}); });
@ -230,78 +227,63 @@ impl GameWindow {
self.proxy self.proxy
.send_event(UserEvent::OpenTerminal(self.sim_id)) .send_event(UserEvent::OpenTerminal(self.sim_id))
.unwrap(); .unwrap();
ui.close_menu();
} }
if ui.button("GDB Server").clicked() { if ui.button("GDB Server").clicked() {
self.proxy self.proxy
.send_event(UserEvent::OpenDebugger(self.sim_id)) .send_event(UserEvent::OpenDebugger(self.sim_id))
.unwrap(); .unwrap();
ui.close_menu();
} }
ui.separator(); ui.separator();
if ui.button("Character Data").clicked() { if ui.button("Character Data").clicked() {
self.proxy self.proxy
.send_event(UserEvent::OpenCharacterData(self.sim_id)) .send_event(UserEvent::OpenCharacterData(self.sim_id))
.unwrap(); .unwrap();
ui.close_menu();
} }
if ui.button("Background Maps").clicked() { if ui.button("Background Maps").clicked() {
self.proxy self.proxy
.send_event(UserEvent::OpenBgMap(self.sim_id)) .send_event(UserEvent::OpenBgMap(self.sim_id))
.unwrap(); .unwrap();
ui.close_menu();
} }
if ui.button("Objects").clicked() { if ui.button("Objects").clicked() {
self.proxy self.proxy
.send_event(UserEvent::OpenObjects(self.sim_id)) .send_event(UserEvent::OpenObjects(self.sim_id))
.unwrap(); .unwrap();
ui.close_menu();
} }
if ui.button("Worlds").clicked() { if ui.button("Worlds").clicked() {
self.proxy self.proxy
.send_event(UserEvent::OpenWorlds(self.sim_id)) .send_event(UserEvent::OpenWorlds(self.sim_id))
.unwrap(); .unwrap();
ui.close_menu();
} }
if ui.button("Frame Buffers").clicked() { if ui.button("Frame Buffers").clicked() {
self.proxy self.proxy
.send_event(UserEvent::OpenFrameBuffers(self.sim_id)) .send_event(UserEvent::OpenFrameBuffers(self.sim_id))
.unwrap(); .unwrap();
ui.close_menu();
} }
if ui.button("Registers").clicked() { if ui.button("Registers").clicked() {
self.proxy self.proxy
.send_event(UserEvent::OpenRegisters(self.sim_id)) .send_event(UserEvent::OpenRegisters(self.sim_id))
.unwrap(); .unwrap();
ui.close_menu();
} }
}); });
ui.menu_button("Help", |ui| { ui.menu_button("Help", |ui| {
if ui.button("About").clicked() { if ui.button("About").clicked() {
self.proxy.send_event(UserEvent::OpenAbout).unwrap(); 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 { match self.try_take_screenshot().await {
Ok(Some(path)) => { Ok(Some(path)) => {
toasts.add( let mut toast = Toast::info(format!("Saved to {path}"));
Toast::new() toast.duration(Some(Duration::from_secs(5)));
.kind(ToastKind::Info) self.toasts.add(toast);
.options(ToastOptions::default().duration_in_seconds(5.0))
.text(format!("Saved to {path}")),
);
} }
Ok(None) => {} Ok(None) => {}
Err(error) => { Err(error) => {
toasts.add( let mut toast = Toast::error(format!("{error:#}"));
Toast::new() toast.duration(Some(Duration::from_secs(5)));
.kind(ToastKind::Error) self.toasts.add(toast);
.options(ToastOptions::default().duration_in_seconds(5.0))
.text(format!("{error:#}")),
);
} }
} }
} }
@ -348,7 +330,6 @@ impl GameWindow {
.clicked() .clicked()
{ {
ctx.send_viewport_cmd(ViewportCommand::InnerSize(dims)); ctx.send_viewport_cmd(ViewportCommand::InnerSize(dims));
ui.close_menu();
} }
} }
}); });
@ -385,13 +366,11 @@ impl GameWindow {
c.display_mode = display_mode; c.display_mode = display_mode;
c.dimensions = current_dims * scale; c.dimensions = current_dims * scale;
}); });
ui.close_menu();
}); });
ui.menu_button("Colors", |ui| { ui.menu_button("Colors", |ui| {
for preset in COLOR_PRESETS { for preset in COLOR_PRESETS {
if ui.color_pair_button(preset[0], preset[1]).clicked() { if ui.color_pair_button(preset[0], preset[1]).clicked() {
self.update_config(|c| c.colors = preset); self.update_config(|c| c.colors = preset);
ui.close_menu();
} }
} }
ui.with_layout(ui.layout().with_cross_align(egui::Align::Center), |ui| { ui.with_layout(ui.layout().with_cross_align(egui::Align::Center), |ui| {
@ -412,7 +391,6 @@ impl GameWindow {
just_opened: true, just_opened: true,
unpause_on_close: is_running, unpause_on_close: is_running,
}); });
ui.close_menu();
} }
}); });
}); });
@ -423,23 +401,19 @@ impl GameWindow {
if ui.selectable_button(p1_enabled, "Player 1").clicked() { if ui.selectable_button(p1_enabled, "Player 1").clicked() {
self.client self.client
.send_command(EmulatorCommand::SetAudioEnabled(!p1_enabled, p2_enabled)); .send_command(EmulatorCommand::SetAudioEnabled(!p1_enabled, p2_enabled));
ui.close_menu();
} }
if ui.selectable_button(p2_enabled, "Player 2").clicked() { if ui.selectable_button(p2_enabled, "Player 2").clicked() {
self.client self.client
.send_command(EmulatorCommand::SetAudioEnabled(p1_enabled, !p2_enabled)); .send_command(EmulatorCommand::SetAudioEnabled(p1_enabled, !p2_enabled));
ui.close_menu();
} }
}); });
ui.menu_button("Input", |ui| { ui.menu_button("Input", |ui| {
if ui.button("Bind Inputs").clicked() { if ui.button("Bind Inputs").clicked() {
self.proxy.send_event(UserEvent::OpenInput).unwrap(); self.proxy.send_event(UserEvent::OpenInput).unwrap();
ui.close_menu();
} }
}); });
if ui.button("Hotkeys").clicked() { if ui.button("Hotkeys").clicked() {
self.proxy.send_event(UserEvent::OpenHotkeys).unwrap(); 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); 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() { if let Some(messages) = self.messages.as_mut() {
while let Ok(toast) = messages.try_recv() { while let Ok(toast) = messages.try_recv() {
toasts.add(toast); self.toasts.add(toast);
} }
} }
TopBottomPanel::top("menubar") TopBottomPanel::top("menubar")
.exact_height(22.0) .exact_height(22.0)
.show(ctx, |ui| { .show(ctx, |ui| {
menu::bar(ui, |ui| { MenuBar::new().ui(ui, |ui| {
self.show_menu(ctx, ui, &mut toasts); self.show_menu(ctx, ui);
}); });
}); });
if self.color_picker.is_some() { if self.color_picker.is_some() {
@ -566,7 +537,7 @@ impl AppWindow for GameWindow {
ui.add(screen); ui.add(screen);
} }
}); });
toasts.show(ctx); self.toasts.show(ctx);
} }
fn on_init(&mut self, _ctx: &Context, render_state: &egui_wgpu::RenderState) { fn on_init(&mut self, _ctx: &Context, render_state: &egui_wgpu::RenderState) {

View File

@ -49,7 +49,7 @@ impl UiExt for Ui {
let old_rect = res.response.rect; let old_rect = res.response.rect;
let mut text_rect = old_rect; let mut text_rect = old_rect;
text_rect.min.x += 6.0; 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 { if old_rect.width() > 0.0 {
self.advance_cursor_after_rect(old_rect); self.advance_cursor_after_rect(old_rect);
} }