From d77cd31387cace6fccb227aebc6d8008b57bf2b7 Mon Sep 17 00:00:00 2001 From: Tristan Debrunner Date: Tue, 17 Jan 2023 15:31:32 -0700 Subject: [PATCH] Transition to iced 0.10 and other version bumps --- Cargo.lock | 3296 +++++++++++------ fonts/Cargo.toml | 2 +- fonts/src/lib.rs | 2 +- matrix-drawing/Cargo.toml | 10 +- refbox/Cargo.toml | 31 +- refbox/resources/Roboto-Medium.ttf | Bin 109536 -> 168644 bytes refbox/resources/arrow_drop_down.svg | 9 + refbox/resources/arrow_drop_up.svg | 9 + refbox/resources/backspace.svg | 9 + refbox/resources/pause.svg | 9 + refbox/resources/play_arrow.svg | 9 + refbox/src/app/mod.rs | 255 +- refbox/src/app/style.rs | 242 +- refbox/src/app/view_builders/configuration.rs | 735 ++-- refbox/src/app/view_builders/confirmation.rs | 167 +- refbox/src/app/view_builders/game_info.rs | 81 +- .../keypad_pages/game_number_edit.rs | 44 +- .../src/app/view_builders/keypad_pages/mod.rs | 253 +- .../keypad_pages/penalty_edit.rs | 152 +- .../view_builders/keypad_pages/score_add.rs | 73 +- .../keypad_pages/team_timeout_edit.rs | 57 +- refbox/src/app/view_builders/list_selector.rs | 63 +- refbox/src/app/view_builders/main_view.rs | 179 +- refbox/src/app/view_builders/penalties.rs | 126 +- refbox/src/app/view_builders/score_edit.rs | 172 +- .../src/app/view_builders/shared_elements.rs | 531 +-- refbox/src/app/view_builders/time_edit.rs | 80 +- refbox/src/main.rs | 12 +- refbox/src/sim_app/mod.rs | 77 +- refbox/src/sound_controller/mod.rs | 4 +- uwh-common/Cargo.toml | 2 +- 31 files changed, 3810 insertions(+), 2881 deletions(-) create mode 100644 refbox/resources/arrow_drop_down.svg create mode 100644 refbox/resources/arrow_drop_up.svg create mode 100644 refbox/resources/backspace.svg create mode 100644 refbox/resources/pause.svg create mode 100644 refbox/resources/play_arrow.svg diff --git a/Cargo.lock b/Cargo.lock index 0d7e6401..c52d218c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,7 +9,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0e9889e6db118d49d88d84728d0e964d973a5680befb5f85f55141beea5c20b" dependencies = [ "libc", - "mach 0.1.2", + "mach", ] [[package]] @@ -20,14 +20,14 @@ checksum = "99696c398cbaf669d2368076bdb3d627fb0ce51a26899d7c61228c5c0af3bf4a" dependencies = [ "CoreFoundation-sys", "libc", - "mach 0.1.2", + "mach", ] [[package]] name = "ab_glyph" -version = "0.2.21" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5110f1c78cf582855d895ecd0746b653db010cec6d9f5575293f27934d980a39" +checksum = "80179d7dd5d7e8c285d67c4a1e652972a92de7475beddfb92028c76463b13225" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -41,9 +41,9 @@ checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" [[package]] name = "addr2line" -version = "0.19.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] @@ -56,24 +56,37 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "once_cell", "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + [[package]] name = "alphagen" version = "0.1.0" @@ -85,14 +98,14 @@ dependencies = [ [[package]] name = "alsa" -version = "0.6.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5915f52fe2cf65e83924d037b6c5290b7cee097c6b5c8700746e6168a343fd6b" +checksum = "e2562ad8dcf0f789f65c6fdaad8a8a9708ed6b488e649da28c01656ad66b8b47" dependencies = [ "alsa-sys", "bitflags 1.3.2", "libc", - "nix 0.23.2", + "nix 0.24.3", ] [[package]] @@ -106,16 +119,34 @@ dependencies = [ ] [[package]] -name = "android-tzdata" -version = "0.1.1" +name = "android-activity" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" +checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0" +dependencies = [ + "android-properties", + "bitflags 1.3.2", + "cc", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys 0.4.1+23.1.7779620", + "num_enum 0.6.1", +] [[package]] -name = "android_glue" -version = "0.2.3" +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android-tzdata" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "000444226fcff248f2bc4c7625be32c63caccfecc2723a2b9f78a7487a49c407" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" [[package]] name = "android_system_properties" @@ -128,30 +159,29 @@ dependencies = [ [[package]] name = "anstream" -version = "0.3.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" dependencies = [ "utf8parse", ] @@ -167,9 +197,9 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", "windows-sys 0.48.0", @@ -177,9 +207,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.71" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "approx" @@ -208,12 +238,6 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "arrayvec" version = "0.7.4" @@ -223,28 +247,50 @@ dependencies = [ "serde", ] +[[package]] +name = "ash" +version = "0.37.3+1.3.251" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" +dependencies = [ + "libloading 0.7.4", +] + [[package]] name = "async-channel" -version = "1.8.0" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" +checksum = "d37875bd9915b7d67c2f117ea2c30a0989874d0b2cb694fe25403c85763c0c9e" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener 3.1.0", + "event-listener-strategy", "futures-core", + "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.5.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" +checksum = "fc5ea910c42e5ab19012bab31f53cb4d63d54c3a27730f9a833a88efcf4bb52d" dependencies = [ - "async-lock", + "async-lock 3.1.0", "async-task", "concurrent-queue", - "fastrand", - "futures-lite", + "fastrand 2.0.1", + "futures-lite 2.0.1", "slab", ] @@ -254,12 +300,12 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" dependencies = [ - "async-channel", + "async-channel 1.9.0", "async-executor", - "async-io", - "async-lock", + "async-io 1.13.0", + "async-lock 2.8.0", "blocking", - "futures-lite", + "futures-lite 1.13.0", "once_cell", ] @@ -269,44 +315,92 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ - "async-lock", + "async-lock 2.8.0", "autocfg", - "cfg-if 1.0.0", + "cfg-if", "concurrent-queue", - "futures-lite", + "futures-lite 1.13.0", "log", "parking", - "polling", - "rustix", + "polling 2.8.0", + "rustix 0.37.27", + "slab", + "socket2 0.4.10", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ed9d5715c2d329bf1b4da8d60455b99b187f27ba726df2883799af9af60997" +dependencies = [ + "async-lock 3.1.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.0.1", + "parking", + "polling 3.3.0", + "rustix 0.38.24", "slab", - "socket2", + "tracing", "waker-fn", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", ] [[package]] name = "async-lock" -version = "2.7.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" +checksum = "deb2ab2aa8a746e221ab826c73f48bc6ba41be6763f0855cb249eb6d154cf1d7" dependencies = [ - "event-listener", + "event-listener 3.1.0", + "event-listener-strategy", + "pin-project-lite", ] [[package]] name = "async-process" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9" +checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" dependencies = [ - "async-io", - "async-lock", - "autocfg", + "async-io 1.13.0", + "async-lock 2.8.0", + "async-signal", "blocking", - "cfg-if 1.0.0", - "event-listener", - "futures-lite", - "rustix", - "signal-hook", + "cfg-if", + "event-listener 3.1.0", + "futures-lite 1.13.0", + "rustix 0.38.24", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-signal" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" +dependencies = [ + "async-io 2.2.0", + "async-lock 2.8.0", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 0.38.24", + "signal-hook-registry", + "slab", "windows-sys 0.48.0", ] @@ -316,16 +410,16 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" dependencies = [ - "async-channel", + "async-channel 1.9.0", "async-global-executor", - "async-io", - "async-lock", + "async-io 1.13.0", + "async-lock 2.8.0", "async-process", "crossbeam-utils", "futures-channel", "futures-core", "futures-io", - "futures-lite", + "futures-lite 1.13.0", "gloo-timers", "kv-log-macro", "log", @@ -339,15 +433,15 @@ dependencies = [ [[package]] name = "async-task" -version = "4.4.0" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" +checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" [[package]] name = "atomic-waker" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "atty" @@ -374,38 +468,32 @@ checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" [[package]] name = "backtrace" -version = "0.3.67" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", - "cfg-if 1.0.0", + "cfg-if", "libc", - "miniz_oxide 0.6.2", + "miniz_oxide", "object", "rustc-demangle", ] -[[package]] -name = "base-x" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" - [[package]] name = "base64" -version = "0.21.2" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "bindgen" -version = "0.64.0" +version = "0.69.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4" +checksum = "9ffcebc3849946a7170a05992aac39da343a90676ab392c51a4280981d6379c2" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.1", "cexpr", "clang-sys", "lazy_static", @@ -416,9 +504,24 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 1.0.109", + "syn 2.0.39", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bit_field" version = "0.10.2" @@ -433,9 +536,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.0.2" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487f1e0fcbe47deb8b0574e646def1c903389d95241dd1bbcc6ce4a715dfc0c1" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "block" @@ -443,26 +546,46 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" +[[package]] +name = "block-sys" +version = "0.1.0-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" +dependencies = [ + "objc-sys", +] + +[[package]] +name = "block2" +version = "0.2.0-alpha.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" +dependencies = [ + "block-sys", + "objc2-encode", +] + [[package]] name = "blocking" -version = "1.3.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ - "async-channel", - "async-lock", + "async-channel 2.1.0", + "async-lock 3.1.0", "async-task", - "atomic-waker", - "fastrand", - "futures-lite", - "log", + "fastrand 2.0.1", + "futures-io", + "futures-lite 2.0.1", + "piper", + "tracing", ] [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byte-slice-cast" @@ -472,35 +595,35 @@ checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" [[package]] name = "bytemuck" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" +checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.39", ] [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cache-padded" @@ -510,21 +633,26 @@ checksum = "981520c98f422fcc584dc1a95c334e6953900b9106bc47a9839b81790009eb21" [[package]] name = "calloop" -version = "0.9.3" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf2eec61efe56aa1e813f5126959296933cf0700030e4314786c48779a66ab82" +checksum = "52e0d00eb1ea24371a97d2da6201c6747a633dc6dc1988ef503403b4c59504a8" dependencies = [ + "bitflags 1.3.2", "log", - "nix 0.22.3", + "nix 0.25.1", + "slotmap", + "thiserror", + "vec_map", ] [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", + "libc", ] [[package]] @@ -542,12 +670,6 @@ dependencies = [ "nom", ] -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -555,27 +677,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cgl" -version = "0.3.2" +name = "cfg_aliases" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" -dependencies = [ - "libc", -] +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "chrono" -version = "0.4.26" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", - "time 0.1.45", "wasm-bindgen", - "winapi", + "windows-targets 0.48.5", ] [[package]] @@ -608,25 +726,23 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.8" +version = "4.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9394150f5b4273a1763355bd1c2ec54cc5a2593f790587bcd6b2c947cfa9211" +checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" dependencies = [ "clap_builder", - "clap_derive 4.3.2", - "once_cell", + "clap_derive 4.4.7", ] [[package]] name = "clap_builder" -version = "4.3.8" +version = "4.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a78fbdd3cc2914ddf37ba444114bc7765bbdcb55ec9cbe6fa054f0137400717" +checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" dependencies = [ "anstream", "anstyle", - "bitflags 1.3.2", - "clap_lex 0.5.0", + "clap_lex 0.6.0", "strsim", ] @@ -645,14 +761,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.3.2" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.39", ] [[package]] @@ -666,9 +782,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "clipboard-win" @@ -708,18 +824,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "983a7010836ecd04dde2c6d27a0cb56ec5d21572177e782bdcb24a600124e921" dependencies = [ "thiserror", - "x11rb", + "x11rb 0.9.0", ] [[package]] name = "coarsetime" -version = "0.1.23" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90d114103adbc625300f346d4d09dfb4ab1c4a8df6868435dd903392ecf4354" +checksum = "71367d3385c716342014ad17e3d19f7788ae514885a1f4c24f500260fb365e1a" dependencies = [ "libc", "once_cell", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] @@ -732,8 +848,8 @@ dependencies = [ "bitflags 1.3.2", "block", "cocoa-foundation", - "core-foundation 0.9.3", - "core-graphics 0.22.3", + "core-foundation", + "core-graphics", "foreign-types", "libc", "objc", @@ -741,19 +857,28 @@ dependencies = [ [[package]] name = "cocoa-foundation" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ "bitflags 1.3.2", "block", - "core-foundation 0.9.3", + "core-foundation", "core-graphics-types", - "foreign-types", "libc", "objc", ] +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + [[package]] name = "collect_array" version = "0.1.3" @@ -772,6 +897,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "com-rs" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642" + [[package]] name = "combine" version = "4.6.6" @@ -784,9 +915,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" dependencies = [ "crossbeam-utils", ] @@ -797,17 +928,17 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e37668cb35145dcfaa1931a5f37fde375eeae8068b4c0d2f289da28a270b2d2c" dependencies = [ - "directories", + "directories 4.0.1", "serde", "thiserror", - "toml", + "toml 0.5.11", ] [[package]] name = "conquer-once" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c6d3a9775a69f6d1fe2cc888999b67ed30257d3da4d2af91984e722f2ec918a" +checksum = "5d008a441c0f269f36ca13712528069a86a3e60dffee1d98b976eb3b0b2160b4" dependencies = [ "conquer-util", ] @@ -818,50 +949,22 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e763eef8846b13b380f37dfecda401770b0ca4e56e95170237bd7c25c7db3582" -[[package]] -name = "core-foundation" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" -dependencies = [ - "core-foundation-sys 0.7.0", - "libc", -] - [[package]] name = "core-foundation" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ - "core-foundation-sys 0.8.4", + "core-foundation-sys", "libc", ] -[[package]] -name = "core-foundation-sys" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" - [[package]] name = "core-foundation-sys" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" -[[package]] -name = "core-graphics" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.7.0", - "foreign-types", - "libc", -] - [[package]] name = "core-graphics" version = "0.22.3" @@ -869,7 +972,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3", + "core-foundation", "core-graphics-types", "foreign-types", "libc", @@ -882,64 +985,73 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3", - "libc", -] - -[[package]] -name = "core-video-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828" -dependencies = [ - "cfg-if 0.1.10", - "core-foundation-sys 0.7.0", - "core-graphics 0.19.2", + "core-foundation", "libc", - "objc", ] [[package]] name = "coreaudio-rs" -version = "0.10.0" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11894b20ebfe1ff903cbdc52259693389eea03b94918a2def2c30c3bf227ad88" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" dependencies = [ "bitflags 1.3.2", + "core-foundation-sys", "coreaudio-sys", ] [[package]] name = "coreaudio-sys" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f034b2258e6c4ade2f73bf87b21047567fb913ee9550837c2316d139b0262b24" +checksum = "f3120ebb80a9de008e638ad833d4127d50ea3d3a960ea23ea69bc66d9358a028" dependencies = [ "bindgen", ] +[[package]] +name = "cosmic-text" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0b68966c2543609f8d92f9d33ac3b719b2a67529b0c6c0b3e025637b477eef9" +dependencies = [ + "aliasable", + "fontdb", + "libm", + "log", + "rangemap", + "rustybuzz 0.8.0", + "swash", + "sys-locale", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + [[package]] name = "cpal" -version = "0.14.2" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f342c1b63e185e9953584ff2199726bf53850d96610a310e3aca09e9405a2d0b" +checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" dependencies = [ "alsa", - "core-foundation-sys 0.8.4", + "core-foundation-sys", "coreaudio-rs", - "jni", + "dasp_sample", + "jni 0.19.0", "js-sys", "libc", - "mach 0.3.2", - "ndk 0.7.0", + "mach2", + "ndk", "ndk-context", "oboe", "once_cell", "parking_lot 0.12.1", - "stdweb", - "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", "web-sys", - "windows 0.37.0", + "windows 0.46.0", ] [[package]] @@ -948,14 +1060,14 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] name = "creek" -version = "0.2.3" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5144c0d2ade935e744126361ede4007ca3d7d36d06bc3d227b49393c511094b3" +checksum = "b01a32e142cd462c493f706a208780b3f90bed74b55c4ee9f6a67d3f4fe292bd" dependencies = [ "creek-core", "creek-decode-symphonia", @@ -964,28 +1076,29 @@ dependencies = [ [[package]] name = "creek-core" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee99446d0b490e7b6bd094772ec2067cfa0a94bb2a2ed97b141cacf7a533551" +checksum = "324fdebf340780c68b62d526f524a4cad41495db651d9c1333d2930ba189d6e4" dependencies = [ "rtrb", ] [[package]] name = "creek-decode-symphonia" -version = "0.1.1" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f924e3a21a66fe9e2d6628a33081b5d1934e8d5c8165541d731fb410479e177" +checksum = "8371cf1deee7e3df88125c6c54e95e7966ba62e508b041db238f48a383119706" dependencies = [ "creek-core", + "log", "symphonia", ] [[package]] name = "creek-encode-wav" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d86aa83b7e6ff8d7bcf452a7ea821ad3dc01b6fd932817f0d469da820037a4b" +checksum = "063e2422d455bb48879d04b0787b1e697e24c6fd3f3a3fa54554636e1595f316" dependencies = [ "byte-slice-cast", "creek-core", @@ -997,7 +1110,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crossbeam-utils", ] @@ -1007,7 +1120,7 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] @@ -1019,7 +1132,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" dependencies = [ "autocfg", - "cfg-if 1.0.0", + "cfg-if", "crossbeam-utils", "memoffset 0.9.0", "scopeguard", @@ -1031,7 +1144,7 @@ version = "0.8.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -1041,45 +1154,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] -name = "cty" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" - -[[package]] -name = "darling" -version = "0.13.4" +name = "d3d12" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +checksum = "d8f0de2f5a8e7bd4a9eec0e3c781992a4ce1724f68aec7d7a3715344de8b39da" dependencies = [ - "darling_core", - "darling_macro", + "bitflags 1.3.2", + "libloading 0.7.4", + "winapi", ] [[package]] -name = "darling_core" -version = "0.13.4" +name = "dasp_sample" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 1.0.109", -] +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" [[package]] -name = "darling_macro" -version = "0.13.4" +name = "data-url" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core", - "quote", - "syn 1.0.109", -] +checksum = "8d7439c3735f405729d52c3fbbe4de140eaf938a1fe47d227c27f8254d4302a5" [[package]] name = "defmt" @@ -1101,7 +1196,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.39", ] [[package]] @@ -1114,7 +1209,17 @@ dependencies = [ ] [[package]] -name = "derivative" +name = "deranged" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derivative" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" @@ -1130,7 +1235,16 @@ version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" dependencies = [ - "dirs-sys", + "dirs-sys 0.3.7", +] + +[[package]] +name = "directories" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" +dependencies = [ + "dirs-sys 0.4.1", ] [[package]] @@ -1145,10 +1259,16 @@ dependencies = [ ] [[package]] -name = "discard" -version = "1.0.4" +name = "dirs-sys" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] [[package]] name = "dispatch" @@ -1164,7 +1284,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.39", ] [[package]] @@ -1173,7 +1293,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading 0.8.0", + "libloading 0.8.1", ] [[package]] @@ -1184,15 +1304,15 @@ checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" [[package]] name = "either" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "embedded-graphics" -version = "0.7.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "750082c65094fbcc4baf9ba31583ce9a8bb7f52cadfb96f6164b1bc7f922f32b" +checksum = "0649998afacf6d575d126d83e68b78c0ab0e00ca2ac7e9b3db11b4cbe8274ef0" dependencies = [ "az", "byteorder", @@ -1203,9 +1323,9 @@ dependencies = [ [[package]] name = "embedded-graphics-core" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8b1239db5f3eeb7e33e35bd10bd014e7b2537b17e071f726a09351431337cfa" +checksum = "ba9ecd261f991856250d2207f6d8376946cd9f412a2165d3b75bc87a0bc7a044" dependencies = [ "az", "byteorder", @@ -1213,18 +1333,18 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] name = "enum-derive-2018" -version = "2.0.1" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c12aad72e0c5b4f1e0cc866187d8812deeaa1fccc892d3baf44c2b154d3e27b" +checksum = "bdda1596b510968293c861d7bcce74303321b3d4db91bd4467533b7c9abc8dfe" [[package]] name = "env_logger" @@ -1247,33 +1367,32 @@ checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" [[package]] name = "errno" -version = "0.3.1" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" dependencies = [ - "errno-dragonfly", "libc", "windows-sys 0.48.0", ] [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "error-code" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" dependencies = [ - "cc", "libc", + "str-buf", ] [[package]] -name = "error-code" -version = "2.3.1" +name = "etagere" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +checksum = "306960881d6c46bd0dd6b7f07442a441418c08d0d3e63d8d080b0f64c6343e4e" dependencies = [ - "libc", - "str-buf", + "euclid", + "svg_fmt", ] [[package]] @@ -1291,6 +1410,27 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "event-listener" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96b852f1345da36d551b9473fa1e2b1eb5c5195585c6c018118bc92a8d91160" +dependencies = [ + "event-listener 3.1.0", + "pin-project-lite", +] + [[package]] name = "exr" version = "1.6.4" @@ -1301,12 +1441,18 @@ dependencies = [ "flume", "half", "lebe", - "miniz_oxide 0.7.1", + "miniz_oxide", "rayon-core", "smallvec", "zune-inflate", ] +[[package]] +name = "fast-srgb8" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" + [[package]] name = "fastrand" version = "1.9.0" @@ -1316,30 +1462,36 @@ dependencies = [ "instant", ] +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + [[package]] name = "fdeflate" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +checksum = "64d6dafc854908ff5da46ff3f8f473c6984119a2876a383a860246dd7841a868" dependencies = [ "simd-adler32", ] [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", - "miniz_oxide 0.7.1", + "miniz_oxide", ] [[package]] name = "float-cmp" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" dependencies = [ "num-traits", ] @@ -1352,12 +1504,9 @@ checksum = "28a80e3145d8ad11ba0995949bbcf48b9df2be62772b3d351ef017dff6ecb853" [[package]] name = "float_next_after" -version = "0.1.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fc612c5837986b7104a87a0df74a5460931f1c5274be12f8d0f40aa2f30d632" -dependencies = [ - "num-traits", -] +checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" [[package]] name = "flume" @@ -1378,6 +1527,29 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "fontconfig-parser" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "674e258f4b5d2dcd63888c01c68413c51f565e8af99d2f7701c7b81d79ef41c4" +dependencies = [ + "roxmltree", +] + +[[package]] +name = "fontdb" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af8d8cbea8f21307d7e84bca254772981296f058a1d36b461bf4d83a7499fc9e" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2 0.6.2", + "slotmap", + "tinyvec", + "ttf-parser 0.19.2", +] + [[package]] name = "fontdue" version = "0.7.3" @@ -1421,9 +1593,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -1436,9 +1608,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -1446,15 +1618,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -1464,9 +1636,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-lite" @@ -1474,7 +1646,7 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ - "fastrand", + "fastrand 1.9.0", "futures-core", "futures-io", "memchr", @@ -1483,34 +1655,48 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "futures-lite" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3831c2651acb5177cbd83943f3d9c8912c5ad03c76afcc0e9511ba568ec5ebb" +dependencies = [ + "fastrand 2.0.1", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.39", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -1536,14 +1722,14 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] @@ -1559,35 +1745,21 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" - -[[package]] -name = "gl_generator" -version = "0.14.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" -dependencies = [ - "khronos_api", - "log", - "xml-rs", -] +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "glam" -version = "0.10.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579160312273c954cc51bd440f059dde741029ac8daf8c84fece76cb77f62c15" -dependencies = [ - "version_check", -] +checksum = "518faa5064866338b013ff9b2350dc318e14cc4fcd6cb8206d7e7c9886c98815" [[package]] name = "glam" -version = "0.21.3" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518faa5064866338b013ff9b2350dc318e14cc4fcd6cb8206d7e7c9886c98815" +checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945" [[package]] name = "glob" @@ -1609,9 +1781,9 @@ dependencies = [ [[package]] name = "glow" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8bd5877156a19b8ac83a29b2306fe20537429d318f3ff0a1a2119f8d9c61919" +checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728" dependencies = [ "js-sys", "slotmap", @@ -1620,132 +1792,84 @@ dependencies = [ ] [[package]] -name = "glow_glyph" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4e62c64947b9a24fe20e2bba9ad819ecb506ef5c8df7ffc4737464c6df9510" -dependencies = [ - "bytemuck", - "glow", - "glyph_brush", - "log", -] - -[[package]] -name = "glutin" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00ea9dbe544bc8a657c4c4a798c2d16cd01b549820e47657297549d28371f6d2" -dependencies = [ - "android_glue", - "cgl", - "cocoa", - "core-foundation 0.9.3", - "glutin_egl_sys", - "glutin_emscripten_sys", - "glutin_gles2_sys", - "glutin_glx_sys", - "glutin_wgl_sys", - "lazy_static", - "libloading 0.7.4", - "log", - "objc", - "osmesa-sys", - "parking_lot 0.11.2", - "wayland-client", - "wayland-egl", - "winapi", - "winit", -] - -[[package]] -name = "glutin_egl_sys" -version = "0.1.6" +name = "glyphon" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68900f84b471f31ea1d1355567eb865a2cf446294f06cef8d653ed7bcf5f013d" +checksum = "5e87caa7459145f5e5f167bf34db4532901404c679e62339fb712a0e3ccf722a" dependencies = [ - "gl_generator", - "winapi", + "cosmic-text", + "etagere", + "lru", + "wgpu", ] [[package]] -name = "glutin_emscripten_sys" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80de4146df76e8a6c32b03007bc764ff3249dcaeb4f675d68a06caf1bac363f1" - -[[package]] -name = "glutin_gles2_sys" -version = "0.1.5" +name = "gpu-alloc" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094e708b730a7c8a1954f4f8a31880af00eb8a1c5b5bf85d28a0a3c6d69103" +checksum = "22beaafc29b38204457ea030f6fb7a84c9e4dd1b86e311ba0542533453d87f62" dependencies = [ - "gl_generator", - "objc", + "bitflags 1.3.2", + "gpu-alloc-types", ] [[package]] -name = "glutin_glx_sys" -version = "0.1.8" +name = "gpu-alloc-types" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93d0575865098580c5b3a423188cd959419912ea60b1e48e8b3b526f6d02468" +checksum = "54804d0d6bc9d7f26db4eaec1ad10def69b599315f487d32c334a80d1efe67a5" dependencies = [ - "gl_generator", - "x11-dl", + "bitflags 1.3.2", ] [[package]] -name = "glutin_wgl_sys" -version = "0.1.5" +name = "gpu-allocator" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5951a1569dbab865c6f2a863efafff193a93caf05538d193e9e3816d21696" +checksum = "ce95f9e2e11c2c6fadfce42b5af60005db06576f231f5c92550fdded43c423e8" dependencies = [ - "gl_generator", + "backtrace", + "log", + "thiserror", + "winapi", + "windows 0.44.0", ] [[package]] -name = "glyph_brush" -version = "0.7.7" +name = "gpu-descriptor" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4edefd123f28a0b1d41ec4a489c2b43020b369180800977801611084f342978d" +checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ - "glyph_brush_draw_cache", - "glyph_brush_layout", - "ordered-float", - "rustc-hash", - "twox-hash", + "bitflags 2.4.1", + "gpu-descriptor-types", + "hashbrown 0.14.2", ] [[package]] -name = "glyph_brush_draw_cache" -version = "0.1.5" +name = "gpu-descriptor-types" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6010675390f6889e09a21e2c8b575b3ee25667ea8237a8d59423f73cb8c28610" +checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" dependencies = [ - "ab_glyph", - "crossbeam-channel", - "crossbeam-deque", - "linked-hash-map", - "rayon", - "rustc-hash", + "bitflags 2.4.1", ] [[package]] -name = "glyph_brush_layout" -version = "0.2.3" +name = "guillotiere" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc32c2334f00ca5ac3695c5009ae35da21da8c62d255b5b96d56e2597a637a38" +checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" dependencies = [ - "ab_glyph", - "approx", - "xi-unicode", + "euclid", + "svg_fmt", ] [[package]] name = "h2" -version = "0.3.20" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -1753,7 +1877,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -1766,7 +1890,7 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "crunchy", ] @@ -1787,9 +1911,28 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hassle-rs" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "1397650ee315e8891a0df210707f0fc61771b0cc518c3023896064c5407cb3b0" +dependencies = [ + "bitflags 1.3.2", + "com-rs", + "libc", + "libloading 0.7.4", + "thiserror", + "widestring", + "winapi", +] [[package]] name = "heck" @@ -1808,24 +1951,38 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.2.6" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] -name = "hermit-abi" -version = "0.3.1" +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "hound" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" + +[[package]] +name = "hrtf" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "0f4de47a84fd55fa33aa5ef337016814fdc869fdad23e7898b5322fa290248e6" +dependencies = [ + "byteorder", + "rubato", + "rustfft", +] [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -1851,9 +2008,9 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" @@ -1878,7 +2035,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -1900,16 +2057,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", - "core-foundation-sys 0.8.4", + "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows 0.48.0", + "windows-core", ] [[package]] @@ -1923,39 +2080,41 @@ dependencies = [ [[package]] name = "iced" -version = "0.4.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6025abe6b1056c9b5adad79c484c5fd8b7012e5230f3b0439a1294ade7ded7bf" +checksum = "c708807ec86f99dd729dc4d42db5239acf118cec14d3c5f57679dcfdbbc472b1" dependencies = [ "iced_core", "iced_futures", - "iced_glow", - "iced_glutin", - "iced_graphics", - "iced_native", - "iced_pure", + "iced_renderer", + "iced_widget", "iced_winit", "thiserror", ] [[package]] name = "iced_core" -version = "0.5.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf9133ceb345ec640047d5597fb8aa88e9cf74ce2d0277a9a62e2d6ed4a8148" +checksum = "64d0bc4fbf018576d08d93f838e6058cc6f10bbc05e04ae249a2a44dffb4ebc8" dependencies = [ "bitflags 1.3.2", - "wasm-timer", + "instant", + "log", + "palette", + "thiserror", + "twox-hash", ] [[package]] name = "iced_futures" -version = "0.4.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d13241d5ed32846bbcffaf60e27e7ceebb60cf16d791ff00d582f0d4d1b07b" +checksum = "14dab0054a9c7a1cbce227a8cd9ee4a094497b3d06094551ac6c1488d563802e" dependencies = [ "async-std", "futures", + "iced_core", "log", "tokio", "wasm-bindgen-futures", @@ -1963,93 +2122,125 @@ dependencies = [ ] [[package]] -name = "iced_glow" -version = "0.3.0" +name = "iced_graphics" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f8d1a2a04e2570230df7c864c1012b88ec0027a94baaf7664e3045651db87ae" +checksum = "67ff14447a221e9e9205a13d84d7bbdf0636a3b1daa02cfca690ed09689c4d2b" dependencies = [ + "bitflags 1.3.2", "bytemuck", - "euclid", - "glow", - "glow_glyph", - "glyph_brush", - "iced_graphics", - "iced_native", + "glam 0.24.2", + "half", + "iced_core", "log", + "lyon_path", + "raw-window-handle", + "thiserror", ] [[package]] -name = "iced_glutin" -version = "0.3.0" +name = "iced_renderer" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e18f56d746d304b92a7dcdfcffa93fafb732aec046b0bf9fb1b39d6bc91c20a7" +checksum = "1033385b0db0099a0d13178c9ff93c1ce11e7d0177522acf578bf79febdb2af8" dependencies = [ - "glutin", "iced_graphics", - "iced_native", - "iced_winit", + "iced_tiny_skia", + "iced_wgpu", + "log", + "raw-window-handle", + "thiserror", ] [[package]] -name = "iced_graphics" -version = "0.3.1" +name = "iced_runtime" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2adcf703fc326e0985ea99c75f1b73e718560a7b220d57ec6478417ccb2f463f" +checksum = "7c6c89853e1250c6fac82c5015fa2144517be9b33d4b8e456f10e198b23e28bd" dependencies = [ - "bytemuck", - "glam 0.10.2", - "iced_native", - "iced_pure", - "iced_style", - "lyon", - "raw-window-handle 0.4.3", + "iced_core", + "iced_futures", "thiserror", ] [[package]] -name = "iced_native" -version = "0.5.1" +name = "iced_style" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca174d4693a5daa2ffcae38d5c28cf0dbd54bd8fc19848f28392cd52624751a" +checksum = "d85c47d9d13e2281f75ddf98c865daf2101632bd2b855c401dd0b1c8b81a31a0" dependencies = [ "iced_core", - "iced_futures", - "iced_style", - "num-traits", + "once_cell", + "palette", +] + +[[package]] +name = "iced_tiny_skia" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7715f6222c9470bbbd75a39f70478fa0d1bdfb81a377a34fd1b090ffccc480b" +dependencies = [ + "bytemuck", + "cosmic-text", + "iced_graphics", + "kurbo", + "log", + "raw-window-handle", + "resvg", + "rustc-hash", + "softbuffer", + "tiny-skia 0.10.0", "twox-hash", - "unicode-segmentation", ] [[package]] -name = "iced_pure" -version = "0.2.2" +name = "iced_wgpu" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80aeaecadfd6832c2c787cbdfd357adc256a51c55d68142d852037451e72f393" +checksum = "703f7c5de46b997ed7b18e05ec67059dcdf3beeac51e917c21071b021bb848b9" dependencies = [ - "iced_native", - "iced_style", - "num-traits", + "bitflags 1.3.2", + "bytemuck", + "futures", + "glam 0.24.2", + "glyphon", + "guillotiere", + "iced_graphics", + "log", + "lyon", + "once_cell", + "raw-window-handle", + "resvg", + "rustc-hash", + "twox-hash", + "wgpu", ] [[package]] -name = "iced_style" -version = "0.4.0" +name = "iced_widget" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90028c94ab62c13cd3b6fb1499a593a51510d4729c5b4e8e60705b2b28c6bc2" +checksum = "a177219ae51c3ba08f228ab932354b360cc669e94aec50c01e7c9b675f074c7c" dependencies = [ - "iced_core", + "iced_renderer", + "iced_runtime", + "iced_style", + "num-traits", + "thiserror", + "unicode-segmentation", ] [[package]] name = "iced_winit" -version = "0.4.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72011b895e439e2ebad8f545720e3e97c7368ecfc47a23cbfeaa9508a98af90c" +checksum = "ad0c884bcb14722a57192b40a5ef6b5e170fa2f01fe2ff28d6cdd9efe37acf70" dependencies = [ - "iced_futures", "iced_graphics", - "iced_native", + "iced_runtime", + "iced_style", "log", + "raw-window-handle", "thiserror", "web-sys", "winapi", @@ -2057,12 +2248,6 @@ dependencies = [ "winit", ] -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "idna" version = "0.4.0" @@ -2075,9 +2260,9 @@ dependencies = [ [[package]] name = "image" -version = "0.24.6" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" +checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" dependencies = [ "bytemuck", "byteorder", @@ -2092,6 +2277,12 @@ dependencies = [ "tiff", ] +[[package]] +name = "imagesize" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" + [[package]] name = "indexmap" version = "1.9.3" @@ -2104,12 +2295,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.14.2", ] [[package]] @@ -2118,7 +2309,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "wasm-bindgen", "web-sys", @@ -2130,34 +2321,22 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi 0.3.3", "libc", "windows-sys 0.48.0", ] [[package]] name = "ipnet" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" - -[[package]] -name = "is-terminal" -version = "0.4.7" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" -dependencies = [ - "hermit-abi 0.3.1", - "io-lifetimes", - "rustix", - "windows-sys 0.48.0", -] +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jni" @@ -2173,6 +2352,20 @@ dependencies = [ "walkdir", ] +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + [[package]] name = "jni-sys" version = "0.3.0" @@ -2181,9 +2374,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] @@ -2199,18 +2392,32 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" dependencies = [ "wasm-bindgen", ] [[package]] -name = "khronos_api" -version = "3.1.0" +name = "khronos-egl" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3" +dependencies = [ + "libc", + "libloading 0.7.4", + "pkg-config", +] + +[[package]] +name = "kurbo" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +checksum = "bd85a5776cd9500c2e2059c8c76c3b01528566b7fcbaf8098b55a33fc298849b" +dependencies = [ + "arrayvec", +] [[package]] name = "kv-log-macro" @@ -2241,9 +2448,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "libloading" @@ -2251,25 +2458,47 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "winapi", ] [[package]] name = "libloading" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d580318f95776505201b28cf98eb1fa5e4be3b689633ba6a3e6cd880ff22d8cb" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "windows-sys 0.48.0", ] [[package]] -name = "linked-hash-map" -version = "0.5.6" +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall 0.4.1", +] + +[[package]] +name = "libredox" +version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall 0.4.1", +] [[package]] name = "linux-raw-sys" @@ -2277,11 +2506,23 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +[[package]] +name = "linux-raw-sys" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" + +[[package]] +name = "llq" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22edcb39a6fc7e511be7ba578a719af09125391ecde44e0bd61ad3c8e003a4a3" + [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -2289,9 +2530,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" dependencies = [ "value-bag", ] @@ -2333,11 +2574,20 @@ dependencies = [ "winapi", ] +[[package]] +name = "lru" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a83fb7698b3643a0e34f9ae6f2e8f0178c0fd42f8b59d493aa271ff3a5bf21" +dependencies = [ + "hashbrown 0.14.2", +] + [[package]] name = "lyon" -version = "0.17.10" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf0510ed5e3e2fb80f3db2061ef5ca92d87bfda1a624bb1eacf3bd50226e4cbb" +checksum = "91e7f9cda98b5430809e63ca5197b06c7d191bf7e26dfc467d5a3f0290e2a74f" dependencies = [ "lyon_algorithms", "lyon_tessellation", @@ -2345,42 +2595,44 @@ dependencies = [ [[package]] name = "lyon_algorithms" -version = "0.17.7" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8037f716541ba0d84d3de05c0069f8068baf73990d55980558b84d944c8a244a" +checksum = "a3bca95f9a4955b3e4a821fbbcd5edfbd9be2a9a50bb5758173e5358bfb4c623" dependencies = [ "lyon_path", - "sid", + "num-traits", ] [[package]] name = "lyon_geom" -version = "0.17.7" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d89ccbdafd83d259403e22061be27bccc3254bba65cdc5303250c4227c8c8e" +checksum = "74df1ff0a0147282eb10699537a03baa7d31972b58984a1d44ce0624043fe8ad" dependencies = [ - "arrayvec 0.5.2", + "arrayvec", "euclid", "num-traits", ] [[package]] name = "lyon_path" -version = "0.17.7" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0a59fdf767ca0d887aa61d1b48d4bbf6a124c1a45503593f7d38ab945bfbc0" +checksum = "ca507745ba7ccbc76e5c44e7b63b1a29d2b0d6126f375806a5bbaf657c7d6c45" dependencies = [ "lyon_geom", + "num-traits", ] [[package]] name = "lyon_tessellation" -version = "0.17.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7230e08dd0638048e46f387f255dbe7a7344a3e6705beab53242b5af25635760" +checksum = "23bcac20d47825850fabf1e869bf7c2bbe2daefa0776c3cd2eb7cb74635f6e4a" dependencies = [ "float_next_after", "lyon_path", + "thiserror", ] [[package]] @@ -2392,15 +2644,6 @@ dependencies = [ "libc", ] -[[package]] -name = "mach" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" -dependencies = [ - "libc", -] - [[package]] name = "mach2" version = "0.4.1" @@ -2412,9 +2655,9 @@ dependencies = [ [[package]] name = "macro-attr-2018" -version = "2.1.2" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66fbbf2d3635c91b436074cf14a7c8948dc608e193c9d2b389bdc64aae2ca37b" +checksum = "f21755d53936fc1663b414dba30636788f2183d3e782bdee4b1e7236637974e7" [[package]] name = "macroquad" @@ -2451,7 +2694,7 @@ name = "matrix-drawing" version = "0.1.4" dependencies = [ "arrayref", - "arrayvec 0.7.4", + "arrayvec", "embedded-graphics", "fonts", "more-asserts", @@ -2462,24 +2705,24 @@ dependencies = [ [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memmap2" -version = "0.3.1" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b6c2ebff6180198788f5db08d7ce3bc1d0b617176678831a7510825973e357" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" dependencies = [ "libc", ] [[package]] name = "memmap2" -version = "0.5.10" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +checksum = "6d28bba84adfe6646737845bc5ebbfa2c08424eb1c37e94a1fd2a82adb56a872" dependencies = [ "libc", ] @@ -2511,11 +2754,25 @@ dependencies = [ "autocfg", ] +[[package]] +name = "metal" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de11355d1f6781482d027a3b4d4de7825dcedb197bf573e0596d00008402d060" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", +] + [[package]] name = "micromath" -version = "1.1.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc4010833aea396656c2f91ee704d51a6f1329ec2ab56ffd00bfd56f7481ea94" +checksum = "c3c8dda44ff03a2f238717214da50f65d5a53b45cd213a7370424ffdb6fae815" [[package]] name = "mime" @@ -2541,15 +2798,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "miniz_oxide" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" -dependencies = [ - "adler", -] - [[package]] name = "miniz_oxide" version = "0.7.1" @@ -2562,13 +2810,13 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys 0.48.0", ] @@ -2580,16 +2828,36 @@ checksum = "20a4c60ca5c9c0e114b3bd66ff4aa5f9b2b175442be51ca6c4365d687a97a2ac" dependencies = [ "log", "mio", - "nix 0.26.2", + "nix 0.26.4", "serialport", "winapi", ] [[package]] name = "more-asserts" -version = "0.2.2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fafa6961cabd9c63bcd77a45d7e3b7f3b552b70417831fb0f56db717e72407e" + +[[package]] +name = "naga" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" +checksum = "bbcc2e0513220fd2b598e6068608d4462db20322c0e77e47f6f488dfcfc279cb" +dependencies = [ + "bit-set", + "bitflags 1.3.2", + "codespan-reporting", + "hexf-parse", + "indexmap 1.9.3", + "log", + "num-traits", + "rustc-hash", + "spirv", + "termcolor", + "thiserror", + "unicode-xid", +] [[package]] name = "nanorand" @@ -2618,32 +2886,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "ndk" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d868f654c72e75f8687572699cdabe755f03effbb62542768e995d5b8d699d" -dependencies = [ - "bitflags 1.3.2", - "jni-sys", - "ndk-sys 0.2.2", - "num_enum", - "thiserror", -] - -[[package]] -name = "ndk" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" -dependencies = [ - "bitflags 1.3.2", - "jni-sys", - "ndk-sys 0.3.0", - "num_enum", - "thiserror", -] - [[package]] name = "ndk" version = "0.7.0" @@ -2653,8 +2895,8 @@ dependencies = [ "bitflags 1.3.2", "jni-sys", "ndk-sys 0.4.1+23.1.7779620", - "num_enum", - "raw-window-handle 0.5.2", + "num_enum 0.5.11", + "raw-window-handle", "thiserror", ] @@ -2664,49 +2906,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" -[[package]] -name = "ndk-glue" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71bee8ea72d685477e28bd004cfe1bf99c754d688cd78cad139eae4089484d4" -dependencies = [ - "lazy_static", - "libc", - "log", - "ndk 0.5.0", - "ndk-context", - "ndk-macro", - "ndk-sys 0.2.2", -] - -[[package]] -name = "ndk-macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c" -dependencies = [ - "darling", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "ndk-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" -[[package]] -name = "ndk-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" -dependencies = [ - "jni-sys", -] - [[package]] name = "ndk-sys" version = "0.4.1+23.1.7779620" @@ -2724,48 +2929,47 @@ checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" dependencies = [ "bitflags 1.3.2", "cc", - "cfg-if 1.0.0", + "cfg-if", "libc", "memoffset 0.6.5", ] [[package]] name = "nix" -version = "0.23.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" dependencies = [ "bitflags 1.3.2", - "cc", - "cfg-if 1.0.0", + "cfg-if", "libc", "memoffset 0.6.5", ] [[package]] name = "nix" -version = "0.24.3" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" dependencies = [ + "autocfg", "bitflags 1.3.2", - "cfg-if 1.0.0", + "cfg-if", "libc", "memoffset 0.6.5", ] [[package]] name = "nix" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ "bitflags 1.3.2", - "cfg-if 1.0.0", + "cfg-if", "libc", "memoffset 0.7.1", "pin-utils", - "static_assertions", ] [[package]] @@ -2780,9 +2984,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" dependencies = [ "num-traits", ] @@ -2821,20 +3025,21 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", + "libm", ] [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi 0.3.3", "libc", ] @@ -2844,7 +3049,16 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" dependencies = [ - "num_enum_derive", + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", ] [[package]] @@ -2859,6 +3073,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.39", +] + [[package]] name = "num_threads" version = "0.1.6" @@ -2875,6 +3101,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", + "objc_exception", ] [[package]] @@ -2889,7 +3116,42 @@ dependencies = [ ] [[package]] -name = "objc_id" +name = "objc-sys" +version = "0.2.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" + +[[package]] +name = "objc2" +version = "0.3.0-beta.3.patch-leaks.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" +dependencies = [ + "block2", + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-encode" +version = "2.0.0-pre.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" +dependencies = [ + "objc-sys", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" @@ -2899,21 +3161,21 @@ dependencies = [ [[package]] name = "object" -version = "0.30.4" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03b4680b86d9cfafba8fc491dc9b6df26b68cf40e9e6cd73909194759a63c385" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "memchr", ] [[package]] name = "oboe" -version = "0.4.6" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f63c358b4fa0fbcfefd7c8be5cfc39c08ce2389f5325687e7762a48d30a5c1" +checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0" dependencies = [ - "jni", - "ndk 0.6.0", + "jni 0.20.0", + "ndk", "ndk-context", "num-derive", "num-traits", @@ -2922,9 +3184,9 @@ dependencies = [ [[package]] name = "oboe-sys" -version = "0.4.5" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3370abb7372ed744232c12954d920d1a40f1c4686de9e79e800021ef492294bd" +checksum = "7f44155e7fb718d3cfddcf70690b2b51ac4412f347cd9e4fbe511abe9cd7b5f2" dependencies = [ "cc", ] @@ -2937,12 +3199,12 @@ checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.55" +version = "0.10.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" dependencies = [ - "bitflags 1.3.2", - "cfg-if 1.0.0", + "bitflags 2.4.1", + "cfg-if", "foreign-types", "libc", "once_cell", @@ -2958,7 +3220,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.39", ] [[package]] @@ -2969,9 +3231,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.90" +version = "0.9.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" dependencies = [ "cc", "libc", @@ -2980,38 +3242,35 @@ dependencies = [ ] [[package]] -name = "ordered-float" -version = "3.7.0" +name = "option-ext" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fc2dbde8f8a79f2102cc474ceb0ad68e3b80b85289ea62389b60e66777e4213" -dependencies = [ - "num-traits", -] +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] -name = "os_str_bytes" -version = "6.5.1" +name = "orbclient" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" +checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +dependencies = [ + "libredox 0.0.2", +] [[package]] -name = "osmesa-sys" -version = "0.1.2" +name = "os_str_bytes" +version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b" -dependencies = [ - "shared_library", -] +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" [[package]] name = "overlay" version = "0.1.4" dependencies = [ - "clap 4.3.8", + "clap 4.4.8", "coarsetime", "confy", "crossbeam-channel", - "directories", + "directories 4.0.1", "image", "log", "log-panics", @@ -3027,18 +3286,41 @@ dependencies = [ [[package]] name = "owned_ttf_parser" -version = "0.19.0" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7" +dependencies = [ + "ttf-parser 0.20.0", +] + +[[package]] +name = "palette" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e2f34147767aa758aa649415b50a69eeb46a67f9dc7db8011eeb3d84b351dc" +dependencies = [ + "approx", + "fast-srgb8", + "palette_derive", + "phf", +] + +[[package]] +name = "palette_derive" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "706de7e2214113d63a8238d1910463cfce781129a6f263d13fdb09ff64355ba4" +checksum = "b7db010ec5ff3d4385e4f133916faacd9dad0f6a09394c92d825b3aed310fa0a" dependencies = [ - "ttf-parser 0.19.1", + "proc-macro2", + "quote", + "syn 2.0.39", ] [[package]] name = "parking" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" @@ -3058,7 +3340,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.8", + "parking_lot_core 0.9.9", ] [[package]] @@ -3067,7 +3349,7 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "instant", "libc", "redox_syscall 0.2.16", @@ -3077,22 +3359,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall 0.4.1", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] name = "paste" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "peeking_take_while" @@ -3106,31 +3388,79 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + [[package]] name = "pin-project" -version = "1.1.0" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.0" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.39", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -3138,6 +3468,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand 2.0.1", + "futures-io", +] + [[package]] name = "piston-float" version = "1.0.1" @@ -3152,15 +3493,15 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "png" -version = "0.17.9" +version = "0.17.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11" +checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" dependencies = [ "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.7.1", + "miniz_oxide", ] [[package]] @@ -3171,7 +3512,7 @@ checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" dependencies = [ "autocfg", "bitflags 1.3.2", - "cfg-if 1.0.0", + "cfg-if", "concurrent-queue", "libc", "log", @@ -3179,12 +3520,32 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "polling" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e53b6af1f60f36f8c2ac2aad5459d75a5a9b4be1e8cdd40264f315d78193e531" +dependencies = [ + "cfg-if", + "concurrent-queue", + "pin-project-lite", + "rustix 0.38.24", + "tracing", + "windows-sys 0.48.0", +] + [[package]] name = "pollster" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -3207,7 +3568,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", ] [[package]] @@ -3236,13 +3597,19 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f89dff0959d98c9758c88826cc002e2c3d0b9dfac4139711d1f30de442f1139b" + [[package]] name = "qoi" version = "0.4.1" @@ -3258,11 +3625,20 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "658fa1faf7a4cc5f057c9ee5ef560f717ad9d8dc66d975267f709624d6e1ab88" +[[package]] +name = "quick-xml" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1" +dependencies = [ + "memchr", +] + [[package]] name = "quote" -version = "1.0.28" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -3298,23 +3674,16 @@ dependencies = [ ] [[package]] -name = "raw-window-handle" -version = "0.3.4" +name = "range-alloc" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28f55143d0548dad60bb4fbdc835a3d7ac6acc3324506450c5fdd6e42903a76" -dependencies = [ - "libc", - "raw-window-handle 0.4.3", -] +checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" [[package]] -name = "raw-window-handle" -version = "0.4.3" +name = "rangemap" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" -dependencies = [ - "cty", -] +checksum = "977b1e897f9d764566891689e642653e5ed90c6895106acd005eb4c1d0203991" [[package]] name = "raw-window-handle" @@ -3324,9 +3693,9 @@ checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] name = "rayon" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" dependencies = [ "either", "rayon-core", @@ -3334,16 +3703,20 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] +[[package]] +name = "rctree" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b42e27ef78c35d3998403c1d26f3efd9e135d3e5121b0a4845cc5cc27547f4f" + [[package]] name = "realfft" version = "3.3.0" @@ -3371,14 +3744,23 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ "getrandom", - "redox_syscall 0.2.16", + "libredox 0.0.1", "thiserror", ] @@ -3388,19 +3770,21 @@ version = "0.1.4" dependencies = [ "array-concat", "arrayref", - "clap 4.3.8", + "clap 4.4.8", "collect_array", "confy", "conquer-once", "derivative", - "directories", + "directories 5.0.1", "embedded-graphics", "enum-derive-2018", "env_logger", - "futures-lite", + "futures-lite 1.13.0", "iced", + "iced_core", "iced_futures", - "iced_native", + "iced_renderer", + "iced_runtime", "log", "log-panics", "log4rs", @@ -3415,10 +3799,10 @@ dependencies = [ "serde_json", "skip_error", "thiserror", - "time 0.3.22", + "time", "tokio", "tokio-serial", - "toml", + "toml 0.8.8", "uwh-common", "web-audio-api", "winres", @@ -3426,9 +3810,21 @@ dependencies = [ [[package]] name = "regex" -version = "1.8.4" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", @@ -3437,15 +3833,21 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "renderdoc-sys" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" +checksum = "216080ab382b992234dda86873c18d4c48358f5cfcb70fd693d7f6f2131b628b" [[package]] name = "reqwest" -version = "0.11.18" +version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ "base64", "bytes", @@ -3468,6 +3870,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", + "system-configuration", "tokio", "tokio-native-tls", "tower-service", @@ -3478,6 +3881,41 @@ dependencies = [ "winreg", ] +[[package]] +name = "resvg" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6554f47c38eca56827eea7f285c2a3018b4e12e0e195cc105833c008be338f1" +dependencies = [ + "gif", + "jpeg-decoder", + "log", + "pico-args", + "png", + "rgb", + "svgtypes", + "tiny-skia 0.10.0", + "usvg", +] + +[[package]] +name = "rgb" +version = "0.8.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "roxmltree" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862340e351ce1b271a378ec53f304a5558f7db87f3769dc655a8f6ecbb68b302" +dependencies = [ + "xmlparser", +] + [[package]] name = "rppal" version = "0.14.1" @@ -3498,9 +3936,9 @@ dependencies = [ [[package]] name = "rubato" -version = "0.12.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd70209c27d5b08f5528bdc779ea3ffb418954e28987f9f9775c6eac41003f9c" +checksum = "e6dd52e80cfc21894deadf554a5673002938ae4625f7a283e536f9cf7c17b0d5" dependencies = [ "num-complex", "num-integer", @@ -3520,15 +3958,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - [[package]] name = "rustfft" version = "6.1.0" @@ -3546,23 +3975,69 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.20" +version = "0.37.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" dependencies = [ "bitflags 1.3.2", "errno", "io-lifetimes", "libc", - "linux-raw-sys", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ad981d6c340a49cdc40a1028d9c6084ec7e9fa33fcb839cab656a267071e234" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys 0.4.11", "windows-sys 0.48.0", ] +[[package]] +name = "rustybuzz" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162bdf42e261bee271b3957691018634488084ef577dddeb6420a9684cab2a6a" +dependencies = [ + "bitflags 1.3.2", + "bytemuck", + "smallvec", + "ttf-parser 0.18.1", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-general-category", + "unicode-script", +] + +[[package]] +name = "rustybuzz" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82eea22c8f56965eeaf3a209b3d24508256c7b920fb3b6211b8ba0f7c0583250" +dependencies = [ + "bitflags 1.3.2", + "bytemuck", + "libm", + "smallvec", + "ttf-parser 0.19.2", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-general-category", + "unicode-script", +] + [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" [[package]] name = "same-file" @@ -3575,11 +4050,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys 0.42.0", + "windows-sys 0.48.0", ] [[package]] @@ -3590,79 +4065,86 @@ checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "security-framework" -version = "2.9.1" +name = "sctk-adwaita" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" +checksum = "cda4e97be1fd174ccc2aae81c8b694e803fa99b34e8fd0f057a9d70698e3ed09" dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.3", - "core-foundation-sys 0.8.4", - "libc", - "security-framework-sys", + "ab_glyph", + "log", + "memmap2 0.5.10", + "smithay-client-toolkit", + "tiny-skia 0.8.4", ] [[package]] -name = "security-framework-sys" -version = "2.9.0" +name = "security-framework" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "core-foundation-sys 0.8.4", + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", "libc", + "security-framework-sys", ] [[package]] -name = "semver" -version = "0.9.0" +name = "security-framework-sys" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ - "semver-parser", + "core-foundation-sys", + "libc", ] -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "serde" -version = "1.0.164" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.164" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.39", ] [[package]] name = "serde_json" -version = "1.0.99" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ "itoa", "ryu", "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3677,85 +4159,56 @@ dependencies = [ [[package]] name = "serialport" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353dc2cbfc67c9a14a89a1292a9d8e819bd51066b083e08c1974ba08e3f48c62" +checksum = "c32634e2bd4311420caa504404a55fad2131292c485c97014cbed89a5899885f" dependencies = [ "CoreFoundation-sys", "IOKit-sys", - "bitflags 2.0.2", - "cfg-if 1.0.0", + "bitflags 1.3.2", + "cfg-if", "mach2", - "nix 0.26.2", + "nix 0.26.4", "regex", "scopeguard", "winapi", ] -[[package]] -name = "sha1" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" -dependencies = [ - "sha1_smol", -] - -[[package]] -name = "sha1_smol" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" - -[[package]] -name = "shared_library" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" -dependencies = [ - "lazy_static", - "libc", -] - [[package]] name = "shlex" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" [[package]] -name = "sid" -version = "0.6.1" +name = "signal-hook-registry" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5ac56c121948b4879bba9e519852c211bcdd8f014efff766441deff0b91bdb" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ - "num-traits", + "libc", ] [[package]] -name = "signal-hook" -version = "0.3.15" +name = "simd-adler32" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "732768f1176d21d09e076c23a93123d40bba92d50c4058da34d45c8de8e682b9" -dependencies = [ - "libc", - "signal-hook-registry", -] +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] -name = "signal-hook-registry" -version = "1.4.1" +name = "simplecss" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a11be7c62927d9427e9f40f3444d5499d868648e2edbc4e2116de69e7ec0e89d" dependencies = [ - "libc", + "log", ] [[package]] -name = "simd-adler32" -version = "0.3.5" +name = "siphasher" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "238abfbb77c1915110ad968465608b68e869e0772622c9656714e73e5a1a522f" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "skip_error" @@ -3765,9 +4218,9 @@ checksum = "0a17bb801cb94f28c0885ef79ca5b412519ab95e6bfd3160506d5e84570d5173" [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -3783,43 +4236,25 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "smithay-client-toolkit" -version = "0.15.4" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a28f16a97fa0e8ce563b2774d1e732dd5d4025d2772c5dba0a41a0f90a29da3" +checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" dependencies = [ "bitflags 1.3.2", "calloop", "dlib", "lazy_static", "log", - "memmap2 0.3.1", - "nix 0.22.3", - "pkg-config", - "wayland-client", - "wayland-cursor", - "wayland-protocols", -] - -[[package]] -name = "smithay-client-toolkit" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f307c47d32d2715eb2e0ece5589057820e0e5e70d07c247d1063e844e107f454" -dependencies = [ - "bitflags 1.3.2", - "dlib", - "lazy_static", - "log", "memmap2 0.5.10", "nix 0.24.3", "pkg-config", - "wayland-client", + "wayland-client 0.29.5", "wayland-cursor", "wayland-protocols", ] @@ -3830,83 +4265,82 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" dependencies = [ - "smithay-client-toolkit 0.16.0", - "wayland-client", + "smithay-client-toolkit", + "wayland-client 0.29.5", ] [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", ] [[package]] -name = "spin" -version = "0.9.8" +name = "socket2" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ - "lock_api", + "libc", + "windows-sys 0.48.0", ] [[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "stdweb" -version = "0.4.20" +name = "softbuffer" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" +checksum = "c2b953f6ba7285f0af131eb748aabd8ddaf53e0b81dda3ba5d803b0847d6559f" dependencies = [ - "discard", - "rustc_version", - "stdweb-derive", - "stdweb-internal-macros", - "stdweb-internal-runtime", + "bytemuck", + "cfg_aliases", + "cocoa", + "core-graphics", + "fastrand 1.9.0", + "foreign-types", + "log", + "nix 0.26.4", + "objc", + "raw-window-handle", + "redox_syscall 0.3.5", + "thiserror", "wasm-bindgen", + "wayland-backend", + "wayland-client 0.30.2", + "wayland-sys 0.30.1", + "web-sys", + "windows-sys 0.48.0", + "x11-dl", + "x11rb 0.11.1", ] [[package]] -name = "stdweb-derive" -version = "0.5.3" +name = "spin" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" dependencies = [ - "proc-macro2", - "quote", - "serde", - "serde_derive", - "syn 1.0.109", + "lock_api", ] [[package]] -name = "stdweb-internal-macros" -version = "0.2.9" +name = "spirv" +version = "0.2.0+1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" +checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" dependencies = [ - "base-x", - "proc-macro2", - "quote", - "serde", - "serde_derive", - "serde_json", - "sha1", - "syn 1.0.109", + "bitflags 1.3.2", + "num-traits", ] [[package]] -name = "stdweb-internal-runtime" -version = "0.1.5" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "str-buf" @@ -3920,12 +4354,47 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +dependencies = [ + "float-cmp", +] + [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "svg_fmt" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2" + +[[package]] +name = "svgtypes" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed4b0611e7f3277f68c0fa18e385d9e2d26923691379690039548f867cef02a7" +dependencies = [ + "kurbo", + "siphasher", +] + +[[package]] +name = "swash" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7c73c813353c347272919aa1af2885068b05e625e5532b43049e4f641ae77f" +dependencies = [ + "yazi", + "zeno", +] + [[package]] name = "symphonia" version = "0.5.3" @@ -3993,7 +4462,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7c73eb88fee79705268cc7b742c7bc93a7b76e092ab751d0833866970754142" dependencies = [ - "arrayvec 0.7.4", + "arrayvec", "bitflags 1.3.2", "bytemuck", "lazy_static", @@ -4071,34 +4540,63 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.22" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sys-locale" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e801cf239ecd6ccd71f03d270d67dd53d13e90aab208bf4b8fe4ad957ea949b0" +dependencies = [ + "libc", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tempfile" -version = "3.6.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ - "autocfg", - "cfg-if 1.0.0", - "fastrand", - "redox_syscall 0.3.5", - "rustix", + "cfg-if", + "fastrand 2.0.1", + "redox_syscall 0.4.1", + "rustix 0.38.24", "windows-sys 0.48.0", ] [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" dependencies = [ "winapi-util", ] @@ -4111,40 +4609,39 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.39", ] [[package]] name = "thread-id" -version = "4.1.0" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ee93aa2b8331c0fec9091548843f2c90019571814057da3b783f9de09349d73" +checksum = "f0ec81c46e9eb50deaa257be2f148adf052d1fb7701cfd55ccfab2525280b70b" dependencies = [ "libc", - "redox_syscall 0.2.16", "winapi", ] [[package]] name = "tiff" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7449334f9ff2baf290d55d73983a7d6fa15e01198faef72af07e2a8db851e471" +checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211" dependencies = [ "flate2", "jpeg-decoder", @@ -4153,24 +4650,15 @@ dependencies = [ [[package]] name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "time" -version = "0.3.22" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea9e1b3cf1243ae005d9e74085d4d542f3125458f3a81af210d901dcd7411efd" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ + "deranged", "itoa", "libc", "num_threads", + "powerfmt", "serde", "time-core", "time-macros", @@ -4178,19 +4666,70 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.9" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ "time-core", ] +[[package]] +name = "tiny-skia" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8493a203431061e901613751931f047d1971337153f96d0e5e363d6dbf6a67" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "png", + "tiny-skia-path 0.8.4", +] + +[[package]] +name = "tiny-skia" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7db11798945fa5c3e5490c794ccca7c6de86d3afdd54b4eb324109939c6f37bc" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png", + "tiny-skia-path 0.10.0", +] + +[[package]] +name = "tiny-skia-path" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adbfb5d3f3dd57a0e11d12f4f13d4ebbbc1b5c15b7ab0a156d030b21da5f677c" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tiny-skia-path" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f60aa35c89ac2687ace1a2556eaaea68e8c0d47408a2e3e7f5c98a489e7281c" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + [[package]] name = "tinyvec" version = "1.6.0" @@ -4208,30 +4747,30 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.28.2" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", "mio", "num_cpus", "pin-project-lite", - "socket2", + "socket2 0.5.5", "tokio-macros", "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.39", ] [[package]] @@ -4250,7 +4789,7 @@ version = "5.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa6e2e4cf0520a99c5f87d5abb24172b5bd220de57c3181baaaa5440540c64aa" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "futures", "log", "mio-serial", @@ -4259,9 +4798,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -4280,19 +4819,47 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.21.0", +] + [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] [[package]] name = "toml_edit" -version = "0.19.11" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266f016b7f039eec8a1a80dfe6156b633d208b9fccca5e4db1d6775b0c4e34a7" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.1.0", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -4305,20 +4872,19 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if 1.0.0", "pin-project-lite", "tracing-core", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] @@ -4347,9 +4913,21 @@ checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd" [[package]] name = "ttf-parser" -version = "0.19.1" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0609f771ad9c6155384897e1df4d948e692667cc0588548b68eb44d052b27633" + +[[package]] +name = "ttf-parser" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49d64318d8311fc2668e48b63969f4343e0a85c4a109aa8460d6672e364b8bd1" + +[[package]] +name = "ttf-parser" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a464a4b34948a5f67fddd2b823c62d9d92e44be75058b99939eae6c5b6960b33" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" [[package]] name = "twox-hash" @@ -4357,7 +4935,7 @@ version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "rand", "static_assertions", ] @@ -4369,37 +4947,146 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] -name = "unicode-ident" -version = "1.0.9" +name = "unicode-bidi-mirroring" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +checksum = "56d12260fb92d52f9008be7e4bca09f584780eb2266dc8fecc6a192bec561694" [[package]] -name = "unicode-normalization" -version = "0.1.22" +name = "unicode-ccc" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] +checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1" [[package]] -name = "unicode-segmentation" -version = "1.10.1" +name = "unicode-general-category" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "2281c8c1d221438e373249e065ca4989c4c36952c211ff21a0ee91c44a3869e7" [[package]] -name = "url" -version = "2.4.0" +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-script" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d817255e1bed6dfd4ca47258685d14d2bdcfbc64fdc9e3819bd5848057b8ecc" + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "unicode-vo" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" + +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "url" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "usvg" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14d09ddfb0d93bf84824c09336d32e42f80961a9d1680832eb24fdf249ce11e6" +dependencies = [ + "base64", + "log", + "pico-args", + "usvg-parser", + "usvg-text-layout", + "usvg-tree", + "xmlwriter", +] + +[[package]] +name = "usvg-parser" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19bf93d230813599927d88557014e0908ecc3531666d47c634c6838bc8db408" +dependencies = [ + "data-url", + "flate2", + "imagesize", + "kurbo", + "log", + "roxmltree", + "simplecss", + "siphasher", + "svgtypes", + "usvg-tree", +] + +[[package]] +name = "usvg-text-layout" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "035044604e89652c0a2959b8b356946997a52649ba6cade45928c2842376feb4" +dependencies = [ + "fontdb", + "kurbo", + "log", + "rustybuzz 0.7.0", + "unicode-bidi", + "unicode-script", + "unicode-vo", + "usvg-tree", +] + +[[package]] +name = "usvg-tree" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7939a7e4ed21cadb5d311d6339730681c3e24c3e81d60065be80e485d3fc8b92" +dependencies = [ + "rctree", + "strict-num", + "svgtypes", + "tiny-skia-path 0.10.0", +] + [[package]] name = "utf8parse" version = "0.2.1" @@ -4411,7 +5098,7 @@ name = "uwh-common" version = "0.1.4" dependencies = [ "arrayref", - "arrayvec 0.7.4", + "arrayvec", "defmt", "derivative", "displaydoc", @@ -4420,15 +5107,15 @@ dependencies = [ "log", "reqwest", "serde", - "time 0.3.22", - "toml", + "time", + "toml 0.8.8", ] [[package]] name = "value-bag" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4d330786735ea358f3bc09eea4caa098569c1c93f342d9aca0514915022fe7e" +checksum = "4a72e1902dde2bd6441347de2b70b7f5d59bf157c6c62f0c44572607a1d55bbe" [[package]] name = "vcpkg" @@ -4436,6 +5123,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "vecmath" version = "1.0.0" @@ -4453,15 +5146,15 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "waker-fn" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", @@ -4476,12 +5169,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -4490,36 +5177,36 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.39", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "wasm-bindgen", "web-sys", @@ -4527,9 +5214,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4537,22 +5224,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] name = "wasm-timer" @@ -4569,6 +5256,21 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wayland-backend" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b48e27457e8da3b2260ac60d0a94512f5cba36448679f3747c0865b7893ed8" +dependencies = [ + "cc", + "downcast-rs", + "io-lifetimes", + "nix 0.26.4", + "scoped-tls", + "smallvec", + "wayland-sys 0.30.1", +] + [[package]] name = "wayland-client" version = "0.29.5" @@ -4581,8 +5283,20 @@ dependencies = [ "nix 0.24.3", "scoped-tls", "wayland-commons", - "wayland-scanner", - "wayland-sys", + "wayland-scanner 0.29.5", + "wayland-sys 0.29.5", +] + +[[package]] +name = "wayland-client" +version = "0.30.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "489c9654770f674fc7e266b3c579f4053d7551df0ceb392f153adb1f9ed06ac8" +dependencies = [ + "bitflags 1.3.2", + "nix 0.26.4", + "wayland-backend", + "wayland-scanner 0.30.1", ] [[package]] @@ -4594,7 +5308,7 @@ dependencies = [ "nix 0.24.3", "once_cell", "smallvec", - "wayland-sys", + "wayland-sys 0.29.5", ] [[package]] @@ -4604,20 +5318,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" dependencies = [ "nix 0.24.3", - "wayland-client", + "wayland-client 0.29.5", "xcursor", ] -[[package]] -name = "wayland-egl" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402de949f81a012926d821a2d659f930694257e76dd92b6e0042ceb27be4107d" -dependencies = [ - "wayland-client", - "wayland-sys", -] - [[package]] name = "wayland-protocols" version = "0.29.5" @@ -4625,9 +5329,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" dependencies = [ "bitflags 1.3.2", - "wayland-client", + "wayland-client 0.29.5", "wayland-commons", - "wayland-scanner", + "wayland-scanner 0.29.5", ] [[package]] @@ -4641,6 +5345,17 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "wayland-scanner" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9b873b257fbc32ec909c0eb80dea312076a67014e65e245f5eb69a6b8ab330e" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + [[package]] name = "wayland-sys" version = "0.29.5" @@ -4652,21 +5367,36 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "wayland-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b2a02ac608e07132978689a6f9bf4214949c85998c247abadd4f4129b1aa06" +dependencies = [ + "dlib", + "lazy_static", + "log", + "pkg-config", +] + [[package]] name = "web-audio-api" -version = "0.26.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd314efae40c8c14a2c2ae41bac1f97e51777efbc0ef2cb5afc3b459d8685602" +checksum = "20211522d5ba0d302025c8fde30553fc9295d416d478d686bb0e987acd51420e" dependencies = [ - "arrayvec 0.7.4", + "arc-swap", + "arrayvec", "cpal", "creek", "crossbeam-channel", + "dasp_sample", "float_eq", - "lazy_static", + "hound", + "hrtf", + "llq", "log", "num-complex", - "once_cell", "realfft", "rubato", "rustc-hash", @@ -4677,9 +5407,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" dependencies = [ "js-sys", "wasm-bindgen", @@ -4691,6 +5421,112 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" +[[package]] +name = "wgpu" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "480c965c9306872eb6255fa55e4b4953be55a8b64d57e61d7ff840d3dcc051cd" +dependencies = [ + "arrayvec", + "cfg-if", + "js-sys", + "log", + "naga", + "parking_lot 0.12.1", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f478237b4bf0d5b70a39898a66fa67ca3a007d79f2520485b8b0c3dfc46f8c2" +dependencies = [ + "arrayvec", + "bit-vec", + "bitflags 2.4.1", + "codespan-reporting", + "log", + "naga", + "parking_lot 0.12.1", + "profiling", + "raw-window-handle", + "rustc-hash", + "smallvec", + "thiserror", + "web-sys", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ecb3258078e936deee14fd4e0febe1cfe9bbb5ffef165cb60218d2ee5eb4448" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.4.1", + "block", + "core-graphics-types", + "d3d12", + "foreign-types", + "glow", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hassle-rs", + "js-sys", + "khronos-egl", + "libc", + "libloading 0.8.1", + "log", + "metal", + "naga", + "objc", + "parking_lot 0.12.1", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash", + "smallvec", + "thiserror", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "winapi", +] + +[[package]] +name = "wgpu-types" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0c153280bb108c2979eb5c7391cb18c56642dd3c072e55f52065e13e2a1252a" +dependencies = [ + "bitflags 2.4.1", + "js-sys", + "web-sys", +] + +[[package]] +name = "widestring" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" + [[package]] name = "winapi" version = "0.3.9" @@ -4709,9 +5545,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -4733,53 +5569,52 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window_clipboard" -version = "0.2.4" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "015dd4474dc6aa96fe19aae3a24587a088bd90331dba5a5cc60fb3a180234c4d" +checksum = "63287c9c4396ccf5346d035a9b0fcaead9e18377637f5eaa78b7ac65c873ff7d" dependencies = [ "clipboard-win", "clipboard_macos", "clipboard_wayland", "clipboard_x11", - "raw-window-handle 0.3.4", + "raw-window-handle", "thiserror", ] [[package]] name = "windows" -version = "0.37.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" +checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" dependencies = [ - "windows_aarch64_msvc 0.37.0", - "windows_i686_gnu 0.37.0", - "windows_i686_msvc 0.37.0", - "windows_x86_64_gnu 0.37.0", - "windows_x86_64_msvc 0.37.0", + "windows-targets 0.42.2", ] [[package]] name = "windows" -version = "0.48.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" dependencies = [ - "windows-targets", + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets 0.42.2", ] [[package]] @@ -4788,22 +5623,37 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", ] [[package]] name = "windows-targets" -version = "0.48.0" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -4814,15 +5664,9 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" @@ -4832,15 +5676,9 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" - -[[package]] -name = "windows_i686_gnu" -version = "0.37.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" @@ -4850,15 +5688,9 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" - -[[package]] -name = "windows_i686_msvc" -version = "0.37.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" @@ -4868,15 +5700,9 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.37.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" @@ -4886,9 +5712,9 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" @@ -4898,15 +5724,9 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" @@ -4916,59 +5736,62 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winit" -version = "0.26.1" +version = "0.28.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b43cc931d58b99461188607efd7acb2a093e65fc621f54cad78517a6063e73a" +checksum = "9596d90b45384f5281384ab204224876e8e8bf7d58366d9b795ad99aa9894b94" dependencies = [ + "android-activity", "bitflags 1.3.2", - "cocoa", - "core-foundation 0.9.3", - "core-graphics 0.22.3", - "core-video-sys", + "cfg_aliases", + "core-foundation", + "core-graphics", "dispatch", "instant", - "lazy_static", "libc", "log", "mio", - "ndk 0.5.0", - "ndk-glue", - "ndk-sys 0.2.2", - "objc", - "parking_lot 0.11.2", + "ndk", + "objc2", + "once_cell", + "orbclient", "percent-encoding", - "raw-window-handle 0.4.3", - "smithay-client-toolkit 0.15.4", + "raw-window-handle", + "redox_syscall 0.3.5", + "sctk-adwaita", + "smithay-client-toolkit", "wasm-bindgen", - "wayland-client", + "wayland-client 0.29.5", + "wayland-commons", "wayland-protocols", + "wayland-scanner 0.29.5", "web-sys", - "winapi", + "windows-sys 0.45.0", "x11-dl", ] [[package]] name = "winnow" -version = "0.4.7" +version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448" +checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" dependencies = [ "memchr", ] [[package]] name = "winreg" -version = "0.10.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys 0.48.0", ] [[package]] @@ -4977,7 +5800,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" dependencies = [ - "toml", + "toml 0.5.11", ] [[package]] @@ -5003,6 +5826,31 @@ dependencies = [ "winapi-wsapoll", ] +[[package]] +name = "x11rb" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdf3c79412dd91bae7a7366b8ad1565a85e35dd049affc3a6a2c549e97419617" +dependencies = [ + "gethostname", + "libc", + "libloading 0.7.4", + "nix 0.25.1", + "once_cell", + "winapi", + "winapi-wsapoll", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0b1513b141123073ce54d5bb1d33f801f17508fbd61e02060b1214e96d39c56" +dependencies = [ + "nix 0.25.1", +] + [[package]] name = "xcursor" version = "0.3.4" @@ -5013,16 +5861,54 @@ dependencies = [ ] [[package]] -name = "xi-unicode" -version = "0.3.0" +name = "xml-rs" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" +checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" [[package]] -name = "xml-rs" -version = "0.8.14" +name = "xmlparser" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" + +[[package]] +name = "xmlwriter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" + +[[package]] +name = "yazi" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" + +[[package]] +name = "zeno" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" + +[[package]] +name = "zerocopy" +version = "0.7.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52839dc911083a8ef63efa4d039d1f58b5e409f923e44c80828f206f66e5541c" +checksum = "e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] [[package]] name = "zune-inflate" diff --git a/fonts/Cargo.toml b/fonts/Cargo.toml index 3bf33d4d..566f5c5a 100644 --- a/fonts/Cargo.toml +++ b/fonts/Cargo.toml @@ -5,4 +5,4 @@ authors = ["Atlantis Sports "] edition = "2021" [dependencies] -embedded-graphics = "0.7" +embedded-graphics = "0.8" diff --git a/fonts/src/lib.rs b/fonts/src/lib.rs index 21ded789..84c5cacd 100644 --- a/fonts/src/lib.rs +++ b/fonts/src/lib.rs @@ -5,7 +5,7 @@ pub mod fonts { ($name:ident, $file:literal, $w:literal, $h:literal, $spacing:literal, $base:literal) => { pub const $name: embedded_graphics::mono_font::MonoFont = embedded_graphics::mono_font::MonoFont { - image: embedded_graphics::image::ImageRaw::new_binary( + image: embedded_graphics::image::ImageRaw::new( core::include_bytes!(core::concat!(core::env!("OUT_DIR"), "/", $file)), $w * 8, ), diff --git a/matrix-drawing/Cargo.toml b/matrix-drawing/Cargo.toml index 4ab7d6dd..43620ff1 100644 --- a/matrix-drawing/Cargo.toml +++ b/matrix-drawing/Cargo.toml @@ -11,9 +11,9 @@ std = ["arrayvec/std", "serde/std", "uwh-common/std"] [dependencies] arrayref = "0.3" arrayvec = { version = "0.7", default-features = false } -embedded-graphics = "0.7" -fonts = { version = "0.1", path = "../fonts" } -more-asserts = "0.2" -serde = { version = "1.0", default-features = false } -serde_derive = "1.0" +embedded-graphics = "0.8" +fonts = { version = "0.1.4", path = "../fonts" } +more-asserts = "0.3" +serde = { version = "1", default-features = false } +serde_derive = "1" uwh-common = { version = "0.1.4", path = "../uwh-common", default-features = false } diff --git a/refbox/Cargo.toml b/refbox/Cargo.toml index 73ae0352..74a3d3a9 100644 --- a/refbox/Cargo.toml +++ b/refbox/Cargo.toml @@ -15,21 +15,24 @@ arrayref = "0.3" collect_array = "0.1" clap = { version = "4", features = ["derive"] } confy = "0.5" -conquer-once = "0.3" -derivative = "2.2" -directories = "4" -embedded-graphics = "0.7" -enum-derive-2018 = "2" +conquer-once = "0.4" +derivative = "2" +directories = "5" +embedded-graphics = "0.8" +enum-derive-2018 = "3" env_logger = "0.9" futures-lite = "1" -iced = { version = "0.4", default-features = false, features = ["canvas", "glow", "pure", "tokio"] } -iced_futures = { version = "0.4", features = ["async-std"] } -iced_native = "0.5" +iced = { version = "0.10", default-features = false, features = ["canvas", "svg", "tokio", "wgpu"] } +iced_core = "0.10" +iced_futures = { version = "0.7", features = ["async-std"] } +# iced_native = "0.10" +iced_renderer = "0.1" +iced_runtime = "0.1" log = "0.4" log4rs = { version = "1", default-features = false, features = ["background_rotation", "compound_policy", "console_appender", "fixed_window_roller", "gzip", "pattern_encoder", "rolling_file_appender", "size_trigger"]} log-panics = { version = "2", features = ["with-backtrace"]} -macro-attr-2018 = "2" -more-asserts = "0.2" +macro-attr-2018 = "3" +more-asserts = "0.3" paste = "1" reqwest = { version = "0.11", features = ["json"] } serde = "1" @@ -40,10 +43,10 @@ thiserror = "1" time = { version = "0.3", features = ["local-offset", "macros", "serde", "serde-human-readable"] } tokio = { version = "1", features = ["io-util", "macros", "net", "sync", "time"] } tokio-serial = "5" -toml = "0.5" -uwh-common = { version = "0.1", path = "../uwh-common"} -matrix-drawing = { version = "0.1", path = "../matrix-drawing"} -web-audio-api = { version = "0.26", default-features = false, features = ["cpal"] } +toml = "0.8" +uwh-common = { version = "0.1.3", path = "../uwh-common"} +matrix-drawing = { version = "0.1.3", path = "../matrix-drawing"} +web-audio-api = { version = "0.34", default-features = false, features = ["cpal"] } [target.'cfg(target_os = "linux")'.dependencies] rppal = "0.14" diff --git a/refbox/resources/Roboto-Medium.ttf b/refbox/resources/Roboto-Medium.ttf index 092470d81ba2bf32dff6725a15808ae80af7f8cf..ac0f908b9c9c73da558b45d65cc5c6094874d3e8 100644 GIT binary patch literal 168644 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 X76wnEi(n^v8!x?bp_;lO!DIggn3ZN8 literal 109536 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 diff --git a/refbox/resources/arrow_drop_down.svg b/refbox/resources/arrow_drop_down.svg new file mode 100644 index 00000000..4fdf49ae --- /dev/null +++ b/refbox/resources/arrow_drop_down.svg @@ -0,0 +1,9 @@ + + + diff --git a/refbox/resources/arrow_drop_up.svg b/refbox/resources/arrow_drop_up.svg new file mode 100644 index 00000000..e94f3cee --- /dev/null +++ b/refbox/resources/arrow_drop_up.svg @@ -0,0 +1,9 @@ + + + diff --git a/refbox/resources/backspace.svg b/refbox/resources/backspace.svg new file mode 100644 index 00000000..cd0da8b5 --- /dev/null +++ b/refbox/resources/backspace.svg @@ -0,0 +1,9 @@ + + + diff --git a/refbox/resources/pause.svg b/refbox/resources/pause.svg new file mode 100644 index 00000000..a8977059 --- /dev/null +++ b/refbox/resources/pause.svg @@ -0,0 +1,9 @@ + + + diff --git a/refbox/resources/play_arrow.svg b/refbox/resources/play_arrow.svg new file mode 100644 index 00000000..03f06c1a --- /dev/null +++ b/refbox/resources/play_arrow.svg @@ -0,0 +1,9 @@ + + + diff --git a/refbox/src/app/mod.rs b/refbox/src/app/mod.rs index 8b72bc62..064dcb8f 100644 --- a/refbox/src/app/mod.rs +++ b/refbox/src/app/mod.rs @@ -5,21 +5,18 @@ use crate::{ sound_controller::*, tournament_manager::*, }; -use iced::{ - executor, - pure::{column, Application, Element}, - Command, Subscription, -}; +use iced::{executor, widget::column, Application, Command, Subscription}; use iced_futures::{ futures::stream::{self, BoxStream}, - subscription::Recipe, + subscription::{EventStream, Recipe}, }; +use iced_runtime::{command, window}; use log::*; use reqwest::{Client, Method, StatusCode}; use std::{ + borrow::Cow, cmp::min, collections::BTreeMap, - hash::Hasher, process::Child, sync::{Arc, Mutex}, }; @@ -43,7 +40,7 @@ mod message; use message::*; pub mod style; -use style::{PADDING, SPACING, WINDOW_BACKGROUND}; +use style::{PADDING, SPACING}; pub mod update_sender; use update_sender::*; @@ -51,6 +48,8 @@ use update_sender::*; const REQUEST_TIMEOUT: Duration = Duration::from_secs(10); const MAX_RETRIES: usize = 6; +pub type Element<'a, Message> = iced::Element<'a, Message, iced::Renderer>; + pub struct RefBoxApp { tm: Arc>, config: Config, @@ -444,6 +443,7 @@ impl Drop for RefBoxApp { impl Application for RefBoxApp { type Executor = executor::Default; type Message = Message; + type Theme = style::ApplicationTheme; type Flags = RefBoxAppFlags; fn new(flags: Self::Flags) -> (Self, Command) { @@ -520,7 +520,16 @@ impl Application for RefBoxApp { fullscreen, list_all_tournaments, }, - Command::none(), + Command::single(command::Action::LoadFont { + bytes: Cow::from(&include_bytes!("../../resources/Roboto-Medium.ttf")[..]), + tagger: Box::new(|res| match res { + Ok(()) => { + info!("Loaded font"); + Message::NoAction + } + Err(e) => panic!("Failed to load font: {e:?}"), + }), + }), ) } @@ -535,14 +544,6 @@ impl Application for RefBoxApp { "UWH Ref Box".into() } - fn mode(&self) -> iced::window::Mode { - if self.fullscreen { - iced::window::Mode::Fullscreen - } else { - iced::window::Mode::Windowed - } - } - fn update(&mut self, message: Message) -> Command { trace!("Handling message: {message:?}"); @@ -554,6 +555,14 @@ impl Application for RefBoxApp { self.last_message = message.clone(); } + let command = if matches!(message, Message::Init) && self.fullscreen { + Command::single(command::Action::Window(window::Action::ChangeMode( + iced_core::window::Mode::Fullscreen, + ))) + } else { + Command::none() + }; + match message { Message::Init => self.request_tournament_list(), Message::NewSnapshot(snapshot) => { @@ -1633,119 +1642,113 @@ impl Application for RefBoxApp { Message::NoAction => {} }; - Command::none() - } - - fn background_color(&self) -> iced::Color { - WINDOW_BACKGROUND + command } fn view(&self) -> Element { let clock_running = self.tm.lock().unwrap().clock_is_running(); - let mut main_view = column() - .spacing(SPACING) - .padding(PADDING) - .push(match self.app_state { - AppState::MainPage => { - let new_config = if self.snapshot.current_period == GamePeriod::BetweenGames { - self.tm - .lock() - .unwrap() - .next_game_info() - .as_ref() - .and_then(|info| Some(info.timing.as_ref()?.clone().into())) - } else { - None - }; - - let config = if let Some(ref c) = new_config { - c - } else { - &self.config.game - }; + let mut main_view = column![match self.app_state { + AppState::MainPage => { + let new_config = if self.snapshot.current_period == GamePeriod::BetweenGames { + self.tm + .lock() + .unwrap() + .next_game_info() + .as_ref() + .and_then(|info| Some(info.timing.as_ref()?.clone().into())) + } else { + None + }; - build_main_view( - &self.snapshot, - config, - self.using_uwhscores, - &self.games, - self.config.mode, - clock_running, - ) - } - AppState::TimeEdit(_, time, timeout_time) => build_time_edit_view( - &self.snapshot, - time, - timeout_time, - self.config.mode, - clock_running, - ), - AppState::ScoreEdit { - scores, - is_confirmation, - } => build_score_edit_view( - &self.snapshot, - scores, - is_confirmation, - self.config.mode, - clock_running, - ), - AppState::PenaltyOverview(indices) => build_penalty_overview_page( - &self.snapshot, - self.pen_edit.get_printable_lists(Instant::now()).unwrap(), - indices, - self.config.mode, - clock_running, - ), - AppState::KeypadPage(page, player_num) => build_keypad_page( - &self.snapshot, - page, - player_num, - self.config.mode, - clock_running, - ), - AppState::GameDetailsPage => build_game_info_page( + let config = if let Some(ref c) = new_config { + c + } else { + &self.config.game + }; + build_main_view( &self.snapshot, - &self.config.game, + config, self.using_uwhscores, &self.games, self.config.mode, clock_running, - ), - AppState::EditGameConfig(page) => build_game_config_edit_page( - &self.snapshot, - self.edited_settings.as_ref().unwrap(), - &self.tournaments, - page, - self.config.mode, - clock_running, - ), - AppState::ParameterEditor(param, dur) => build_game_parameter_editor( - &self.snapshot, - param, - dur, - self.config.mode, - clock_running, - ), - AppState::ParameterList(param, index) => build_list_selector_page( - &self.snapshot, - param, - index, - self.edited_settings.as_ref().unwrap(), - &self.tournaments, - self.config.mode, - clock_running, - ), - AppState::ConfirmationPage(ref kind) => { - build_confirmation_page(&self.snapshot, kind, self.config.mode, clock_running) - } - AppState::ConfirmScores(scores) => build_score_confirmation_page( - &self.snapshot, - scores, - self.config.mode, - clock_running, - ), - }); + ) + } + AppState::TimeEdit(_, time, timeout_time) => build_time_edit_view( + &self.snapshot, + time, + timeout_time, + self.config.mode, + clock_running, + ), + AppState::ScoreEdit { + scores, + is_confirmation, + } => build_score_edit_view( + &self.snapshot, + scores, + is_confirmation, + self.config.mode, + clock_running, + ), + AppState::PenaltyOverview(indices) => build_penalty_overview_page( + &self.snapshot, + self.pen_edit.get_printable_lists(Instant::now()).unwrap(), + indices, + self.config.mode, + clock_running, + ), + AppState::KeypadPage(page, player_num) => build_keypad_page( + &self.snapshot, + page, + player_num, + self.config.mode, + clock_running, + ), + AppState::GameDetailsPage => build_game_info_page( + &self.snapshot, + &self.config.game, + self.using_uwhscores, + &self.games, + self.config.mode, + clock_running, + ), + AppState::EditGameConfig(page) => build_game_config_edit_page( + &self.snapshot, + self.edited_settings.as_ref().unwrap(), + &self.tournaments, + page, + self.config.mode, + clock_running, + ), + AppState::ParameterEditor(param, dur) => build_game_parameter_editor( + &self.snapshot, + param, + dur, + self.config.mode, + clock_running, + ), + AppState::ParameterList(param, index) => build_list_selector_page( + &self.snapshot, + param, + index, + self.edited_settings.as_ref().unwrap(), + &self.tournaments, + self.config.mode, + clock_running, + ), + AppState::ConfirmationPage(ref kind) => { + build_confirmation_page(&self.snapshot, kind, self.config.mode, clock_running) + } + AppState::ConfirmScores(scores) => build_score_confirmation_page( + &self.snapshot, + scores, + self.config.mode, + clock_running, + ), + }] + .spacing(SPACING) + .padding(PADDING); match self.app_state { AppState::ScoreEdit { @@ -1771,16 +1774,16 @@ struct TimeUpdater { clock_running_receiver: watch::Receiver, } -impl Recipe for TimeUpdater { +impl Recipe for TimeUpdater { type Output = Message; - fn hash(&self, state: &mut H) { + fn hash(&self, state: &mut iced_core::Hasher) { use std::hash::Hash; "TimeUpdater".hash(state); } - fn stream(self: Box, _input: BoxStream<'static, I>) -> BoxStream<'static, Self::Output> { + fn stream(self: Box, _input: EventStream) -> BoxStream<'static, Self::Output> { debug!("Updater started"); struct State { @@ -1868,16 +1871,16 @@ struct MessageListener { rx: Arc>>>, } -impl Recipe for MessageListener { +impl Recipe for MessageListener { type Output = Message; - fn hash(&self, state: &mut H) { + fn hash(&self, state: &mut iced_core::Hasher) { use std::hash::Hash; "MessageListener".hash(state); } - fn stream(self: Box, _input: BoxStream<'static, I>) -> BoxStream<'static, Self::Output> { + fn stream(self: Box, _input: EventStream) -> BoxStream<'static, Self::Output> { info!("Message Listener started"); let rx = self diff --git a/refbox/src/app/style.rs b/refbox/src/app/style.rs index 1e272dfb..6a30d1b6 100644 --- a/refbox/src/app/style.rs +++ b/refbox/src/app/style.rs @@ -1,19 +1,24 @@ use iced::{ - pure::widget::{button, container}, - Background, Color, Vector, + application, + widget::{self, button, container, svg, text}, + Background, BorderRadius, Color, Vector, }; +use iced_core::text::LineHeight; +use iced_renderer::Renderer; use paste::paste; pub const BORDER_RADIUS: f32 = 9.0; pub const BORDER_WIDTH: f32 = 6.0; -pub const SPACING: u16 = 8; // Must be a multiple of 4 -pub const PADDING: u16 = 8; -pub const MIN_BUTTON_SIZE: u16 = 89; +pub const SPACING: f32 = 8.0; +pub const PADDING: f32 = 8.0; +pub const MIN_BUTTON_SIZE: f32 = 89.0; -pub const SMALL_TEXT: u16 = 22; -pub const SMALL_PLUS_TEXT: u16 = 34; -pub const MEDIUM_TEXT: u16 = 44; -pub const LARGE_TEXT: u16 = 80; +pub const SMALL_TEXT: f32 = 19.0; +pub const SMALL_PLUS_TEXT: f32 = 29.0; +pub const MEDIUM_TEXT: f32 = 38.0; +pub const LARGE_TEXT: f32 = 66.0; + +pub const LINE_HEIGHT: LineHeight = LineHeight::Relative(1.15); // See https://stackoverflow.com/a/727339 for color mixing math. For darkening colors with pure // black, the math simplifies to new_r = orig_r * (1 - black_alpha), so we will multiply by the @@ -48,8 +53,20 @@ pub const DISABLED_COLOR: Color = GRAY; pub const WINDOW_BACKGROUND: Color = Color::from_rgb(0.82, 0.82, 0.82); -#[derive(Clone, Copy, Debug)] -pub enum Button { +#[derive(Clone, Copy, Debug, Default)] +pub enum ApplicationTheme { + #[default] + Light, +} + +pub type Element<'a, Message> = iced::Element<'a, Message, Renderer>; +pub type Button<'a, Message> = widget::Button<'a, Message, Renderer>; +pub type Container<'a, Message> = widget::Container<'a, Message, Renderer>; +pub type Row<'a, Message> = widget::Row<'a, Message, Renderer>; +pub type Text<'a> = widget::Text<'a, Renderer>; + +#[derive(Clone, Copy, Debug, Default)] +pub enum ButtonStyle { White, WhiteSelected, Black, @@ -63,123 +80,200 @@ pub enum Button { Green, GreenSelected, Blue, + #[default] Gray, LightGray, } -impl button::StyleSheet for Button { - fn active(&self) -> button::Style { - let (background_color, text_color) = match self { - Self::White | Self::WhiteSelected => (WHITE, BLACK), - Self::Black | Self::BlackSelected => (BLACK, WHITE), - Self::Red | Self::RedSelected => (RED, BLACK), - Self::Orange | Self::OrangeSelected => (ORANGE, BLACK), - Self::Yellow | Self::YellowSelected => (YELLOW, BLACK), - Self::Green | Self::GreenSelected => (GREEN, BLACK), - Self::Blue => (BLUE, WHITE), - Self::Gray => (GRAY, BLACK), - Self::LightGray => (LIGHT_GRAY, BLACK), +impl button::StyleSheet for ApplicationTheme { + type Style = ButtonStyle; + + fn active(&self, style: &Self::Style) -> button::Appearance { + let (background_color, text_color) = match style { + ButtonStyle::White | ButtonStyle::WhiteSelected => (WHITE, BLACK), + ButtonStyle::Black | ButtonStyle::BlackSelected => (BLACK, WHITE), + ButtonStyle::Red | ButtonStyle::RedSelected => (RED, BLACK), + ButtonStyle::Orange | ButtonStyle::OrangeSelected => (ORANGE, BLACK), + ButtonStyle::Yellow | ButtonStyle::YellowSelected => (YELLOW, BLACK), + ButtonStyle::Green | ButtonStyle::GreenSelected => (GREEN, BLACK), + ButtonStyle::Blue => (BLUE, WHITE), + ButtonStyle::Gray => (GRAY, BLACK), + ButtonStyle::LightGray => (LIGHT_GRAY, BLACK), }; - let border_width = match self { - Self::White - | Self::Black - | Self::Red - | Self::Orange - | Self::Yellow - | Self::Green - | Self::Blue - | Self::Gray - | Self::LightGray => 0.0, - Self::WhiteSelected - | Self::BlackSelected - | Self::RedSelected - | Self::OrangeSelected - | Self::YellowSelected - | Self::GreenSelected => BORDER_WIDTH, + let border_width = match style { + ButtonStyle::White + | ButtonStyle::Black + | ButtonStyle::Red + | ButtonStyle::Orange + | ButtonStyle::Yellow + | ButtonStyle::Green + | ButtonStyle::Blue + | ButtonStyle::Gray + | ButtonStyle::LightGray => 0.0, + ButtonStyle::WhiteSelected + | ButtonStyle::BlackSelected + | ButtonStyle::RedSelected + | ButtonStyle::OrangeSelected + | ButtonStyle::YellowSelected + | ButtonStyle::GreenSelected => BORDER_WIDTH, }; let background = Some(Background::Color(background_color)); - button::Style { + button::Appearance { shadow_offset: Vector::default(), background, - border_radius: BORDER_RADIUS, + border_radius: BorderRadius::from(BORDER_RADIUS), border_width, border_color: BORDER_COLOR, text_color, } } - fn hovered(&self) -> button::Style { - self.active() + fn hovered(&self, style: &Self::Style) -> button::Appearance { + self.active(style) } - fn pressed(&self) -> button::Style { - let background_color = match self { - Self::White | Self::WhiteSelected => WHITE_PRESSED, - Self::Black | Self::BlackSelected => BLACK_PRESSED, - Self::Red | Self::RedSelected => RED_PRESSED, - Self::Orange | Self::OrangeSelected => ORANGE_PRESSED, - Self::Yellow | Self::YellowSelected => YELLOW_PRESSED, - Self::Green | Self::GreenSelected => GREEN_PRESSED, - Self::Blue => BLUE_PRESSED, - Self::Gray => GRAY_PRESSED, - Self::LightGray => LIGHT_GRAY_PRESSED, + fn pressed(&self, style: &Self::Style) -> button::Appearance { + let background_color = match style { + ButtonStyle::White | ButtonStyle::WhiteSelected => WHITE_PRESSED, + ButtonStyle::Black | ButtonStyle::BlackSelected => BLACK_PRESSED, + ButtonStyle::Red | ButtonStyle::RedSelected => RED_PRESSED, + ButtonStyle::Orange | ButtonStyle::OrangeSelected => ORANGE_PRESSED, + ButtonStyle::Yellow | ButtonStyle::YellowSelected => YELLOW_PRESSED, + ButtonStyle::Green | ButtonStyle::GreenSelected => GREEN_PRESSED, + ButtonStyle::Blue => BLUE_PRESSED, + ButtonStyle::Gray => GRAY_PRESSED, + ButtonStyle::LightGray => LIGHT_GRAY_PRESSED, }; - button::Style { + button::Appearance { background: Some(Background::Color(background_color)), - ..self.active() + ..self.active(style) } } - fn disabled(&self) -> button::Style { - button::Style { + fn disabled(&self, style: &Self::Style) -> button::Appearance { + button::Appearance { background: Some(Background::Color(WINDOW_BACKGROUND)), border_color: DISABLED_COLOR, border_width: BORDER_WIDTH, text_color: DISABLED_COLOR, - ..self.active() + ..self.active(style) } } } -#[derive(Clone, Copy, Debug)] -pub enum Container { +#[derive(Clone, Copy, Debug, Default)] +pub enum ContainerStyle { LightGray, + #[default] Gray, Black, White, ScrollBar, Disabled, + Transparent, } -impl container::StyleSheet for Container { - fn style(&self) -> container::Style { - match self { - Self::LightGray => cont_style(LIGHT_GRAY, BLACK), - Self::Gray => cont_style(GRAY, BLACK), - Self::Black => cont_style(BLACK, WHITE), - Self::White => cont_style(WHITE, BLACK), - Self::ScrollBar => cont_style(WINDOW_BACKGROUND, BLACK), - Self::Disabled => container::Style { +impl container::StyleSheet for ApplicationTheme { + type Style = ContainerStyle; + + fn appearance(&self, style: &Self::Style) -> container::Appearance { + match style { + ContainerStyle::LightGray => cont_style(LIGHT_GRAY, BLACK), + ContainerStyle::Gray => cont_style(GRAY, BLACK), + ContainerStyle::Black => cont_style(BLACK, WHITE), + ContainerStyle::White => cont_style(WHITE, BLACK), + ContainerStyle::ScrollBar => cont_style(WINDOW_BACKGROUND, BLACK), + ContainerStyle::Disabled => container::Appearance { text_color: Some(DISABLED_COLOR), background: None, - border_radius: BORDER_RADIUS, + border_radius: BorderRadius::from(BORDER_RADIUS), border_width: BORDER_WIDTH, border_color: DISABLED_COLOR, }, + ContainerStyle::Transparent => container::Appearance { + text_color: None, + background: None, + border_radius: BorderRadius::from(BORDER_RADIUS), + border_width: 0.0, + border_color: BORDER_COLOR, + }, } } } -fn cont_style(bkgnd: Color, text: Color) -> container::Style { - container::Style { +fn cont_style(bkgnd: Color, text: Color) -> container::Appearance { + container::Appearance { text_color: Some(text), background: Some(Background::Color(bkgnd)), - border_radius: BORDER_RADIUS, + border_radius: BorderRadius::from(BORDER_RADIUS), border_width: 0.0, border_color: BORDER_COLOR, } } + +#[derive(Clone, Copy, Debug, Default)] +pub enum TextStyle { + #[default] + Defualt, + Black, + White, + Green, + Yellow, + Orange, + Red, +} + +impl text::StyleSheet for ApplicationTheme { + type Style = TextStyle; + + fn appearance(&self, style: Self::Style) -> text::Appearance { + text::Appearance { + color: match style { + TextStyle::Defualt => None, + TextStyle::Black => Some(BLACK), + TextStyle::White => Some(WHITE), + TextStyle::Green => Some(GREEN), + TextStyle::Yellow => Some(YELLOW), + TextStyle::Orange => Some(ORANGE), + TextStyle::Red => Some(RED), + }, + } + } +} + +#[derive(Clone, Copy, Debug, Default)] +pub enum SvgStyle { + #[default] + White, + Black, +} + +impl svg::StyleSheet for ApplicationTheme { + type Style = SvgStyle; + + fn appearance(&self, style: &Self::Style) -> svg::Appearance { + let color = match style { + SvgStyle::White => Some(WHITE), + SvgStyle::Black => Some(BLACK), + }; + svg::Appearance { color } + } +} + +#[derive(Clone, Copy, Debug, Default)] +pub struct ApplicationStyle {} + +impl application::StyleSheet for ApplicationTheme { + type Style = ApplicationStyle; + + fn appearance(&self, _style: &Self::Style) -> application::Appearance { + application::Appearance { + background_color: WINDOW_BACKGROUND, + text_color: BLACK, + } + } +} diff --git a/refbox/src/app/view_builders/configuration.rs b/refbox/src/app/view_builders/configuration.rs index 5f349b0a..184788d9 100644 --- a/refbox/src/app/view_builders/configuration.rs +++ b/refbox/src/app/view_builders/configuration.rs @@ -1,14 +1,17 @@ use super::{ message::*, shared_elements::*, - style::{self, MEDIUM_TEXT, MIN_BUTTON_SIZE, PADDING, SMALL_TEXT, SPACING}, + style::{ + ButtonStyle, ContainerStyle, Element, LINE_HEIGHT, MEDIUM_TEXT, MIN_BUTTON_SIZE, PADDING, + SMALL_TEXT, SPACING, + }, }; use crate::config::Mode; use crate::sound_controller::*; use collect_array::CollectArrayResult; use iced::{ alignment::{Horizontal, Vertical}, - pure::{button, column, container, horizontal_space, row, text, vertical_space, Element}, + widget::{button, column, container, horizontal_space, row, text, vertical_space}, Alignment, Length, }; use std::collections::BTreeMap; @@ -166,81 +169,61 @@ fn make_main_config_page<'a>( game_number.to_string() }; - column() - .spacing(SPACING) - .height(Length::Fill) - .push(make_game_time_button( - snapshot, - false, - false, - mode, - clock_running, - )) - .push(make_value_button( - "GAME:", - game_label, - (true, game_large_text), - game_btn_msg, - )) - .push( - make_message_button( - "TOURNAMENT OPTIONS", - Some(Message::ChangeConfigPage(ConfigPage::Tournament)), - ) - .style(style::Button::LightGray), + column![ + make_game_time_button(snapshot, false, false, mode, clock_running,), + make_value_button("GAME:", game_label, (true, game_large_text), game_btn_msg,), + make_message_button( + "TOURNAMENT OPTIONS", + Some(Message::ChangeConfigPage(ConfigPage::Tournament)), ) - .push( - make_message_button( - "POOL AND SOUND OPTIONS", - Some(Message::ChangeConfigPage(ConfigPage::Sound)), - ) - .style(style::Button::LightGray), + .style(ButtonStyle::LightGray), + make_message_button( + "POOL AND SOUND OPTIONS", + Some(Message::ChangeConfigPage(ConfigPage::Sound)), ) - .push( - row() - .spacing(SPACING) - .width(Length::Fill) - .height(Length::Fill) - .push(make_value_button( - "APP\nMODE", - settings.mode.to_string().to_uppercase(), - (false, true), - Some(Message::CycleParameter(CyclingParameter::Mode)), - )) - .push(make_value_button( - "HIDE TIME FOR\nLAST 15 SECONDS", - bool_string(settings.hide_time), - (false, true), - Some(Message::ToggleBoolParameter(BoolGameParameter::HideTime)), - )) - .push(make_value_button( - "TRACK CAP NUMBER\nOF SCORER", - bool_string(settings.collect_scorer_cap_num), - (false, true), - Some(Message::ToggleBoolParameter( - BoolGameParameter::ScorerCapNum, - )), + .style(ButtonStyle::LightGray), + row![ + make_value_button( + "APP\nMODE", + settings.mode.to_string().to_uppercase(), + (false, true), + Some(Message::CycleParameter(CyclingParameter::Mode)), + ), + make_value_button( + "HIDE TIME FOR\nLAST 15 SECONDS", + bool_string(settings.hide_time), + (false, true), + Some(Message::ToggleBoolParameter(BoolGameParameter::HideTime)), + ), + make_value_button( + "TRACK CAP NUMBER\nOF SCORER", + bool_string(settings.collect_scorer_cap_num), + (false, true), + Some(Message::ToggleBoolParameter( + BoolGameParameter::ScorerCapNum, )), - ) - .push( - row() - .spacing(SPACING) + ), + ] + .spacing(SPACING) + .width(Length::Fill) + .height(Length::Fill), + row![ + make_button("CANCEL") + .style(ButtonStyle::Red) .width(Length::Fill) - .push( - make_button("CANCEL") - .style(style::Button::Red) - .width(Length::Fill) - .on_press(Message::ConfigEditComplete { canceled: true }), - ) - .push(horizontal_space(Length::Fill)) - .push( - make_button("DONE") - .style(style::Button::Green) - .width(Length::Fill) - .on_press(Message::ConfigEditComplete { canceled: false }), - ), - ) - .into() + .on_press(Message::ConfigEditComplete { canceled: true }), + horizontal_space(Length::Fill), + make_button("DONE") + .style(ButtonStyle::Green) + .width(Length::Fill) + .on_press(Message::ConfigEditComplete { canceled: false }), + ] + .spacing(SPACING) + .width(Length::Fill), + ] + .spacing(SPACING) + .height(Length::Fill) + .into() } fn make_tournament_config_page<'a>( @@ -315,57 +298,55 @@ fn make_tournament_config_page<'a>( .height(Length::Fill) .into(), vertical_space(Length::Fill).into(), - row() - .spacing(SPACING) - .height(Length::Fill) - .push(horizontal_space(Length::Fill)) - .push(horizontal_space(Length::Fill)) - .push( - make_button("DONE") - .style(style::Button::Green) - .width(Length::Fill) - .on_press(Message::ChangeConfigPage(ConfigPage::Main)), - ) - .into(), + row![ + horizontal_space(Length::Fill), + horizontal_space(Length::Fill), + make_button("DONE") + .style(ButtonStyle::Green) + .width(Length::Fill) + .on_press(Message::ChangeConfigPage(ConfigPage::Main)), + ] + .spacing(SPACING) + .height(Length::Fill) + .into(), ] } else { [ - row() - .spacing(SPACING) - .height(Length::Fill) - .push(make_value_button( + row![ + make_value_button( "HALF LENGTH:", time_string(config.half_play_duration), (false, true), Some(Message::EditParameter(LengthParameter::Half)), - )) - .push(make_value_button( + ), + make_value_button( "OVERTIME\nALLOWED:", bool_string(config.overtime_allowed), (false, true), Some(Message::ToggleBoolParameter( BoolGameParameter::OvertimeAllowed, )), - )) - .push(make_value_button( + ), + make_value_button( "SUDDEN DEATH\nALLOWED:", bool_string(config.sudden_death_allowed), (false, true), Some(Message::ToggleBoolParameter( BoolGameParameter::SuddenDeathAllowed, )), - )) - .into(), - row() - .spacing(SPACING) - .height(Length::Fill) - .push(make_value_button( + ) + ] + .spacing(SPACING) + .height(Length::Fill) + .into(), + row![ + make_value_button( "HALF TIME\nLENGTH:", time_string(config.half_time_duration), (false, true), Some(Message::EditParameter(LengthParameter::HalfTime)), - )) - .push(make_value_button( + ), + make_value_button( "PRE OT\nBREAK LENGTH:", time_string(config.pre_overtime_break), (false, true), @@ -374,8 +355,8 @@ fn make_tournament_config_page<'a>( } else { None }, - )) - .push(make_value_button( + ), + make_value_button( "PRE SD\nBREAK LENGTH:", time_string(config.pre_sudden_death_duration), (false, true), @@ -384,18 +365,19 @@ fn make_tournament_config_page<'a>( } else { None }, - )) - .into(), - row() - .spacing(SPACING) - .height(Length::Fill) - .push(make_value_button( + ) + ] + .spacing(SPACING) + .height(Length::Fill) + .into(), + row![ + make_value_button( "NOMINAL BRK\nBTWN GAMES:", time_string(config.nominal_break), (false, true), Some(Message::EditParameter(LengthParameter::NominalBetweenGame)), - )) - .push(make_value_button( + ), + make_value_button( "OT HALF\nLENGTH:", time_string(config.ot_half_play_duration), (false, true), @@ -404,26 +386,27 @@ fn make_tournament_config_page<'a>( } else { None }, - )) - .push(make_value_button( + ), + make_value_button( "NUM TEAM T/Os\nALLWD PER HALF:", config.team_timeouts_per_half.to_string(), (false, true), Some(Message::KeypadPage(KeypadPage::TeamTimeouts( config.team_timeout_duration, ))), - )) - .into(), - row() - .spacing(SPACING) - .height(Length::Fill) - .push(make_value_button( + ) + ] + .spacing(SPACING) + .height(Length::Fill) + .into(), + row![ + make_value_button( "MINIMUM BRK\nBTWN GAMES:", time_string(config.minimum_break), (false, true), Some(Message::EditParameter(LengthParameter::MinimumBetweenGame)), - )) - .push(make_value_button( + ), + make_value_button( "OT HALF\nTIME LENGTH:", time_string(config.ot_half_time_duration), (false, true), @@ -432,38 +415,32 @@ fn make_tournament_config_page<'a>( } else { None }, - )) - .push( - make_button("DONE") - .style(style::Button::Green) - .width(Length::Fill) - .on_press(Message::ChangeConfigPage(ConfigPage::Main)), - ) - .into(), + ), + make_button("DONE") + .style(ButtonStyle::Green) + .width(Length::Fill) + .on_press(Message::ChangeConfigPage(ConfigPage::Main)), + ] + .spacing(SPACING) + .height(Length::Fill) + .into(), ] }; - let mut col = column() - .spacing(SPACING) - .height(Length::Fill) - .push(make_game_time_button( - snapshot, - false, - false, - mode, - clock_running, - )) - .push( - make_value_button( - "USING UWHPORTAL:", - bool_string(using_uwhscores), - (true, true), - Some(Message::ToggleBoolParameter( - BoolGameParameter::UsingUwhScores, - )), - ) - .height(Length::Fill), - ); + let mut col = column![ + make_game_time_button(snapshot, false, true, mode, clock_running), + make_value_button( + "USING UWHPORTAL:", + bool_string(using_uwhscores), + (true, true), + Some(Message::ToggleBoolParameter( + BoolGameParameter::UsingUwhScores, + )), + ) + .height(Length::Fill), + ] + .spacing(SPACING) + .height(Length::Fill); for row in rows { col = col.push(row); @@ -489,16 +466,17 @@ fn make_sound_config_page<'a>( .center_y() .width(Length::FillPortion(2)) .height(Length::Fill) - .style(style::Container::White); + .style(ContainerStyle::White); let black = container("BLACK") .center_x() .center_y() .width(Length::FillPortion(2)) .height(Length::Fill) - .style(style::Container::Black); + .style(ContainerStyle::Black); let center = text("STARTING SIDES") .size(MEDIUM_TEXT) + .line_height(LINE_HEIGHT) .vertical_alignment(Vertical::Center) .horizontal_alignment(Horizontal::Center) .width(Length::FillPortion(3)); @@ -507,153 +485,140 @@ fn make_sound_config_page<'a>( // of view we need to reverse the direction let sides = if *white_on_right { // White to Ref's left - row().padding(PADDING).push(white).push(center).push(black) + row![white, center, black].padding(PADDING) } else { // White to Ref's right - row().padding(PADDING).push(black).push(center).push(white) + row![black, center, white].padding(PADDING) }; let sides_btn = button(sides.width(Length::Fill).height(Length::Fill)) .height(Length::Fill) .width(Length::Fill) .padding(0) - .style(style::Button::LightGray) + .style(ButtonStyle::LightGray) .on_press(Message::ToggleBoolParameter( BoolGameParameter::WhiteOnRight, )); - column() + column![ + make_game_time_button(snapshot, false, true, mode, clock_running), + sides_btn, + row![ + make_value_button( + "SOUND\nENABLED:", + bool_string(sound.sound_enabled), + (false, true), + Some(Message::ToggleBoolParameter( + BoolGameParameter::SoundEnabled, + )), + ), + make_value_button( + "WHISTLE\nVOLUME:", + sound.whistle_vol.to_string().to_uppercase(), + (false, true), + if sound.sound_enabled && sound.whistle_enabled { + Some(Message::CycleParameter(CyclingParameter::AlertVolume)) + } else { + None + }, + ), + make_message_button( + "MANAGE REMOTES", + Some(Message::ChangeConfigPage(ConfigPage::Remotes(0, false))), + ) + .style(ButtonStyle::LightGray) + .height(Length::Fill), + ] .spacing(SPACING) - .height(Length::Fill) - .push(make_game_time_button( - snapshot, - false, - false, - mode, - clock_running, - )) - .push(sides_btn) - .push( - row() - .spacing(SPACING) - .height(Length::Fill) - .push(make_value_button( - "SOUND\nENABLED:", - bool_string(sound.sound_enabled), - (false, true), + .height(Length::Fill), + row![ + make_value_button( + "WHISTLE\nENABLED:", + bool_string(sound.whistle_enabled), + (false, true), + if sound.sound_enabled { Some(Message::ToggleBoolParameter( - BoolGameParameter::SoundEnabled, - )), - )) - .push(make_value_button( - "WHISTLE\nVOLUME:", - sound.whistle_vol.to_string().to_uppercase(), - (false, true), - if sound.sound_enabled && sound.whistle_enabled { - Some(Message::CycleParameter(CyclingParameter::AlertVolume)) - } else { - None - }, - )) - .push( - make_message_button( - "MANAGE REMOTES", - Some(Message::ChangeConfigPage(ConfigPage::Remotes(0, false))), - ) - .style(style::Button::LightGray) - .height(Length::Fill), - ), - ) - .push( - row() - .spacing(SPACING) - .height(Length::Fill) - .push(make_value_button( - "WHISTLE\nENABLED:", - bool_string(sound.whistle_enabled), - (false, true), - if sound.sound_enabled { - Some(Message::ToggleBoolParameter( - BoolGameParameter::RefAlertEnabled, - )) - } else { - None - }, - )) - .push(make_value_button( - "ABOVE WATER\nVOLUME:", - sound.above_water_vol.to_string().to_uppercase(), - (false, true), - if sound.sound_enabled { - Some(Message::CycleParameter(CyclingParameter::AboveWaterVol)) - } else { - None - }, - )) - .push(make_value_button( - "AUTO SOUND\nSTART PLAY:", - bool_string(sound.auto_sound_start_play), - (false, true), - if sound.sound_enabled { - Some(Message::ToggleBoolParameter( - BoolGameParameter::AutoSoundStartPlay, - )) - } else { - None - }, - )), - ) - .push( - row() - .spacing(SPACING) - .height(Length::Fill) - .push(make_value_button( - "BUZZER\nSOUND:", - sound.buzzer_sound.to_string().to_uppercase(), - (false, true), - if sound.sound_enabled { - Some(Message::CycleParameter(CyclingParameter::BuzzerSound)) - } else { - None - }, - )) - .push(make_value_button( - "UNDER WATER\nVOLUME:", - sound.under_water_vol.to_string().to_uppercase(), - (false, true), - if sound.sound_enabled { - Some(Message::CycleParameter(CyclingParameter::UnderWaterVol)) - } else { - None - }, - )) - .push(make_value_button( - "AUTO SOUND\nSTOP PLAY:", - bool_string(sound.auto_sound_stop_play), - (false, true), - if sound.sound_enabled { - Some(Message::ToggleBoolParameter( - BoolGameParameter::AutoSoundStopPlay, - )) - } else { - None - }, - )), - ) - .push( - row() - .spacing(SPACING) - .height(Length::Fill) - .push(horizontal_space(Length::Fill)) - .push(horizontal_space(Length::Fill)) - .push( - make_button("DONE") - .style(style::Button::Green) - .width(Length::Fill) - .on_press(Message::ChangeConfigPage(ConfigPage::Main)), - ), - ) - .into() + BoolGameParameter::RefAlertEnabled, + )) + } else { + None + }, + ), + make_value_button( + "ABOVE WATER\nVOLUME:", + sound.above_water_vol.to_string().to_uppercase(), + (false, true), + if sound.sound_enabled { + Some(Message::CycleParameter(CyclingParameter::AboveWaterVol)) + } else { + None + }, + ), + make_value_button( + "AUTO SOUND\nSTART PLAY:", + bool_string(sound.auto_sound_start_play), + (false, true), + if sound.sound_enabled { + Some(Message::ToggleBoolParameter( + BoolGameParameter::AutoSoundStartPlay, + )) + } else { + None + }, + ) + ] + .spacing(SPACING) + .height(Length::Fill), + row![ + make_value_button( + "BUZZER\nSOUND:", + sound.buzzer_sound.to_string().to_uppercase(), + (false, true), + if sound.sound_enabled { + Some(Message::CycleParameter(CyclingParameter::BuzzerSound)) + } else { + None + }, + ), + make_value_button( + "UNDER WATER\nVOLUME:", + sound.under_water_vol.to_string().to_uppercase(), + (false, true), + if sound.sound_enabled { + Some(Message::CycleParameter(CyclingParameter::UnderWaterVol)) + } else { + None + }, + ), + make_value_button( + "AUTO SOUND\nSTOP PLAY:", + bool_string(sound.auto_sound_stop_play), + (false, true), + if sound.sound_enabled { + Some(Message::ToggleBoolParameter( + BoolGameParameter::AutoSoundStopPlay, + )) + } else { + None + }, + ) + ] + .spacing(SPACING) + .height(Length::Fill), + row![ + horizontal_space(Length::Fill), + horizontal_space(Length::Fill), + make_button("DONE") + .style(ButtonStyle::Green) + .width(Length::Fill) + .on_press(Message::ChangeConfigPage(ConfigPage::Main)), + ] + .spacing(SPACING) + .height(Length::Fill), + ] + .spacing(SPACING) + .height(Length::Fill) + .into() } fn make_remote_config_page<'a>( @@ -667,6 +632,7 @@ fn make_remote_config_page<'a>( const REMOTES_LIST_LEN: usize = 4; let title = text("REMOTES") + .line_height(LINE_HEIGHT) .height(Length::Fill) .width(Length::Fill) .horizontal_alignment(Horizontal::Center) @@ -691,44 +657,40 @@ fn make_remote_config_page<'a>( let sound_text = format!("SOUND: {}", sound_text); container( - row() - .padding(PADDING) - .spacing(SPACING) - .push( - text(format!("ID: {:05X}", rem_info.id)) - .size(MEDIUM_TEXT) - .vertical_alignment(Vertical::Center) - .horizontal_alignment(Horizontal::Center) - .height(Length::Fill) - .width(Length::Fill), - ) - .push( - make_message_button( - sound_text, - Some(Message::CycleParameter( - CyclingParameter::RemoteBuzzerSound(idx), - )), - ) - .width(Length::Units(275)) - .height(Length::Units(MIN_BUTTON_SIZE - (2 * PADDING))) - .style(style::Button::Yellow), + row![ + text(format!("ID: {:05X}", rem_info.id)) + .size(MEDIUM_TEXT) + .line_height(LINE_HEIGHT) + .vertical_alignment(Vertical::Center) + .horizontal_alignment(Horizontal::Center) + .height(Length::Fill) + .width(Length::Fill), + make_message_button( + sound_text, + Some(Message::CycleParameter( + CyclingParameter::RemoteBuzzerSound(idx), + )), ) - .push( - make_message_button("DELETE", Some(Message::DeleteRemote(idx))) - .width(Length::Units(130)) - .height(Length::Units(MIN_BUTTON_SIZE - (2 * PADDING))) - .style(style::Button::Red), - ), + .width(Length::Fixed(275.0)) + .height(Length::Fixed(MIN_BUTTON_SIZE - (2.0 * PADDING))) + .style(ButtonStyle::Yellow), + make_message_button("DELETE", Some(Message::DeleteRemote(idx))) + .width(Length::Fixed(130.0)) + .height(Length::Fixed(MIN_BUTTON_SIZE - (2.0 * PADDING))) + .style(ButtonStyle::Red), + ] + .padding(PADDING) + .spacing(SPACING), ) .width(Length::Fill) - .height(Length::Units(MIN_BUTTON_SIZE)) - .style(style::Container::Gray) + .height(Length::Fixed(MIN_BUTTON_SIZE)) + .style(ContainerStyle::Gray) .into() } else { container(horizontal_space(Length::Fill)) .width(Length::Fill) - .height(Length::Units(MIN_BUTTON_SIZE)) - .style(style::Container::Disabled) + .height(Length::Fixed(MIN_BUTTON_SIZE)) + .style(ContainerStyle::Disabled) .into() } }) @@ -739,52 +701,38 @@ fn make_remote_config_page<'a>( } else { make_message_button("ADD", Some(Message::RequestRemoteId)) } - .style(style::Button::Orange); - - column() + .style(ButtonStyle::Orange); + + column![ + make_game_time_button(snapshot, false, true, mode, clock_running), + row![ + make_scroll_list( + buttons.unwrap(), + settings.sound.remotes.len(), + index, + title, + ScrollOption::GameParameter, + ContainerStyle::LightGray, + ) + .height(Length::Fill) + .width(Length::FillPortion(5)), + column![ + vertical_space(Length::Fill), + add_btn, + make_message_button("DONE", Some(Message::ChangeConfigPage(ConfigPage::Sound)),) + .style(ButtonStyle::Green), + ] + .spacing(SPACING) + .height(Length::Fill) + .width(Length::Fill), + ] .spacing(SPACING) .height(Length::Fill) - .push(make_game_time_button( - snapshot, - false, - false, - mode, - clock_running, - )) - .push( - row() - .spacing(SPACING) - .height(Length::Fill) - .width(Length::Fill) - .push( - make_scroll_list( - buttons.unwrap(), - settings.sound.remotes.len(), - index, - title, - ScrollOption::GameParameter, - style::Container::LightGray, - ) - .height(Length::Fill) - .width(Length::FillPortion(5)), - ) - .push( - column() - .spacing(SPACING) - .height(Length::Fill) - .width(Length::Fill) - .push(vertical_space(Length::Fill)) - .push(add_btn) - .push( - make_message_button( - "DONE", - Some(Message::ChangeConfigPage(ConfigPage::Sound)), - ) - .style(style::Button::Green), - ), - ), - ) - .into() + .width(Length::Fill), + ] + .spacing(SPACING) + .height(Length::Fill) + .into() } pub(in super::super) fn build_game_parameter_editor<'a>( @@ -827,43 +775,32 @@ pub(in super::super) fn build_game_parameter_editor<'a>( ), }; - column() - .spacing(SPACING) - .align_items(Alignment::Center) - .width(Length::Fill) - .height(Length::Fill) - .push(make_game_time_button( - snapshot, - false, - false, - mode, - clock_running, - )) - .push(vertical_space(Length::Fill)) - .push(make_time_editor(title, length, false)) - .push(vertical_space(Length::Fill)) - .push( - text(String::from("Help: ") + hint) - .size(SMALL_TEXT) - .horizontal_alignment(Horizontal::Center), - ) - .push(vertical_space(Length::Fill)) - .push( - row() - .spacing(SPACING) - .push( - make_button("CANCEL") - .style(style::Button::Red) - .width(Length::Fill) - .on_press(Message::ParameterEditComplete { canceled: true }), - ) - .push(horizontal_space(Length::Fill)) - .push( - make_button("DONE") - .style(style::Button::Green) - .width(Length::Fill) - .on_press(Message::ParameterEditComplete { canceled: false }), - ), - ) - .into() + column![ + make_game_time_button(snapshot, false, true, mode, clock_running), + vertical_space(Length::Fill), + make_time_editor(title, length, false), + vertical_space(Length::Fill), + text(String::from("Help: ") + hint) + .size(SMALL_TEXT) + .line_height(LINE_HEIGHT) + .horizontal_alignment(Horizontal::Center), + vertical_space(Length::Fill), + row![ + make_button("CANCEL") + .style(ButtonStyle::Red) + .width(Length::Fill) + .on_press(Message::ParameterEditComplete { canceled: true }), + horizontal_space(Length::Fill), + make_button("DONE") + .style(ButtonStyle::Green) + .width(Length::Fill) + .on_press(Message::ParameterEditComplete { canceled: false }), + ] + .spacing(SPACING), + ] + .spacing(SPACING) + .align_items(Alignment::Center) + .width(Length::Fill) + .height(Length::Fill) + .into() } diff --git a/refbox/src/app/view_builders/confirmation.rs b/refbox/src/app/view_builders/confirmation.rs index c059218f..322faf04 100644 --- a/refbox/src/app/view_builders/confirmation.rs +++ b/refbox/src/app/view_builders/confirmation.rs @@ -1,11 +1,11 @@ use super::{ - style::{self, PADDING, SPACING}, + style::{ButtonStyle, ContainerStyle, Element, LINE_HEIGHT, PADDING, SPACING}, *, }; use iced::{ alignment::Horizontal, - pure::{column, container, horizontal_space, row, text, vertical_space, Element}, + widget::{column, container, horizontal_space, row, text, vertical_space}, Alignment, Length, }; @@ -28,58 +28,54 @@ pub(in super::super) fn build_confirmation_page<'a>( ConfirmationKind::GameConfigChanged(_) => vec![ ( "GO BACK TO EDITOR", - style::Button::Green, + ButtonStyle::Green, ConfirmationOption::GoBack, ), ( "DISCARD CHANGES", - style::Button::Yellow, + ButtonStyle::Yellow, ConfirmationOption::DiscardChanges, ), ( "END CURRENT GAME AND APPLY CHANGES", - style::Button::Red, + ButtonStyle::Red, ConfirmationOption::EndGameAndApply, ), ], ConfirmationKind::GameNumberChanged => vec![ ( "GO BACK TO EDITOR", - style::Button::Green, + ButtonStyle::Green, ConfirmationOption::GoBack, ), ( "DISCARD CHANGES", - style::Button::Yellow, + ButtonStyle::Yellow, ConfirmationOption::DiscardChanges, ), ( "KEEP CURRENT GAME AND APPLY CHANGE", - style::Button::Orange, + ButtonStyle::Orange, ConfirmationOption::KeepGameAndApply, ), ( "END CURRENT GAME AND APPLY CHANGE", - style::Button::Red, + ButtonStyle::Red, ConfirmationOption::EndGameAndApply, ), ], ConfirmationKind::Error(_) => { - vec![( - "OK", - style::Button::Green, - ConfirmationOption::DiscardChanges, - )] + vec![("OK", ButtonStyle::Green, ConfirmationOption::DiscardChanges)] } ConfirmationKind::UwhScoresIncomplete => vec![ ( "GO BACK TO EDITOR", - style::Button::Green, + ButtonStyle::Green, ConfirmationOption::GoBack, ), ( "DISCARD CHANGES", - style::Button::Yellow, + ButtonStyle::Yellow, ConfirmationOption::DiscardChanges, ), ], @@ -91,44 +87,39 @@ pub(in super::super) fn build_confirmation_page<'a>( .on_press(Message::ConfirmationSelected(option)) }); - let mut button_col = column().spacing(SPACING).width(Length::Fill); + let mut button_col = column![].spacing(SPACING).width(Length::Fill); for button in buttons { button_col = button_col.push(button); } - column() - .width(Length::Fill) - .height(Length::Fill) - .align_items(Alignment::Center) - .push(make_game_time_button( - snapshot, - false, - false, - mode, - clock_running, - )) - .push(vertical_space(Length::Fill)) - .push( - row() - .push(horizontal_space(Length::Fill)) - .push( - container( - column() - .spacing(SPACING) - .width(Length::Fill) - .align_items(Alignment::Center) - .push(text(header_text).horizontal_alignment(Horizontal::Center)) - .push(button_col), - ) - .width(Length::FillPortion(3)) - .style(style::Container::LightGray) - .padding(PADDING), - ) - .push(horizontal_space(Length::Fill)), - ) - .push(vertical_space(Length::Fill)) - .into() + column![ + make_game_time_button(snapshot, false, true, mode, clock_running), + vertical_space(Length::Fill), + row![ + horizontal_space(Length::Fill), + container( + column![ + text(header_text) + .line_height(LINE_HEIGHT) + .horizontal_alignment(Horizontal::Center), + button_col + ] + .spacing(SPACING) + .width(Length::Fill) + .align_items(Alignment::Center), + ) + .width(Length::FillPortion(3)) + .style(ContainerStyle::LightGray) + .padding(PADDING), + horizontal_space(Length::Fill) + ], + vertical_space(Length::Fill) + ] + .width(Length::Fill) + .height(Length::Fill) + .align_items(Alignment::Center) + .into() } pub(in super::super) fn build_score_confirmation_page<'a>( @@ -141,52 +132,40 @@ pub(in super::super) fn build_score_confirmation_page<'a>( "Is this score correct?\nConfirm with cheif referee.\n\nBlack: {} White: {}\n", scores.black, scores.white )) + .line_height(LINE_HEIGHT) .horizontal_alignment(Horizontal::Center); - let options = row() - .spacing(SPACING) - .width(Length::Fill) - .push( - make_button("YES") - .style(style::Button::Green) - .on_press(Message::ScoreConfirmation { correct: true }), - ) - .push( - make_button("NO") - .style(style::Button::Red) - .on_press(Message::ScoreConfirmation { correct: false }), - ); + let options = row![ + make_button("YES") + .style(ButtonStyle::Green) + .on_press(Message::ScoreConfirmation { correct: true }), + make_button("NO") + .style(ButtonStyle::Red) + .on_press(Message::ScoreConfirmation { correct: false }), + ] + .spacing(SPACING) + .width(Length::Fill); - column() - .width(Length::Fill) - .height(Length::Fill) - .align_items(Alignment::Center) - .push(make_game_time_button( - snapshot, - false, - false, - mode, - clock_running, - )) - .push(vertical_space(Length::Fill)) - .push( - row() - .push(horizontal_space(Length::Fill)) - .push( - container( - column() - .spacing(SPACING) - .width(Length::Fill) - .align_items(Alignment::Center) - .push(header) - .push(options), - ) - .width(Length::FillPortion(3)) - .style(style::Container::LightGray) - .padding(PADDING), - ) - .push(horizontal_space(Length::Fill)), - ) - .push(vertical_space(Length::Fill)) - .into() + column![ + make_game_time_button(snapshot, false, true, mode, clock_running), + vertical_space(Length::Fill), + row![ + horizontal_space(Length::Fill), + container( + column![header, options] + .spacing(SPACING) + .width(Length::Fill) + .align_items(Alignment::Center), + ) + .width(Length::FillPortion(3)) + .style(ContainerStyle::LightGray) + .padding(PADDING), + horizontal_space(Length::Fill) + ], + vertical_space(Length::Fill) + ] + .width(Length::Fill) + .height(Length::Fill) + .align_items(Alignment::Center) + .into() } diff --git a/refbox/src/app/view_builders/game_info.rs b/refbox/src/app/view_builders/game_info.rs index 636c9b1d..58258bb0 100644 --- a/refbox/src/app/view_builders/game_info.rs +++ b/refbox/src/app/view_builders/game_info.rs @@ -1,10 +1,10 @@ use super::{ - style::{self, SMALL_TEXT, SPACING}, + style::{ButtonStyle, Element, SMALL_TEXT, SPACING}, *, }; use iced::{ alignment::{Horizontal, Vertical}, - pure::{column, horizontal_space, row, text, Element}, + widget::{column, horizontal_space, row, text}, Length, }; @@ -21,55 +21,40 @@ pub(in super::super) fn build_game_info_page<'a>( clock_running: bool, ) -> Element<'a, Message> { let (left_details, right_details) = details_strings(snapshot, config, using_uwhscores, games); - column() + column![ + make_game_time_button(snapshot, false, false, mode, clock_running,), + row![ + text(left_details) + .size(SMALL_TEXT) + .vertical_alignment(Vertical::Top) + .horizontal_alignment(Horizontal::Left) + .width(Length::Fill), + text(right_details) + .size(SMALL_TEXT) + .vertical_alignment(Vertical::Top) + .horizontal_alignment(Horizontal::Left) + .width(Length::Fill), + ] .spacing(SPACING) - .height(Length::Fill) - .push(make_game_time_button( - snapshot, - false, - false, - mode, - clock_running, - )) - .push( - row() - .spacing(SPACING) + .width(Length::Fill) + .height(Length::Fill), + row![ + make_button("BACK") + .style(ButtonStyle::Red) .width(Length::Fill) - .height(Length::Fill) - .push( - text(left_details) - .size(SMALL_TEXT) - .vertical_alignment(Vertical::Top) - .horizontal_alignment(Horizontal::Left) - .width(Length::Fill), - ) - .push( - text(right_details) - .size(SMALL_TEXT) - .vertical_alignment(Vertical::Top) - .horizontal_alignment(Horizontal::Left) - .width(Length::Fill), - ), - ) - .push( - row() - .spacing(SPACING) + .on_press(Message::ConfigEditComplete { canceled: true }), + horizontal_space(Length::Fill), + make_button("SETTINGS") + .style(ButtonStyle::Gray) .width(Length::Fill) - .push( - make_button("BACK") - .style(style::Button::Red) - .width(Length::Fill) - .on_press(Message::ConfigEditComplete { canceled: true }), - ) - .push(horizontal_space(Length::Fill)) - .push( - make_button("SETTINGS") - .style(style::Button::Gray) - .width(Length::Fill) - .on_press(Message::EditGameConfig), - ), - ) - .into() + .on_press(Message::EditGameConfig), + ] + .spacing(SPACING) + .width(Length::Fill), + ] + .spacing(SPACING) + .height(Length::Fill) + .into() } fn details_strings( diff --git a/refbox/src/app/view_builders/keypad_pages/game_number_edit.rs b/refbox/src/app/view_builders/keypad_pages/game_number_edit.rs index 0e67fd55..5d13bd5a 100644 --- a/refbox/src/app/view_builders/keypad_pages/game_number_edit.rs +++ b/refbox/src/app/view_builders/keypad_pages/game_number_edit.rs @@ -1,32 +1,24 @@ -use super::{ - style::{self, SPACING}, - *, -}; - +use super::{style::Element, *}; use iced::{ - pure::{column, row, vertical_space, Element}, + widget::{column, row, vertical_space}, Length, }; pub(super) fn make_game_number_edit_page<'a>() -> Element<'a, Message> { - column() - .spacing(SPACING) - .push(vertical_space(Length::Fill)) - .push( - row() - .spacing(SPACING) - .push( - make_button("CANCEL") - .style(style::Button::Red) - .width(Length::Fill) - .on_press(Message::ParameterEditComplete { canceled: true }), - ) - .push( - make_button("DONE") - .style(style::Button::Green) - .width(Length::Fill) - .on_press(Message::ParameterEditComplete { canceled: false }), - ), - ) - .into() + column![ + vertical_space(Length::Fill), + row![ + make_button("CANCEL") + .style(ButtonStyle::Red) + .width(Length::Fill) + .on_press(Message::ParameterEditComplete { canceled: true }), + make_button("DONE") + .style(ButtonStyle::Green) + .width(Length::Fill) + .on_press(Message::ParameterEditComplete { canceled: false }), + ] + .spacing(SPACING), + ] + .spacing(SPACING) + .into() } diff --git a/refbox/src/app/view_builders/keypad_pages/mod.rs b/refbox/src/app/view_builders/keypad_pages/mod.rs index 5e8826e1..3500e65b 100644 --- a/refbox/src/app/view_builders/keypad_pages/mod.rs +++ b/refbox/src/app/view_builders/keypad_pages/mod.rs @@ -1,13 +1,20 @@ use crate::config::Mode; use super::{ - style::{self, LARGE_TEXT, MEDIUM_TEXT, MIN_BUTTON_SIZE, PADDING, SPACING}, + style::{ + ButtonStyle, ContainerStyle, Element, SvgStyle, LARGE_TEXT, LINE_HEIGHT, MEDIUM_TEXT, + MIN_BUTTON_SIZE, PADDING, SPACING, + }, *, }; use iced::{ alignment::{Horizontal, Vertical}, - pure::{column, container, row, text, Element}, + widget::{ + button, column, container, row, + svg::{self, Svg}, + text, + }, Alignment, Length, }; @@ -32,148 +39,104 @@ pub(in super::super) fn build_keypad_page<'a>( mode: Mode, clock_running: bool, ) -> Element<'a, Message> { - column() - .spacing(SPACING) - .height(Length::Fill) - .push(make_game_time_button( - snapshot, - false, - false, - mode, - clock_running, - )) - .push( - row() - .spacing(SPACING) - .height(Length::Fill) - .push( - container( - column() - .spacing(SPACING) - .push( - row() - .align_items(Alignment::Center) - .height(Length::Fill) - .width(Length::Units(3 * MIN_BUTTON_SIZE + 2 * SPACING)) - .push( - text(page.text()) - .horizontal_alignment(Horizontal::Left) - .vertical_alignment(Vertical::Center), - ) - .push( - text(player_num.to_string()) - .size(LARGE_TEXT) - .width(Length::Fill) - .horizontal_alignment(Horizontal::Right) - .vertical_alignment(Vertical::Center), - ), - ) - .push( - row() - .spacing(SPACING) - .push( - make_small_button("7", MEDIUM_TEXT) - .style(style::Button::Blue) - .on_press(Message::KeypadButtonPress( - KeypadButton::Seven, - )), - ) - .push( - make_small_button("8", MEDIUM_TEXT) - .style(style::Button::Blue) - .on_press(Message::KeypadButtonPress( - KeypadButton::Eight, - )), - ) - .push( - make_small_button("9", MEDIUM_TEXT) - .style(style::Button::Blue) - .on_press(Message::KeypadButtonPress( - KeypadButton::Nine, - )), - ), - ) - .push( - row() - .spacing(SPACING) - .push( - make_small_button("4", MEDIUM_TEXT) - .style(style::Button::Blue) - .on_press(Message::KeypadButtonPress( - KeypadButton::Four, - )), - ) - .push( - make_small_button("5", MEDIUM_TEXT) - .style(style::Button::Blue) - .on_press(Message::KeypadButtonPress( - KeypadButton::Five, - )), - ) - .push( - make_small_button("6", MEDIUM_TEXT) - .style(style::Button::Blue) - .on_press(Message::KeypadButtonPress( - KeypadButton::Six, - )), - ), + column![ + make_game_time_button(snapshot, false, true, mode, clock_running), + row![ + container( + column![ + row![ + text(page.text()) + .line_height(LINE_HEIGHT) + .horizontal_alignment(Horizontal::Left) + .vertical_alignment(Vertical::Center), + text(player_num.to_string()) + .size(LARGE_TEXT) + .line_height(LINE_HEIGHT) + .width(Length::Fill) + .horizontal_alignment(Horizontal::Right) + .vertical_alignment(Vertical::Center), + ] + .align_items(Alignment::Center) + .height(Length::Fill) + .width(Length::Fixed(3.0 * MIN_BUTTON_SIZE + 2.0 * SPACING)), + row![ + make_small_button("7", MEDIUM_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::KeypadButtonPress(KeypadButton::Seven,)), + make_small_button("8", MEDIUM_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::KeypadButtonPress(KeypadButton::Eight,)), + make_small_button("9", MEDIUM_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::KeypadButtonPress(KeypadButton::Nine,)), + ] + .spacing(SPACING), + row![ + make_small_button("4", MEDIUM_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::KeypadButtonPress(KeypadButton::Four,)), + make_small_button("5", MEDIUM_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::KeypadButtonPress(KeypadButton::Five,)), + make_small_button("6", MEDIUM_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::KeypadButtonPress(KeypadButton::Six,)), + ] + .spacing(SPACING), + row![ + make_small_button("1", MEDIUM_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::KeypadButtonPress(KeypadButton::One,)), + make_small_button("2", MEDIUM_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::KeypadButtonPress(KeypadButton::Two,)), + make_small_button("3", MEDIUM_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::KeypadButtonPress(KeypadButton::Three,)), + ] + .spacing(SPACING), + row![ + make_small_button("0", MEDIUM_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::KeypadButtonPress(KeypadButton::Zero,)), + button( + container( + Svg::new(svg::Handle::from_memory( + &include_bytes!("../../../../resources/backspace.svg")[..], + )) + .style(SvgStyle::White) + .height(Length::Fixed(MEDIUM_TEXT * 1.2)), ) - .push( - row() - .spacing(SPACING) - .push( - make_small_button("1", MEDIUM_TEXT) - .style(style::Button::Blue) - .on_press(Message::KeypadButtonPress( - KeypadButton::One, - )), - ) - .push( - make_small_button("2", MEDIUM_TEXT) - .style(style::Button::Blue) - .on_press(Message::KeypadButtonPress( - KeypadButton::Two, - )), - ) - .push( - make_small_button("3", MEDIUM_TEXT) - .style(style::Button::Blue) - .on_press(Message::KeypadButtonPress( - KeypadButton::Three, - )), - ), - ) - .push( - row() - .spacing(SPACING) - .push( - make_small_button("0", MEDIUM_TEXT) - .style(style::Button::Blue) - .on_press(Message::KeypadButtonPress( - KeypadButton::Zero, - )), - ) - .push( - make_small_button("\u{232b}", LARGE_TEXT) - .width(Length::Units(2 * MIN_BUTTON_SIZE + SPACING)) - .style(style::Button::Blue) - .on_press(Message::KeypadButtonPress( - KeypadButton::Delete, - )), - ), - ), - ) - .style(style::Container::LightGray) - .padding(PADDING), - ) - .push(match page { - KeypadPage::AddScore(color) => make_score_add_page(color), - KeypadPage::Penalty(origin, color, kind) => { - make_penalty_edit_page(origin, color, kind, mode) - } - KeypadPage::GameNumber => make_game_number_edit_page(), - KeypadPage::TeamTimeouts(dur) => make_team_timeout_edit_page(dur), - }), - ) - .into() + .width(Length::Fill) + .height(Length::Fill) + .style(ContainerStyle::Transparent) + .center_x() + .center_y(), + ) + .width(Length::Fixed(2.0 * MIN_BUTTON_SIZE + SPACING)) + .height(Length::Fixed(MIN_BUTTON_SIZE)) + .style(ButtonStyle::Blue) + .on_press(Message::KeypadButtonPress(KeypadButton::Delete,)), + ] + .spacing(SPACING), + ] + .spacing(SPACING), + ) + .style(ContainerStyle::LightGray) + .padding(PADDING), + match page { + KeypadPage::AddScore(color) => make_score_add_page(color), + KeypadPage::Penalty(origin, color, kind) => { + make_penalty_edit_page(origin, color, kind, mode) + } + KeypadPage::GameNumber => make_game_number_edit_page(), + KeypadPage::TeamTimeouts(dur) => make_team_timeout_edit_page(dur), + } + ] + .spacing(SPACING) + .height(Length::Fill), + ] + .spacing(SPACING) + .height(Length::Fill) + .into() } diff --git a/refbox/src/app/view_builders/keypad_pages/penalty_edit.rs b/refbox/src/app/view_builders/keypad_pages/penalty_edit.rs index 87aa8a88..7ed1fe4a 100644 --- a/refbox/src/app/view_builders/keypad_pages/penalty_edit.rs +++ b/refbox/src/app/view_builders/keypad_pages/penalty_edit.rs @@ -1,12 +1,6 @@ -use crate::config::Mode; - -use super::{ - style::{self, SPACING}, - *, -}; - +use super::{style::Element, *}; use iced::{ - pure::{column, row, vertical_space, Element}, + widget::{column, row, vertical_space}, Length, }; @@ -19,8 +13,8 @@ pub(super) fn make_penalty_edit_page<'a>( mode: Mode, ) -> Element<'a, Message> { let (black_style, white_style) = match color { - GameColor::Black => (style::Button::BlackSelected, style::Button::White), - GameColor::White => (style::Button::Black, style::Button::WhiteSelected), + GameColor::Black => (ButtonStyle::BlackSelected, ButtonStyle::White), + GameColor::White => (ButtonStyle::Black, ButtonStyle::WhiteSelected), }; let (green, yellow, orange) = match mode { @@ -45,55 +39,54 @@ pub(super) fn make_penalty_edit_page<'a>( let (green_style, yellow_style, orange_style, td_style) = if kind == green { ( - style::Button::GreenSelected, - style::Button::Yellow, - style::Button::Orange, - style::Button::Red, + ButtonStyle::GreenSelected, + ButtonStyle::Yellow, + ButtonStyle::Orange, + ButtonStyle::Red, ) } else if kind == yellow { ( - style::Button::Green, - style::Button::YellowSelected, - style::Button::Orange, - style::Button::Red, + ButtonStyle::Green, + ButtonStyle::YellowSelected, + ButtonStyle::Orange, + ButtonStyle::Red, ) } else if kind == orange { ( - style::Button::Green, - style::Button::Yellow, - style::Button::OrangeSelected, - style::Button::Red, + ButtonStyle::Green, + ButtonStyle::Yellow, + ButtonStyle::OrangeSelected, + ButtonStyle::Red, ) } else if kind == PenaltyKind::TotalDismissal { ( - style::Button::Green, - style::Button::Yellow, - style::Button::Orange, - style::Button::RedSelected, + ButtonStyle::Green, + ButtonStyle::Yellow, + ButtonStyle::Orange, + ButtonStyle::RedSelected, ) } else { ( - style::Button::Green, - style::Button::Yellow, - style::Button::Orange, - style::Button::Red, + ButtonStyle::Green, + ButtonStyle::Yellow, + ButtonStyle::Orange, + ButtonStyle::Red, ) }; - let mut exit_row = row().spacing(SPACING).push( - make_button("CANCEL") - .style(style::Button::Red) - .width(Length::Fill) - .on_press(Message::PenaltyEditComplete { - canceled: true, - deleted: false, - }), - ); + let mut exit_row = row![make_button("CANCEL") + .style(ButtonStyle::Red) + .width(Length::Fill) + .on_press(Message::PenaltyEditComplete { + canceled: true, + deleted: false, + }),] + .spacing(SPACING); if origin.is_some() { exit_row = exit_row.push( make_button("DELETE") - .style(style::Button::Orange) + .style(ButtonStyle::Orange) .width(Length::Fill) .on_press(Message::PenaltyEditComplete { canceled: false, @@ -104,7 +97,7 @@ pub(super) fn make_penalty_edit_page<'a>( exit_row = exit_row.push( make_button("DONE") - .style(style::Button::Green) + .style(ButtonStyle::Green) .width(Length::Fill) .on_press(Message::PenaltyEditComplete { canceled: false, @@ -128,49 +121,36 @@ pub(super) fn make_penalty_edit_page<'a>( let yellow_label = labels[1]; let orange_label = labels[2]; - column() - .spacing(SPACING) - .push(vertical_space(Length::Fill)) - .push( - row() - .spacing(SPACING) - .push( - make_button("BLACK") - .style(black_style) - .on_press(Message::ChangeColor(GameColor::Black)), - ) - .push( - make_button("WHITE") - .style(white_style) - .on_press(Message::ChangeColor(GameColor::White)), - ), - ) - .push(vertical_space(Length::Fill)) - .push( - row() - .spacing(SPACING) - .push( - make_button(green_label) - .style(green_style) - .on_press(Message::ChangeKind(green)), - ) - .push( - make_button(yellow_label) - .style(yellow_style) - .on_press(Message::ChangeKind(yellow)), - ) - .push( - make_button(orange_label) - .style(orange_style) - .on_press(Message::ChangeKind(orange)), - ) - .push( - make_button("TD") - .style(td_style) - .on_press(Message::ChangeKind(PenaltyKind::TotalDismissal)), - ), - ) - .push(vertical_space(Length::Fill)) - .push(exit_row) - .into() + column![ + vertical_space(Length::Fill), + row![ + make_button("BLACK") + .style(black_style) + .on_press(Message::ChangeColor(GameColor::Black)), + make_button("WHITE") + .style(white_style) + .on_press(Message::ChangeColor(GameColor::White)), + ] + .spacing(SPACING), + vertical_space(Length::Fill), + row![ + make_button(green_label) + .style(green_style) + .on_press(Message::ChangeKind(green)), + make_button(yellow_label) + .style(yellow_style) + .on_press(Message::ChangeKind(yellow)), + make_button(orange_label) + .style(orange_style) + .on_press(Message::ChangeKind(orange)), + make_button("TD") + .style(td_style) + .on_press(Message::ChangeKind(PenaltyKind::TotalDismissal)), + ] + .spacing(SPACING), + vertical_space(Length::Fill), + exit_row, + ] + .spacing(SPACING) + .into() } diff --git a/refbox/src/app/view_builders/keypad_pages/score_add.rs b/refbox/src/app/view_builders/keypad_pages/score_add.rs index ce6d6008..db9f10e9 100644 --- a/refbox/src/app/view_builders/keypad_pages/score_add.rs +++ b/refbox/src/app/view_builders/keypad_pages/score_add.rs @@ -1,10 +1,6 @@ -use super::{ - style::{self, SPACING}, - *, -}; - +use super::{style::Element, *}; use iced::{ - pure::{column, row, vertical_space, Element}, + widget::{column, row, vertical_space}, Length, }; @@ -12,43 +8,34 @@ use uwh_common::game_snapshot::Color as GameColor; pub(super) fn make_score_add_page<'a>(color: GameColor) -> Element<'a, Message> { let (black_style, white_style) = match color { - GameColor::Black => (style::Button::BlackSelected, style::Button::White), - GameColor::White => (style::Button::Black, style::Button::WhiteSelected), + GameColor::Black => (ButtonStyle::BlackSelected, ButtonStyle::White), + GameColor::White => (ButtonStyle::Black, ButtonStyle::WhiteSelected), }; - column() - .spacing(SPACING) - .push(vertical_space(Length::Fill)) - .push( - row() - .spacing(SPACING) - .push( - make_button("BLACK") - .style(black_style) - .on_press(Message::ChangeColor(GameColor::Black)), - ) - .push( - make_button("WHITE") - .style(white_style) - .on_press(Message::ChangeColor(GameColor::White)), - ), - ) - .push(vertical_space(Length::Fill)) - .push( - row() - .spacing(SPACING) - .push( - make_button("CANCEL") - .style(style::Button::Red) - .width(Length::Fill) - .on_press(Message::AddScoreComplete { canceled: true }), - ) - .push( - make_button("DONE") - .style(style::Button::Green) - .width(Length::Fill) - .on_press(Message::AddScoreComplete { canceled: false }), - ), - ) - .into() + column![ + vertical_space(Length::Fill), + row![ + make_button("BLACK") + .style(black_style) + .on_press(Message::ChangeColor(GameColor::Black)), + make_button("WHITE") + .style(white_style) + .on_press(Message::ChangeColor(GameColor::White)), + ] + .spacing(SPACING), + vertical_space(Length::Fill), + row![ + make_button("CANCEL") + .style(ButtonStyle::Red) + .width(Length::Fill) + .on_press(Message::AddScoreComplete { canceled: true }), + make_button("DONE") + .style(ButtonStyle::Green) + .width(Length::Fill) + .on_press(Message::AddScoreComplete { canceled: false }), + ] + .spacing(SPACING), + ] + .spacing(SPACING) + .into() } diff --git a/refbox/src/app/view_builders/keypad_pages/team_timeout_edit.rs b/refbox/src/app/view_builders/keypad_pages/team_timeout_edit.rs index 03b617de..fb116056 100644 --- a/refbox/src/app/view_builders/keypad_pages/team_timeout_edit.rs +++ b/refbox/src/app/view_builders/keypad_pages/team_timeout_edit.rs @@ -1,41 +1,32 @@ -use super::{ - style::{self, SPACING}, - *, -}; - +use super::{style::Element, *}; use iced::{ - pure::{column, horizontal_space, row, vertical_space, Element}, + widget::{column, horizontal_space, row, vertical_space}, Length, }; use std::time::Duration; pub(super) fn make_team_timeout_edit_page<'a>(duration: Duration) -> Element<'a, Message> { - column() - .spacing(SPACING) - .push(vertical_space(Length::Fill)) - .push( - row() - .push(horizontal_space(Length::Fill)) - .push(make_time_editor("TIMEOUT LENGTH", duration, false)) - .push(horizontal_space(Length::Fill)), - ) - .push(vertical_space(Length::Fill)) - .push( - row() - .spacing(SPACING) - .push( - make_button("CANCEL") - .style(style::Button::Red) - .width(Length::Fill) - .on_press(Message::ParameterEditComplete { canceled: true }), - ) - .push( - make_button("DONE") - .style(style::Button::Green) - .width(Length::Fill) - .on_press(Message::ParameterEditComplete { canceled: false }), - ), - ) - .into() + column![ + vertical_space(Length::Fill), + row![ + horizontal_space(Length::Fill), + make_time_editor("TIMEOUT LENGTH", duration, false), + horizontal_space(Length::Fill) + ], + vertical_space(Length::Fill), + row![ + make_button("CANCEL") + .style(ButtonStyle::Red) + .width(Length::Fill) + .on_press(Message::ParameterEditComplete { canceled: true }), + make_button("DONE") + .style(ButtonStyle::Green) + .width(Length::Fill) + .on_press(Message::ParameterEditComplete { canceled: false }), + ] + .spacing(SPACING), + ] + .spacing(SPACING) + .into() } diff --git a/refbox/src/app/view_builders/list_selector.rs b/refbox/src/app/view_builders/list_selector.rs index 56212d78..3f5dd9df 100644 --- a/refbox/src/app/view_builders/list_selector.rs +++ b/refbox/src/app/view_builders/list_selector.rs @@ -1,11 +1,11 @@ use super::{ - style::{self, MIN_BUTTON_SIZE, PADDING, SPACING}, + style::{ButtonStyle, ContainerStyle, Element, LINE_HEIGHT, MIN_BUTTON_SIZE, PADDING, SPACING}, *, }; use collect_array::CollectArrayResult; use iced::{ alignment::{Horizontal, Vertical}, - pure::{button, column, horizontal_space, row, text, vertical_space, Element}, + widget::{button, column, horizontal_space, row, text, vertical_space}, Length, }; @@ -30,6 +30,7 @@ pub(in super::super) fn build_list_selector_page<'a>( }; let title = text(title) + .line_height(LINE_HEIGHT) .height(Length::Fill) .width(Length::Fill) .horizontal_alignment(Horizontal::Center) @@ -48,22 +49,23 @@ pub(in super::super) fn build_list_selector_page<'a>( .map(|pen| { if let Some((btn_text, msg_val)) = pen { let text = text(btn_text) + .line_height(LINE_HEIGHT) .vertical_alignment(Vertical::Center) .horizontal_alignment(Horizontal::Left) .width(Length::Fill); button(text) .padding(PADDING) - .height(Length::Units(MIN_BUTTON_SIZE)) + .height(Length::Fixed(MIN_BUTTON_SIZE)) .width(Length::Fill) - .style(style::Button::Gray) + .style(ButtonStyle::Gray) .on_press(Message::ParameterSelected(param, msg_val)) .into() } else { button(horizontal_space(Length::Shrink)) - .height(Length::Units(MIN_BUTTON_SIZE)) + .height(Length::Fixed(MIN_BUTTON_SIZE)) .width(Length::Fill) - .style(style::Button::Gray) + .style(ButtonStyle::Gray) .into() } }) @@ -109,38 +111,29 @@ pub(in super::super) fn build_list_selector_page<'a>( index, title, ScrollOption::GameParameter, - style::Container::LightGray, + ContainerStyle::LightGray, ) .width(Length::FillPortion(4)); - column() + column![ + make_game_time_button(snapshot, false, true, mode, clock_running), + row![ + scroll_list, + column![ + vertical_space(Length::Fill), + make_button("CANCEL") + .style(ButtonStyle::Red) + .width(Length::Fill) + .height(Length::Fixed(MIN_BUTTON_SIZE)) + .on_press(Message::ParameterEditComplete { canceled: true }), + ] + .width(Length::Fill), + ] .spacing(SPACING) .height(Length::Fill) - .push(make_game_time_button( - snapshot, - false, - false, - mode, - clock_running, - )) - .push( - row() - .spacing(SPACING) - .height(Length::Fill) - .width(Length::Fill) - .push(scroll_list) - .push( - column() - .width(Length::Fill) - .push(vertical_space(Length::Fill)) - .push( - make_button("CANCEL") - .style(style::Button::Red) - .width(Length::Fill) - .height(Length::Units(MIN_BUTTON_SIZE)) - .on_press(Message::ParameterEditComplete { canceled: true }), - ), - ), - ) - .into() + .width(Length::Fill), + ] + .spacing(SPACING) + .height(Length::Fill) + .into() } diff --git a/refbox/src/app/view_builders/main_view.rs b/refbox/src/app/view_builders/main_view.rs index 49339e22..7a520dcb 100644 --- a/refbox/src/app/view_builders/main_view.rs +++ b/refbox/src/app/view_builders/main_view.rs @@ -1,14 +1,16 @@ use super::{ - style::{self, LARGE_TEXT, MIN_BUTTON_SIZE, PADDING, SMALL_PLUS_TEXT, SMALL_TEXT, SPACING}, + style::{ + ButtonStyle, Element, LARGE_TEXT, LINE_HEIGHT, MIN_BUTTON_SIZE, PADDING, SMALL_PLUS_TEXT, + SMALL_TEXT, SPACING, + }, *, }; use iced::{ alignment::{Horizontal, Vertical}, - pure::{button, column, horizontal_space, row, text, Element}, + widget::{button, column, horizontal_space, row, text}, Alignment, Length, }; - use uwh_common::{ config::Game as GameConfig, game_snapshot::{Color as GameColor, GamePeriod, GameSnapshot, PenaltyTime, TimeoutSnapshot}, @@ -24,10 +26,7 @@ pub(in super::super) fn build_main_view<'a>( ) -> Element<'a, Message> { let time_button = make_game_time_button(snapshot, true, false, mode, clock_running); - let mut center_col = column() - .spacing(SPACING) - .width(Length::Fill) - .push(time_button); + let mut center_col = column![time_button].spacing(SPACING).width(Length::Fill); match snapshot.timeout { TimeoutSnapshot::White(_) @@ -36,7 +35,7 @@ pub(in super::super) fn build_main_view<'a>( | TimeoutSnapshot::PenaltyShot(_) => { center_col = center_col.push( make_button("END TIMEOUT") - .style(style::Button::Yellow) + .style(ButtonStyle::Yellow) .on_press(Message::EndTimeout), ) } @@ -49,7 +48,7 @@ pub(in super::super) fn build_main_view<'a>( | GamePeriod::PreSuddenDeath => { center_col = center_col.push( make_button("START NOW") - .style(style::Button::Green) + .style(ButtonStyle::Green) .on_press(Message::StartPlayNow), ) } @@ -66,11 +65,12 @@ pub(in super::super) fn build_main_view<'a>( button( text(config_string(snapshot, config, using_uwhscores, games)) .size(SMALL_TEXT) + .line_height(LINE_HEIGHT) .vertical_alignment(Vertical::Center) .horizontal_alignment(Horizontal::Left), ) .padding(PADDING) - .style(style::Button::LightGray) + .style(ButtonStyle::LightGray) .width(Length::Fill) .height(Length::Fill) .on_press(Message::ShowGameDetails), @@ -102,32 +102,31 @@ pub(in super::super) fn build_main_view<'a>( }; let button_style = if make_penalties_red { - style::Button::Red + ButtonStyle::Red } else { match color { - GameColor::Black => style::Button::Black, - GameColor::White => style::Button::White, + GameColor::Black => ButtonStyle::Black, + GameColor::White => ButtonStyle::White, } }; button( - column() - .spacing(SPACING) - .push( - text("Penalties") - .vertical_alignment(Vertical::Center) - .horizontal_alignment(Horizontal::Center) - .width(Length::Fill), - ) - .push( - text(penalty_string(penalties)) - .vertical_alignment(Vertical::Top) - .horizontal_alignment(Horizontal::Left) - .width(Length::Fill) - .height(Length::Fill), - ) - .width(Length::Fill) - .height(Length::Fill), + column![ + text("PENALTIES") + .line_height(LINE_HEIGHT) + .vertical_alignment(Vertical::Center) + .horizontal_alignment(Horizontal::Center) + .width(Length::Fill), + text(penalty_string(penalties)) + .line_height(LINE_HEIGHT) + .vertical_alignment(Vertical::Top) + .horizontal_alignment(Horizontal::Left) + .width(Length::Fill) + .height(Length::Fill), + ] + .spacing(SPACING) + .width(Length::Fill) + .height(Length::Fill), ) .padding(PADDING) .width(Length::Fill) @@ -137,32 +136,40 @@ pub(in super::super) fn build_main_view<'a>( }; let mut black_score_btn = button( - column() - .align_items(Alignment::Center) - .width(Length::Fill) - .push("BLACK") - .push(text(snapshot.b_score.to_string()).size(LARGE_TEXT)), + column![ + text("BLACK").line_height(LINE_HEIGHT), + text(snapshot.b_score.to_string()) + .size(LARGE_TEXT) + .line_height(LINE_HEIGHT), + ] + .align_items(Alignment::Center) + .width(Length::Fill), ) .padding(PADDING) .width(Length::Fill) - .height(Length::Units(MIN_BUTTON_SIZE + SMALL_PLUS_TEXT + PADDING)) - .style(style::Button::Black); + .height(Length::Fixed(MIN_BUTTON_SIZE + SMALL_PLUS_TEXT + PADDING)) + .style(ButtonStyle::Black); - let mut black_new_score_btn = make_button("SCORE\nBLACK").style(style::Button::Black); + let mut black_new_score_btn = + make_multi_label_button(("SCORE", "BLACK")).style(ButtonStyle::Black); let mut white_score_btn = button( - column() - .align_items(Alignment::Center) - .width(Length::Fill) - .push("WHITE") - .push(text(snapshot.w_score.to_string()).size(LARGE_TEXT)), + column![ + text("WHITE").line_height(LINE_HEIGHT), + text(snapshot.w_score.to_string()) + .size(LARGE_TEXT) + .line_height(LINE_HEIGHT), + ] + .align_items(Alignment::Center) + .width(Length::Fill), ) .padding(PADDING) .width(Length::Fill) - .height(Length::Units(MIN_BUTTON_SIZE + SMALL_PLUS_TEXT + PADDING)) - .style(style::Button::White); + .height(Length::Fixed(MIN_BUTTON_SIZE + SMALL_PLUS_TEXT + PADDING)) + .style(ButtonStyle::White); - let mut white_new_score_btn = make_button("SCORE\nWHITE").style(style::Button::White); + let mut white_new_score_btn = + make_multi_label_button(("SCORE", "WHITE")).style(ButtonStyle::White); if snapshot.current_period != GamePeriod::BetweenGames { black_score_btn = black_score_btn.on_press(Message::EditScores); @@ -171,46 +178,46 @@ pub(in super::super) fn build_main_view<'a>( white_new_score_btn = white_new_score_btn.on_press(Message::AddNewScore(GameColor::White)); } - let black_col = column() - .spacing(SPACING) - .align_items(Alignment::Center) + let black_col = column![ + black_score_btn, + black_new_score_btn, + make_penalty_button(snapshot, GameColor::Black), + ] + .spacing(SPACING) + .align_items(Alignment::Center) + .width(Length::Fill); + + let white_col = column![ + white_score_btn, + white_new_score_btn, + make_penalty_button(snapshot, GameColor::White), + ] + .spacing(SPACING) + .align_items(Alignment::Center) + .width(Length::Fill); + + row![ + row![ + black_col, + horizontal_space(Length::Fixed(3.0 * SPACING / 4.0)), + ] .width(Length::Fill) - .push(black_score_btn) - .push(black_new_score_btn) - .push(make_penalty_button(snapshot, GameColor::Black)); - - let white_col = column() - .spacing(SPACING) - .align_items(Alignment::Center) + .spacing(0), + row![ + horizontal_space(Length::Fixed(SPACING / 4.0)), + center_col, + horizontal_space(Length::Fixed(SPACING / 4.0)), + ] + .width(Length::FillPortion(2)) + .spacing(0), + row![ + horizontal_space(Length::Fixed(3.0 * SPACING / 4.0)), + white_col, + ] .width(Length::Fill) - .push(white_score_btn) - .push(white_new_score_btn) - .push(make_penalty_button(snapshot, GameColor::White)); - - row() - .spacing(0) - .height(Length::Fill) - .push( - row() - .width(Length::Fill) - .spacing(0) - .push(black_col) - .push(horizontal_space(Length::Units(3 * SPACING / 4))), - ) - .push( - row() - .width(Length::FillPortion(2)) - .spacing(0) - .push(horizontal_space(Length::Units(SPACING / 4))) - .push(center_col) - .push(horizontal_space(Length::Units(SPACING / 4))), - ) - .push( - row() - .width(Length::Fill) - .spacing(0) - .push(horizontal_space(Length::Units(3 * SPACING / 4))) - .push(white_col), - ) - .into() + .spacing(0), + ] + .spacing(0) + .height(Length::Fill) + .into() } diff --git a/refbox/src/app/view_builders/penalties.rs b/refbox/src/app/view_builders/penalties.rs index ae64d268..28341932 100644 --- a/refbox/src/app/view_builders/penalties.rs +++ b/refbox/src/app/view_builders/penalties.rs @@ -1,11 +1,15 @@ use super::{ - style::{self, GREEN, MIN_BUTTON_SIZE, ORANGE, PADDING, RED, SPACING}, + style::{ + ButtonStyle, Container, ContainerStyle, Element, LINE_HEIGHT, MIN_BUTTON_SIZE, PADDING, + SPACING, + }, *, }; +use crate::app::style::TextStyle; use collect_array::CollectArrayResult; use iced::{ alignment::{Horizontal, Vertical}, - pure::{button, column, horizontal_space, row, text, widget::Container, Element}, + widget::{button, column, horizontal_space, row, text}, Length, }; @@ -18,68 +22,65 @@ pub(in super::super) fn build_penalty_overview_page<'a>( mode: Mode, clock_running: bool, ) -> Element<'a, Message> { - column() + let default_pen_len = match mode { + Mode::Hockey3V3 => PenaltyKind::ThirtySecond, + Mode::Hockey6V6 => PenaltyKind::OneMinute, + Mode::Rugby => PenaltyKind::TwoMinute, + }; + + column![ + make_game_time_button(snapshot, false, true, mode, clock_running), + row![ + make_penalty_list( + penalties.black, + indices.black, + GameColor::Black, + default_pen_len + ), + make_penalty_list( + penalties.white, + indices.white, + GameColor::White, + default_pen_len + ) + ] .spacing(SPACING) - .height(Length::Fill) - .push(make_game_time_button( - snapshot, - false, - false, - mode, - clock_running, - )) - .push( - row() - .spacing(SPACING) - .height(Length::Fill) - .push(make_penalty_list( - penalties.black, - indices.black, + .height(Length::Fill), + row![ + make_button("CANCEL") + .style(ButtonStyle::Red) + .width(Length::Fill) + .on_press(Message::PenaltyOverviewComplete { canceled: true }), + make_button("NEW") + .style(ButtonStyle::Blue) + .width(Length::Fill) + .on_press(Message::KeypadPage(KeypadPage::Penalty( + None, GameColor::Black, - )) - .push(make_penalty_list( - penalties.white, - indices.white, - GameColor::White, - )), - ) - .push( - row() - .spacing(SPACING) - .push( - make_button("CANCEL") - .style(style::Button::Red) - .width(Length::Fill) - .on_press(Message::PenaltyOverviewComplete { canceled: true }), - ) - .push( - make_button("NEW") - .style(style::Button::Blue) - .width(Length::Fill) - .on_press(Message::KeypadPage(KeypadPage::Penalty( - None, - GameColor::Black, - PenaltyKind::OneMinute, - ))), - ) - .push( - make_button("DONE") - .style(style::Button::Green) - .width(Length::Fill) - .on_press(Message::PenaltyOverviewComplete { canceled: false }), - ), - ) - .into() + default_pen_len, + ))), + make_button("DONE") + .style(ButtonStyle::Green) + .width(Length::Fill) + .on_press(Message::PenaltyOverviewComplete { canceled: false }), + ] + .spacing(SPACING), + ] + .spacing(SPACING) + .height(Length::Fill) + .into() } fn make_penalty_list<'a>( penalties: Vec<(String, FormatHint, PenaltyKind)>, index: usize, color: GameColor, + default_pen_len: PenaltyKind, ) -> Container<'a, Message> { const PENALTY_LIST_LEN: usize = 3; let title = text(format!("{} PENALTIES", color.to_string().to_uppercase())) + .line_height(LINE_HEIGHT) .height(Length::Fill) .width(Length::Fill) .horizontal_alignment(Horizontal::Center) @@ -97,22 +98,23 @@ fn make_penalty_list<'a>( .map(|pen| { if let Some((i, (pen_text, format, kind))) = pen { let mut text = text(pen_text) + .line_height(LINE_HEIGHT) .vertical_alignment(Vertical::Center) .horizontal_alignment(Horizontal::Left) .width(Length::Fill); match format { FormatHint::NoChange => {} - FormatHint::Edited => text = text.color(ORANGE), - FormatHint::Deleted => text = text.color(RED), - FormatHint::New => text = text.color(GREEN), + FormatHint::Edited => text = text.style(TextStyle::Orange), + FormatHint::Deleted => text = text.style(TextStyle::Red), + FormatHint::New => text = text.style(TextStyle::Green), } button(text) .padding(PADDING) - .height(Length::Units(MIN_BUTTON_SIZE)) + .height(Length::Fixed(MIN_BUTTON_SIZE)) .width(Length::Fill) - .style(style::Button::Gray) + .style(ButtonStyle::Gray) .on_press(Message::KeypadPage(KeypadPage::Penalty( Some((color, i)), color, @@ -121,13 +123,13 @@ fn make_penalty_list<'a>( .into() } else { button(horizontal_space(Length::Shrink)) - .height(Length::Units(MIN_BUTTON_SIZE)) + .height(Length::Fixed(MIN_BUTTON_SIZE)) .width(Length::Fill) - .style(style::Button::Gray) + .style(ButtonStyle::Gray) .on_press(Message::KeypadPage(KeypadPage::Penalty( None, color, - PenaltyKind::OneMinute, + default_pen_len, ))) .into() } @@ -135,8 +137,8 @@ fn make_penalty_list<'a>( .collect(); let cont_style = match color { - GameColor::Black => style::Container::Black, - GameColor::White => style::Container::White, + GameColor::Black => ContainerStyle::Black, + GameColor::White => ContainerStyle::White, }; let scroll_option = match color { diff --git a/refbox/src/app/view_builders/score_edit.rs b/refbox/src/app/view_builders/score_edit.rs index 95623d42..c3aac4d5 100644 --- a/refbox/src/app/view_builders/score_edit.rs +++ b/refbox/src/app/view_builders/score_edit.rs @@ -1,11 +1,11 @@ use super::{ - style::{self, LARGE_TEXT, PADDING, SPACING}, + style::{ButtonStyle, ContainerStyle, Element, LARGE_TEXT, LINE_HEIGHT, PADDING, SPACING}, *, }; use iced::{ alignment::Horizontal, - pure::{column, container, horizontal_space, row, text, vertical_space, Element}, + widget::{column, container, horizontal_space, row, text, vertical_space}, Alignment, Length, }; @@ -25,95 +25,85 @@ pub(in super::super) fn build_score_edit_view<'a>( }; let black_edit = container( - row() + row![ + column![ + make_small_button("+", LARGE_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::ChangeScore { + color: GameColor::Black, + increase: true, + }), + make_small_button("-", LARGE_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::ChangeScore { + color: GameColor::Black, + increase: false, + }), + ] + .spacing(SPACING), + column![ + "BLACK", + text(scores.black.to_string()) + .size(LARGE_TEXT) + .line_height(LINE_HEIGHT) + ] .spacing(SPACING) - .align_items(Alignment::Center) - .push( - column() - .spacing(SPACING) - .push( - make_small_button("+", LARGE_TEXT) - .style(style::Button::Blue) - .on_press(Message::ChangeScore { - color: GameColor::Black, - increase: true, - }), - ) - .push( - make_small_button("-", LARGE_TEXT) - .style(style::Button::Blue) - .on_press(Message::ChangeScore { - color: GameColor::Black, - increase: false, - }), - ), - ) - .push( - column() - .spacing(SPACING) - .width(Length::Fill) - .align_items(Alignment::Center) - .push("BLACK") - .push(text(scores.black.to_string()).size(LARGE_TEXT)), - ), + .width(Length::Fill) + .align_items(Alignment::Center), + ] + .spacing(SPACING) + .align_items(Alignment::Center), ) .padding(PADDING) .width(Length::FillPortion(2)) - .style(style::Container::Black); + .style(ContainerStyle::Black); let white_edit = container( - row() + row![ + column![ + "WHITE", + text(scores.white.to_string()) + .size(LARGE_TEXT) + .line_height(LINE_HEIGHT) + ] .spacing(SPACING) - .align_items(Alignment::Center) - .push( - column() - .spacing(SPACING) - .width(Length::Fill) - .align_items(Alignment::Center) - .push("WHITE") - .push(text(scores.white.to_string()).size(LARGE_TEXT)), - ) - .push( - column() - .spacing(SPACING) - .push( - make_small_button("+", LARGE_TEXT) - .style(style::Button::Blue) - .on_press(Message::ChangeScore { - color: GameColor::White, - increase: true, - }), - ) - .push( - make_small_button("-", LARGE_TEXT) - .style(style::Button::Blue) - .on_press(Message::ChangeScore { - color: GameColor::White, - increase: false, - }), - ), - ), + .width(Length::Fill) + .align_items(Alignment::Center), + column![ + make_small_button("+", LARGE_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::ChangeScore { + color: GameColor::White, + increase: true, + }), + make_small_button("-", LARGE_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::ChangeScore { + color: GameColor::White, + increase: false, + }), + ] + .spacing(SPACING), + ] + .spacing(SPACING) + .align_items(Alignment::Center), ) .padding(PADDING) .width(Length::FillPortion(2)) - .style(style::Container::White); + .style(ContainerStyle::White); - let mut main_col = column() - .spacing(SPACING) - .height(Length::Fill) - .push(make_game_time_button( - snapshot, - false, - false, - mode, - clock_running, - )) - .push(vertical_space(Length::Fill)); + let mut main_col = column![ + make_game_time_button(snapshot, false, true, mode, clock_running), + vertical_space(Length::Fill) + ] + .spacing(SPACING) + .height(Length::Fill); if is_confirmation { main_col = main_col .push( text("Please enter the final score") + .line_height(LINE_HEIGHT) .horizontal_alignment(Horizontal::Center) .width(Length::Fill), ) @@ -122,25 +112,25 @@ pub(in super::super) fn build_score_edit_view<'a>( main_col .push( - row() - .spacing(SPACING) - .push(horizontal_space(Length::Fill)) - .push(black_edit) - .push(horizontal_space(Length::Fill)) - .push(white_edit) - .push(horizontal_space(Length::Fill)), + row![ + horizontal_space(Length::Fill), + black_edit, + horizontal_space(Length::Fill), + white_edit, + horizontal_space(Length::Fill) + ] + .spacing(SPACING), ) .push(vertical_space(Length::Fill)) .push( - row() - .spacing(SPACING) - .push(make_message_button("CANCEL", cancel_btn_msg).style(style::Button::Red)) - .push(horizontal_space(Length::Fill)) - .push( - make_button("DONE") - .style(style::Button::Green) - .on_press(Message::ScoreEditComplete { canceled: false }), - ), + row![ + make_message_button("CANCEL", cancel_btn_msg).style(ButtonStyle::Red), + horizontal_space(Length::Fill), + make_button("DONE") + .style(ButtonStyle::Green) + .on_press(Message::ScoreEditComplete { canceled: false }), + ] + .spacing(SPACING), ) .into() } diff --git a/refbox/src/app/view_builders/shared_elements.rs b/refbox/src/app/view_builders/shared_elements.rs index 4d814a4a..a99145c6 100644 --- a/refbox/src/app/view_builders/shared_elements.rs +++ b/refbox/src/app/view_builders/shared_elements.rs @@ -1,19 +1,18 @@ use super::{ message::*, style::{ - self, BLACK, GREEN, LARGE_TEXT, MEDIUM_TEXT, MIN_BUTTON_SIZE, PADDING, RED, - SMALL_PLUS_TEXT, SMALL_TEXT, SPACING, WHITE, YELLOW, + Button, ButtonStyle, Container, ContainerStyle, Row, SvgStyle, Text, TextStyle, LARGE_TEXT, + LINE_HEIGHT, MEDIUM_TEXT, MIN_BUTTON_SIZE, PADDING, SMALL_PLUS_TEXT, SMALL_TEXT, SPACING, }, + Element, }; use crate::{config::Mode, tournament_manager::TournamentManager}; -use uwh_common::{drawing_support::*, uwhscores::GameInfo}; - use iced::{ alignment::{Horizontal, Vertical}, - pure::{ - button, column, container, horizontal_space, row, text, vertical_space, - widget::{Button, Container, Row, Text}, - Element, + widget::{ + button, column, container, horizontal_space, row, + svg::{self, Svg}, + text, vertical_space, }, Alignment, Length, }; @@ -27,18 +26,38 @@ use std::{ }; use uwh_common::{ config::Game as GameConfig, + drawing_support::*, game_snapshot::{GamePeriod, GameSnapshot, PenaltySnapshot, PenaltyTime, TimeoutSnapshot}, + uwhscores::GameInfo, }; +macro_rules! column { + () => ( + iced::widget::Column::new() + ); + ($($x:expr),+ $(,)?) => ( + iced::widget::Column::with_children(vec![$($crate::app::Element::from($x)),+]) + ); +} + +macro_rules! row { + () => ( + iced::widget::Row::new() + ); + ($($x:expr),+ $(,)?) => ( + iced::widget::Row::with_children(vec![$($crate::app::Element::from($x)),+]) + ); +} + pub(super) fn make_scroll_list<'a, const LIST_LEN: usize>( buttons: [Element<'a, Message>; LIST_LEN], num_items: usize, index: usize, - title: Text, + title: Text<'a>, scroll_option: ScrollOption, - cont_style: impl iced::pure::widget::container::StyleSheet + 'a, + cont_style: ContainerStyle, ) -> Container<'a, Message> { - let mut main_col = column().spacing(SPACING).width(Length::Fill).push(title); + let mut main_col = column![title].spacing(SPACING).width(Length::Fill); for button in buttons { main_col = main_col.push(button); @@ -71,9 +90,39 @@ pub(super) fn make_scroll_list<'a, const LIST_LEN: usize>( other => Length::FillPortion(other), }; - let mut up_btn = make_small_button("\u{25b2}", MEDIUM_TEXT).style(style::Button::Blue); - - let mut down_btn = make_small_button("\u{25be}", MEDIUM_TEXT).style(style::Button::Blue); + let mut up_btn = button( + container( + Svg::new(svg::Handle::from_memory( + &include_bytes!("../../../resources/arrow_drop_up.svg")[..], + )) + .style(SvgStyle::White), + ) + .width(Length::Fill) + .height(Length::Fill) + .style(ContainerStyle::Transparent) + .center_x() + .center_y(), + ) + .width(Length::Fixed(MIN_BUTTON_SIZE)) + .height(Length::Fixed(MIN_BUTTON_SIZE)) + .style(ButtonStyle::Blue); + + let mut down_btn = button( + container( + Svg::new(svg::Handle::from_memory( + &include_bytes!("../../../resources/arrow_drop_down.svg")[..], + )) + .style(SvgStyle::White), + ) + .width(Length::Fill) + .height(Length::Fill) + .style(ContainerStyle::Transparent) + .center_x() + .center_y(), + ) + .width(Length::Fixed(MIN_BUTTON_SIZE)) + .height(Length::Fixed(MIN_BUTTON_SIZE)) + .style(ButtonStyle::Blue); if can_scroll_up { up_btn = up_btn.on_press(Message::Scroll { @@ -89,46 +138,39 @@ pub(super) fn make_scroll_list<'a, const LIST_LEN: usize>( }); } - let scroll_bar = row() + let scroll_bar = row![] .width(Length::Fill) .height(Length::Fill) .push(horizontal_space(Length::Fill)) .push( - container( - column() - .push(vertical_space(top_len)) - .push( - container(vertical_space(Length::Fill)) - .width(Length::Fill) - .height(Length::FillPortion(LIST_LEN as u16)) - .style(style::Container::Gray), - ) - .push(vertical_space(bottom_len)), - ) + container(column![ + vertical_space(top_len), + container(vertical_space(Length::Fill)) + .width(Length::Fill) + .height(Length::FillPortion(LIST_LEN as u16)) + .style(ContainerStyle::Gray), + vertical_space(bottom_len), + ]) .padding(PADDING) .width(Length::FillPortion(2)) .height(Length::Fill) - .style(style::Container::ScrollBar), + .style(ContainerStyle::ScrollBar), ) .push(horizontal_space(Length::Fill)); container( - row() - .spacing(SPACING) - .width(Length::Fill) - .height(Length::Fill) - .push(main_col) - .push( - column() - .spacing(SPACING) - .width(Length::Units(MIN_BUTTON_SIZE)) - .height(Length::Fill) - .push(up_btn) - .push(scroll_bar) - .push(down_btn), - ), + row![ + main_col, + column![up_btn, scroll_bar, down_btn] + .spacing(SPACING) + .width(Length::Fixed(MIN_BUTTON_SIZE)) + .height(Length::Fill), + ] + .spacing(SPACING) + .width(Length::Fill) + .height(Length::Fill) + .padding(PADDING), ) - .padding(PADDING) .width(Length::Fill) .height(Length::Fill) .style(cont_style) @@ -142,79 +184,85 @@ pub(in super::super) fn build_timeout_ribbon<'a>( let tm = tm.lock().unwrap(); let black = match snapshot.timeout { - TimeoutSnapshot::None => make_message_button( - "BLACK\nTIMEOUT", + TimeoutSnapshot::None => make_multi_label_message_button( + ("BLACK", "TIMEOUT"), tm.can_start_b_timeout() .ok() .map(|_| Message::BlackTimeout(false)), ) - .style(style::Button::Black), - TimeoutSnapshot::Black(_) => make_message_button("END\nTIMEOUT", Some(Message::EndTimeout)) - .style(style::Button::Yellow), + .style(ButtonStyle::Black), + TimeoutSnapshot::Black(_) => { + make_multi_label_message_button(("END", "TIMEOUT"), Some(Message::EndTimeout)) + .style(ButtonStyle::Yellow) + } TimeoutSnapshot::White(_) | TimeoutSnapshot::Ref(_) | TimeoutSnapshot::PenaltyShot(_) => { - make_message_button( - "SWITCH TO\nBLACK", + make_multi_label_message_button( + ("SWITCH TO", "BLACK"), tm.can_switch_to_b_timeout() .ok() .map(|_| Message::BlackTimeout(true)), ) - .style(style::Button::Black) + .style(ButtonStyle::Black) } }; let white = match snapshot.timeout { - TimeoutSnapshot::None => make_message_button( - "WHITE\nTIMEOUT", + TimeoutSnapshot::None => make_multi_label_message_button( + ("WHITE", "TIMEOUT"), tm.can_start_w_timeout() .ok() .map(|_| Message::WhiteTimeout(false)), ) - .style(style::Button::White), - TimeoutSnapshot::White(_) => make_message_button("END\nTIMEOUT", Some(Message::EndTimeout)) - .style(style::Button::Yellow), + .style(ButtonStyle::White), + TimeoutSnapshot::White(_) => { + make_multi_label_message_button(("END", "TIMEOUT"), Some(Message::EndTimeout)) + .style(ButtonStyle::Yellow) + } TimeoutSnapshot::Black(_) | TimeoutSnapshot::Ref(_) | TimeoutSnapshot::PenaltyShot(_) => { - make_message_button( - "SWITCH TO\nWHITE", + make_multi_label_message_button( + ("SWITCH TO", "WHITE"), tm.can_switch_to_w_timeout() .ok() .map(|_| Message::WhiteTimeout(true)), ) - .style(style::Button::White) + .style(ButtonStyle::White) } }; let referee = match snapshot.timeout { - TimeoutSnapshot::None => make_message_button( - "REF\nTIMEOUT", + TimeoutSnapshot::None => make_multi_label_message_button( + ("REF", "TIMEOUT"), tm.can_start_ref_timeout() .ok() .map(|_| Message::RefTimeout(false)), ) - .style(style::Button::Yellow), - TimeoutSnapshot::Ref(_) => make_message_button("END\nTIMEOUT", Some(Message::EndTimeout)) - .style(style::Button::Yellow), + .style(ButtonStyle::Yellow), + TimeoutSnapshot::Ref(_) => { + make_multi_label_message_button(("END", "TIMEOUT"), Some(Message::EndTimeout)) + .style(ButtonStyle::Yellow) + } TimeoutSnapshot::Black(_) | TimeoutSnapshot::White(_) | TimeoutSnapshot::PenaltyShot(_) => { - make_message_button( - "SWITCH TO\nREF", + make_multi_label_message_button( + ("SWITCH TO", "REF"), tm.can_switch_to_ref_timeout() .ok() .map(|_| Message::RefTimeout(true)), ) - .style(style::Button::Yellow) + .style(ButtonStyle::Yellow) } }; let penalty = match snapshot.timeout { - TimeoutSnapshot::None => make_message_button( - "PENALTY\nSHOT", + TimeoutSnapshot::None => make_multi_label_message_button( + ("PENALTY", "SHOT"), tm.can_start_penalty_shot() .ok() .map(|_| Message::PenaltyShot(false)), ) - .style(style::Button::Red), + .style(ButtonStyle::Red), TimeoutSnapshot::PenaltyShot(_) => { - make_message_button("END\nTIMEOUT", Some(Message::EndTimeout)) - .style(style::Button::Yellow) + make_multi_label_message_button(("END", "TIMEOUT"), Some(Message::EndTimeout)) + .style(ButtonStyle::Yellow) } TimeoutSnapshot::Black(_) | TimeoutSnapshot::White(_) | TimeoutSnapshot::Ref(_) => { let can_switch = if mode == Mode::Rugby { @@ -222,22 +270,17 @@ pub(in super::super) fn build_timeout_ribbon<'a>( } else { tm.can_switch_to_penalty_shot() }; - make_message_button( - "SWITCH TO\nPEN SHOT", + make_multi_label_message_button( + ("SWITCH TO", "PEN SHOT"), can_switch.ok().map(|_| Message::PenaltyShot(true)), ) - .style(style::Button::Red) + .style(ButtonStyle::Red) } }; drop(tm); - row() - .spacing(SPACING) - .push(black) - .push(referee) - .push(penalty) - .push(white) + row![black, referee, penalty, white].spacing(SPACING) } pub(super) fn make_game_time_button<'a>( @@ -280,20 +323,20 @@ pub(super) fn make_game_time_button<'a>( let (mut period_text, period_color) = { let (text, color) = match snapshot.current_period { - GamePeriod::BetweenGames => ("NEXT GAME", YELLOW), - GamePeriod::FirstHalf => ("FIRST HALF", GREEN), - GamePeriod::HalfTime => ("HALF TIME", YELLOW), - GamePeriod::SecondHalf => ("SECOND HALF", GREEN), - GamePeriod::PreOvertime => ("PRE OVERTIME BREAK", YELLOW), - GamePeriod::OvertimeFirstHalf => ("OVERTIME FIRST HALF", GREEN), - GamePeriod::OvertimeHalfTime => ("OVERTIME HALF TIME", YELLOW), - GamePeriod::OvertimeSecondHalf => ("OVERTIME SECOND HALF", GREEN), - GamePeriod::PreSuddenDeath => ("PRE SUDDEN DEATH BREAK", YELLOW), - GamePeriod::SuddenDeath => ("SUDDEN DEATH", GREEN), + GamePeriod::BetweenGames => ("NEXT GAME", TextStyle::Yellow), + GamePeriod::FirstHalf => ("FIRST HALF", TextStyle::Green), + GamePeriod::HalfTime => ("HALF TIME", TextStyle::Yellow), + GamePeriod::SecondHalf => ("SECOND HALF", TextStyle::Green), + GamePeriod::PreOvertime => ("PRE OVERTIME BREAK", TextStyle::Yellow), + GamePeriod::OvertimeFirstHalf => ("OVERTIME FIRST HALF", TextStyle::Green), + GamePeriod::OvertimeHalfTime => ("OVERTIME HALF TIME", TextStyle::Yellow), + GamePeriod::OvertimeSecondHalf => ("OVERTIME SECOND HALF", TextStyle::Green), + GamePeriod::PreSuddenDeath => ("PRE SUDDEN DEATH BREAK", TextStyle::Yellow), + GamePeriod::SuddenDeath => ("SUDDEN DEATH", TextStyle::Green), }; if make_red { - (text, BLACK) + (text, TextStyle::Black) } else { (text, color) } @@ -320,30 +363,35 @@ pub(super) fn make_game_time_button<'a>( }; } - let make_time_view_row = |period_text, time_text, color| { + let make_time_view_row = |period_text, time_text, style| { let per = text(period_text) - .color(color) + .line_height(LINE_HEIGHT) + .style(style) .width(Length::Fill) .vertical_alignment(Vertical::Center) .horizontal_alignment(Horizontal::Right); let time = text(time_text) - .color(color) + .line_height(LINE_HEIGHT) + .style(style) .size(LARGE_TEXT) .width(Length::Fill) .vertical_alignment(Vertical::Center) .horizontal_alignment(Horizontal::Left); - let r = row().spacing(SPACING); + let r = row![].spacing(SPACING); make_time_view!(r, per, time) }; - let make_time_view_col = |period_text, time_text, color| { - let per = text(period_text).color(color); - let time = text(time_text).color(color).size(LARGE_TEXT); - let c = column(); + let make_time_view_col = |period_text, time_text, style| { + let per = text(period_text).line_height(LINE_HEIGHT).style(style); + let time = text(time_text) + .line_height(LINE_HEIGHT) + .style(style) + .size(LARGE_TEXT); + let c = column![]; make_time_view!(c, per, time) }; - let mut content = row() + let mut content = row![] .spacing(SPACING) .height(Length::Fill) .width(Length::Fill) @@ -352,11 +400,18 @@ pub(super) fn make_game_time_button<'a>( let timeout_info = match snapshot.timeout { TimeoutSnapshot::White(_) => Some(( if tall { "WHT T/O" } else { "WHITE TIMEOUT" }, - if make_red { BLACK } else { WHITE }, + if make_red { + TextStyle::Black + } else { + TextStyle::White + }, )), - TimeoutSnapshot::Black(_) => Some((if tall { "BLK T/O" } else { "BLACK TIMEOUT" }, BLACK)), - TimeoutSnapshot::Ref(_) => Some(("REF TMOUT", YELLOW)), - TimeoutSnapshot::PenaltyShot(_) => Some(("PNLTY SHT", RED)), + TimeoutSnapshot::Black(_) => Some(( + if tall { "BLK T/O" } else { "BLACK TIMEOUT" }, + TextStyle::Black, + )), + TimeoutSnapshot::Ref(_) => Some(("REF TMOUT", TextStyle::Yellow)), + TimeoutSnapshot::PenaltyShot(_) => Some(("PNLTY SHT", TextStyle::Red)), TimeoutSnapshot::None => None, }; @@ -384,15 +439,15 @@ pub(super) fn make_game_time_button<'a>( } let button_height = if tall { - Length::Units(MIN_BUTTON_SIZE + SMALL_PLUS_TEXT + PADDING) + Length::Fixed(MIN_BUTTON_SIZE + SMALL_PLUS_TEXT + PADDING) } else { - Length::Units(MIN_BUTTON_SIZE) + Length::Fixed(MIN_BUTTON_SIZE) }; let button_style = if make_red { - style::Button::Red + ButtonStyle::Red } else { - style::Button::Gray + ButtonStyle::Gray }; let time_button = button(content) @@ -406,28 +461,30 @@ pub(super) fn make_game_time_button<'a>( Message::EditTime }); - let mut time_row = row() + let mut time_row = row![time_button] .height(button_height) .width(Length::Fill) - .spacing(SPACING) - .push(time_button); + .spacing(SPACING); if mode == Mode::Rugby { - let play_pause_text = if clock_running { - "\u{25AE} \u{25AE}" - } else { - "\u{25B6}" - }; - let play_pause_text = text(play_pause_text) - .size(LARGE_TEXT) - .vertical_alignment(Vertical::Center) - .horizontal_alignment(Horizontal::Center) - .width(Length::Fill) - .height(Length::Fill); - let mut play_pause_button = button(play_pause_text) - .style(style::Button::Gray) + let play_pause_icon = container( + Svg::new(svg::Handle::from_memory(if clock_running { + &include_bytes!("../../../resources/pause.svg")[..] + } else { + &include_bytes!("../../../resources/play_arrow.svg")[..] + })) + .style(SvgStyle::Black) + .height(Length::Fixed(LARGE_TEXT * 1.2)), + ) + .width(Length::Fill) + .height(Length::Fill) + .style(ContainerStyle::Transparent) + .center_x() + .center_y(); + let mut play_pause_button = button(play_pause_icon) + .style(ButtonStyle::Gray) .height(button_height) - .width(Length::Units(MIN_BUTTON_SIZE)); + .width(Length::Fixed(MIN_BUTTON_SIZE)); if !editing_time { play_pause_button = play_pause_button.on_press(if clock_running { Message::StopClock @@ -441,75 +498,70 @@ pub(super) fn make_game_time_button<'a>( time_row } -pub(super) fn make_time_editor<'a, T: Into>( +pub(super) fn make_time_editor<'a, T: ToString>( title: T, time: Duration, timeout: bool, ) -> Container<'a, Message> { let wide = time > Duration::from_secs(MAX_STRINGABLE_SECS as u64); + let min_edits = column![ + make_small_button("+", LARGE_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::ChangeTime { + increase: true, + secs: 60, + timeout, + }), + make_small_button("-", LARGE_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::ChangeTime { + increase: false, + secs: 60, + timeout, + }), + ] + .spacing(SPACING); + + let sec_edits = column![ + make_small_button("+", LARGE_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::ChangeTime { + increase: true, + secs: 1, + timeout, + }), + make_small_button("-", LARGE_TEXT) + .style(ButtonStyle::Blue) + .on_press(Message::ChangeTime { + increase: false, + secs: 1, + timeout, + }), + ] + .spacing(SPACING); + + let time_edit = row![ + min_edits, + text(time_string(time)) + .size(LARGE_TEXT) + .line_height(LINE_HEIGHT) + .horizontal_alignment(Horizontal::Center) + .width(Length::Fixed(if wide { 300.0 } else { 200.0 })), + sec_edits, + ] + .spacing(SPACING) + .align_items(Alignment::Center); + container( - column() - .spacing(SPACING) - .align_items(Alignment::Center) - .push(text(title).size(MEDIUM_TEXT)) - .push( - row() - .spacing(SPACING) - .align_items(Alignment::Center) - .push( - column() - .spacing(SPACING) - .push( - make_small_button("+", LARGE_TEXT) - .style(style::Button::Blue) - .on_press(Message::ChangeTime { - increase: true, - secs: 60, - timeout, - }), - ) - .push( - make_small_button("-", LARGE_TEXT) - .style(style::Button::Blue) - .on_press(Message::ChangeTime { - increase: false, - secs: 60, - timeout, - }), - ), - ) - .push( - text(time_string(time)) - .size(LARGE_TEXT) - .horizontal_alignment(Horizontal::Center) - .width(Length::Units(if wide { 300 } else { 200 })), - ) - .push( - column() - .spacing(SPACING) - .push( - make_small_button("+", LARGE_TEXT) - .style(style::Button::Blue) - .on_press(Message::ChangeTime { - increase: true, - secs: 1, - timeout, - }), - ) - .push( - make_small_button("-", LARGE_TEXT) - .style(style::Button::Blue) - .on_press(Message::ChangeTime { - increase: false, - secs: 1, - timeout, - }), - ), - ), - ), + column![ + text(title).size(MEDIUM_TEXT).line_height(LINE_HEIGHT), + time_edit + ] + .spacing(SPACING) + .align_items(Alignment::Center), ) - .style(style::Container::LightGray) + .style(ContainerStyle::LightGray) .padding(PADDING) } @@ -694,19 +746,36 @@ pub(super) fn config_string( result } -pub(super) fn make_button<'a, Message: Clone, T: Into>(label: T) -> Button<'a, Message> { +pub(super) fn make_button<'a, Message: Clone, T: ToString>(label: T) -> Button<'a, Message> { + button(centered_text(label)) + .padding(PADDING) + .height(Length::Fixed(MIN_BUTTON_SIZE)) + .width(Length::Fill) +} + +pub(super) fn make_multi_label_button<'a, Message: 'a + Clone, T: ToString>( + labels: (T, T), +) -> Button<'a, Message> { button( - text(label) - .vertical_alignment(Vertical::Center) - .horizontal_alignment(Horizontal::Center) - .width(Length::Fill), + column![centered_text(labels.0), centered_text(labels.1)] + .width(Length::Fill) + .height(Length::Fill), ) .padding(PADDING) - .height(Length::Units(MIN_BUTTON_SIZE)) + .height(Length::Fixed(MIN_BUTTON_SIZE)) .width(Length::Fill) } -pub(super) fn make_message_button<'a, Message: Clone, T: Into>( +fn centered_text<'a, T: ToString>(label: T) -> Text<'a> { + text(label) + .line_height(LINE_HEIGHT) + .vertical_alignment(Vertical::Center) + .horizontal_alignment(Horizontal::Center) + .width(Length::Fill) + .height(Length::Fill) +} + +pub(super) fn make_message_button<'a, Message: Clone, T: ToString>( label: T, message: Option, ) -> Button<'a, Message> { @@ -717,55 +786,59 @@ pub(super) fn make_message_button<'a, Message: Clone, T: Into>( } } -pub(super) fn make_small_button<'a, Message: Clone, T: Into>( +pub(super) fn make_multi_label_message_button<'a, Message: 'a + Clone, T: ToString>( + labels: (T, T), + message: Option, +) -> Button<'a, Message> { + if let Some(msg) = message { + make_multi_label_button(labels).on_press(msg) + } else { + make_multi_label_button(labels) + } +} + +pub(super) fn make_small_button<'a, Message: Clone, T: ToString>( label: T, - size: u16, + size: f32, ) -> Button<'a, Message> { - button( - text(label) - .size(size) - .vertical_alignment(Vertical::Center) - .horizontal_alignment(Horizontal::Center) - .width(Length::Fill), - ) - .width(Length::Units(MIN_BUTTON_SIZE)) - .height(Length::Units(MIN_BUTTON_SIZE)) + button(centered_text(label).size(size)) + .width(Length::Fixed(MIN_BUTTON_SIZE)) + .height(Length::Fixed(MIN_BUTTON_SIZE)) } -pub(super) fn make_value_button<'a, Message: 'a + Clone, T: Into, U: Into>( +pub(super) fn make_value_button<'a, Message: 'a + Clone, T: ToString, U: ToString>( first_label: T, second_label: U, large_text: (bool, bool), message: Option, ) -> Button<'a, Message> { let mut button = button( - row() - .spacing(SPACING) - .align_items(Alignment::Center) - .push( - text(first_label) - .size(if large_text.0 { - MEDIUM_TEXT - } else { - SMALL_TEXT - }) - .vertical_alignment(Vertical::Center), - ) - .push(horizontal_space(Length::Fill)) - .push( - text(second_label) - .size(if large_text.1 { - MEDIUM_TEXT - } else { - SMALL_TEXT - }) - .vertical_alignment(Vertical::Center), - ), + row![ + text(first_label) + .size(if large_text.0 { + MEDIUM_TEXT + } else { + SMALL_TEXT + }) + .line_height(LINE_HEIGHT) + .vertical_alignment(Vertical::Center), + horizontal_space(Length::Fill), + text(second_label) + .size(if large_text.1 { + MEDIUM_TEXT + } else { + SMALL_TEXT + }) + .line_height(LINE_HEIGHT) + .vertical_alignment(Vertical::Center), + ] + .spacing(SPACING) + .align_items(Alignment::Center) + .padding(PADDING), ) - .padding(PADDING) .height(Length::Fill) .width(Length::Fill) - .style(style::Button::LightGray); + .style(ButtonStyle::LightGray); if let Some(message) = message { button = button.on_press(message); diff --git a/refbox/src/app/view_builders/time_edit.rs b/refbox/src/app/view_builders/time_edit.rs index bfe4aef3..89128fb1 100644 --- a/refbox/src/app/view_builders/time_edit.rs +++ b/refbox/src/app/view_builders/time_edit.rs @@ -1,10 +1,10 @@ use super::{ - style::{self, SMALL_TEXT, SPACING}, + style::{ButtonStyle, LINE_HEIGHT, SMALL_TEXT, SPACING}, *, }; use iced::{ alignment::Horizontal, - pure::{column, horizontal_space, row, text, vertical_space, Element}, + widget::{column, horizontal_space, row, text, vertical_space}, Alignment, Length, }; use std::time::Duration; @@ -17,12 +17,13 @@ pub(in super::super) fn build_time_edit_view<'a>( mode: Mode, clock_running: bool, ) -> Element<'a, Message> { - let mut edit_row = row() - .spacing(SPACING) - .align_items(Alignment::Center) - .push(horizontal_space(Length::Fill)) - .push(make_time_editor("GAME TIME", time, false)) - .push(horizontal_space(Length::Fill)); + let mut edit_row = row![ + horizontal_space(Length::Fill), + make_time_editor("GAME TIME", time, false), + horizontal_space(Length::Fill) + ] + .spacing(SPACING) + .align_items(Alignment::Center); if snapshot.timeout != TimeoutSnapshot::None { edit_row = edit_row @@ -31,42 +32,31 @@ pub(in super::super) fn build_time_edit_view<'a>( .push(horizontal_space(Length::Fill)); } - column() - .spacing(SPACING) - .height(Length::Fill) - .push(make_game_time_button( - snapshot, - false, - true, - mode, - clock_running, - )) - .push(vertical_space(Length::Fill)) - .push( - text("Note: Game time is paused while on this screen") - .size(SMALL_TEXT) + column![ + make_game_time_button(snapshot, false, false, mode, clock_running), + vertical_space(Length::Fill), + text("Note: Game time is paused while on this screen") + .size(SMALL_TEXT) + .line_height(LINE_HEIGHT) + .width(Length::Fill) + .horizontal_alignment(Horizontal::Center), + vertical_space(Length::Fill), + edit_row, + vertical_space(Length::Fill), + row![ + make_button("CANCEL") + .style(ButtonStyle::Red) .width(Length::Fill) - .horizontal_alignment(Horizontal::Center), - ) - .push(vertical_space(Length::Fill)) - .push(edit_row) - .push(vertical_space(Length::Fill)) - .push( - row() - .spacing(SPACING) - .push( - make_button("CANCEL") - .style(style::Button::Red) - .width(Length::Fill) - .on_press(Message::TimeEditComplete { canceled: true }), - ) - .push(horizontal_space(Length::Fill)) - .push( - make_button("DONE") - .style(style::Button::Green) - .width(Length::Fill) - .on_press(Message::TimeEditComplete { canceled: false }), - ), - ) - .into() + .on_press(Message::TimeEditComplete { canceled: true }), + horizontal_space(Length::Fill), + make_button("DONE") + .style(ButtonStyle::Green) + .width(Length::Fill) + .on_press(Message::TimeEditComplete { canceled: false }), + ] + .spacing(SPACING), + ] + .spacing(SPACING) + .height(Length::Fill) + .into() } diff --git a/refbox/src/main.rs b/refbox/src/main.rs index 1a489eac..097c16b1 100644 --- a/refbox/src/main.rs +++ b/refbox/src/main.rs @@ -1,7 +1,8 @@ #![cfg_attr(windows, windows_subsystem = "windows")] use clap::Parser; -use iced::{pure::Application, window::icon::Icon, Settings}; +use iced::{window::icon, Application, Settings}; +use iced_core::Font; use log::*; #[cfg(debug_assertions)] use log4rs::append::console::{ConsoleAppender, Target}; @@ -181,7 +182,7 @@ fn main() -> std::result::Result<(), Box> { let spacing = args.spacing.unwrap_or(args.scale / 4.0); let icon = - Icon::from_rgba(Vec::from(app_icon::DATA), app_icon::WIDTH, app_icon::HEIGHT).unwrap(); + icon::from_rgba(Vec::from(app_icon::DATA), app_icon::WIDTH, app_icon::HEIGHT).unwrap(); if args.is_simulator { let flags = sim_app::SimRefBoxAppFlags { @@ -308,7 +309,12 @@ fn main() -> std::result::Result<(), Box> { settings.window.resizable = false; settings.window.icon = Some(icon); settings.default_text_size = app::style::SMALL_PLUS_TEXT; - settings.default_font = Some(include_bytes!("../resources/Roboto-Medium.ttf")); + settings.default_font = Font { + family: iced_core::font::Family::Name("Roboto"), + weight: iced_core::font::Weight::Medium, + stretch: iced_core::font::Stretch::Normal, + monospaced: false, + }; info!("Starting UI"); app::RefBoxApp::run(settings)?; diff --git a/refbox/src/sim_app/mod.rs b/refbox/src/sim_app/mod.rs index 2d774b04..dda4d191 100644 --- a/refbox/src/sim_app/mod.rs +++ b/refbox/src/sim_app/mod.rs @@ -1,19 +1,21 @@ use arrayref::array_ref; use iced::{ - canvas::{Cache, Cursor, Fill, Geometry, Program}, - executor, Application, Canvas, Color, Command, Element, Length, Point, Rectangle, Size, - Subscription, + application, executor, + mouse::Cursor, + widget::canvas::{Cache, Canvas, Fill, Geometry, Program}, + Application, Color, Command, Length, Point, Rectangle, Size, Subscription, }; use iced_futures::{ futures::{ future::{pending, Pending}, stream::{self, BoxStream}, }, - subscription::Recipe, + subscription::{EventStream, Recipe}, }; +use iced_runtime::{command, window}; use log::*; use matrix_drawing::{draw_panels, transmitted_data::TransmittedData}; -use std::{hash::Hasher, rc::Rc, sync::Mutex}; +use std::{rc::Rc, sync::Mutex}; use tokio::{ net::TcpStream, time::{self, Duration}, @@ -22,7 +24,6 @@ use tokio::{ mod display_simulator; use display_simulator::*; -const WINDOW_BACKGROUND: Color = Color::BLACK; const WIDTH: usize = 256; const HEIGHT: usize = 64; @@ -45,7 +46,6 @@ pub struct SimRefBoxApp { buffer: Rc>>, cache: Cache, listener: SnapshotListener, - should_stop: bool, } #[derive(Clone, Debug)] @@ -53,9 +53,33 @@ pub struct SimRefBoxAppFlags { pub tcp_port: u16, } +#[derive(Clone, Copy, Debug, Default)] +pub enum ApplicationTheme { + #[default] + Dark, +} + +#[derive(Clone, Copy, Debug, Default)] +pub struct ApplicationStyle {} + +impl application::StyleSheet for ApplicationTheme { + type Style = ApplicationStyle; + + fn appearance(&self, _style: &Self::Style) -> application::Appearance { + application::Appearance { + background_color: Color::BLACK, + text_color: Color::BLACK, + } + } +} + +type Renderer = iced_renderer::Renderer; +type Element<'a, Message> = iced::Element<'a, Message, Renderer>; + impl Application for SimRefBoxApp { type Executor = executor::Default; type Message = Message; + type Theme = ApplicationTheme; type Flags = SimRefBoxAppFlags; fn new(flags: Self::Flags) -> (Self, Command) { @@ -66,7 +90,6 @@ impl Application for SimRefBoxApp { buffer: Rc::new(Mutex::new(Default::default())), cache: Cache::new(), listener: SnapshotListener { port: tcp_port }, - should_stop: false, }, Command::none(), ) @@ -80,14 +103,6 @@ impl Application for SimRefBoxApp { "Panel Simulator".into() } - fn background_color(&self) -> iced::Color { - WINDOW_BACKGROUND - } - - fn should_exit(&self) -> bool { - self.should_stop - } - fn update(&mut self, message: Message) -> Command { trace!("Handling message: {message:?}"); match message { @@ -96,15 +111,14 @@ impl Application for SimRefBoxApp { buffer.clear_buffer(); draw_panels(&mut *buffer, data.snapshot, data.white_on_right, data.flash).unwrap(); self.cache.clear(); + Command::none() } - Message::Stop => self.should_stop = true, - Message::NoAction => {} + Message::Stop => Command::single(command::Action::Window(window::Action::Close)), + Message::NoAction => Command::none(), } - - Command::none() } - fn view(&mut self) -> Element { + fn view(&self) -> Element { Canvas::new(self) .width(Length::Fill) .height(Length::Fill) @@ -112,11 +126,20 @@ impl Application for SimRefBoxApp { } } -impl Program for SimRefBoxApp { - fn draw(&self, bounds: Rectangle, _cursor: Cursor) -> Vec { +impl Program for SimRefBoxApp { + type State = (); + + fn draw( + &self, + _state: &Self::State, + renderer: &Renderer, + _theme: &ApplicationTheme, + bounds: Rectangle, + _cursor: Cursor, + ) -> Vec { let buffer_ = self.buffer.clone(); let panel = - self.cache.draw(bounds.size(), |frame| { + self.cache.draw(renderer, bounds.size(), |frame| { let buffer = buffer_.lock().unwrap(); let horiz_spacing = frame.width() / ((WIDTH * 5 + 1) as f32); @@ -152,16 +175,16 @@ struct SnapshotListener { port: u16, } -impl Recipe for SnapshotListener { +impl Recipe for SnapshotListener { type Output = Message; - fn hash(&self, state: &mut H) { + fn hash(&self, state: &mut iced_core::Hasher) { use std::hash::Hash; "SnapshotListener".hash(state); } - fn stream(self: Box, _input: BoxStream<'static, I>) -> BoxStream<'static, Self::Output> { + fn stream(self: Box, _input: EventStream) -> BoxStream<'static, Self::Output> { info!("Sim: starting listener"); #[derive(Debug)] diff --git a/refbox/src/sound_controller/mod.rs b/refbox/src/sound_controller/mod.rs index caeadc03..050e2ea5 100644 --- a/refbox/src/sound_controller/mod.rs +++ b/refbox/src/sound_controller/mod.rs @@ -553,7 +553,7 @@ impl Sound { gain_r.connect_at(&_merger, 0, 1); gain_r.gain().set_value(volumes.right); - let source = context.create_buffer_source(); + let mut source = context.create_buffer_source(); source.set_buffer(buffer); source.connect(&gain_l); source.connect(&gain_r); @@ -599,7 +599,7 @@ impl Sound { } } - async fn stop(self) { + async fn stop(mut self) { let fade_end = self.context.current_time() + FADE_LEN; // Set the gains so that the start of the fade is now, not when the sound started diff --git a/uwh-common/Cargo.toml b/uwh-common/Cargo.toml index e62f6937..487230b5 100644 --- a/uwh-common/Cargo.toml +++ b/uwh-common/Cargo.toml @@ -23,7 +23,7 @@ time = { version = "0.3", features = [ "serde", "serde-human-readable", ], optional = true } -toml = { version = "0.5", optional = true } +toml = { version = "0.8", optional = true } [dev-dependencies] env_logger = "0.9"