diff --git a/Cargo.lock b/Cargo.lock index d3f85f8..ab94444 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -55,6 +55,12 @@ dependencies = [ "equator", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "android-activity" version = "0.6.0" @@ -685,9 +691,9 @@ dependencies = [ [[package]] name = "cosmic-text" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "173852283a9a57a3cbe365d86e74dc428a09c50421477d5ad6fe9d9509e37737" +checksum = "c4cadaea21e24c49c0c82116f2b465ae6a49d63c90e428b0f8d9ae1f638ac91f" dependencies = [ "bitflags 2.10.0", "fontdb", @@ -697,7 +703,7 @@ dependencies = [ "rangemap", "rustc-hash 1.1.0", "self_cell", - "skrifa", + "skrifa 0.39.0", "smol_str", "swash", "sys-locale", @@ -1273,7 +1279,21 @@ dependencies = [ "log", "presser", "thiserror 1.0.69", - "windows", + "windows 0.58.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51255ea7cfaadb6c5f1528d43e92a82acb2b96c43365989a28b2d44ee38f8795" +dependencies = [ + "ash", + "hashbrown 0.16.1", + "log", + "presser", + "thiserror 2.0.17", + "windows 0.58.0", ] [[package]] @@ -1310,14 +1330,14 @@ dependencies = [ [[package]] name = "harfrust" -version = "0.3.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92c020db12c71d8a12a3fe7607873cade3a01a6287e29d540c8723276221b9d8" +checksum = "e0caaee032384c10dd597af4579c67dee16650d862a9ccbe1233ff1a379abc07" dependencies = [ "bitflags 2.10.0", "bytemuck", "core_maths", - "read-fonts", + "read-fonts 0.36.0", "smallvec", ] @@ -1336,6 +1356,8 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ + "allocator-api2", + "equivalent", "foldhash 0.2.0", ] @@ -1464,8 +1486,9 @@ dependencies = [ "iris-core", "iris-macro", "pollster", + "tokio", "unicode-segmentation", - "wgpu", + "wgpu 28.0.0", "winit", ] @@ -1477,7 +1500,7 @@ dependencies = [ "cosmic-text", "fxhash", "image", - "wgpu", + "wgpu 28.0.0", "winit", ] @@ -1485,6 +1508,7 @@ dependencies = [ name = "iris-macro" version = "0.1.0" dependencies = [ + "proc-macro2", "quote", "syn", ] @@ -1715,6 +1739,21 @@ dependencies = [ "paste", ] +[[package]] +name = "metal" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7047791b5bc903b8cd963014b355f71dc9864a9a0b727057676c1dcae5cbc15" +dependencies = [ + "bitflags 2.10.0", + "block", + "core-graphics-types 0.2.0", + "foreign-types", + "log", + "objc", + "paste", +] + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1772,6 +1811,32 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "naga" +version = "28.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "618f667225063219ddfc61251087db8a9aec3c3f0950c916b614e403486f1135" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.10.0", + "cfg-if", + "cfg_aliases", + "codespan-reporting", + "half", + "hashbrown 0.16.1", + "hexf-parse", + "indexmap", + "libm", + "log", + "num-traits", + "once_cell", + "rustc-hash 1.1.0", + "spirv", + "thiserror 2.0.17", + "unicode-ident", +] + [[package]] name = "ndk" version = "0.9.0" @@ -2218,7 +2283,7 @@ dependencies = [ "sled", "tokio", "tracing", - "wgpu", + "wgpu 27.0.1", "winit", "zstd", ] @@ -2772,6 +2837,16 @@ name = "read-fonts" version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358" +dependencies = [ + "bytemuck", + "font-types", +] + +[[package]] +name = "read-fonts" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eaa2941a4c05443ee3a7b26ab076a553c343ad5995230cc2b1d3e993bdc6345" dependencies = [ "bytemuck", "core_maths", @@ -3189,7 +3264,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c31071dedf532758ecf3fed987cdb4bd9509f900e026ab684b4ecb81ea49841" dependencies = [ "bytemuck", - "read-fonts", + "read-fonts 0.35.0", +] + +[[package]] +name = "skrifa" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9eb0b904a04d09bd68c65d946617b8ff733009999050f3b851c32fb3cfb60e" +dependencies = [ + "bytemuck", + "read-fonts 0.36.0", ] [[package]] @@ -3318,7 +3403,7 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47846491253e976bdd07d0f9cc24b7daf24720d11309302ccbbc6e6b6e53550a" dependencies = [ - "skrifa", + "skrifa 0.37.0", "yazi", "zeno", ] @@ -3480,9 +3565,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.48.0" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ "bytes", "libc", @@ -3918,7 +4003,7 @@ dependencies = [ "hashbrown 0.16.1", "js-sys", "log", - "naga", + "naga 27.0.3", "parking_lot 0.12.5", "portable-atomic", "profiling", @@ -3928,9 +4013,39 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "wgpu-core", - "wgpu-hal", - "wgpu-types", + "wgpu-core 27.0.3", + "wgpu-hal 27.0.4", + "wgpu-types 27.0.1", +] + +[[package]] +name = "wgpu" +version = "28.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9cb534d5ffd109c7d1135f34cdae29e60eab94855a625dcfe1705f8bc7ad79f" +dependencies = [ + "arrayvec", + "bitflags 2.10.0", + "bytemuck", + "cfg-if", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "js-sys", + "log", + "naga 28.0.0", + "parking_lot 0.12.5", + "portable-atomic", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core 28.0.0", + "wgpu-hal 28.0.0", + "wgpu-types 28.0.0", ] [[package]] @@ -3949,7 +4064,7 @@ dependencies = [ "hashbrown 0.16.1", "indexmap", "log", - "naga", + "naga 27.0.3", "once_cell", "parking_lot 0.12.5", "portable-atomic", @@ -3958,11 +4073,43 @@ dependencies = [ "rustc-hash 1.1.0", "smallvec", "thiserror 2.0.17", - "wgpu-core-deps-apple", - "wgpu-core-deps-emscripten", - "wgpu-core-deps-windows-linux-android", - "wgpu-hal", - "wgpu-types", + "wgpu-core-deps-apple 27.0.0", + "wgpu-core-deps-emscripten 27.0.0", + "wgpu-core-deps-windows-linux-android 27.0.0", + "wgpu-hal 27.0.4", + "wgpu-types 27.0.1", +] + +[[package]] +name = "wgpu-core" +version = "28.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb4c8b5db5f00e56f1f08869d870a0dff7c8bc7ebc01091fec140b0cf0211a9" +dependencies = [ + "arrayvec", + "bit-set", + "bit-vec", + "bitflags 2.10.0", + "bytemuck", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "indexmap", + "log", + "naga 28.0.0", + "once_cell", + "parking_lot 0.12.5", + "portable-atomic", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 2.0.17", + "wgpu-core-deps-apple 28.0.0", + "wgpu-core-deps-emscripten 28.0.0", + "wgpu-core-deps-windows-linux-android 28.0.0", + "wgpu-hal 28.0.0", + "wgpu-types 28.0.0", ] [[package]] @@ -3971,7 +4118,16 @@ version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233" dependencies = [ - "wgpu-hal", + "wgpu-hal 27.0.4", +] + +[[package]] +name = "wgpu-core-deps-apple" +version = "28.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87b7b696b918f337c486bf93142454080a32a37832ba8a31e4f48221890047da" +dependencies = [ + "wgpu-hal 28.0.0", ] [[package]] @@ -3980,7 +4136,16 @@ version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5" dependencies = [ - "wgpu-hal", + "wgpu-hal 27.0.4", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "28.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b251c331f84feac147de3c4aa3aa45112622a95dd7ee1b74384fa0458dbd79" +dependencies = [ + "wgpu-hal 28.0.0", ] [[package]] @@ -3989,7 +4154,16 @@ version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3" dependencies = [ - "wgpu-hal", + "wgpu-hal 27.0.4", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "28.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ca976e72b2c9964eb243e281f6ce7f14a514e409920920dcda12ae40febaae" +dependencies = [ + "wgpu-hal 28.0.0", ] [[package]] @@ -4011,7 +4185,7 @@ dependencies = [ "glow", "glutin_wgl_sys", "gpu-alloc", - "gpu-allocator", + "gpu-allocator 0.27.0", "gpu-descriptor", "hashbrown 0.16.1", "js-sys", @@ -4019,8 +4193,8 @@ dependencies = [ "libc", "libloading", "log", - "metal", - "naga", + "metal 0.32.0", + "naga 27.0.3", "ndk-sys", "objc", "once_cell", @@ -4036,9 +4210,57 @@ dependencies = [ "thiserror 2.0.17", "wasm-bindgen", "web-sys", - "wgpu-types", - "windows", - "windows-core", + "wgpu-types 27.0.1", + "windows 0.58.0", + "windows-core 0.58.0", +] + +[[package]] +name = "wgpu-hal" +version = "28.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "293080d77fdd14d6b08a67c5487dfddbf874534bb7921526db56a7b75d7e3bef" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.10.0", + "block", + "bytemuck", + "cfg-if", + "cfg_aliases", + "core-graphics-types 0.2.0", + "glow", + "glutin_wgl_sys", + "gpu-allocator 0.28.0", + "gpu-descriptor", + "hashbrown 0.16.1", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal 0.33.0", + "naga 28.0.0", + "ndk-sys", + "objc", + "once_cell", + "ordered-float", + "parking_lot 0.12.5", + "portable-atomic", + "portable-atomic-util", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "smallvec", + "thiserror 2.0.17", + "wasm-bindgen", + "web-sys", + "wgpu-types 28.0.0", + "windows 0.62.2", + "windows-core 0.62.2", ] [[package]] @@ -4055,6 +4277,19 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wgpu-types" +version = "28.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e18308757e594ed2cd27dddbb16a139c42a683819d32a2e0b1b0167552f5840c" +dependencies = [ + "bitflags 2.10.0", + "bytemuck", + "js-sys", + "log", + "web-sys", +] + [[package]] name = "winapi" version = "0.3.9" @@ -4092,23 +4327,68 @@ version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core", + "windows-core 0.58.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core 0.62.2", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core 0.62.2", +] + [[package]] name = "windows-core" version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ - "windows-implement", - "windows-interface", - "windows-result", - "windows-strings", + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link", + "windows-threading", +] + [[package]] name = "windows-implement" version = "0.58.0" @@ -4120,6 +4400,17 @@ dependencies = [ "syn", ] +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-interface" version = "0.58.0" @@ -4131,12 +4422,33 @@ dependencies = [ "syn", ] +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core 0.62.2", + "windows-link", +] + [[package]] name = "windows-result" version = "0.2.0" @@ -4146,16 +4458,34 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-strings" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-result", + "windows-result 0.2.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -4249,6 +4579,15 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" diff --git a/iris b/iris index 7f4846a..a9c76e4 160000 --- a/iris +++ b/iris @@ -1 +1 @@ -Subproject commit 7f4846a2d377edc31293673443dffeb9ae9d4b76 +Subproject commit a9c76e4326c913592501fbe67cd3f2fc93040f4c diff --git a/src/bin/client/debug.rs b/src/bin/client/debug.rs index 36b240d..1059582 100644 --- a/src/bin/client/debug.rs +++ b/src/bin/client/debug.rs @@ -1,28 +1,30 @@ -use crate::Client; -use iris::prelude::*; +use crate::{Client, Rsc}; +use openworm::net::NetServerMsg; -pub fn debug(_client: &mut Client, ui: &mut Ui, _state: &UiState) { - ui.debug_layers(); - // let mut file = std::fs::OpenOptions::new() - // .write(true) - // .create(true) - // .truncate(true) - // .open("./old_msgs") - // .unwrap(); - // bincode::encode_into_std_write( - // self.msgs.clone(), - // &mut file, - // openworm::net::BINCODE_CONFIG, - // ) - // .unwrap(); - // let mut file = std::fs::OpenOptions::new() - // .read(true) - // .open("./old_msgs") - // .unwrap(); - // let msgs: Vec = - // bincode::decode_from_std_read(&mut file, openworm::net::BINCODE_CONFIG).unwrap(); - // for msg in msgs { - // println!("{msg:?}"); - // } - // client.ui.debug_layers(); +impl Client { + pub fn debug(&mut self, rsc: &mut Rsc) { + rsc.ui.debug_layers(); + // let mut file = std::fs::OpenOptions::new() + // .write(true) + // .create(true) + // .truncate(true) + // .open("./old_msgs") + // .unwrap(); + // bincode::encode_into_std_write( + // self.msgs.clone(), + // &mut file, + // openworm::net::BINCODE_CONFIG, + // ) + // .unwrap(); + let mut file = std::fs::OpenOptions::new() + .read(true) + .open("/home/bryan/.local/share/openworm/old_msgs") + .unwrap(); + let msgs: Vec = + bincode::decode_from_std_read(&mut file, openworm::net::BINCODE_CONFIG).unwrap(); + for msg in msgs { + println!("{msg:?}"); + } + // client.ui.debug_layers(); + } } diff --git a/src/bin/client/main.rs b/src/bin/client/main.rs index 8ef65bd..4d02682 100644 --- a/src/bin/client/main.rs +++ b/src/bin/client/main.rs @@ -11,10 +11,7 @@ use openworm::{ net::{ClientMsg, ServerMsg, install_crypto_provider}, rsc::DataDir, }; -use winit::{ - event::{ElementState, MouseButton, WindowEvent}, - window::WindowAttributes, -}; +use winit::event::{ElementState, MouseButton, WindowEvent}; mod account; mod debug; @@ -28,7 +25,9 @@ fn main() { DefaultApp::::run(); } +#[derive(DefaultUiState)] pub struct Client { + ui_state: DefaultUiState, dir: DataDir, data: ClientData, state: ClientState, @@ -37,6 +36,8 @@ pub struct Client { proxy: Proxy, } +pub type Rsc = DefaultRsc; + pub enum ClientEvent { Connect { send: NetSender }, ServerMsg(ServerMsg), @@ -46,14 +47,14 @@ pub enum ClientEvent { impl DefaultAppState for Client { type Event = ClientEvent; - fn window_attrs() -> WindowAttributes { - WindowAttributes::default().with_title("OPENWORM") - } - - fn new(ui: &mut Ui, _state: &UiState, proxy: Proxy) -> Self { + fn new( + ui_state: DefaultUiState, + rsc: &mut DefaultRsc, + proxy: Proxy, + ) -> Self { let dir = DataDir::default(); - let notif = WidgetPtr::default().add(ui); - let main_ui = WidgetPtr::default().add(ui); + let notif = WidgetPtr::default().add(rsc); + let main_ui = WidgetPtr::default().add(rsc); let bg = ( image(include_bytes!("./assets/fuit.jpg")), rect(Color::BLACK.alpha((0.8 * 255.0) as u8)), @@ -62,25 +63,26 @@ impl DefaultAppState for Client { ( bg, - main_ui.clone(), - notif.clone().pad(Padding::top(10)).align(Align::TOP_CENTER), + main_ui, + notif.pad(Padding::top(10)).align(Align::TOP_CENTER), ) .stack() - .set_root(ui); + .set_root(rsc); - let mut s = Self { + main_view(rsc).set_ptr(main_ui, rsc); + + Self { + ui_state, data: dir.load(CLIENT_DATA), state: Default::default(), dir, - main_ui: main_ui.clone(), + main_ui, notif, proxy, - }; - start_ui(&mut s, ui).set_ptr(&s.main_ui, ui); - s + } } - fn event(&mut self, event: ClientEvent, ui: &mut Ui, _state: &UiState) { + fn event(&mut self, event: Self::Event, rsc: &mut DefaultRsc) { match event { ClientEvent::Connect { send } => { let ClientState::Connect(connect) = self.state.take() else { @@ -98,20 +100,20 @@ impl DefaultAppState for Client { ClientEvent::ServerMsg(msg) => match msg { ServerMsg::SendMsg(msg) => { if let ClientState::LoggedIn(state) = &mut self.state - && let Some(msg_area) = &state.channel + && let Some(msg_area) = state.channel { - let msg = msg_widget(&msg.user, &msg.content).add(ui); - msg_area.get_mut().children.push(msg); + let msg = msg_widget(&msg.user, &msg.content).add_strong(rsc); + rsc.ui[msg_area].children.push(msg); } } ServerMsg::LoadMsgs(msgs) => { if let ClientState::LoggedIn(state) = &mut self.state - && let Some(msg_area) = &state.channel + && let Some(msg_area) = state.channel { for msg in msgs { state.msgs.push(msg.clone()); - let msg = msg_widget(&msg.user, &msg.content).add(ui); - msg_area.get_mut().children.push(msg); + let msg = msg_widget(&msg.user, &msg.content).add_strong(rsc); + rsc.ui[msg_area].children.push(msg); } } } @@ -126,32 +128,32 @@ impl DefaultAppState for Client { msgs: Vec::new(), username, }); - main_view(self, ui).set_ptr(&self.main_ui, ui); + main_view(rsc).set_ptr(self.main_ui, rsc); } ServerMsg::Error(error) => { let msg = format!("{error:?}"); - self.notif.get_mut().inner = Some(werror(ui, &msg)); + rsc.ui[self.notif].inner = Some(werror(&msg, rsc)); } }, ClientEvent::Err(msg) => { - self.notif.get_mut().inner = Some(werror(ui, &msg)); + rsc.ui[self.notif].inner = Some(werror(&msg, rsc)); } } } - fn exit(&mut self, _ui: &mut Ui, _state: &UiState) { + fn exit(&mut self, _: &mut DefaultRsc) { self.state.exit(); self.dir.save(CLIENT_DATA, &self.data); } - fn window_event(&mut self, event: WindowEvent, ui: &mut Ui, state: &UiState) { + fn window_event(&mut self, event: WindowEvent, rsc: &mut DefaultRsc) { if let WindowEvent::MouseInput { state: ElementState::Pressed, button: MouseButton::Middle, .. } = event { - debug::debug(self, ui, state); + self.debug(rsc); } } } diff --git a/src/bin/client/state.rs b/src/bin/client/state.rs index 58bc5ac..1f5415b 100644 --- a/src/bin/client/state.rs +++ b/src/bin/client/state.rs @@ -1,9 +1,8 @@ +use crate::net::NetHandle; use iris::prelude::*; use openworm::net::NetServerMsg; use std::thread::JoinHandle; -use crate::net::NetHandle; - #[derive(Default)] pub struct Connect { pub handle: Option>, diff --git a/src/bin/client/ui/connect.rs b/src/bin/client/ui/connect.rs index 55254a0..476d90a 100644 --- a/src/bin/client/ui/connect.rs +++ b/src/bin/client/ui/connect.rs @@ -1,6 +1,6 @@ use super::*; -pub fn start_ui(client: &mut Client, ui: &mut Ui) -> WidgetRef { +pub fn start_ui(rsc: &mut Rsc) -> WidgetRef { let mut accounts = Span::empty(Dir::DOWN); accounts.push( @@ -9,16 +9,14 @@ pub fn start_ui(client: &mut Client, ui: &mut Ui) -> WidgetRef { .center_text() .color(Color::GRAY) .height(60) - .add(ui), + .add_strong(rsc), ); - let connect = Button::submit("connect", ui); - let create = Button::submit("create", ui); - let connect_ = connect.clone(); - let create_ = create.clone(); - ui.on(connect.view(), Submit, move |_| { - connect_.disable(); - create_.disable(); + let connect = Button::submit("connect", rsc); + let create = Button::submit("create", rsc); + connect.on(Submit, move |_, rsc| { + connect.disable(); + create.disable(); }); let connect_ = connect.clone(); diff --git a/src/bin/client/ui/main.rs b/src/bin/client/ui/main.rs index 339bcbd..50d89dd 100644 --- a/src/bin/client/ui/main.rs +++ b/src/bin/client/ui/main.rs @@ -1,22 +1,19 @@ +use crate::Rsc; + use super::*; -use crate::state::{ClientState, LoggedIn}; -use openworm::net::{ClientMsg, NetClientMsg}; pub const SIZE: u32 = 20; -pub fn main_view(client: &mut Client, ui: &mut Ui) -> WidgetRef { - let ClientState::LoggedIn(state) = &mut client.state else { - panic!("we ain't logged in buh"); - }; - let msg_panel = msg_panel(ui, state); +pub fn main_view(rsc: &mut Rsc) -> WidgetRef { + let msg_panel = msg_panel(rsc); let side_bar = rect(Color::BLACK.brighter(0.05)).width(80); - (side_bar, msg_panel).span(Dir::RIGHT).add(ui) + (side_bar, msg_panel).span(Dir::RIGHT).add(rsc) } -pub fn msg_widget(username: &str, content: &str) -> impl WidgetRet { +pub fn msg_widget(username: &str, content: &str) -> impl WidgetIdFn { let content = wtext(content) - .editable(false) + .editable(EditMode::MultiLine) .size(SIZE) .wrap(true) .attr::(()); @@ -36,40 +33,32 @@ pub fn msg_widget(username: &str, content: &str) -> impl WidgetRet { .to_any() } -pub fn msg_panel(ui: &mut Ui, state: &mut LoggedIn) -> WidgetRef { - let msg_area = Span::empty(Dir::DOWN).gap(15).add(ui); - state.channel = Some(msg_area.clone()); +pub fn msg_panel(rsc: &mut Rsc) -> WidgetRef { + let msg_area = Span::empty(Dir::DOWN).gap(15); let send_text = wtext("") - .editable(false) + .editable(EditMode::MultiLine) .size(SIZE) .wrap(true) .hint(hint("send message")) - .add(ui); + .add(rsc); + + let msg_area = msg_area.add(rsc); ( msg_area - .clone() - .scroll() + .scrollable() .pad(Padding::x(15).with_top(15)) .height(rest(1)), send_text - .clone() - .on(Submit, move |ctx| { - let ClientState::LoggedIn(state) = &mut ctx.state.state else { - panic!("we ain't logged in buh"); - }; - let content = ctx.widget.get_mut().take(); - let msg = NetClientMsg { - content: content.clone(), - }; - state.network.send(ClientMsg::SendMsg(msg.clone())); - let msg = msg_widget(&state.username, &content).add(ctx.ui); - msg_area.get_mut().children.push(msg); + .on(Submit, move |ctx, rsc| { + let content = ctx.widget.edit(rsc).take(); + let msg = msg_widget("ur mothe:", &content).add_strong(rsc); + rsc.ui[msg_area].children.push(msg); }) .pad(15) .attr::(send_text) - .scroll() + .scrollable() .masked() .background(rect(Color::BLACK.brighter(0.05)).radius(15)) .pad(15) @@ -78,5 +67,5 @@ pub fn msg_panel(ui: &mut Ui, state: &mut LoggedIn) -> WidgetRef { ) .span(Dir::DOWN) .width(rest(1)) - .add(ui) + .add(rsc) } diff --git a/src/bin/client/ui/misc.rs b/src/bin/client/ui/misc.rs index a0a5d36..bb673b2 100644 --- a/src/bin/client/ui/misc.rs +++ b/src/bin/client/ui/misc.rs @@ -1,106 +1,101 @@ use super::*; -pub fn werror(ui: &mut Ui, msg: &str) -> WidgetRef { +pub fn werror(msg: &str, rsc: &mut Rsc) -> WidgetHandle { wtext(msg) .size(20) .pad(10) .background(rect(Color::RED).radius(10)) - .add(ui) + .add_strong(rsc) } -pub fn hint(msg: impl Into) -> TextBuilder { +pub fn hint(msg: impl Into) -> TextBuilder { wtext(msg).size(20).color(Color::GRAY) } -pub fn field_widget(name: &str, hint_text: &str, ui: &mut Ui) -> WidgetRef { +pub fn field_widget(name: &str, hint_text: &str, rsc: &mut Rsc) -> WidgetRef { wtext(name) - .editable(true) + .editable(EditMode::SingleLine) .size(20) .hint(hint(hint_text)) - .add(ui) + .add(rsc) } -pub fn field_box(field: WidgetRef, ui: &mut Ui) -> WidgetRef { +pub fn field_box(field: WidgetRef, rsc: &mut Rsc) -> WidgetRef { field - .clone() .pad(10) .background(rect(Color::BLACK.brighter(0.1)).radius(15)) .attr::(field) - .add(ui) + .add(rsc) } -#[derive(Clone)] +#[derive(Clone, Copy, WidgetView)] pub struct Button { - color: UiColor, + #[root] root: WidgetRef, rect: WidgetRef, enabled: Handle, } -impl WidgetView for Button { - fn view(&self) -> &WidgetRef { - &self.root - } -} +// impl WidgetView for Button { +// fn view(&self) -> &WidgetRef { +// &self.root +// } +// } impl Button { - pub fn new(text: &str, color: UiColor, ui: &mut Ui) -> Self { - let rect = rect(color).radius(15).add(ui); - let enabled = Handle::from(true); - let enabled_ = enabled.clone(); - let enabled__ = enabled.clone(); + pub fn new(text: &str, color: UiColor, rsc: &mut Rsc) -> Self { + let rect = rect(color).radius(15).add(rsc); + // let enabled = Handle::from(true); + // let enabled_ = enabled.clone(); + // let enabled__ = enabled.clone(); let root = rect - .clone() .on( CursorSense::HoverStart | CursorSense::unclick(), - move |ctx| { - if !*enabled_.get() { - return; - } - ctx.widget.get_mut().color = color.brighter(0.1); + move |ctx, rsc: &mut Rsc| { + // if !*enabled_.get() { + // return; + // } + rsc.ui[ctx.widget].color = color.brighter(0.1); }, ) - .on(CursorSense::HoverEnd, move |ctx| { - if !*enabled__.get() { - return; - } - ctx.widget.get_mut().color = color; + .on(CursorSense::HoverEnd, move |ctx, rsc| { + // if !*enabled__.get() { + // return; + // } + rsc.ui[ctx.widget].color = color; }) .height(60) .foreground(wtext(text).size(25).text_align(Align::CENTER)) - .add(ui); - let root_ = root.clone(); - let enabled_ = enabled.clone(); - rect.clone() - .on(CursorSense::click(), move |ctx| { - if !*enabled_.get() { - return; - } - ctx.widget.get_mut().color = color.darker(0.2); - ctx.ui.run_event(ctx.state, &root_, Submit, ()); - }) - .add(ui); + .add(rsc); + // let enabled_ = enabled.clone(); + rect.on(CursorSense::click(), move |ctx, rsc: &mut Rsc| { + // if !*enabled_.get() { + // return; + // } + rsc.ui[ctx.widget].color = color.darker(0.2); + rsc.run_event::(root, (), ctx.state); + }) + .add(rsc); Self { root, rect, - color, - enabled, + // enabled, } } - pub fn submit(text: &str, ui: &mut Ui) -> Self { - Self::new(text, color::GREEN, ui) + pub fn submit(text: &str, rsc: &mut Rsc) -> Self { + Self::new(text, color::GREEN, rsc) } - pub fn disable(&self) { + pub fn disable(&self, rsc: &mut Rsc) { *self.enabled.get_mut() = false; self.rect.get_mut().color = self.color.darker(0.8); } } widget_trait! { - pub trait Stuff; - fn modal(self, width: impl UiNum) -> impl WidgetIdFn { + pub trait Stuff; + fn modal(self, width: impl UiNum) -> impl WidgetIdFn { |ui| { self .pad(15) diff --git a/src/bin/client/ui/mod.rs b/src/bin/client/ui/mod.rs index 560d36c..ee7d85c 100644 --- a/src/bin/client/ui/mod.rs +++ b/src/bin/client/ui/mod.rs @@ -1,14 +1,11 @@ -use crate::Client; +use crate::Rsc; use iris::prelude::*; -use len_fns::*; +pub mod color; mod connect; mod main; mod misc; -pub mod color; pub use connect::*; pub use main::*; pub use misc::*; - -event_ctx!(Client);