Base gui, player, side, top nav, song list
Super happy with this
This commit is contained in:
parent
4dcd36c3d8
commit
9bcfcb9209
427
Cargo.lock
generated
427
Cargo.lock
generated
|
@ -23,6 +23,10 @@ name = "accesskit"
|
||||||
version = "0.12.3"
|
version = "0.12.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "74a4b14f3d99c1255dcba8f45621ab1a2e7540a0009652d33989005a4d0bfc6b"
|
checksum = "74a4b14f3d99c1255dcba8f45621ab1a2e7540a0009652d33989005a4d0bfc6b"
|
||||||
|
dependencies = [
|
||||||
|
"enumn",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "accesskit_consumer"
|
name = "accesskit_consumer"
|
||||||
|
@ -113,6 +117,7 @@ dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"getrandom",
|
"getrandom",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
|
"serde",
|
||||||
"version_check",
|
"version_check",
|
||||||
"zerocopy",
|
"zerocopy",
|
||||||
]
|
]
|
||||||
|
@ -515,6 +520,18 @@ dependencies = [
|
||||||
"windows-targets 0.52.6",
|
"windows-targets 0.52.6",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "base64"
|
||||||
|
version = "0.21.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "base64"
|
||||||
|
version = "0.22.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bit-set"
|
name = "bit-set"
|
||||||
version = "0.5.3"
|
version = "0.5.3"
|
||||||
|
@ -988,6 +1005,12 @@ version = "1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991"
|
checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "data-url"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "derivative"
|
name = "derivative"
|
||||||
version = "2.2.0"
|
version = "2.2.0"
|
||||||
|
@ -1047,6 +1070,16 @@ checksum = "20930a432bbd57a6d55e07976089708d4893f3d556cf42a0d79e9e321fa73b10"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"color-hex",
|
"color-hex",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ecolor"
|
||||||
|
version = "0.28.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2e6b451ff1143f6de0f33fc7f1b68fecfd2c7de06e104de96c4514de3f5396f8"
|
||||||
|
dependencies = [
|
||||||
|
"emath 0.28.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1058,7 +1091,7 @@ dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"cocoa",
|
"cocoa",
|
||||||
"document-features",
|
"document-features",
|
||||||
"egui",
|
"egui 0.27.2",
|
||||||
"egui-wgpu",
|
"egui-wgpu",
|
||||||
"egui-winit",
|
"egui-winit",
|
||||||
"egui_glow",
|
"egui_glow",
|
||||||
|
@ -1091,9 +1124,31 @@ checksum = "584c5d1bf9a67b25778a3323af222dbe1a1feb532190e103901187f92c7fe29a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"accesskit",
|
"accesskit",
|
||||||
"ahash",
|
"ahash",
|
||||||
"epaint",
|
"epaint 0.27.2",
|
||||||
"log",
|
"log",
|
||||||
"nohash-hasher",
|
"nohash-hasher",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "egui"
|
||||||
|
version = "0.28.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "20c97e70a2768de630f161bb5392cbd3874fcf72868f14df0e002e82e06cb798"
|
||||||
|
dependencies = [
|
||||||
|
"ahash",
|
||||||
|
"emath 0.28.1",
|
||||||
|
"epaint 0.28.1",
|
||||||
|
"nohash-hasher",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "egui-aesthetix"
|
||||||
|
version = "0.2.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c0b91e1b07193fa9bc71849e39a76d30ffd6a2f57bfc54552e3a2df263da577b"
|
||||||
|
dependencies = [
|
||||||
|
"egui 0.28.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1104,8 +1159,8 @@ checksum = "469ff65843f88a702b731a1532b7d03b0e8e96d283e70f3a22b0e06c46cb9b37"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"document-features",
|
"document-features",
|
||||||
"egui",
|
"egui 0.27.2",
|
||||||
"epaint",
|
"epaint 0.27.2",
|
||||||
"log",
|
"log",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"type-map",
|
"type-map",
|
||||||
|
@ -1122,7 +1177,7 @@ checksum = "2e3da0cbe020f341450c599b35b92de4af7b00abde85624fd16f09c885573609"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"accesskit_winit",
|
"accesskit_winit",
|
||||||
"arboard",
|
"arboard",
|
||||||
"egui",
|
"egui 0.27.2",
|
||||||
"log",
|
"log",
|
||||||
"raw-window-handle 0.6.2",
|
"raw-window-handle 0.6.2",
|
||||||
"smithay-clipboard",
|
"smithay-clipboard",
|
||||||
|
@ -1131,6 +1186,22 @@ dependencies = [
|
||||||
"winit",
|
"winit",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "egui_extras"
|
||||||
|
version = "0.27.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1b78779f35ded1a853786c9ce0b43fe1053e10a21ea3b23ebea411805ce41593"
|
||||||
|
dependencies = [
|
||||||
|
"egui 0.27.2",
|
||||||
|
"ehttp",
|
||||||
|
"enum-map",
|
||||||
|
"image",
|
||||||
|
"log",
|
||||||
|
"mime_guess2",
|
||||||
|
"resvg",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "egui_glow"
|
name = "egui_glow"
|
||||||
version = "0.27.2"
|
version = "0.27.2"
|
||||||
|
@ -1138,7 +1209,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e0e5d975f3c86edc3d35b1db88bb27c15dde7c55d3b5af164968ab5ede3f44ca"
|
checksum = "e0e5d975f3c86edc3d35b1db88bb27c15dde7c55d3b5af164968ab5ede3f44ca"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"egui",
|
"egui 0.27.2",
|
||||||
"glow",
|
"glow",
|
||||||
"log",
|
"log",
|
||||||
"memoffset 0.9.1",
|
"memoffset 0.9.1",
|
||||||
|
@ -1147,6 +1218,20 @@ dependencies = [
|
||||||
"winit",
|
"winit",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ehttp"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "59a81c221a1e4dad06cb9c9deb19aea1193a5eea084e8cd42d869068132bf876"
|
||||||
|
dependencies = [
|
||||||
|
"document-features",
|
||||||
|
"js-sys",
|
||||||
|
"ureq",
|
||||||
|
"wasm-bindgen",
|
||||||
|
"wasm-bindgen-futures",
|
||||||
|
"web-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "emath"
|
name = "emath"
|
||||||
version = "0.27.2"
|
version = "0.27.2"
|
||||||
|
@ -1154,6 +1239,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e4c3a552cfca14630702449d35f41c84a0d15963273771c6059175a803620f3f"
|
checksum = "e4c3a552cfca14630702449d35f41c84a0d15963273771c6059175a803620f3f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "emath"
|
||||||
|
version = "0.28.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0a6a21708405ea88f63d8309650b4d77431f4bc28fb9d8e6f77d3963b51249e6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "enum-map"
|
||||||
|
version = "2.7.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9"
|
||||||
|
dependencies = [
|
||||||
|
"enum-map-derive",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "enum-map-derive"
|
||||||
|
version = "0.17.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn 2.0.87",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1177,6 +1290,17 @@ dependencies = [
|
||||||
"syn 2.0.87",
|
"syn 2.0.87",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "enumn"
|
||||||
|
version = "0.1.14"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn 2.0.87",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "env_filter"
|
name = "env_filter"
|
||||||
version = "0.1.2"
|
version = "0.1.2"
|
||||||
|
@ -1209,11 +1333,26 @@ dependencies = [
|
||||||
"ab_glyph",
|
"ab_glyph",
|
||||||
"ahash",
|
"ahash",
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"ecolor",
|
"ecolor 0.27.2",
|
||||||
"emath",
|
"emath 0.27.2",
|
||||||
"log",
|
"log",
|
||||||
"nohash-hasher",
|
"nohash-hasher",
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "epaint"
|
||||||
|
version = "0.28.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3f0dcc0a0771e7500e94cd1cb797bd13c9f23b9409bdc3c824e2cbc562b7fa01"
|
||||||
|
dependencies = [
|
||||||
|
"ab_glyph",
|
||||||
|
"ahash",
|
||||||
|
"ecolor 0.28.1",
|
||||||
|
"emath 0.28.1",
|
||||||
|
"nohash-hasher",
|
||||||
|
"parking_lot",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1310,6 +1449,12 @@ dependencies = [
|
||||||
"miniz_oxide",
|
"miniz_oxide",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "float-cmp"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "foreign-types"
|
name = "foreign-types"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
|
@ -1701,6 +1846,12 @@ dependencies = [
|
||||||
"png",
|
"png",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "imagesize"
|
||||||
|
version = "0.12.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "2.6.0"
|
version = "2.6.0"
|
||||||
|
@ -1800,6 +1951,15 @@ version = "3.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
|
checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "kurbo"
|
||||||
|
version = "0.9.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bd85a5776cd9500c2e2059c8c76c3b01528566b7fcbaf8098b55a33fc298849b"
|
||||||
|
dependencies = [
|
||||||
|
"arrayvec",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lazy_static"
|
name = "lazy_static"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
|
@ -1934,6 +2094,22 @@ dependencies = [
|
||||||
"paste",
|
"paste",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mime"
|
||||||
|
version = "0.3.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mime_guess2"
|
||||||
|
version = "2.0.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "25a3333bb1609500601edc766a39b4c1772874a4ce26022f4d866854dc020c41"
|
||||||
|
dependencies = [
|
||||||
|
"mime",
|
||||||
|
"unicase",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "miniz_oxide"
|
name = "miniz_oxide"
|
||||||
version = "0.8.0"
|
version = "0.8.0"
|
||||||
|
@ -2299,6 +2475,12 @@ version = "2.3.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
|
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pico-args"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pin-project-lite"
|
name = "pin-project-lite"
|
||||||
version = "0.2.15"
|
version = "0.2.15"
|
||||||
|
@ -2481,6 +2663,12 @@ version = "0.6.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
|
checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rctree"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3b42e27ef78c35d3998403c1d26f3efd9e135d3e5121b0a4845cc5cc27547f4f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.3.5"
|
version = "0.3.5"
|
||||||
|
@ -2534,6 +2722,50 @@ version = "1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832"
|
checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "resvg"
|
||||||
|
version = "0.37.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cadccb3d99a9efb8e5e00c16fbb732cbe400db2ec7fc004697ee7d97d86cf1f4"
|
||||||
|
dependencies = [
|
||||||
|
"log",
|
||||||
|
"pico-args",
|
||||||
|
"rgb",
|
||||||
|
"svgtypes",
|
||||||
|
"tiny-skia",
|
||||||
|
"usvg",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rgb"
|
||||||
|
version = "0.8.50"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a"
|
||||||
|
dependencies = [
|
||||||
|
"bytemuck",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ring"
|
||||||
|
version = "0.17.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
"cfg-if",
|
||||||
|
"getrandom",
|
||||||
|
"libc",
|
||||||
|
"spin",
|
||||||
|
"untrusted",
|
||||||
|
"windows-sys 0.52.0",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "roxmltree"
|
||||||
|
version = "0.19.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustc-demangle"
|
name = "rustc-demangle"
|
||||||
version = "0.1.24"
|
version = "0.1.24"
|
||||||
|
@ -2573,6 +2805,38 @@ dependencies = [
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustls"
|
||||||
|
version = "0.23.16"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e"
|
||||||
|
dependencies = [
|
||||||
|
"log",
|
||||||
|
"once_cell",
|
||||||
|
"ring",
|
||||||
|
"rustls-pki-types",
|
||||||
|
"rustls-webpki",
|
||||||
|
"subtle",
|
||||||
|
"zeroize",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustls-pki-types"
|
||||||
|
version = "1.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustls-webpki"
|
||||||
|
version = "0.102.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
|
||||||
|
dependencies = [
|
||||||
|
"ring",
|
||||||
|
"rustls-pki-types",
|
||||||
|
"untrusted",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ryu"
|
name = "ryu"
|
||||||
version = "1.0.18"
|
version = "1.0.18"
|
||||||
|
@ -2688,6 +2952,21 @@ version = "0.3.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
|
checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "simplecss"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a11be7c62927d9427e9f40f3444d5499d868648e2edbc4e2116de69e7ec0e89d"
|
||||||
|
dependencies = [
|
||||||
|
"log",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "siphasher"
|
||||||
|
version = "0.3.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "slab"
|
name = "slab"
|
||||||
version = "0.4.9"
|
version = "0.4.9"
|
||||||
|
@ -2792,6 +3071,12 @@ dependencies = [
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "spin"
|
||||||
|
version = "0.9.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "spirv"
|
name = "spirv"
|
||||||
version = "0.3.0+sdk-1.3.268.0"
|
version = "0.3.0+sdk-1.3.268.0"
|
||||||
|
@ -2812,6 +3097,9 @@ name = "strict-num"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731"
|
checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731"
|
||||||
|
dependencies = [
|
||||||
|
"float-cmp",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "strsim"
|
name = "strsim"
|
||||||
|
@ -2819,6 +3107,22 @@ version = "0.11.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "subtle"
|
||||||
|
version = "2.6.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "svgtypes"
|
||||||
|
version = "0.13.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6e44e288cd960318917cbd540340968b90becc8bc81f171345d706e7a89d9d70"
|
||||||
|
dependencies = [
|
||||||
|
"kurbo",
|
||||||
|
"siphasher",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.109"
|
version = "1.0.109"
|
||||||
|
@ -2894,6 +3198,7 @@ dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"log",
|
"log",
|
||||||
|
"png",
|
||||||
"tiny-skia-path",
|
"tiny-skia-path",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -3041,6 +3346,12 @@ dependencies = [
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicase"
|
||||||
|
version = "2.8.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-bidi"
|
name = "unicode-bidi"
|
||||||
version = "0.3.17"
|
version = "0.3.17"
|
||||||
|
@ -3080,6 +3391,28 @@ version = "0.2.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
|
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "untrusted"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ureq"
|
||||||
|
version = "2.10.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a"
|
||||||
|
dependencies = [
|
||||||
|
"base64 0.22.1",
|
||||||
|
"flate2",
|
||||||
|
"log",
|
||||||
|
"once_cell",
|
||||||
|
"rustls",
|
||||||
|
"rustls-pki-types",
|
||||||
|
"url",
|
||||||
|
"webpki-roots",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "url"
|
name = "url"
|
||||||
version = "2.5.2"
|
version = "2.5.2"
|
||||||
|
@ -3092,6 +3425,50 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "usvg"
|
||||||
|
version = "0.37.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "38b0a51b72ab80ca511d126b77feeeb4fb1e972764653e61feac30adc161a756"
|
||||||
|
dependencies = [
|
||||||
|
"base64 0.21.7",
|
||||||
|
"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 = [
|
||||||
|
"data-url",
|
||||||
|
"flate2",
|
||||||
|
"imagesize",
|
||||||
|
"kurbo",
|
||||||
|
"log",
|
||||||
|
"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]]
|
[[package]]
|
||||||
name = "utf8parse"
|
name = "utf8parse"
|
||||||
version = "0.2.2"
|
version = "0.2.2"
|
||||||
|
@ -3374,6 +3751,15 @@ dependencies = [
|
||||||
"web-sys",
|
"web-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "webpki-roots"
|
||||||
|
version = "0.26.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958"
|
||||||
|
dependencies = [
|
||||||
|
"rustls-pki-types",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wgpu"
|
name = "wgpu"
|
||||||
version = "0.19.4"
|
version = "0.19.4"
|
||||||
|
@ -3919,6 +4305,12 @@ version = "0.8.22"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26"
|
checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "xmlwriter"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "xmpd-cli"
|
name = "xmpd-cli"
|
||||||
version = "2.0.0"
|
version = "2.0.0"
|
||||||
|
@ -3937,6 +4329,14 @@ dependencies = [
|
||||||
"xmpd-manifest",
|
"xmpd-manifest",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "xmpd-derive"
|
||||||
|
version = "2.0.0"
|
||||||
|
dependencies = [
|
||||||
|
"quote",
|
||||||
|
"syn 2.0.87",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "xmpd-dl"
|
name = "xmpd-dl"
|
||||||
version = "2.0.0"
|
version = "2.0.0"
|
||||||
|
@ -3947,10 +4347,13 @@ version = "2.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"eframe",
|
"eframe",
|
||||||
"egui",
|
"egui 0.27.2",
|
||||||
|
"egui-aesthetix",
|
||||||
|
"egui_extras",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"log",
|
"log",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"xmpd-derive",
|
||||||
"xmpd-manifest",
|
"xmpd-manifest",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -4052,6 +4455,12 @@ dependencies = [
|
||||||
"syn 2.0.87",
|
"syn 2.0.87",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zeroize"
|
||||||
|
version = "1.8.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zvariant"
|
name = "zvariant"
|
||||||
version = "3.15.2"
|
version = "3.15.2"
|
||||||
|
|
|
@ -4,7 +4,7 @@ members=[
|
||||||
"xmpd-core",
|
"xmpd-core",
|
||||||
"xmpd-manifest",
|
"xmpd-manifest",
|
||||||
"xmpd-gui",
|
"xmpd-gui",
|
||||||
"xmpd-cli", "xmpd-dl",
|
"xmpd-cli", "xmpd-dl", "xmpd-derive",
|
||||||
# "xmpd-tui"
|
# "xmpd-tui"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
4
assets/next.svg
Normal file
4
assets/next.svg
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M4 15H2V1H4L10 7V1H14V15H10V9L4 15Z" fill="#FFFFFF"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 295 B |
6
assets/pause.svg
Normal file
6
assets/pause.svg
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M21 12C21 16.9706 16.9706 21 12 21C7.02944 21 3 16.9706 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12Z" stroke="#FFFFFF" stroke-width="2"/>
|
||||||
|
<path d="M14 9L14 15" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M10 9L10 15" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 604 B |
12
assets/play.svg
Normal file
12
assets/play.svg
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg fill="#FFFFFF" height="800px" width="800px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
viewBox="0 0 60 60" xml:space="preserve">
|
||||||
|
<g>
|
||||||
|
<path d="M45.563,29.174l-22-15c-0.307-0.208-0.703-0.231-1.031-0.058C22.205,14.289,22,14.629,22,15v30
|
||||||
|
c0,0.371,0.205,0.711,0.533,0.884C22.679,45.962,22.84,46,23,46c0.197,0,0.394-0.059,0.563-0.174l22-15
|
||||||
|
C45.836,30.64,46,30.331,46,30S45.836,29.36,45.563,29.174z M24,43.107V16.893L43.225,30L24,43.107z"/>
|
||||||
|
<path d="M30,0C13.458,0,0,13.458,0,30s13.458,30,30,30s30-13.458,30-30S46.542,0,30,0z M30,58C14.561,58,2,45.439,2,30
|
||||||
|
S14.561,2,30,2s28,12.561,28,28S45.439,58,30,58z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 827 B |
4
assets/prev.svg
Normal file
4
assets/prev.svg
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M2 1H6V7L12 1H14V15H12L6 9V15H2V1Z" fill="#FFFFFF"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 294 B |
File diff suppressed because one or more lines are too long
52
scripts/manifest_legacy_to_v1_json.py
Normal file
52
scripts/manifest_legacy_to_v1_json.py
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
"""
|
||||||
|
Converts legacy manifest to v1 json
|
||||||
|
"""
|
||||||
|
|
||||||
|
import uuid
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def main(inp: str, out: str):
|
||||||
|
manifest = {
|
||||||
|
"songs": {},
|
||||||
|
"playlists": {}
|
||||||
|
}
|
||||||
|
with open(inp, "r", encoding="utf-8") as f:
|
||||||
|
data = json.load(f)
|
||||||
|
_format = data["format"] # unused
|
||||||
|
for pname in data["playlists"]:
|
||||||
|
pid = str(uuid.uuid4())
|
||||||
|
manifest["playlists"][pid] = {
|
||||||
|
"name": pname,
|
||||||
|
"author": "Unknown",
|
||||||
|
"songs": []
|
||||||
|
}
|
||||||
|
for sname in data["playlists"][pname]["songs"]:
|
||||||
|
asn = sname.split(" - ", 2)
|
||||||
|
author = None
|
||||||
|
name = None
|
||||||
|
if len(asn) < 2:
|
||||||
|
author = "Unknown"
|
||||||
|
name = sname
|
||||||
|
else:
|
||||||
|
author = asn[0]
|
||||||
|
name = asn[1]
|
||||||
|
song = data["playlists"][pname]["songs"][sname]
|
||||||
|
|
||||||
|
sid = str(uuid.uuid4())
|
||||||
|
manifest["playlists"][pid]["songs"].append(sid)
|
||||||
|
manifest["songs"][sid] = {
|
||||||
|
"name": name,
|
||||||
|
"author": author,
|
||||||
|
"url": song["url"],
|
||||||
|
"source_type": song["typ"]
|
||||||
|
}
|
||||||
|
converted = json.dumps(manifest)
|
||||||
|
with open(out, "w", encoding="utf-8") as f:
|
||||||
|
f.write(converted)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) < 3:
|
||||||
|
print(f"Usage: {sys.argv[0]} [in] [out]")
|
||||||
|
sys.exit(1)
|
||||||
|
main(sys.argv[1], sys.argv[2])
|
15
xmpd-derive/Cargo.toml
Normal file
15
xmpd-derive/Cargo.toml
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
[package]
|
||||||
|
name = "xmpd-derive"
|
||||||
|
edition = "2021"
|
||||||
|
version.workspace = true
|
||||||
|
repository.workspace = true
|
||||||
|
license.workspace = true
|
||||||
|
authors.workspace = true
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
proc-macro=true
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
quote = "1.0.37"
|
||||||
|
syn = "2.0.87"
|
||||||
|
# xmpd-gui.path = "../xmpd-gui"
|
26
xmpd-derive/src/lib.rs
Normal file
26
xmpd-derive/src/lib.rs
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
use proc_macro::TokenStream;
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate quote;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate syn;
|
||||||
|
extern crate proc_macro;
|
||||||
|
|
||||||
|
|
||||||
|
#[proc_macro_derive(UiComponent)]
|
||||||
|
pub fn ui_comp_impl(input: TokenStream) -> TokenStream {
|
||||||
|
let ast: syn::DeriveInput = syn::parse(input).unwrap();
|
||||||
|
|
||||||
|
let name = &ast.ident;
|
||||||
|
let vis = &ast.vis;
|
||||||
|
let attr = &ast.attrs;
|
||||||
|
let data = &ast.data;
|
||||||
|
let generics = &ast.generics;
|
||||||
|
|
||||||
|
let gen = quote! {
|
||||||
|
impl xmp
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
gen.into()
|
||||||
|
}
|
|
@ -19,9 +19,12 @@ bench = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
xmpd-manifest.path = "../xmpd-manifest"
|
xmpd-manifest.path = "../xmpd-manifest"
|
||||||
|
xmpd-derive.path = "../xmpd-derive"
|
||||||
egui.workspace = true
|
egui.workspace = true
|
||||||
eframe.workspace = true
|
eframe.workspace = true
|
||||||
tokio.workspace = true
|
tokio.workspace = true
|
||||||
anyhow.workspace = true
|
anyhow.workspace = true
|
||||||
lazy_static.workspace = true
|
lazy_static.workspace = true
|
||||||
log.workspace = true
|
log.workspace = true
|
||||||
|
egui_extras.workspace = true
|
||||||
|
egui-aesthetix = "0.2.4"
|
||||||
|
|
40
xmpd-gui/src/components/left_nav.rs
Normal file
40
xmpd-gui/src/components/left_nav.rs
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
use xmpd_manifest::store::BaseStore;
|
||||||
|
|
||||||
|
use super::CompUi;
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
pub struct LeftNav;
|
||||||
|
|
||||||
|
component_register!(LeftNav);
|
||||||
|
|
||||||
|
impl CompUi for LeftNav {
|
||||||
|
fn draw(ui: &mut egui::Ui, state: &mut crate::GuiState) -> crate::Result<()> {
|
||||||
|
let height = ui.available_height();
|
||||||
|
egui::ScrollArea::vertical().id_source("left_nav").show(ui, |ui| {
|
||||||
|
//ui.horizontal(|ui| {
|
||||||
|
ui.vertical(|ui| {
|
||||||
|
let playlists = state.manifest.store().get_playlists();
|
||||||
|
for (_pid, playlist) in playlists.iter() {
|
||||||
|
ui.horizontal(|ui| {
|
||||||
|
ui.add_space(5.0);
|
||||||
|
ui.add(
|
||||||
|
egui::Image::new(crate::data::NOTE_ICON)
|
||||||
|
.tint(crate::data::C_ACCENT)
|
||||||
|
.fit_to_exact_size(egui::Vec2::new(32.0, 32.0))
|
||||||
|
);
|
||||||
|
ui.label(playlist.name());
|
||||||
|
ui.with_layout(egui::Layout::bottom_up(egui::Align::RIGHT), |ui| {
|
||||||
|
ui.label(format!("{}", playlist.songs().len()));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
ui.separator();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// });
|
||||||
|
});
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
use std::sync::{MutexGuard, PoisonError};
|
||||||
|
|
||||||
|
use crate::GuiState;
|
||||||
|
|
||||||
|
pub mod left_nav;
|
||||||
|
pub mod song_list;
|
||||||
|
pub mod top_nav;
|
||||||
|
pub mod player;
|
||||||
|
|
||||||
|
pub trait CompUi {
|
||||||
|
fn draw(ui: &mut egui::Ui, state: &mut GuiState) -> crate::Result<()>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait CompGetter {
|
||||||
|
fn get() -> crate::Result<MutexGuard<'static, Self>>;
|
||||||
|
}
|
55
xmpd-gui/src/components/player.rs
Normal file
55
xmpd-gui/src/components/player.rs
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
use egui::{Stroke, Vec2};
|
||||||
|
|
||||||
|
use super::{CompGetter, CompUi};
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
pub struct Player {
|
||||||
|
slider_progress: usize
|
||||||
|
}
|
||||||
|
|
||||||
|
component_register!(Player);
|
||||||
|
|
||||||
|
|
||||||
|
impl CompUi for Player {
|
||||||
|
fn draw(ui: &mut egui::Ui, state: &mut crate::GuiState) -> crate::Result<()> {
|
||||||
|
let avail = ui.available_size();
|
||||||
|
ui.vertical_centered_justified(|ui| {
|
||||||
|
ui.add_space(3.0);
|
||||||
|
ui.horizontal(|ui| {
|
||||||
|
{
|
||||||
|
ui.add_space(avail.x * 0.05 / 2.0);
|
||||||
|
let mut slf = handle_error_ui!(Player::get());
|
||||||
|
let slider = egui::Slider::new(&mut slf.slider_progress, 0..=100)
|
||||||
|
.show_value(false);
|
||||||
|
ui.style_mut().spacing.slider_width = avail.x * 0.90;
|
||||||
|
let s = Stroke {
|
||||||
|
color: crate::data::C_ACCENT,
|
||||||
|
width: 2.0
|
||||||
|
};
|
||||||
|
ui.style_mut().visuals.widgets.inactive.fg_stroke = s;
|
||||||
|
ui.style_mut().visuals.widgets.active.fg_stroke = s;
|
||||||
|
ui.add(slider);
|
||||||
|
ui.label("00:00");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
ui.horizontal(|ui| {
|
||||||
|
ui.add_space((avail.x / 2.0) - 16.0 - 8.0 - ui.spacing().item_spacing.x);
|
||||||
|
let prev = egui::Image::new(crate::data::PREV_ICON)
|
||||||
|
.tint(crate::data::C_ACCENT)
|
||||||
|
.max_size(Vec2::new(16.0, 16.0));
|
||||||
|
let play = egui::Image::new(crate::data::PLAY_ICON)
|
||||||
|
.tint(crate::data::C_ACCENT)
|
||||||
|
.max_size(Vec2::new(16.0, 16.0));
|
||||||
|
let next = egui::Image::new(crate::data::NEXT_ICON)
|
||||||
|
.tint(crate::data::C_ACCENT)
|
||||||
|
.max_size(Vec2::new(16.0, 16.0));
|
||||||
|
if ui.add(prev).clicked() {}
|
||||||
|
if ui.add(play).clicked() {}
|
||||||
|
if ui.add(next).clicked() {}
|
||||||
|
});
|
||||||
|
ui.add_space(3.0);
|
||||||
|
});
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
34
xmpd-gui/src/components/song_list.rs
Normal file
34
xmpd-gui/src/components/song_list.rs
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
use egui::{Color32, Vec2};
|
||||||
|
use xmpd_manifest::store::BaseStore;
|
||||||
|
|
||||||
|
use super::CompUi;
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
pub struct SongList;
|
||||||
|
|
||||||
|
component_register!(SongList);
|
||||||
|
|
||||||
|
impl CompUi for SongList {
|
||||||
|
fn draw(ui: &mut egui::Ui, state: &mut crate::GuiState) -> crate::Result<()> {
|
||||||
|
egui::ScrollArea::vertical().id_source("song_list").show(ui, |ui| {
|
||||||
|
ui.vertical(|ui| {
|
||||||
|
let songs = state.manifest.store().get_songs();
|
||||||
|
for (sid, song) in songs.iter() {
|
||||||
|
ui.horizontal(|ui| {
|
||||||
|
ui.add(
|
||||||
|
egui::Image::new(crate::data::NOTE_ICON)
|
||||||
|
.tint(crate::data::C_ACCENT)
|
||||||
|
.fit_to_exact_size(Vec2::new(32.0, 32.0))
|
||||||
|
);
|
||||||
|
ui.label(song.author());
|
||||||
|
ui.strong(" - ");
|
||||||
|
ui.label(song.name());
|
||||||
|
});
|
||||||
|
ui.separator();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
30
xmpd-gui/src/components/top_nav.rs
Normal file
30
xmpd-gui/src/components/top_nav.rs
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
use super::CompUi;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
pub struct TopNav;
|
||||||
|
|
||||||
|
component_register!(TopNav);
|
||||||
|
|
||||||
|
impl CompUi for TopNav {
|
||||||
|
fn draw(ui: &mut egui::Ui, state: &mut crate::GuiState) -> crate::Result<()> {
|
||||||
|
ui.add_space(3.0);
|
||||||
|
ui.horizontal(|ui| {
|
||||||
|
ui.add_space(3.0);
|
||||||
|
egui::menu::bar(ui, |ui| {
|
||||||
|
ui.menu_button("File", |ui| {
|
||||||
|
// TBD
|
||||||
|
});
|
||||||
|
ui.menu_button("Help", |ui| {
|
||||||
|
if ui.button("Source").clicked() {
|
||||||
|
ui.ctx().open_url(egui::OpenUrl::new_tab("https://git.mcorangehq.xyz/XOR64/music"));
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
18
xmpd-gui/src/data.rs
Normal file
18
xmpd-gui/src/data.rs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
// pub const APP_ICON: egui::ImageSource = egui::include_image!("../../assets/app_icon.png");
|
||||||
|
pub const APP_ICON_BYTES: &[u8] = include_bytes!("../../assets/app_icon.png");
|
||||||
|
pub const NOTE_ICON: egui::ImageSource = egui::include_image!("../../assets/note.svg");
|
||||||
|
pub const SEARCH_ICON: egui::ImageSource = egui::include_image!("../../assets/search.svg");
|
||||||
|
pub const PREV_ICON: egui::ImageSource = egui::include_image!("../../assets/prev.svg");
|
||||||
|
pub const NEXT_ICON: egui::ImageSource = egui::include_image!("../../assets/next.svg");
|
||||||
|
pub const PLAY_ICON: egui::ImageSource = egui::include_image!("../../assets/play.svg");
|
||||||
|
pub const PAUSE_ICON: egui::ImageSource = egui::include_image!("../../assets/pause.svg");
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: Replace this with config for theming
|
||||||
|
// pub const C_ACCENT: egui::Color32 = egui::Color32::from_rgb(51, 51, 119);
|
||||||
|
pub const C_ACCENT: egui::Color32 = egui::Color32::from_rgb(5, 102, 146); // #0566F6
|
||||||
|
pub const C_PRIM_BG: egui::Color32 = egui::Color32::from_rgb(31, 34, 40); // #1F2228
|
||||||
|
pub const C_SEC_BG: egui::Color32 = egui::Color32::from_rgb(47, 53, 61); // #2f353d
|
||||||
|
pub const C_TEXT: egui::Color32 = egui::Color32::from_rgb(223, 223, 223); // #dfdfdf
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,17 @@
|
||||||
#![feature(async_closure)]
|
#![feature(async_closure)]
|
||||||
|
|
||||||
use std::{path::{Path, PathBuf}, sync::mpsc, thread::JoinHandle};
|
use std::{path::{Path, PathBuf}, time::Duration};
|
||||||
|
use egui::TextStyle;
|
||||||
use windows::WindowId;
|
use windows::WindowId;
|
||||||
use xmpd_manifest::{store::JsonStore, Manifest};
|
use xmpd_manifest::{store::JsonStore, Manifest};
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
mod macros;
|
||||||
mod main_window;
|
mod main_window;
|
||||||
mod windows;
|
mod windows;
|
||||||
|
mod components;
|
||||||
|
mod data;
|
||||||
|
mod utils;
|
||||||
|
|
||||||
const W_NAME: &str = "xmpd v2.0.0a";
|
const W_NAME: &str = "xmpd v2.0.0a";
|
||||||
|
|
||||||
|
@ -15,12 +20,24 @@ type Result<T> = anyhow::Result<T>;
|
||||||
pub fn start(manifest_path: PathBuf) -> Result<()> {
|
pub fn start(manifest_path: PathBuf) -> Result<()> {
|
||||||
let options = eframe::NativeOptions::default();
|
let options = eframe::NativeOptions::default();
|
||||||
let mut state = GuiState::new(&manifest_path)?;
|
let mut state = GuiState::new(&manifest_path)?;
|
||||||
state.windows.toggle(&WindowId::Error, true);
|
|
||||||
|
|
||||||
let res = eframe::run_simple_native(W_NAME, options, move |ctx, _frame| {
|
let res = eframe::run_simple_native(W_NAME, options, move |ctx, _frame| {
|
||||||
|
egui_extras::install_image_loaders(ctx);
|
||||||
state.windows.clone().draw_all(ctx, &mut state);
|
state.windows.clone().draw_all(ctx, &mut state);
|
||||||
egui::CentralPanel::default().show(ctx, |ui| main_window::draw(ui, &mut state));
|
egui::CentralPanel::default()
|
||||||
ctx.request_repaint();
|
.frame(
|
||||||
|
egui::Frame::none()
|
||||||
|
.fill(data::C_PRIM_BG)
|
||||||
|
.stroke(egui::Stroke::new(
|
||||||
|
1.0,
|
||||||
|
data::C_SEC_BG,
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
.show(ctx, |ui| {
|
||||||
|
ui.style_mut().visuals.override_text_color = Some(crate::data::C_TEXT);
|
||||||
|
main_window::draw(ui, &mut state)
|
||||||
|
});
|
||||||
|
ctx.request_repaint_after(Duration::from_millis(500));
|
||||||
});
|
});
|
||||||
if let Err(e) = res { // dumb err value by eframe
|
if let Err(e) = res { // dumb err value by eframe
|
||||||
anyhow::bail!(e.to_string());
|
anyhow::bail!(e.to_string());
|
||||||
|
|
29
xmpd-gui/src/macros.rs
Normal file
29
xmpd-gui/src/macros.rs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
|
||||||
|
macro_rules! component_register {
|
||||||
|
($comp:ident) => {
|
||||||
|
lazy_static::lazy_static! {
|
||||||
|
static ref __COMPONENT: std::sync::Arc<std::sync::Mutex<$comp>> =
|
||||||
|
std::sync::Arc::new(std::sync::Mutex::new($comp::default()));
|
||||||
|
}
|
||||||
|
impl crate::components::CompGetter for $comp {
|
||||||
|
fn get() -> crate::Result<std::sync::MutexGuard<'static, Self>> {
|
||||||
|
match __COMPONENT.lock() {
|
||||||
|
Ok(l) => Ok(l),
|
||||||
|
Err(e) => Err(anyhow::anyhow!(format!("{e:?}"))),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! handle_error_ui {
|
||||||
|
($val:expr) => {
|
||||||
|
match $val {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(e) => {
|
||||||
|
log::error!("Error in ui: {e:?}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,14 +1,71 @@
|
||||||
use egui::ViewportId;
|
use egui::ViewportId;
|
||||||
use xmpd_manifest::store::JsonStore;
|
use xmpd_manifest::store::JsonStore;
|
||||||
|
|
||||||
use crate::GuiState;
|
use crate::{components::{CompGetter, CompUi}, GuiState};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pub fn draw(ui: &mut egui::Ui, state: &mut GuiState) -> crate::Result<()> {
|
pub fn draw(ui: &mut egui::Ui, state: &mut GuiState) -> crate::Result<()> {
|
||||||
ui.label("Hello! this is root of main window");
|
// The central panel the region left after adding TopPanel's and SidePanel's
|
||||||
if ui.button("open iwndow").clicked() {
|
// ui.heading(format!("Songs ({})", self.manifest.get_song_count()));
|
||||||
state.windows.toggle(&crate::windows::WindowId::Error, true);
|
let avail = ui.available_size();
|
||||||
}
|
ui.vertical(|ui| {
|
||||||
|
handle_error_ui!(crate::components::top_nav::TopNav::draw(ui, state));
|
||||||
|
crate::utils::super_separator(ui, crate::data::C_ACCENT, avail.x, 2.0);
|
||||||
|
let avail = ui.available_size();
|
||||||
|
|
||||||
|
ui.horizontal(|ui| {
|
||||||
|
ui.set_height(avail.y);
|
||||||
|
ui.group(|ui| {
|
||||||
|
ui.set_height(avail.y);
|
||||||
|
ui.set_width(avail.x * 0.25);
|
||||||
|
handle_error_ui!(crate::components::left_nav::LeftNav::draw(ui, state));
|
||||||
|
});
|
||||||
|
handle_error_ui!(crate::components::song_list::SongList::draw(ui, state));
|
||||||
|
});
|
||||||
|
egui::TopBottomPanel::new(egui::panel::TopBottomSide::Bottom, "player")
|
||||||
|
.frame(
|
||||||
|
egui::Frame::none()
|
||||||
|
.fill(crate::data::C_PRIM_BG)
|
||||||
|
.stroke(egui::Stroke::new(
|
||||||
|
1.0,
|
||||||
|
crate::data::C_SEC_BG,
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
.show(ui.ctx(), |ui| {
|
||||||
|
|
||||||
|
ui.style_mut().visuals.override_text_color = Some(crate::data::C_TEXT);
|
||||||
|
handle_error_ui!(crate::components::player::Player::draw(ui, state));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
//ui.vertical_centered_justified(|ui| {
|
||||||
|
// ui.with_layout(egui::Layout::top_down_justified(egui::Align::TOP), |ui| {
|
||||||
|
// let avail = ui.available_size();
|
||||||
|
// ui.vertical(|ui| {
|
||||||
|
// let avail_width = ui.available_width();
|
||||||
|
// ui.set_height(avail.y);
|
||||||
|
// ui.vertical(|ui| {
|
||||||
|
// ui.set_height(avail.y * 0.9);
|
||||||
|
// ui.horizontal(|ui| {
|
||||||
|
//
|
||||||
|
// ui.group(|ui| {
|
||||||
|
// ui.set_width(avail_width * 0.25);
|
||||||
|
// handle_error_ui!(crate::components::left_nav::LeftNav::draw(ui, state));
|
||||||
|
// });
|
||||||
|
// // crate::utils::super_separator(ui, crate::data::C_ACCENT, 3.0, avail_width);
|
||||||
|
// // handle_error_ui!(crate::components::song_list::SongList::draw(ui, state));
|
||||||
|
// });
|
||||||
|
// // handle_error_ui!(crate::components::player::Player::draw(ui, state));
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
//
|
||||||
|
// ui.with_layout(egui::Layout::bottom_up(egui::Align::LEFT), |ui| {
|
||||||
|
// egui::warn_if_debug_build(ui);
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
//});
|
||||||
|
//
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
11
xmpd-gui/src/utils.rs
Normal file
11
xmpd-gui/src/utils.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
|
||||||
|
pub fn super_separator(ui: &mut egui::Ui, color: egui::Color32, width: f32, height: f32) {
|
||||||
|
egui::Frame::none()
|
||||||
|
.fill(color)
|
||||||
|
// .stroke(egui::Stroke { color: crate::data::C_ACCENT, width: 1.0 })
|
||||||
|
.show(ui, |ui| {
|
||||||
|
ui.set_width(width);
|
||||||
|
ui.set_height(height);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
|
@ -64,7 +64,6 @@ impl Windows {
|
||||||
if status {
|
if status {
|
||||||
OPEN_WINDOWS.lock().unwrap().insert(id.clone());
|
OPEN_WINDOWS.lock().unwrap().insert(id.clone());
|
||||||
} else {
|
} else {
|
||||||
log::debug!("tried to kill");
|
|
||||||
OPEN_WINDOWS.lock().unwrap().remove(id);
|
OPEN_WINDOWS.lock().unwrap().remove(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user