From 09a639b3b8bfcaf4f534f127bbc410afa3fdd074 Mon Sep 17 00:00:00 2001 From: Yuan Zhu Date: Mon, 1 Jul 2024 08:23:28 +0800 Subject: [PATCH] Refactor main (#16) * fix: update egui and eframe to 0.27.2 * fix: update opendal to 0.47.1 --- Cargo.lock | 1998 ++++++++++++++++++------- Cargo.toml | 6 +- crates/cc_storage/Cargo.toml | 2 +- crates/cc_storage/src/client.rs | 185 +-- crates/cc_storage/src/error.rs | 2 + crates/cc_storage/src/lib.rs | 4 +- crates/cc_storage/src/partial_file.rs | 120 ++ crates/cc_storage/src/stream.rs | 216 +++ crates/cc_storage/src/transfer.rs | 4 +- crates/cc_ui/src/design_tokens.rs | 17 +- crates/cc_ui/src/lib.rs | 28 +- icons/icon.png | Bin 0 -> 20331 bytes src/main.rs | 46 +- src/pages/auth.rs | 5 +- src/pages/main.rs | 2 +- src/widgets/confirm.rs | 2 +- src/widgets/file_view.rs | 2 +- src/widgets/list_item.rs | 2 +- src/widgets/thumb_item.rs | 4 +- src/widgets/top_bar.rs | 10 +- 20 files changed, 1993 insertions(+), 662 deletions(-) create mode 100644 crates/cc_storage/src/partial_file.rs create mode 100644 crates/cc_storage/src/stream.rs create mode 100644 icons/icon.png diff --git a/Cargo.lock b/Cargo.lock index 6937f5f..02f8e45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,9 +20,9 @@ checksum = "330223a1aecc308757b9926e9391c9b47f8ef2dbd8aea9df88312aea18c5e8d6" [[package]] name = "accesskit" -version = "0.11.0" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c98a5d094590335462354da402d754fe2cb78f0e6ce5024611c28ed539c1de" +checksum = "74a4b14f3d99c1255dcba8f45621ab1a2e7540a0009652d33989005a4d0bfc6b" dependencies = [ "enumn", "serde", @@ -30,59 +30,61 @@ dependencies = [ [[package]] name = "accesskit_consumer" -version = "0.15.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca541e0fdb600916d196a940228df99b86d804fd2e6ef13894d7814f2799db43" +checksum = "8c17cca53c09fbd7288667b22a201274b9becaa27f0b91bf52a526db95de45e6" dependencies = [ "accesskit", ] [[package]] name = "accesskit_macos" -version = "0.7.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfea17e5bb5dcbfcf5b256ab2f5889a3e6f6582de78b9db9b6689adad3b002f3" +checksum = "cd3b6ae1eabbfbced10e840fd3fce8a93ae84f174b3e4ba892ab7bcb42e477a7" dependencies = [ "accesskit", "accesskit_consumer", - "objc2", + "objc2 0.3.0-beta.3", "once_cell", ] [[package]] name = "accesskit_unix" -version = "0.5.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4d1517421278cc8e67422d0786a18cf4291093ebe49eadf1cf989ff80e57f90" +checksum = "09f46c18d99ba61ad7123dd13eeb0c104436ab6af1df6a1cd8c11054ed394a08" dependencies = [ "accesskit", "accesskit_consumer", "async-channel", + "async-once-cell", "atspi", - "futures-lite", + "futures-lite 1.13.0", + "once_cell", "serde", "zbus", ] [[package]] name = "accesskit_windows" -version = "0.14.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e11c7f177739f23bd19bb856e4a64fdd96eb8638ec0a6a6dde9a7019a9e91c53" +checksum = "afcae27ec0974fc7c3b0b318783be89fd1b2e66dd702179fe600166a38ff4a0b" dependencies = [ "accesskit", "accesskit_consumer", - "arrayvec", "once_cell", "paste", - "windows 0.44.0", + "static_assertions", + "windows 0.48.0", ] [[package]] name = "accesskit_winit" -version = "0.14.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f741b54fba827e49a73d55fdd43e8d3d5133aa7710a48581013c7802f232b83" +checksum = "5284218aca17d9e150164428a0ebc7b955f70e3a9a78b4c20894513aabf98a67" dependencies = [ "accesskit", "accesskit_macos", @@ -110,15 +112,16 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.1" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464b3811b747f8f7ebc8849c9c728c39f6ac98a055edad93baf9eb330e3f8f9d" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", "getrandom", "once_cell", "serde", "version_check", + "zerocopy", ] [[package]] @@ -130,15 +133,23 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + [[package]] name = "android-activity" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4165a1aef703232031b40a6e8908c2f9e314d495f11aa7f98db75d39a497cc6a" +checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289" dependencies = [ "android-properties", - "bitflags", + "bitflags 2.6.0", "cc", + "cesu8", + "jni 0.21.1", "jni-sys", "libc", "log", @@ -146,6 +157,7 @@ dependencies = [ "ndk-context", "ndk-sys", "num_enum", + "thiserror", ] [[package]] @@ -177,19 +189,16 @@ checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" [[package]] name = "arboard" -version = "3.2.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6041616acea41d67c4a984709ddab1587fd0b10efe5cc563fee954d2f011854" +checksum = "9fb4009533e8ff8f1450a5bcbc30f4242a1d34442221f72314bea1f5dc9c7f89" dependencies = [ "clipboard-win", "log", - "objc", - "objc-foundation", - "objc_id", - "once_cell", + "objc2 0.5.2", + "objc2-app-kit", + "objc2-foundation", "parking_lot", - "thiserror", - "winapi", "x11rb", ] @@ -205,26 +214,42 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[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-broadcast" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b19760fa2b7301cf235360ffd6d3558b1ed4249edd16d6cca8d690cee265b95" dependencies = [ - "event-listener", + "event-listener 2.5.3", "futures-core", "parking_lot", ] [[package]] name = "async-channel" -version = "1.8.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener-strategy", "futures-core", + "pin-project-lite", ] [[package]] @@ -233,42 +258,107 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b" dependencies = [ - "async-lock", + "async-lock 2.6.0", "async-task", "concurrent-queue", "fastrand 1.9.0", - "futures-lite", + "futures-lite 1.13.0", "slab", ] +[[package]] +name = "async-fs" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +dependencies = [ + "async-lock 2.6.0", + "autocfg", + "blocking", + "futures-lite 1.13.0", +] + [[package]] name = "async-io" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c374dda1ed3e7d8f0d9ba58715f924862c63eae6849c92d3a18e7fbde9e2794" dependencies = [ - "async-lock", + "async-lock 2.6.0", "autocfg", "concurrent-queue", - "futures-lite", + "futures-lite 1.13.0", "libc", "log", "parking", - "polling", + "polling 2.4.0", "slab", "socket2 0.4.9", "waker-fn", "windows-sys 0.42.0", ] +[[package]] +name = "async-io" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" +dependencies = [ + "async-lock 3.4.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.3.0", + "parking", + "polling 3.7.2", + "rustix", + "slab", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "async-lock" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8101efe8695a6c17e02911402145357e718ac92d3ff88ae8419e84b1707b685" dependencies = [ - "event-listener", - "futures-lite", + "event-listener 2.5.3", + "futures-lite 1.13.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.3.1", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-once-cell" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9338790e78aa95a416786ec8389546c4b6a1dfc3dc36071ed9518a9413a542eb" + +[[package]] +name = "async-process" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +dependencies = [ + "async-io 1.12.0", + "async-lock 2.6.0", + "async-signal", + "blocking", + "cfg-if", + "event-listener 3.1.0", + "futures-lite 1.13.0", + "rustix", + "windows-sys 0.48.0", ] [[package]] @@ -282,6 +372,24 @@ dependencies = [ "syn 1.0.103", ] +[[package]] +name = "async-signal" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "794f185324c2f00e771cd9f1ae8b5ac68be2ca7abb129a87afd6e86d228bc54d" +dependencies = [ + "async-io 2.3.3", + "async-lock 3.4.0", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.52.0", +] + [[package]] name = "async-task" version = "4.3.0" @@ -296,7 +404,7 @@ checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.11", + "syn 2.0.68", ] [[package]] @@ -311,6 +419,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "atomic_refcell" version = "0.1.8" @@ -319,29 +433,50 @@ checksum = "73b5e5f48b927f04e952dedc932f31995a65a0bf65ec971c74436e51bf6e970d" [[package]] name = "atspi" -version = "0.10.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "674e7a3376837b2e7d12d34d58ac47073c491dc3bf6f71a7adaf687d4d817faa" +checksum = "6059f350ab6f593ea00727b334265c4dfc7fd442ee32d264794bd9bdc68e87ca" +dependencies = [ + "atspi-common", + "atspi-connection", + "atspi-proxies", +] + +[[package]] +name = "atspi-common" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92af95f966d2431f962bc632c2e68eda7777330158bf640c4af4249349b2cdf5" dependencies = [ - "async-recursion", - "async-trait", - "atspi-macros", "enumflags2", - "futures-lite", "serde", - "tracing", + "static_assertions", "zbus", "zbus_names", + "zvariant", ] [[package]] -name = "atspi-macros" -version = "0.2.0" +name = "atspi-connection" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb4870a32c0eaa17e35bca0e6b16020635157121fb7d45593d242c295bc768" +checksum = "a0c65e7d70f86d4c0e3b2d585d9bf3f979f0b19d635a336725a88d279f76b939" dependencies = [ - "quote", - "syn 1.0.103", + "atspi-common", + "atspi-proxies", + "futures-lite 1.13.0", + "zbus", +] + +[[package]] +name = "atspi-proxies" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6495661273703e7a229356dcbe8c8f38223d697aacfaf0e13590a9ac9977bb52" +dependencies = [ + "atspi-common", + "serde", + "zbus", ] [[package]] @@ -386,12 +521,33 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[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 = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + [[package]] name = "block" version = "0.1.6" @@ -422,7 +578,16 @@ version = "0.1.0-beta.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" dependencies = [ - "objc-sys", + "objc-sys 0.2.0-beta.2", +] + +[[package]] +name = "block-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7" +dependencies = [ + "objc-sys 0.3.5", ] [[package]] @@ -431,8 +596,40 @@ version = "0.2.0-alpha.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" dependencies = [ - "block-sys", - "objc2-encode", + "block-sys 0.1.0-beta.1", + "objc2-encode 2.0.0-pre.2", +] + +[[package]] +name = "block2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b55663a85f33501257357e6421bb33e769d5c9ffb5ba0921c975a123e35e68" +dependencies = [ + "block-sys 0.2.1", + "objc2 0.4.1", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite 2.3.0", + "piper", ] [[package]] @@ -443,22 +640,22 @@ checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" [[package]] name = "bytemuck" -version = "1.12.3" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaa3a8d9a1ca92e282c96a32d6511b695d7d994d1d102ba85d279f9b2756947f" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.3.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe233b960f12f8007e3db2d136e3cb1c291bfd7396e384ee76025fc1a3932b4" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.103", + "syn 2.0.68", ] [[package]] @@ -491,15 +688,28 @@ dependencies = [ [[package]] name = "calloop" -version = "0.10.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eb0438b3c6d262395fe30e6de9a61beb57ea56290b00a07f227fe6e20cbf2" +checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" dependencies = [ + "bitflags 2.6.0", "log", - "nix 0.24.2", - "slotmap", + "polling 3.7.2", + "rustix", + "slab", "thiserror", - "vec_map", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02" +dependencies = [ + "calloop", + "rustix", + "wayland-backend", + "wayland-client", ] [[package]] @@ -513,7 +723,7 @@ dependencies = [ "cc_ui", "crossbeam-channel", "eframe", - "egui 0.23.0", + "egui 0.27.2", "egui-notify", "egui_extras", "image", @@ -563,7 +773,7 @@ name = "cc_files" version = "0.1.0" dependencies = [ "anyhow", - "egui 0.23.0", + "egui 0.27.2", "enum-map", "infer", "serde", @@ -591,7 +801,7 @@ dependencies = [ "chrono", "crossbeam-channel", "futures", - "http", + "http 0.2.9", "opendal", "pin-project", "thiserror", @@ -604,7 +814,7 @@ name = "cc_ui" version = "0.1.0" dependencies = [ "eframe", - "egui 0.23.0", + "egui 0.27.2", ] [[package]] @@ -669,27 +879,25 @@ dependencies = [ [[package]] name = "clipboard-win" -version = "4.4.2" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4ab1b92798304eedc095b53942963240037c0516452cb11aeba709d420b2219" +checksum = "79f4473f5144e20d9aceaf2972478f06ddf687831eafeeb434fbaf0acc4144ad" dependencies = [ "error-code", - "str-buf", - "winapi", ] [[package]] name = "cocoa" -version = "0.24.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" dependencies = [ - "bitflags", + "bitflags 1.3.2", "block", "cocoa-foundation", "core-foundation", "core-graphics", - "foreign-types", + "foreign-types 0.5.0", "libc", "objc", ] @@ -700,11 +908,11 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" dependencies = [ - "bitflags", + "bitflags 1.3.2", "block", "core-foundation", "core-graphics-types", - "foreign-types", + "foreign-types 0.3.2", "libc", "objc", ] @@ -725,6 +933,37 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "com" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" +dependencies = [ + "com_macros", +] + +[[package]] +name = "com_macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" +dependencies = [ + "com_macros_support", + "proc-macro2", + "syn 1.0.103", +] + +[[package]] +name = "com_macros_support" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.103", +] + [[package]] name = "combine" version = "4.6.6" @@ -737,9 +976,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.0.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7bef69dc86e3c610e4e7aed41035e2a7ed12e72dd7530f61327a6579a4390b" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] @@ -774,9 +1013,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -784,32 +1023,31 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core-graphics" -version = "0.22.3" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-graphics-types", - "foreign-types", + "foreign-types 0.5.0", "libc", ] [[package]] name = "core-graphics-types" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", - "foreign-types", "libc", ] @@ -822,6 +1060,15 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32c" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a47af21622d091a8f0fb295b88bc886ac74efcc613efc19f5d0b21de5c89e47" +dependencies = [ + "rustc_version", +] + [[package]] name = "crc32fast" version = "1.3.2" @@ -867,10 +1114,10 @@ dependencies = [ ] [[package]] -name = "cty" -version = "0.2.2" +name = "cursor-icon" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" [[package]] name = "cxx" @@ -896,7 +1143,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.11", + "syn 2.0.68", ] [[package]] @@ -913,14 +1160,14 @@ checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.11", + "syn 2.0.68", ] [[package]] name = "data-url" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d7439c3735f405729d52c3fbbe4de140eaf938a1fe47d227c27f8254d4302a5" +checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" [[package]] name = "der" @@ -1005,11 +1252,11 @@ checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" [[package]] name = "dlib" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading", + "libloading 0.8.4", ] [[package]] @@ -1023,9 +1270,9 @@ dependencies = [ [[package]] name = "document-features" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e493c573fce17f00dcab13b6ac057994f3ce17d1af4dc39bfd482b83c6eb6157" +checksum = "ef5282ad69563b5fc40319526ba27e0e7363d552a896f0297d54f767717f9b95" dependencies = [ "litrs", ] @@ -1044,9 +1291,9 @@ checksum = "1f99fe3cac305af9d6d92971af60d0f7ea4d783201ef1673571567b6699964d9" [[package]] name = "ecolor" -version = "0.23.0" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfdf4e52dbbb615cfd30cf5a5265335c217b5fd8d669593cea74a517d9c605af" +checksum = "20930a432bbd57a6d55e07976089708d4893f3d556cf42a0d79e9e321fa73b10" dependencies = [ "bytemuck", "serde", @@ -1054,14 +1301,16 @@ dependencies = [ [[package]] name = "eframe" -version = "0.23.0" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d9efede6c8905d3fc51a5ec9a506d4da4011bbcae0253d0304580fe40af3f5" +checksum = "020e2ccef6bbcec71dbc542f7eed64a5846fc3076727f5746da8fd307c91bab2" dependencies = [ "bytemuck", "cocoa", "directories-next", - "egui 0.23.0", + "document-features", + "egui 0.27.2", + "egui-wgpu", "egui-winit", "egui_glow", "glow", @@ -1073,7 +1322,8 @@ dependencies = [ "objc", "parking_lot", "percent-encoding", - "raw-window-handle", + "raw-window-handle 0.5.2", + "raw-window-handle 0.6.2", "ron", "serde", "static_assertions", @@ -1081,6 +1331,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "web-time", "winapi", "winit", ] @@ -1098,13 +1349,13 @@ dependencies = [ [[package]] name = "egui" -version = "0.23.0" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd69fed5fcf4fbb8225b24e80ea6193b61e17a625db105ef0c4d71dde6eb8b7" +checksum = "584c5d1bf9a67b25778a3323af222dbe1a1feb532190e103901187f92c7fe29a" dependencies = [ "accesskit", "ahash", - "epaint 0.23.0", + "epaint 0.27.2", "log", "nohash-hasher", "ron", @@ -1120,17 +1371,35 @@ dependencies = [ "egui 0.21.0", ] +[[package]] +name = "egui-wgpu" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469ff65843f88a702b731a1532b7d03b0e8e96d283e70f3a22b0e06c46cb9b37" +dependencies = [ + "bytemuck", + "document-features", + "egui 0.27.2", + "epaint 0.27.2", + "log", + "thiserror", + "type-map", + "web-time", + "wgpu", + "winit", +] + [[package]] name = "egui-winit" -version = "0.23.0" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15479a96d9fadccf5dac690bdc6373b97b8e1c0dd28367058f25a5298da0195" +checksum = "2e3da0cbe020f341450c599b35b92de4af7b00abde85624fd16f09c885573609" dependencies = [ "accesskit_winit", "arboard", - "egui 0.23.0", + "egui 0.27.2", "log", - "raw-window-handle", + "raw-window-handle 0.6.2", "serde", "smithay-clipboard", "web-time", @@ -1140,42 +1409,41 @@ dependencies = [ [[package]] name = "egui_extras" -version = "0.23.0" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ffe3fe5c00295f91c2a61a74ee271c32f74049c94ba0b1cea8f26eb478bc07" +checksum = "1b78779f35ded1a853786c9ce0b43fe1053e10a21ea3b23ebea411805ce41593" dependencies = [ - "egui 0.23.0", + "egui 0.27.2", "ehttp", "enum-map", "image", "log", - "mime_guess", + "mime_guess2", "resvg", "serde", - "tiny-skia", - "usvg", ] [[package]] name = "egui_glow" -version = "0.23.0" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6726c08798822280038bbad2e32f4fc3cbed800cd51c6e34e99cd2d60cc1bc" +checksum = "e0e5d975f3c86edc3d35b1db88bb27c15dde7c55d3b5af164968ab5ede3f44ca" dependencies = [ "bytemuck", - "egui 0.23.0", + "egui 0.27.2", "glow", "log", - "memoffset", + "memoffset 0.9.1", "wasm-bindgen", "web-sys", + "winit", ] [[package]] name = "ehttp" -version = "0.3.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f88f45662356f96afc7d9e2bc9910ad8352ee01417f7c69b8b16a53c8767a75d" +checksum = "59a81c221a1e4dad06cb9c9deb19aea1193a5eea084e8cd42d869068132bf876" dependencies = [ "document-features", "js-sys", @@ -1193,23 +1461,14 @@ checksum = "b8ecd80612937e0267909d5351770fe150004e24dab93954f69ca62eecd3f77e" [[package]] name = "emath" -version = "0.23.0" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ef2b29de53074e575c18b694167ccbe6e5191f7b25fe65175a0d905a32eeec0" +checksum = "e4c3a552cfca14630702449d35f41c84a0d15963273771c6059175a803620f3f" dependencies = [ "bytemuck", "serde", ] -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if", -] - [[package]] name = "enum-map" version = "2.5.0" @@ -1233,9 +1492,9 @@ dependencies = [ [[package]] name = "enumflags2" -version = "0.7.5" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e75d4cd21b95383444831539909fbb14b9dc3fdceb2a6f5d36577329a1f55ccb" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" dependencies = [ "enumflags2_derive", "serde", @@ -1243,13 +1502,13 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.4" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58dc3c5e468259f19f2d46304a6b28f1c3d034442e14b322d2b850e36f6d5ae" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 1.0.103", + "syn 2.0.68", ] [[package]] @@ -1280,15 +1539,15 @@ dependencies = [ [[package]] name = "epaint" -version = "0.23.0" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58067b840d009143934d91d8dcb8ded054d8301d7c11a517ace0a99bb1e1595e" +checksum = "b381f8b149657a4acf837095351839f32cd5c4aec1817fc4df84e18d76334176" dependencies = [ "ab_glyph", "ahash", "bytemuck", - "ecolor 0.23.0", - "emath 0.23.0", + "ecolor 0.27.2", + "emath 0.27.2", "log", "nohash-hasher", "parking_lot", @@ -1302,15 +1561,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "error-code" -version = "2.3.1" +name = "errno" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", - "str-buf", + "windows-sys 0.52.0", ] +[[package]] +name = "error-code" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" + [[package]] name = "event-listener" version = "2.5.3" @@ -1318,8 +1583,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] -name = "fastrand" -version = "1.9.0" +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" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener 5.3.1", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" dependencies = [ @@ -1366,7 +1663,28 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", ] [[package]] @@ -1375,6 +1693,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1434,9 +1758,9 @@ checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ "fastrand 1.9.0", "futures-core", @@ -1447,6 +1771,16 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.28" @@ -1455,7 +1789,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.11", + "syn 2.0.68", ] [[package]] @@ -1530,12 +1864,12 @@ dependencies = [ [[package]] name = "gethostname" -version = "0.2.3" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" dependencies = [ "libc", - "winapi", + "windows-targets 0.48.0", ] [[package]] @@ -1597,9 +1931,9 @@ dependencies = [ [[package]] name = "glow" -version = "0.12.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8edf6019dff2d92ad27c1e3ff82ad50a0aea5b01370353cc928bfdc33e95925c" +checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" dependencies = [ "js-sys", "slotmap", @@ -1609,11 +1943,11 @@ dependencies = [ [[package]] name = "glutin" -version = "0.30.6" +version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68dc39a51f661324ea93bf87066d62ee6e83439c4260332695478186ec318cac" +checksum = "18fcd4ae4e86d991ad1300b8f57166e5be0c95ef1f63f3f5b827f8a164548746" dependencies = [ - "bitflags", + "bitflags 2.6.0", "cfg_aliases", "cgl", "core-foundation", @@ -1621,42 +1955,43 @@ dependencies = [ "glutin_egl_sys", "glutin_glx_sys", "glutin_wgl_sys", - "libloading", - "objc2", + "icrate", + "libloading 0.8.4", + "objc2 0.4.1", "once_cell", - "raw-window-handle", - "wayland-sys 0.30.1", - "windows-sys 0.45.0", + "raw-window-handle 0.5.2", + "wayland-sys", + "windows-sys 0.48.0", "x11-dl", ] [[package]] name = "glutin-winit" -version = "0.3.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629a873fc04062830bfe8f97c03773bcd7b371e23bcc465d0a61448cd1588fa4" +checksum = "1ebcdfba24f73b8412c5181e56f092b5eff16671c514ce896b258a0a64bd7735" dependencies = [ "cfg_aliases", "glutin", - "raw-window-handle", + "raw-window-handle 0.5.2", "winit", ] [[package]] name = "glutin_egl_sys" -version = "0.4.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5aaf0abb5c4148685b33101ae326a207946b4d3764d6cdc79f8316cdaa8367d" +checksum = "77cc5623f5309ef433c3dd4ca1223195347fe62c413da8e2fdd0eb76db2d9bcd" dependencies = [ "gl_generator", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] name = "glutin_glx_sys" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b53cb5fe568964aa066a3ba91eac5ecbac869fb0842cd0dc9e412434f1a1494" +checksum = "a165fd686c10dcc2d45380b35796e577eacfd43d4660ee741ec8ebe2201b3b4f" dependencies = [ "gl_generator", "x11-dl", @@ -1664,9 +1999,9 @@ dependencies = [ [[package]] name = "glutin_wgl_sys" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef89398e90033fc6bc65e9bd42fd29bbbfd483bda5b56dc5562f455550618165" +checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" dependencies = [ "gl_generator", ] @@ -1682,6 +2017,58 @@ dependencies = [ "system-deps", ] +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.6.0", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884" +dependencies = [ + "log", + "presser", + "thiserror", + "winapi", + "windows 0.52.0", +] + +[[package]] +name = "gpu-descriptor" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" +dependencies = [ + "bitflags 2.6.0", + "gpu-descriptor-types", + "hashbrown", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "gtk-sys" version = "0.15.3" @@ -1701,29 +2088,29 @@ dependencies = [ ] [[package]] -name = "h2" -version = "0.3.26" +name = "hashbrown" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", + "ahash", + "allocator-api2", ] [[package]] -name = "hashbrown" -version = "0.14.5" +name = "hassle-rs" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" +dependencies = [ + "bitflags 2.6.0", + "com", + "libc", + "libloading 0.8.4", + "thiserror", + "widestring", + "winapi", +] [[package]] name = "heck" @@ -1740,12 +2127,24 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + [[package]] name = "hmac" version = "0.12.1" @@ -1775,14 +2174,37 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" -version = "0.4.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ "bytes", - "http", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body", "pin-project-lite", ] @@ -1792,34 +2214,43 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "hyper" -version = "0.14.29" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" +checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", - "h2", - "http", + "http 1.1.0", "http-body", "httparse", - "httpdate", "itoa", "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body", + "hyper", + "pin-project-lite", "socket2 0.5.7", "tokio", + "tower", "tower-service", "tracing", - "want", ] [[package]] @@ -1846,6 +2277,17 @@ dependencies = [ "cxx-build", ] +[[package]] +name = "icrate" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d3aaff8a54577104bafdf686ff18565c3b6903ca5782a2026ef06e2c7aa319" +dependencies = [ + "block2 0.3.0", + "dispatch", + "objc2 0.4.1", +] + [[package]] name = "idna" version = "0.5.0" @@ -1874,9 +2316,9 @@ dependencies = [ [[package]] name = "imagesize" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df19da1e92fbfec043ca97d622955381b1f3ee72a180ec999912df31b1ccd951" +checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" [[package]] name = "indexmap" @@ -1911,9 +2353,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", ] [[package]] @@ -1942,6 +2381,22 @@ dependencies = [ "walkdir", ] +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + [[package]] name = "jni-sys" version = "0.3.0" @@ -1965,9 +2420,9 @@ checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -1987,6 +2442,17 @@ dependencies = [ "simple_asn1", ] +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading 0.8.4", + "pkg-config", +] + [[package]] name = "khronos_api" version = "3.1.0" @@ -1995,9 +2461,9 @@ checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" [[package]] name = "kurbo" -version = "0.8.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a53776d271cfb873b17c618af0298445c88afc52837f3e948fa3fafd131f449" +checksum = "bd85a5776cd9500c2e2059c8c76c3b01528566b7fcbaf8098b55a33fc298849b" dependencies = [ "arrayvec", ] @@ -2027,6 +2493,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "libloading" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" +dependencies = [ + "cfg-if", + "windows-targets 0.52.5", +] + [[package]] name = "libm" version = "0.2.6" @@ -2042,11 +2518,17 @@ dependencies = [ "cc", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + [[package]] name = "litrs" -version = "0.2.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9275e0933cf8bb20f008924c0cb07a0692fe54d8064996520bf998de9eb79aa" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" [[package]] name = "lock_api" @@ -2093,22 +2575,46 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memmap2" -version = "0.5.8" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b182332558b18d807c4ce1ca8ca983b34c3ee32765e47b3f0f69b90355cc1dc" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" dependencies = [ "libc", ] [[package]] name = "memoffset" -version = "0.6.5" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] +[[package]] +name = "metal" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" +dependencies = [ + "bitflags 2.6.0", + "block", + "core-graphics-types", + "foreign-types 0.5.0", + "log", + "objc", + "paste", +] + [[package]] name = "mime" version = "0.3.16" @@ -2116,10 +2622,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" [[package]] -name = "mime_guess" -version = "2.0.4" +name = "mime_guess2" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +checksum = "25a3333bb1609500601edc766a39b4c1772874a4ce26022f4d866854dc020c41" dependencies = [ "mime", "unicase", @@ -2161,17 +2667,39 @@ dependencies = [ "windows-sys 0.42.0", ] +[[package]] +name = "naga" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" +dependencies = [ + "bit-set", + "bitflags 2.6.0", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "num-traits", + "rustc-hash", + "spirv", + "termcolor", + "thiserror", + "unicode-xid", +] + [[package]] name = "ndk" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" dependencies = [ - "bitflags", + "bitflags 2.6.0", "jni-sys", + "log", "ndk-sys", "num_enum", - "raw-window-handle", + "raw-window-handle 0.5.2", + "raw-window-handle 0.6.2", "thiserror", ] @@ -2183,37 +2711,23 @@ checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "ndk-sys" -version = "0.4.0" +version = "0.5.0+25.2.9519653" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21d83ec9c63ec5bf950200a8e508bdad6659972187b625469f58ef8c08e29046" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" dependencies = [ "jni-sys", ] [[package]] name = "nix" -version = "0.24.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ - "bitflags", - "cfg-if", - "libc", - "memoffset", -] - -[[package]] -name = "nix" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e322c04a9e3440c327fca7b6c8a63e6890a32fa2ad689db972425f07e0d22abb" -dependencies = [ - "autocfg", - "bitflags", + "bitflags 1.3.2", "cfg-if", "libc", - "memoffset", - "pin-utils", + "memoffset 0.7.1", ] [[package]] @@ -2318,29 +2832,29 @@ version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", ] [[package]] name = "num_enum" -version = "0.5.7" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.5.7" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.103", + "syn 2.0.68", ] [[package]] @@ -2350,6 +2864,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", + "objc_exception", ] [[package]] @@ -2369,15 +2884,81 @@ version = "0.2.0-beta.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + [[package]] name = "objc2" version = "0.3.0-beta.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe31e5425d3d0b89a15982c024392815da40689aceb34bad364d58732bcfd649" dependencies = [ - "block2", - "objc-sys", - "objc2-encode", + "block2 0.2.0-alpha.6", + "objc-sys 0.2.0-beta.2", + "objc2-encode 2.0.0-pre.2", +] + +[[package]] +name = "objc2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d" +dependencies = [ + "objc-sys 0.3.5", + "objc2-encode 3.0.0", +] + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys 0.3.5", + "objc2-encode 4.0.3", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.6.0", + "block2 0.5.1", + "libc", + "objc2 0.5.2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.6.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation", + "objc2-metal", ] [[package]] @@ -2386,7 +2967,65 @@ version = "2.0.0-pre.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" dependencies = [ - "objc-sys", + "objc-sys 0.2.0-beta.2", +] + +[[package]] +name = "objc2-encode" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666" + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2 0.5.1", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", ] [[package]] @@ -2406,25 +3045,26 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opendal" -version = "0.44.2" +version = "0.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4af824652d4d2ffabf606d337a071677ae621b05622adf35df9562f69d9b4498" +checksum = "876c6655dd5b410c83e0c9edf38be60fed540a1cc1c2f3a2ac31830eb8a8ff45" dependencies = [ "anyhow", "async-trait", "backon", - "base64 0.21.0", + "base64 0.22.1", "bytes", "chrono", + "crc32c", "flagset", "futures", "getrandom", - "http", + "http 1.1.0", "log", "md-5", "once_cell", "percent-encoding", - "quick-xml 0.30.0", + "quick-xml", "reqsign", "reqwest", "serde", @@ -2601,6 +3241,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" +dependencies = [ + "atomic-waker", + "fastrand 2.1.0", + "futures-io", +] + [[package]] name = "pkcs1" version = "0.7.5" @@ -2651,7 +3302,7 @@ version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d708eaf860a19b19ce538740d2b4bdeeb8337fa53f7738455e706623ad5c638" dependencies = [ - "bitflags", + "bitflags 1.3.2", "crc32fast", "flate2", "miniz_oxide 0.6.2", @@ -2671,12 +3322,33 @@ dependencies = [ "winapi", ] +[[package]] +name = "polling" +version = "3.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + [[package]] name = "proc-macro-crate" version = "1.2.1" @@ -2696,22 +3368,18 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.54" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e472a104799c74b514a57226160104aa483546de37e839ec50e3c2e41dd87534" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] [[package]] -name = "quick-xml" -version = "0.30.0" +name = "profiling" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" -dependencies = [ - "memchr", - "serde", -] +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" [[package]] name = "quick-xml" @@ -2725,9 +3393,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.26" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -2764,12 +3432,15 @@ dependencies = [ [[package]] name = "raw-window-handle" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7e3d950b66e19e0c372f3fa3fbbcf85b1746b571f74e0c2af6042a5c93420a" -dependencies = [ - "cty", -] +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "rctree" @@ -2783,7 +3454,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -2792,7 +3463,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb02a9aee8e8c7ad8d86890f1e16b49e0bbbffc9961ff3788c31d57c98bcbf03" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -2832,27 +3503,33 @@ dependencies = [ "winapi", ] +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + [[package]] name = "reqsign" -version = "0.14.9" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e319d9de9ff4d941abf4ac718897118b0fe04577ea3f8e0f5788971784eef5" +checksum = "70fe66d4cd0b5ed9b1abbfe639bf6baeaaf509f7da2d51b31111ba945be59286" dependencies = [ "anyhow", "async-trait", - "base64 0.21.0", + "base64 0.22.1", "chrono", "form_urlencoded", "getrandom", "hex", "hmac", "home", - "http", + "http 1.1.0", "jsonwebtoken", "log", "once_cell", "percent-encoding", - "quick-xml 0.31.0", + "quick-xml", "rand", "reqwest", "rsa", @@ -2865,19 +3542,19 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" dependencies = [ - "base64 0.21.0", + "base64 0.22.1", "bytes", - "encoding_rs", "futures-core", "futures-util", - "h2", - "http", + "http 1.1.0", "http-body", + "http-body-util", "hyper", + "hyper-util", "ipnet", "js-sys", "log", @@ -2889,7 +3566,6 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-util", "tower-service", @@ -2903,9 +3579,9 @@ dependencies = [ [[package]] name = "resvg" -version = "0.28.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c115863f2d3621999cf187e318bc92b16402dfeff6a48c74df700d77381394c1" +checksum = "cadccb3d99a9efb8e5e00c16fbb732cbe400db2ec7fc004697ee7d97d86cf1f4" dependencies = [ "log", "pico-args", @@ -2932,7 +3608,7 @@ dependencies = [ "objc", "objc-foundation", "objc_id", - "raw-window-handle", + "raw-window-handle 0.5.2", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -2985,18 +3661,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "300a51053b1cb55c80b7a9fde4120726ddf25ca241a1cbb926626f62fb136bff" dependencies = [ "base64 0.13.1", - "bitflags", + "bitflags 1.3.2", "serde", ] [[package]] name = "roxmltree" -version = "0.15.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9de9831a129b122e7e61f242db509fa9d0838008bf0b29bb0624669edfe48a" -dependencies = [ - "xmlparser", -] +checksum = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f" [[package]] name = "rsa" @@ -3023,12 +3696,41 @@ dependencies = [ [[package]] name = "rust-ini" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0698206bcb8882bf2a9ecb4c1e7785db57ff052297085a6efd4fe42302068a" +checksum = "0d625ed57d8f49af6cfa514c42e1a71fadcff60eb0b1c517ff82fe41aa025b41" dependencies = [ "cfg-if", "ordered-multimap", + "trim-in-place", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", ] [[package]] @@ -3118,9 +3820,9 @@ dependencies = [ [[package]] name = "sctk-adwaita" -version = "0.5.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc56402866c717f54e48b122eb93c69f709bc5a6359c403598992fd92f017931" +checksum = "82b2eaf3a5b264a521b988b2e73042e742df700c4f962cde845d1541adb46550" dependencies = [ "ab_glyph", "log", @@ -3129,6 +3831,12 @@ dependencies = [ "tiny-skia", ] +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + [[package]] name = "serde" version = "1.0.147" @@ -3214,6 +3922,15 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "2.0.0" @@ -3253,9 +3970,9 @@ checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -3277,31 +3994,47 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smithay-client-toolkit" -version = "0.16.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f307c47d32d2715eb2e0ece5589057820e0e5e70d07c247d1063e844e107f454" +checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a" dependencies = [ - "bitflags", + "bitflags 2.6.0", "calloop", - "dlib", - "lazy_static", + "calloop-wayland-source", + "cursor-icon", + "libc", "log", "memmap2", - "nix 0.24.2", - "pkg-config", + "rustix", + "thiserror", + "wayland-backend", "wayland-client", + "wayland-csd-frame", "wayland-cursor", "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", ] [[package]] name = "smithay-clipboard" -version = "0.6.6" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" +checksum = "c091e7354ea8059d6ad99eace06dd13ddeedbb0ac72d40a9a6e7ff790525882d" dependencies = [ + "libc", "smithay-client-toolkit", - "wayland-client", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", ] [[package]] @@ -3336,6 +4069,15 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "spki" version = "0.7.2" @@ -3352,17 +4094,11 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "str-buf" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" - [[package]] name = "strict-num" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9df65f20698aeed245efdde3628a6b559ea1239bbb871af1b6e3b58c413b2bd1" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" dependencies = [ "float-cmp", ] @@ -3375,10 +4111,11 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "svgtypes" -version = "0.8.2" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22975e8a2bac6a76bb54f898a6b18764633b00e780330f0b689f65afb3975564" +checksum = "6e44e288cd960318917cbd540340968b90becc8bc81f171345d706e7a89d9d70" dependencies = [ + "kurbo", "siphasher", ] @@ -3395,9 +4132,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.11" +version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e3787bb71465627110e7d87ed4faaa36c1f61042ee67badb9e2ef173accc40" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", @@ -3406,30 +4143,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" [[package]] name = "system-deps" @@ -3460,31 +4176,31 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.37" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.37" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 1.0.103", + "syn 2.0.68", ] [[package]] @@ -3534,23 +4250,24 @@ dependencies = [ [[package]] name = "tiny-skia" -version = "0.8.3" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfef3412c6975196fdfac41ef232f910be2bb37b9dd3313a49a1a6bc815a5bdb" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" dependencies = [ "arrayref", "arrayvec", "bytemuck", "cfg-if", + "log", "png", "tiny-skia-path", ] [[package]] name = "tiny-skia-path" -version = "0.8.3" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b5edac058fc98f51c935daea4d805b695b38e2f151241cad125ade2a2ac20d" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" dependencies = [ "arrayref", "bytemuck", @@ -3597,7 +4314,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.11", + "syn 2.0.68", ] [[package]] @@ -3622,6 +4339,27 @@ dependencies = [ "serde", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -3686,6 +4424,12 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "trim-in-place" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" + [[package]] name = "try-lock" version = "0.2.3" @@ -3698,6 +4442,15 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "375812fa44dab6df41c195cd2f7fecb488f6c09fbaafb62807488cefab642bff" +[[package]] +name = "type-map" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9f" +dependencies = [ + "rustc-hash", +] + [[package]] name = "typenum" version = "1.15.0" @@ -3744,12 +4497,24 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + [[package]] name = "unicode-width" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + [[package]] name = "untrusted" version = "0.7.1" @@ -3797,22 +4562,46 @@ checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" [[package]] name = "usvg" -version = "0.28.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b5b7c2b30845b3348c067ca3d09e20cc6e327c288f0ca4c48698712abf432e9" +checksum = "38b0a51b72ab80ca511d126b77feeeb4fb1e972764653e61feac30adc161a756" +dependencies = [ + "base64 0.21.0", + "log", + "pico-args", + "usvg-parser", + "usvg-tree", + "xmlwriter", +] + +[[package]] +name = "usvg-parser" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd4e3c291f45d152929a31f0f6c819245e2921bfd01e7bd91201a9af39a2bdc" dependencies = [ - "base64 0.13.1", "data-url", "flate2", "imagesize", "kurbo", "log", - "rctree", "roxmltree", "simplecss", "siphasher", + "svgtypes", + "usvg-tree", +] + +[[package]] +name = "usvg-tree" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee3d202ebdb97a6215604b8f5b4d6ef9024efd623cf2e373a6416ba976ec7d3" +dependencies = [ + "rctree", "strict-num", "svgtypes", + "tiny-skia-path", ] [[package]] @@ -3831,12 +4620,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version-compare" version = "0.1.0" @@ -3884,9 +4667,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -3894,24 +4677,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.11", + "syn 2.0.68", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -3921,9 +4704,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3931,22 +4714,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.11", + "syn 2.0.68", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "wasm-streams" @@ -3962,95 +4745,119 @@ dependencies = [ ] [[package]] -name = "wayland-client" -version = "0.29.5" +name = "wayland-backend" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" +checksum = "34e9e6b6d4a2bb4e7e69433e0b35c7923b95d4dc8503a84d25ec917a4bbfdf07" dependencies = [ - "bitflags", + "cc", "downcast-rs", - "libc", - "nix 0.24.2", + "rustix", "scoped-tls", - "wayland-commons", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e63801c85358a431f986cffa74ba9599ff571fc5774ac113ed3b490c19a1133" +dependencies = [ + "bitflags 2.6.0", + "rustix", + "wayland-backend", "wayland-scanner", - "wayland-sys 0.29.5", ] [[package]] -name = "wayland-commons" -version = "0.29.5" +name = "wayland-csd-frame" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "nix 0.24.2", - "once_cell", - "smallvec", - "wayland-sys 0.29.5", + "bitflags 2.6.0", + "cursor-icon", + "wayland-backend", ] [[package]] name = "wayland-cursor" -version = "0.29.5" +version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" +checksum = "a206e8b2b53b1d3fcb9428fec72bc278ce539e2fa81fe2bfc1ab27703d5187b9" dependencies = [ - "nix 0.24.2", + "rustix", "wayland-client", "xcursor", ] [[package]] name = "wayland-protocols" -version = "0.29.5" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" +checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" dependencies = [ - "bitflags", + "bitflags 2.6.0", + "wayland-backend", "wayland-client", - "wayland-commons", "wayland-scanner", ] [[package]] -name = "wayland-scanner" -version = "0.29.5" +name = "wayland-protocols-plasma" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" dependencies = [ - "proc-macro2", - "quote", - "xml-rs", + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", ] [[package]] -name = "wayland-sys" -version = "0.29.5" +name = "wayland-protocols-wlr" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" +checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" dependencies = [ - "dlib", - "lazy_static", - "pkg-config", + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67da50b9f80159dec0ea4c11c13e24ef9e7574bd6ce24b01860a175010cea565" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", ] [[package]] name = "wayland-sys" -version = "0.30.1" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b2a02ac608e07132978689a6f9bf4214949c85998c247abadd4f4129b1aa06" +checksum = "105b1842da6554f91526c14a2a2172897b7f745a805d62af4ce698706be79c12" dependencies = [ "dlib", - "lazy_static", "log", + "once_cell", "pkg-config", ] [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -4075,11 +4882,11 @@ checksum = "97d1fa1e5c829b2bf9eb1e28fb950248b797cd6a04866fbdfa8bc31e5eef4c78" dependencies = [ "core-foundation", "dirs", - "jni", + "jni 0.20.0", "log", "ndk-context", "objc", - "raw-window-handle", + "raw-window-handle 0.5.2", "url", "web-sys", ] @@ -4105,6 +4912,114 @@ dependencies = [ "cc", ] +[[package]] +name = "wgpu" +version = "0.19.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbd7311dbd2abcfebaabf1841a2824ed7c8be443a0f29166e5d3c6a53a762c01" +dependencies = [ + "arrayvec", + "cfg-if", + "cfg_aliases", + "js-sys", + "log", + "parking_lot", + "profiling", + "raw-window-handle 0.6.2", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "0.19.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a" +dependencies = [ + "arrayvec", + "bit-vec", + "bitflags 2.6.0", + "cfg_aliases", + "codespan-reporting", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "profiling", + "raw-window-handle 0.6.2", + "rustc-hash", + "smallvec", + "thiserror", + "web-sys", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "0.19.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1a4924366df7ab41a5d8546d6534f1f33231aa5b3f72b9930e300f254e39c3" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bitflags 2.6.0", + "cfg_aliases", + "core-graphics-types", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hassle-rs", + "js-sys", + "khronos-egl", + "libc", + "libloading 0.8.4", + "log", + "metal", + "naga", + "ndk-sys", + "objc", + "once_cell", + "parking_lot", + "profiling", + "raw-window-handle 0.6.2", + "renderdoc-sys", + "rustc-hash", + "smallvec", + "thiserror", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "winapi", +] + +[[package]] +name = "wgpu-types" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805" +dependencies = [ + "bitflags 2.6.0", + "js-sys", + "web-sys", +] + +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + [[package]] name = "winapi" version = "0.3.9" @@ -4130,15 +5045,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "winapi-wsapoll" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e" -dependencies = [ - "winapi", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -4160,29 +5066,39 @@ dependencies = [ [[package]] name = "windows" -version = "0.44.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ "windows-implement", "windows-interface", - "windows-targets 0.42.1", + "windows-targets 0.48.0", ] [[package]] name = "windows" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-targets 0.48.0", + "windows-core", + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.5", ] [[package]] name = "windows-implement" -version = "0.44.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce87ca8e3417b02dc2a8a22769306658670ec92d78f1bd420d6310a67c245c6" +checksum = "5e2ee588991b9e7e6c8338edf3333fbe4da35dc72092643958ebb43f0ab2c49c" dependencies = [ "proc-macro2", "quote", @@ -4191,9 +5107,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.44.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "853f69a591ecd4f810d29f17e902d40e349fb05b0b11fff63b08b826bfe39c7f" +checksum = "e6fb8df20c9bcaa8ad6ab513f7b40104840c8867d5751126e4df3b08388d0cc7" dependencies = [ "proc-macro2", "quote", @@ -4452,44 +5368,58 @@ checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] name = "winit" -version = "0.28.1" +version = "0.29.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4755d4ba0e3d30fc7beef2095e246b1e6a6fad0717608bcb87a2df4b003bcf" +checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca" dependencies = [ + "ahash", "android-activity", - "bitflags", + "atomic-waker", + "bitflags 2.6.0", + "bytemuck", + "calloop", "cfg_aliases", "core-foundation", "core-graphics", - "dispatch", - "instant", + "cursor-icon", + "icrate", + "js-sys", "libc", "log", - "mio", + "memmap2", "ndk", - "objc2", + "ndk-sys", + "objc2 0.4.1", "once_cell", "orbclient", "percent-encoding", - "raw-window-handle", + "raw-window-handle 0.5.2", + "raw-window-handle 0.6.2", "redox_syscall 0.3.4", + "rustix", "sctk-adwaita", "smithay-client-toolkit", + "smol_str", + "unicode-segmentation", "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", "wayland-client", - "wayland-commons", "wayland-protocols", - "wayland-scanner", + "wayland-protocols-plasma", "web-sys", - "windows-sys 0.45.0", + "web-time", + "windows-sys 0.48.0", "x11-dl", + "x11rb", + "xkbcommon-dl", ] [[package]] name = "winreg" -version = "0.50.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" dependencies = [ "cfg-if", "windows-sys 0.48.0", @@ -4508,25 +5438,24 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.10.1" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ + "as-raw-xcb-connection", "gethostname", - "nix 0.24.2", - "winapi", - "winapi-wsapoll", + "libc", + "libloading 0.8.4", + "once_cell", + "rustix", "x11rb-protocol", ] [[package]] name = "x11rb-protocol" -version = "0.10.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b245751c0ac9db0e006dc812031482784e434630205a93c73cfefcaabeac67" -dependencies = [ - "nix 0.24.2", -] +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" [[package]] name = "xcursor" @@ -4537,6 +5466,35 @@ dependencies = [ "nom", ] +[[package]] +name = "xdg-home" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca91dcf8f93db085f3a0a29358cd0b9d670915468f4290e8b85d118a34211ab8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.6.0", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + [[package]] name = "xml-rs" version = "0.8.4" @@ -4544,34 +5502,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" [[package]] -name = "xmlparser" -version = "0.13.5" +name = "xmlwriter" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" [[package]] name = "zbus" -version = "3.10.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f770930448dd412a4a7131dd968a8e6df0064db4d7916fbbd2d6c3f26b566938" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" dependencies = [ "async-broadcast", "async-executor", - "async-io", - "async-lock", + "async-fs", + "async-io 1.12.0", + "async-lock 2.6.0", + "async-process", "async-recursion", "async-task", "async-trait", + "blocking", "byteorder", "derivative", - "dirs", "enumflags2", - "event-listener", + "event-listener 2.5.3", "futures-core", "futures-sink", "futures-util", "hex", - "nix 0.25.0", + "nix", "once_cell", "ordered-stream", "rand", @@ -4582,6 +5542,7 @@ dependencies = [ "tracing", "uds_windows", "winapi", + "xdg-home", "zbus_macros", "zbus_names", "zvariant", @@ -4589,28 +5550,49 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "3.10.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4832059b438689017db7340580ebabba07f114eab91bf990c6e55052408b40d8" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", "regex", "syn 1.0.103", + "zvariant_utils", ] [[package]] name = "zbus_names" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f34f314916bd89bdb9934154627fab152f4f28acdda03e7c4c68181b214fe7e3" +checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" dependencies = [ "serde", "static_assertions", "zvariant", ] +[[package]] +name = "zerocopy" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -4619,9 +5601,9 @@ checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] name = "zvariant" -version = "3.11.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903169c05b9ab948ee93fefc9127d08930df4ce031d46c980784274439803e51" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" dependencies = [ "byteorder", "enumflags2", @@ -4633,12 +5615,24 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "3.11.0" +version = "3.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cce76636e8fab7911be67211cf378c252b115ee7f2bae14b18b84821b39260b5" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", "syn 1.0.103", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.103", ] diff --git a/Cargo.toml b/Cargo.toml index f4d7975..0bcdbf7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -63,9 +63,9 @@ cc_ui = { path = "crates/cc_ui" } cc_storage = { path = "crates/cc_storage" } cc_runtime = { path = "crates/cc_runtime" } cc_files = { path = "crates/cc_files" } -eframe = { version = "0.23.0", features = ["persistence"] } -egui = "0.23.0" -egui_extras = { version = "0.23.0", features = ["all_loaders"] } +eframe = { version = "0.27.2", features = ["persistence"] } +egui = "0.27.2" +egui_extras = { version = "0.27.2", features = ["all_loaders"] } serde = { version = "1", features = ["derive"] } serde_json = "1.0" tracing = "0.1.29" diff --git a/crates/cc_storage/Cargo.toml b/crates/cc_storage/Cargo.toml index 5165e7a..6a9276c 100644 --- a/crates/cc_storage/Cargo.toml +++ b/crates/cc_storage/Cargo.toml @@ -11,7 +11,7 @@ anyhow = "1.0" tracing = { workspace = true } bytesize = "1.1.0" chrono = "0.4.24" -opendal = { version = "0.44.2", default-features = false, features = [ +opendal = { version = "0.47.1", default-features = false, features = [ "services-azblob", "services-gcs", "services-oss", diff --git a/crates/cc_storage/src/client.rs b/crates/cc_storage/src/client.rs index 4149f36..0523ad8 100644 --- a/crates/cc_storage/src/client.rs +++ b/crates/cc_storage/src/client.rs @@ -1,22 +1,22 @@ +use std::io::Write; use std::path::PathBuf; use std::sync::Arc; use crate::config::ClientConfig; +use crate::partial_file::PartialFile; use crate::transfer::{TransferProgressInfo, TransferSender, TransferType}; use crate::types::{Bucket, ListObjects, ListObjectsV2Params, Object, Params}; use crate::util::get_name; use crate::Result; +use anyhow::Context; use cc_core::ServiceType; -use futures::StreamExt; use crate::services; -use opendal::{Metadata, Metakey, Operator}; -use tokio::{ - fs, - io::{self, AsyncWriteExt as _}, +use crate::stream::{ + AsyncReadProgressExt, BoxedStreamingUploader, StreamingUploader, TrackableBodyStream, }; - -const DEFAULT_BUF_SIZE: usize = 8 * 1024 * 1024; +use futures::{AsyncReadExt, StreamExt, TryStreamExt}; +use opendal::{Metadata, Metakey, Operator}; #[derive(Clone)] pub struct Client { @@ -102,9 +102,9 @@ impl Client { pub async fn delete_object(&self, object: impl AsRef) -> Result { let object = object.as_ref(); self.operator.delete(object).await?; - // let result = self.operator.is_exist(object).await?; + let result = self.operator.is_exist(object).await?; - Ok(true) + Ok(result) } pub async fn delete_multi_object(self, obj: Vec) -> Result { @@ -122,7 +122,6 @@ impl Client { pub async fn list_v2(&self, query: ListObjectsV2Params) -> Result { tracing::debug!("List object: {:?}", query); - // let path = query.prefix.map_or("".into(), |x| format!("{x}/")); let mut path = query.prefix; if !path.is_empty() && !path.ends_with('/') { path.push('/'); @@ -199,36 +198,57 @@ impl Client { Ok((src.to_string(), is_move)) } + fn streaming_upload(&self, path: &str) -> Result { + Ok(Box::new(StreamingUploader::new( + self.operator.clone(), + path.to_string(), + ))) + } + + async fn streaming_read(&self, path: &str, transfer: TransferSender) -> Result> { + let reader = self.operator.reader(path).await?; + + let size = self.meta_data(path).await?.content_length(); + let mut body = Vec::new(); + + let mut stream = reader + .into_futures_async_read(0..) + .await? + .report_progress(|bytes_read| { + transfer + .send(TransferType::Download( + path.to_string(), + TransferProgressInfo { + total_bytes: size, + transferred_bytes: bytes_read as u64, + }, + )) + .unwrap(); + }); + + stream + .read_to_end(&mut body) + .await + .context("failed to read object content into buffer")?; + + Ok(body) + } + pub async fn download_file( &self, obj: &str, target: PathBuf, transfer: TransferSender, ) -> Result<()> { - let remote_op = self.operator.clone(); - let progress_tx = transfer.clone(); - let oid = obj.to_string(); - let total_bytes = self.meta_data(obj).await?.content_length(); - - tokio::spawn(async move { - let _: Result> = async { - fs::create_dir_all(target.parent().unwrap()).await?; - let mut reader = remote_op.reader_with(&oid).buffer(DEFAULT_BUF_SIZE).await?; - let mut writer = io::BufWriter::new(fs::File::create(&target).await?); - copy_with_progress( - "download", - &progress_tx, - &oid, - total_bytes, - &mut reader, - &mut writer, - ) - .await?; - writer.shutdown().await?; - Ok(Some(target.to_string_lossy().into())) - } - .await; - }); + let mut new_file = PartialFile::create(&target) + .with_context(|| format!("create `{}`", target.display()))?; + + let content = self.streaming_read(obj, transfer).await?; + + new_file + .write_all(&content) + .context("write content of file")?; + new_file.finish().context("finish writing to new file")?; Ok(()) } @@ -236,29 +256,34 @@ impl Client { pub async fn put(&self, path: PathBuf, dest: &str, transfer: &TransferSender) -> Result<()> { let name = get_name(&path); let key = format!("{dest}{name}"); - let remote_op = self.operator.clone(); + + let mut body = TrackableBodyStream::try_from(path) + .map_err(|e| { + panic!("Could not open sample file: {e}"); + }) + .unwrap(); let progress_tx = transfer.clone(); - let total_bytes = fs::metadata(&path).await?.len(); - - tokio::spawn(async move { - let _: Result> = async { - let mut reader = io::BufReader::new(fs::File::open(path).await?); - let mut writer = remote_op.writer_with(&key).buffer(DEFAULT_BUF_SIZE).await?; - copy_with_progress( - "upload", - &progress_tx, - &key, - total_bytes, - &mut reader, - &mut writer, - ) - .await?; - writer.close().await?; - Ok(None) - } - .await; - }); + body.set_callback( + &key, + move |key: &str, tot_size: u64, sent: u64, _cur_buf: u64| { + progress_tx + .send(TransferType::Upload( + key.to_string(), + TransferProgressInfo { + total_bytes: tot_size, + transferred_bytes: sent, + }, + )) + .unwrap(); + }, + ); + + let mut uploader = self.streaming_upload(&key)?; + while let Ok(Some(bytes)) = body.try_next().await { + uploader.write_bytes(bytes).await?; + } + uploader.finish().await?; // TODO: check if put success Ok(()) @@ -331,53 +356,3 @@ impl ClientBuilder { Client::new(self.config) } } - -async fn copy_with_progress( - tp: &str, - progress_sender: &TransferSender, - key: &str, - total_bytes: u64, - mut reader: R, - mut writer: W, -) -> io::Result -where - R: io::AsyncReadExt + Unpin, - W: io::AsyncWriteExt + Unpin, -{ - let mut bytes_so_far: usize = 0; - let mut buf = vec![0; DEFAULT_BUF_SIZE]; - - loop { - let bytes_since_last = reader.read(&mut buf).await?; - if bytes_since_last == 0 { - break; - } - writer.write_all(&buf[..bytes_since_last]).await?; - bytes_so_far += bytes_since_last; - let msg = if tp == "download" { - TransferType::Download( - key.to_string(), - TransferProgressInfo { - total_bytes: total_bytes as usize, - transferred_bytes: bytes_so_far, - }, - ) - } else { - TransferType::Upload( - key.to_string(), - TransferProgressInfo { - total_bytes: total_bytes as usize, - transferred_bytes: bytes_so_far, - }, - ) - }; - send_response(progress_sender, msg).await; - } - - Ok(bytes_so_far) -} - -async fn send_response(sender: &TransferSender, msg: TransferType) { - // tracing::debug!("response: {}", &msg); - sender.send(msg).unwrap(); -} diff --git a/crates/cc_storage/src/error.rs b/crates/cc_storage/src/error.rs index df9b33f..88012ed 100644 --- a/crates/cc_storage/src/error.rs +++ b/crates/cc_storage/src/error.rs @@ -8,3 +8,5 @@ pub enum OSSError { #[error("{0}")] WithDescription(String), } + +pub type ObjectResult = std::result::Result; diff --git a/crates/cc_storage/src/lib.rs b/crates/cc_storage/src/lib.rs index ba6ac21..8811ffb 100644 --- a/crates/cc_storage/src/lib.rs +++ b/crates/cc_storage/src/lib.rs @@ -3,9 +3,9 @@ pub type Result = anyhow::Result; mod client; mod config; mod error; -// mod partial_file; +mod partial_file; mod services; -// mod stream; +mod stream; mod transfer; mod types; pub mod util; diff --git a/crates/cc_storage/src/partial_file.rs b/crates/cc_storage/src/partial_file.rs new file mode 100644 index 0000000..e46b87b --- /dev/null +++ b/crates/cc_storage/src/partial_file.rs @@ -0,0 +1,120 @@ +use crate::Result; +use anyhow::Context; +use std::{ + ffi::OsString, + fs::{self, File}, + io::{BufWriter, Write}, + path::{Path, PathBuf}, + time::SystemTime, +}; + +/// Small helper struct to make writing files a bit safer by first writing to a +/// hidden file and once finished renaming it to the requested name. +#[derive(Debug)] +pub struct PartialFile { + target_path: PathBuf, + partial_path: PathBuf, + partial_file: BufWriter, + finished: bool, +} + +impl PartialFile { + pub fn create(target_path: impl Into) -> Result { + let target_path: PathBuf = target_path.into(); + let partial_path = generate_partial_file_name(&target_path) + .context("could not generate name for partial/temporary file")?; + let partial_file = File::create(&partial_path).with_context(|| { + format!( + "could not create partial/temp file `{}`", + partial_path.display() + ) + })?; + let partial_file = BufWriter::new(partial_file); + + Ok(PartialFile { + target_path, + partial_path, + partial_file, + finished: false, + }) + } + + pub fn finish(mut self) -> Result { + self.partial_file.flush().with_context(|| { + format!( + "failed to flush outstanding writes to `{}`", + self.partial_path.display() + ) + })?; + fs::rename(&self.partial_path, &self.target_path).with_context(|| { + format!( + "cannot finish partial file `{}`, renaming it to `{}` failed", + self.partial_path.display(), + self.target_path.display() + ) + })?; + self.finished = true; + File::open(&self.target_path) + .with_context(|| format!("cannot open finished file `{}`", self.target_path.display())) + } +} + +impl Write for PartialFile { + fn write(&mut self, buf: &[u8]) -> std::io::Result { + self.partial_file.write(buf) + } + + fn flush(&mut self) -> std::io::Result<()> { + self.partial_file.flush() + } + + fn write_vectored(&mut self, bufs: &[std::io::IoSlice<'_>]) -> std::io::Result { + self.partial_file.write_vectored(bufs) + } + + fn write_all(&mut self, buf: &[u8]) -> std::io::Result<()> { + self.partial_file.write_all(buf) + } +} + +impl Drop for PartialFile { + fn drop(&mut self) { + if self.finished { + return; + } + + tracing::info!("Deleting partial file `{}`.", self.partial_path.display()); + tracing::debug!( + "Partial file `{}` was meant to be moved to `{}` once finished", + self.partial_path.display(), + self.target_path.display() + ); + if let Err(e) = fs::remove_file(&self.partial_path) { + tracing::warn!( + "Could not delete partial file `{}`: {}", + self.partial_path.display(), + e + ) + } + } +} + +fn generate_partial_file_name(path: &Path) -> Result { + let target_file_name = path + .file_name() + .with_context(|| format!("cannot get file name from path `{}`", path.display()))?; + let temp_prefix = { + let timestamp = SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .context("cannot get timestamp")?; + format!("artefacta-temp-{}", timestamp.as_secs()) + }; + let new_file_name = { + let mut res = OsString::from("._"); + res.push(&temp_prefix); + res.push(target_file_name); + res.push(".part"); + res + }; + Ok(path.with_file_name(new_file_name)) +} diff --git a/crates/cc_storage/src/stream.rs b/crates/cc_storage/src/stream.rs new file mode 100644 index 0000000..de61de2 --- /dev/null +++ b/crates/cc_storage/src/stream.rs @@ -0,0 +1,216 @@ +use core::{ + pin::Pin, + task::{Context, Poll}, +}; +use futures::io::{AsyncRead as FAsyncRead, IoSliceMut}; +use pin_project::pin_project; +use std::path::PathBuf; +use std::{fmt, io}; + +use futures::{Future, Stream}; +use tokio::{fs::File, io::AsyncReadExt}; + +use crate::error::ObjectResult; +use bytes::Bytes; +use opendal::Operator; + +const DEFAULT_BUFFER_SIZE: usize = 2048; + +/// The callback function triggered every time a chunck of the source file is read +/// in the buffer. +/// +/// # Arguments +/// * `u64`: The total length of the buffer (or size of the file if created from a `PathBuf`) +/// * `u64`: The total number of bytes read so far +/// * `u64`: The number of bytes read in the current chunck +type CallbackFn = dyn FnMut(&str, u64, u64, u64) + Sync + Send + 'static; + +/// A `futures::Stream` implementation that can be used to track uploads +/// ``` +pub struct TrackableBodyStream { + input: I, + file_size: u64, + cur_read: u64, + key: String, + callback: Option>, + buffer_size: usize, +} + +impl TryFrom for TrackableBodyStream { + type Error = std::io::Error; + + fn try_from(value: PathBuf) -> Result { + let file_size = std::fs::metadata(value.clone())?.len(); + let file = futures::executor::block_on(tokio::fs::File::open(value))?; + Ok(Self { + input: file, + file_size, + cur_read: 0, + key: String::new(), + callback: None, + buffer_size: DEFAULT_BUFFER_SIZE, + }) + } +} + +impl TrackableBodyStream { + /// Sets the callback method + pub fn set_callback( + &mut self, + key: &str, + callback: impl FnMut(&str, u64, u64, u64) + Sync + Send + 'static, + ) { + self.key = key.to_string(); + self.callback = Some(Box::new(callback)); + } +} + +impl Stream for TrackableBodyStream { + type Item = Result>; + + fn poll_next( + self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> Poll> { + let mut_self = self.get_mut(); + let mut buf = Vec::with_capacity(mut_self.buffer_size); + + match Future::poll(Box::pin(mut_self.input.read_buf(&mut buf)).as_mut(), cx) { + Poll::Ready(res) => { + if res.is_err() { + return Poll::Ready(Some(Err(Box::new(res.err().unwrap())))); + } + let read_op = res.unwrap(); + if read_op == 0 { + return Poll::Ready(None); + } + mut_self.cur_read += read_op as u64; + //buf.resize(read_op, 0u8); + if mut_self.callback.is_some() { + mut_self.callback.as_mut().unwrap()( + mut_self.key.as_str(), + mut_self.file_size, + mut_self.cur_read, + read_op as u64, + ); + } + Poll::Ready(Some(Ok(Bytes::from(Vec::from(&buf[0..read_op]))))) + } + Poll::Pending => Poll::Pending, + } + } + + fn size_hint(&self) -> (usize, Option) { + ( + (self.file_size - self.cur_read) as usize, + Some(self.file_size as usize), + ) + } +} + +pub type BoxedStreamingUploader = Box; + +/// Store multiple parts in a map, and concatenate them on finish. +pub struct StreamingUploader { + op: Operator, + path: String, + buffer: Vec, +} +impl StreamingUploader { + pub fn new(op: Operator, path: String) -> Self { + Self { + op, + path, + buffer: vec![], + } + } + + pub async fn write_bytes(&mut self, data: Bytes) -> ObjectResult<()> { + self.buffer.push(data); + Ok(()) + } + + pub async fn finish(self: Box) -> ObjectResult<()> { + self.op.write(&self.path, self.buffer).await?; + + Ok(()) + } +} + +/// Reader for the `report_progress` method. +#[pin_project] +#[must_use = "streams do nothing unless polled"] +pub struct StreamDownloader { + #[pin] + inner: St, + callback: F, + bytes_read: usize, +} + +impl fmt::Debug for StreamDownloader +where + St: fmt::Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("StreamDownloader") + .field("stream", &self.inner) + .finish() + } +} + +pub trait AsyncReadProgressExt { + fn report_progress(self, callback: F) -> StreamDownloader + where + Self: Sized, + F: FnMut(usize), + { + let bytes_read = 0; + StreamDownloader { + inner: self, + callback, + bytes_read, + } + } +} + +impl AsyncReadProgressExt for R {} + +impl FAsyncRead for StreamDownloader +where + St: FAsyncRead, + F: FnMut(usize), +{ + fn poll_read( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &mut [u8], + ) -> Poll> { + let this = self.project(); + match this.inner.poll_read(cx, buf) { + Poll::Pending => Poll::Pending, + Poll::Ready(Err(e)) => Poll::Ready(Err(e)), + Poll::Ready(Ok(bytes_read)) => { + *this.bytes_read += bytes_read; + (this.callback)(*this.bytes_read); + Poll::Ready(Ok(bytes_read)) + } + } + } + + fn poll_read_vectored( + self: Pin<&mut Self>, + cx: &mut Context<'_>, + bufs: &mut [IoSliceMut<'_>], + ) -> Poll> { + let this = self.project(); + match this.inner.poll_read_vectored(cx, bufs) { + Poll::Pending => Poll::Pending, + Poll::Ready(Err(e)) => Poll::Ready(Err(e)), + Poll::Ready(Ok(bytes_read)) => { + *this.bytes_read += bytes_read; + (this.callback)(*this.bytes_read); + Poll::Ready(Ok(bytes_read)) + } + } + } +} diff --git a/crates/cc_storage/src/transfer.rs b/crates/cc_storage/src/transfer.rs index f7da80e..90a7825 100644 --- a/crates/cc_storage/src/transfer.rs +++ b/crates/cc_storage/src/transfer.rs @@ -5,8 +5,8 @@ pub type TransferSender = crossbeam_channel::Sender; #[derive(Clone, Default, Debug)] pub struct TransferProgressInfo { - pub total_bytes: usize, - pub transferred_bytes: usize, + pub total_bytes: u64, + pub transferred_bytes: u64, } impl TransferProgressInfo { diff --git a/crates/cc_ui/src/design_tokens.rs b/crates/cc_ui/src/design_tokens.rs index e00c35e..4ef3dc9 100644 --- a/crates/cc_ui/src/design_tokens.rs +++ b/crates/cc_ui/src/design_tokens.rs @@ -112,7 +112,7 @@ fn apply_design_tokens(ctx: &egui::Context) -> DesignTokens { egui_style.visuals.button_frame = true; egui_style.visuals.widgets.inactive.weak_bg_fill = Default::default(); // Buttons have no background color when inactive - egui_style.visuals.widgets.inactive.bg_fill = Color32::from_gray(40); + egui_style.visuals.widgets.inactive.bg_fill = Color32::from_gray(50); { // Background colors for buttons (menu buttons, blueprint buttons, etc) when hovered or clicked: @@ -177,13 +177,18 @@ fn apply_design_tokens(ctx: &egui::Context) -> DesignTokens { egui_style.spacing.button_padding = egui::Vec2::new(1.0, 0.0); // Makes the icons in the blueprint panel align egui_style.spacing.indent = 14.0; // From figma - egui_style.debug.show_blocking_widget = false; // turn this on to debug interaction problems - egui_style.spacing.combo_width = 8.0; // minium width of ComboBox - keep them small, with the down-arrow close. - egui_style.spacing.scroll_bar_inner_margin = 2.0; - egui_style.spacing.scroll_bar_width = 6.0; - egui_style.spacing.scroll_bar_outer_margin = 2.0; + egui_style.spacing.scroll.bar_inner_margin = 2.0; + egui_style.spacing.scroll.bar_width = 6.0; + egui_style.spacing.scroll.bar_outer_margin = 2.0; + + egui_style.spacing.tooltip_width = 720.0; + + // don't color hyperlinks #2733 + egui_style.visuals.hyperlink_color = default; + + egui_style.visuals.image_loading_spinners = false; ctx.set_style(egui_style); diff --git a/crates/cc_ui/src/lib.rs b/crates/cc_ui/src/lib.rs index c803f65..22e8041 100644 --- a/crates/cc_ui/src/lib.rs +++ b/crates/cc_ui/src/lib.rs @@ -4,6 +4,8 @@ pub mod icon; use design_tokens::DesignTokens; use eframe::epaint::text::{LayoutJob, TextWrapping}; +pub const FULLSIZE_CONTENT: bool = cfg!(target_os = "macos"); + pub const CUSTOM_WINDOW_DECORATIONS: bool = false; pub static THUMB_LIST_WIDTH: f32 = 200.0; @@ -120,23 +122,20 @@ impl CCUi { frame } - pub fn top_bar_style( - &self, - native_pixels_per_point: Option, - fullscreen: bool, - ) -> TopBarStyle { - let gui_zoom = if let Some(native_pixels_per_point) = native_pixels_per_point { - native_pixels_per_point / self.egui_ctx.pixels_per_point() - } else { - 1.0 - }; + pub fn top_bar_style(&self, style_like_web: bool) -> TopBarStyle { + let egui_zoom_factor = self.egui_ctx.zoom_factor(); + + let fullscreen = self + .egui_ctx + .input(|i| i.viewport().fullscreen) + .unwrap_or(false); // On Mac, we share the same space as the native red/yellow/green close/minimize/maximize buttons. // This means we need to make room for them. - let make_room_for_window_buttons = { + let make_room_for_window_buttons = !style_like_web && { #[cfg(target_os = "macos")] { - !fullscreen + crate::FULLSIZE_CONTENT && !fullscreen } #[cfg(not(target_os = "macos"))] { @@ -149,19 +148,20 @@ impl CCUi { let height = if make_room_for_window_buttons { // On mac we want to match the height of the native red/yellow/green close/minimize/maximize buttons. + // TODO(emilk): move the native window buttons to match our Self::title_bar_height // Use more vertical space when zoomed in… let height = native_buttons_size_in_native_scale.y; // …but never shrink below the native button height when zoomed out. - height.max(gui_zoom * native_buttons_size_in_native_scale.y) + height.max(native_buttons_size_in_native_scale.y / egui_zoom_factor) } else { Self::top_bar_height() - Self::top_bar_margin().sum().y }; let indent = if make_room_for_window_buttons { // Always use the same width measured in native GUI coordinates: - gui_zoom * native_buttons_size_in_native_scale.x + native_buttons_size_in_native_scale.x / egui_zoom_factor } else { 0.0 }; diff --git a/icons/icon.png b/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..165608456d529870cb8a1e966a9ecb88f6f45ade GIT binary patch literal 20331 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

(HV(yVaakiP4mrRjB50T_+=S_A5Mdk@u!m z38%kB!$%%E9KUJU%Q z>xLrQn{rmO?uXZT6G<-KZBwSSULuwk&i@4nmi!rZvMlU*T^@;b|GcX*a~CtrXL8DA zx%c;}4>KlR^FbBfCY6^UNqBu&?|gcsFnEPE(%vcJerb-HBq3qFW(sAYyXrg7==00r z$R@~+PZzwh)lP+9iIB4&QXd1J_(p;BxA^)er8sLp)s?!MJ5!VWP6^Z|8roOjpdA&e zn>$p$MSrV5w3P_3!)hY<{*0tLea(fsLehzF4x3`Jp6(Bjtx0}-n z4l9py4_)s{R>N>Nv-Ys1@^)KCjyrN*eUm1+idc&O_0)x?Y`NfEojN(`Y3vf*$9@*v zr$yoRyt%)1G;I^lVh5LbR{*?h@5~h|5`FCow_^z;BwpJyi?$q$gpBz4m)q$l2E$C% z1zEQj269~5e%VDXjMLa!48|bGC39fDdR+Er*X}!cS(IjgXw%!wsq^tlX4fyB(Y{u0 zshm-Yp9wx&ql$HTCC}PRs@O%dD`Z>3=7_nM`@MRqzZS%oIox|s&=w3| zYw>?q%zasi#jZUWDNr|WxNc9=X=%wv8k#><&uv1DNn=%m8+aeu6OWZVyCsl4KlMUgVaxhtU##dwkAPDPn+bayetedKdjJRw?AT|M$=TV&H!<@PA-nlqe)eLJAY1 me|YSvOW6O>{r~ZkzIt5BZ1x5B7l%J#@2&$ov$oU!`M&^)&|{qd literal 0 HcmV?d00001 diff --git a/src/main.rs b/src/main.rs index f750dd0..5032811 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,19 +16,21 @@ fn main() -> Result<(), eframe::Error> { eframe::run_native( "Caricare", eframe::NativeOptions { - drag_and_drop_support: true, - initial_window_size: Some([900.0, 450.0].into()), - default_theme: eframe::Theme::Dark, - min_window_size: Some([600.0, 450.0].into()), - #[cfg(target_os = "macos")] - fullsize_content: true, - - // Maybe hide the OS-specific "chrome" around the window: - decorated: !cc_ui::CUSTOM_WINDOW_DECORATIONS, - // To have rounded corners we need transparency: - transparent: cc_ui::CUSTOM_WINDOW_DECORATIONS, - + viewport: egui::ViewportBuilder::default() + .with_app_id("caricare") + .with_icon(icon_data()) + .with_drag_and_drop(true) + .with_min_inner_size([900.0, 450.0]) + .with_inner_size([900.0, 450.0]) + .with_decorations(!cc_ui::CUSTOM_WINDOW_DECORATIONS) // Maybe hide the OS-specific "chrome" around the window + .with_fullsize_content_view(cc_ui::FULLSIZE_CONTENT) + .with_inner_size([1200.0, 800.0]) + .with_title_shown(!cc_ui::FULLSIZE_CONTENT) + .with_titlebar_buttons_shown(!cc_ui::CUSTOM_WINDOW_DECORATIONS) + .with_titlebar_shown(!cc_ui::FULLSIZE_CONTENT) + .with_transparent(cc_ui::CUSTOM_WINDOW_DECORATIONS), // To have rounded corners without decorations we need transparency follow_system_theme: false, + default_theme: eframe::Theme::Dark, ..Default::default() }, Box::new(|cc: &eframe::CreationContext| Box::new(App::new(cc))), @@ -39,6 +41,26 @@ fn main() -> Result<(), eframe::Error> { Ok(()) } +#[allow(clippy::unnecessary_wraps)] +fn icon_data() -> egui::IconData { + let app_icon_png_bytes = include_bytes!("../icons/icon.png"); + + // We include the .png with `include_bytes`. If that fails, things are extremely broken. + match eframe::icon_data::from_png_bytes(app_icon_png_bytes) { + Ok(icon_data) => icon_data, + Err(err) => { + #[cfg(debug_assertions)] + panic!("Failed to load app icon: {err}"); + + #[cfg(not(debug_assertions))] + { + tracing::warn!("Failed to load app icon: {err}"); + Default::default() + } + } + } +} + macro_rules! spawn_evs { ($state:ident, |$ev:ident, $client:ident, $ctx:ident| $fut:tt) => {{ let $client = $state.client().clone(); diff --git a/src/pages/auth.rs b/src/pages/auth.rs index d856cc7..c133bf3 100644 --- a/src/pages/auth.rs +++ b/src/pages/auth.rs @@ -7,7 +7,7 @@ use egui_extras::{Column, TableBuilder}; pub fn auth_page(ctx: &egui::Context, state: &mut State) { egui::CentralPanel::default().show(ctx, |ui| { egui::Frame::none() - .inner_margin(egui::style::Margin::symmetric(0.0, 20.0)) + .inner_margin(egui::Margin::symmetric(0.0, 20.0)) .show(ui, |ui| { egui::Grid::new("auth_form_grid") .spacing([10.0; 2]) @@ -93,7 +93,8 @@ pub fn auth_page(ctx: &egui::Context, state: &mut State) { }) .body(|body| { let sessions = state.sessions.clone(); - body.rows(text_height, state.sessions.len(), |row_index, mut row| { + body.rows(text_height, state.sessions.len(), |mut row| { + let row_index = row.index(); let d = sessions.get(row_index).unwrap(); row.col(|ui| { ui.label(&d.key_id); diff --git a/src/pages/main.rs b/src/pages/main.rs index 9b40fad..38b0448 100644 --- a/src/pages/main.rs +++ b/src/pages/main.rs @@ -11,7 +11,7 @@ pub fn main_page(ctx: &egui::Context, state: &mut State, frame: &mut eframe::Fra top_bar_ui(ctx, state, frame); egui::CentralPanel::default().show(ctx, |ui| { egui::Frame::none() - .inner_margin(egui::style::Margin::same(0.0)) + .inner_margin(egui::Margin::same(0.0)) .show(ui, |ui| { if let Status::Busy(_) = state.status { ui.centered_and_justified(|ui| { diff --git a/src/widgets/confirm.rs b/src/widgets/confirm.rs index 5a3e667..14a7e23 100644 --- a/src/widgets/confirm.rs +++ b/src/widgets/confirm.rs @@ -44,7 +44,7 @@ impl Confirm { pub fn init(&mut self, ctx: &egui::Context) { if self.is_show { - egui::Area::new("confirm_mask") + egui::Area::new(egui::Id::new("confirm_mask")) .interactable(true) .fixed_pos(egui::Pos2::ZERO) .show(ctx, |ui| { diff --git a/src/widgets/file_view.rs b/src/widgets/file_view.rs index 5c3a96e..f85946e 100644 --- a/src/widgets/file_view.rs +++ b/src/widgets/file_view.rs @@ -62,7 +62,7 @@ impl FileView { if let Some(file) = current_file { if file.is_image() { is_image = true; - ui.spacing_mut().scroll_bar_inner_margin = 0.0; + ui.spacing_mut().scroll.bar_inner_margin = 0.0; let resp = egui::ScrollArea::both() .max_height(win_size.y - 110.0) .auto_shrink([false; 2]) diff --git a/src/widgets/list_item.rs b/src/widgets/list_item.rs index 23de7bf..bd10304 100644 --- a/src/widgets/list_item.rs +++ b/src/widgets/list_item.rs @@ -3,7 +3,7 @@ use crate::state::Update; use crate::widgets::confirm::ConfirmAction; use cc_storage::Object; use cc_ui::icon; -use egui::{self, style::Margin, vec2, Color32, Frame, Sense, WidgetInfo, WidgetType}; +use egui::{self, vec2, Color32, Frame, Margin, Sense, WidgetInfo, WidgetType}; pub fn list_item_ui(ui: &mut egui::Ui, data: &mut Object, is_current: bool) -> egui::Response { let row_height = ui.text_style_height(&egui::TextStyle::Body); diff --git a/src/widgets/thumb_item.rs b/src/widgets/thumb_item.rs index 386ec20..6594fbd 100644 --- a/src/widgets/thumb_item.rs +++ b/src/widgets/thumb_item.rs @@ -24,8 +24,8 @@ pub fn thumb_item_ui(ui: &mut egui::Ui, data: &mut Object, is_current: bool) -> } ui.allocate_ui_at_rect(rect, |ui| { egui::Frame { - inner_margin: egui::style::Margin::same(5.0), - outer_margin: egui::style::Margin::same(0.0), + inner_margin: egui::Margin::same(5.0), + outer_margin: egui::Margin::same(0.0), fill: fill_color, ..egui::Frame::default() } diff --git a/src/widgets/top_bar.rs b/src/widgets/top_bar.rs index e4af132..2d0b83d 100644 --- a/src/widgets/top_bar.rs +++ b/src/widgets/top_bar.rs @@ -6,19 +6,15 @@ use cc_core::ShowType; use cc_storage::util::get_name_form_path; use cc_ui::icon; -pub fn top_bar_ui(ctx: &egui::Context, state: &mut State, frame: &mut eframe::Frame) { - let native_pixels_per_point = frame.info().native_pixels_per_point; - let fullscreen = frame.info().window_info.fullscreen; - let top_bar_style = global() - .cc_ui - .top_bar_style(native_pixels_per_point, fullscreen); +pub fn top_bar_ui(ctx: &egui::Context, state: &mut State, _frame: &mut eframe::Frame) { + let top_bar_style = global().cc_ui.top_bar_style(false); egui::TopBottomPanel::top("top_bar") .frame(global().cc_ui.top_panel_frame()) .exact_height(top_bar_style.height) .show(ctx, |ui| { egui::Frame::none() - .inner_margin(egui::style::Margin::symmetric(0.0, 5.0)) + .inner_margin(egui::Margin::symmetric(0.0, 5.0)) .show(ui, |ui| { ui.horizontal_wrapped(|ui| { ui.add_space(top_bar_style.indent);