New icons, new side panel, table no longer shows playlists, as they are selectable seperately
This commit is contained in:
parent
847aa2bb4f
commit
70b92f4ebf
228
Cargo.lock
generated
228
Cargo.lock
generated
|
@ -579,6 +579,12 @@ 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]]
|
[[package]]
|
||||||
name = "base64"
|
name = "base64"
|
||||||
version = "0.22.1"
|
version = "0.22.1"
|
||||||
|
@ -953,6 +959,12 @@ dependencies = [
|
||||||
"unicode-width",
|
"unicode-width",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "color-hex"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ecdffb913a326b6c642290a0d0ec8e8d6597291acdc07cc4c9cb4b3635d44cf9"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "color_quant"
|
name = "color_quant"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
|
@ -1101,6 +1113,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 = "deranged"
|
name = "deranged"
|
||||||
version = "0.3.11"
|
version = "0.3.11"
|
||||||
|
@ -1190,6 +1208,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "20930a432bbd57a6d55e07976089708d4893f3d556cf42a0d79e9e321fa73b10"
|
checksum = "20930a432bbd57a6d55e07976089708d4893f3d556cf42a0d79e9e321fa73b10"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
|
"color-hex",
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1283,9 +1302,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1b78779f35ded1a853786c9ce0b43fe1053e10a21ea3b23ebea411805ce41593"
|
checksum = "1b78779f35ded1a853786c9ce0b43fe1053e10a21ea3b23ebea411805ce41593"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"egui",
|
"egui",
|
||||||
|
"ehttp",
|
||||||
"enum-map",
|
"enum-map",
|
||||||
|
"image",
|
||||||
"log",
|
"log",
|
||||||
"mime_guess2",
|
"mime_guess2",
|
||||||
|
"resvg",
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1305,6 +1327,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"
|
||||||
|
@ -1508,6 +1544,12 @@ dependencies = [
|
||||||
"miniz_oxide 0.8.0",
|
"miniz_oxide 0.8.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "float-cmp"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fnv"
|
name = "fnv"
|
||||||
version = "1.0.7"
|
version = "1.0.7"
|
||||||
|
@ -1936,6 +1978,15 @@ dependencies = [
|
||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "html-escape"
|
||||||
|
version = "0.2.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6d1ad449764d627e22bfd7cd5e8868264fc9236e07c752972b4080cd351cb476"
|
||||||
|
dependencies = [
|
||||||
|
"utf8-width",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "http"
|
name = "http"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
|
@ -2074,6 +2125,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.5.0"
|
version = "2.5.0"
|
||||||
|
@ -2207,6 +2264,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"
|
||||||
|
@ -2329,11 +2395,13 @@ dependencies = [
|
||||||
"egui_extras",
|
"egui_extras",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"futures",
|
"futures",
|
||||||
|
"html-escape",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
"notify-rust",
|
"notify-rust",
|
||||||
"open",
|
"open",
|
||||||
|
"regex",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
@ -2873,6 +2941,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"
|
name = "pin-project"
|
||||||
version = "1.1.5"
|
version = "1.1.5"
|
||||||
|
@ -3138,6 +3212,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"
|
||||||
|
@ -3178,9 +3258,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex"
|
name = "regex"
|
||||||
version = "1.10.6"
|
version = "1.11.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619"
|
checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick",
|
"aho-corasick",
|
||||||
"memchr",
|
"memchr",
|
||||||
|
@ -3190,9 +3270,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex-automata"
|
name = "regex-automata"
|
||||||
version = "0.4.7"
|
version = "0.4.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
|
checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick",
|
"aho-corasick",
|
||||||
"memchr",
|
"memchr",
|
||||||
|
@ -3201,9 +3281,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex-syntax"
|
name = "regex-syntax"
|
||||||
version = "0.8.4"
|
version = "0.8.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
|
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "renderdoc-sys"
|
name = "renderdoc-sys"
|
||||||
|
@ -3217,8 +3297,9 @@ version = "0.12.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63"
|
checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64",
|
"base64 0.22.1",
|
||||||
"bytes",
|
"bytes",
|
||||||
|
"futures-channel",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"h2",
|
"h2",
|
||||||
|
@ -3254,6 +3335,29 @@ dependencies = [
|
||||||
"windows-registry",
|
"windows-registry",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[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]]
|
[[package]]
|
||||||
name = "ring"
|
name = "ring"
|
||||||
version = "0.17.8"
|
version = "0.17.8"
|
||||||
|
@ -3269,6 +3373,12 @@ dependencies = [
|
||||||
"windows-sys 0.52.0",
|
"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"
|
||||||
|
@ -3320,6 +3430,7 @@ version = "0.23.13"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8"
|
checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"log",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"ring",
|
"ring",
|
||||||
"rustls-pki-types",
|
"rustls-pki-types",
|
||||||
|
@ -3334,7 +3445,7 @@ version = "2.1.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425"
|
checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64",
|
"base64 0.22.1",
|
||||||
"rustls-pki-types",
|
"rustls-pki-types",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -3493,6 +3604,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"
|
||||||
|
@ -3633,6 +3759,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"
|
||||||
|
@ -3646,6 +3775,16 @@ version = "2.6.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
|
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"
|
||||||
|
@ -3760,6 +3899,7 @@ dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"log",
|
"log",
|
||||||
|
"png",
|
||||||
"tiny-skia-path",
|
"tiny-skia-path",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -4019,6 +4159,22 @@ version = "0.9.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
|
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"
|
||||||
|
@ -4030,6 +4186,56 @@ dependencies = [
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[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]]
|
||||||
|
name = "utf8-width"
|
||||||
|
version = "0.1.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "utf8parse"
|
name = "utf8parse"
|
||||||
version = "0.2.2"
|
version = "0.2.2"
|
||||||
|
@ -4957,6 +5163,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 = "zbus"
|
name = "zbus"
|
||||||
version = "3.15.2"
|
version = "3.15.2"
|
||||||
|
|
|
@ -11,16 +11,18 @@ anyhow = "1.0.81"
|
||||||
camino = "1.1.6"
|
camino = "1.1.6"
|
||||||
clap = { version = "4.5.4", features = ["derive"] }
|
clap = { version = "4.5.4", features = ["derive"] }
|
||||||
eframe = "0.27.2"
|
eframe = "0.27.2"
|
||||||
egui = "0.27.2"
|
egui = { version = "0.27.2", features = ["color-hex"] }
|
||||||
egui_extras = "0.27.2"
|
egui_extras = { version = "0.27.2", features = ["all_loaders"] }
|
||||||
env_logger = "0.11.3"
|
env_logger = "0.11.3"
|
||||||
futures = "0.3.30"
|
futures = "0.3.30"
|
||||||
|
html-escape = "0.2.13"
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
libc = "0.2.153"
|
libc = "0.2.153"
|
||||||
log = "0.4.21"
|
log = "0.4.21"
|
||||||
notify-rust = "4.11.3"
|
notify-rust = "4.11.3"
|
||||||
open = "5.3.0"
|
open = "5.3.0"
|
||||||
reqwest = { version = "0.12.3", features = ["h2", "http2", "rustls-tls"], default-features = false }
|
regex = "1.11.0"
|
||||||
|
reqwest = { version = "0.12.3", features = ["blocking", "h2", "http2", "rustls-tls"], default-features = false }
|
||||||
serde = { version = "1.0.197", features = ["derive"] }
|
serde = { version = "1.0.197", features = ["derive"] }
|
||||||
serde_json = "1.0.115"
|
serde_json = "1.0.115"
|
||||||
# serde_traitobject = "0.2.8"
|
# serde_traitobject = "0.2.8"
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
19
assets/note.svg
Normal file
19
assets/note.svg
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg width="800px" height="800px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
|
||||||
|
<title>music [#1005]</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs>
|
||||||
|
|
||||||
|
</defs>
|
||||||
|
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="Dribbble-Light-Preview" transform="translate(-260.000000, -3759.000000)" fill="#ffffff">
|
||||||
|
<g id="icons" transform="translate(56.000000, 160.000000)">
|
||||||
|
<path d="M224,3601.05129 L224,3610.55901 C224,3612.90979 222.17612,3614.95492 219.888035,3614.89646 C217.266519,3614.82877 215.248971,3612.1662 216.234285,3609.31593 C216.777356,3607.74464 218.297755,3606.71797 219.920978,3606.69233 C220.695653,3606.68105 220.976173,3606.88208 222.003416,3607.24105 L222.003416,3604.12822 C222.003416,3603.56207 221.556181,3603.10258 221.005124,3603.10258 L213.018786,3603.10258 C212.467729,3603.10258 212.020494,3603.56207 212.020494,3604.12822 L212.020494,3614.65851 C212.020494,3617.02057 210.179644,3619.07289 207.881575,3618.99801 C205.681339,3618.92622 203.914362,3617.02775 204.00321,3614.73031 C204.090061,3612.51594 205.989811,3610.84209 208.147121,3610.79081 C209.166377,3610.76619 209.352059,3610.92619 210.02391,3611.34363 L210.02391,3601.05129 C210.02391,3599.91795 210.91838,3599 212.020494,3599 L222.003416,3599 C223.106529,3599 224,3599.91795 224,3601.05129" id="music-[#1005]">
|
||||||
|
|
||||||
|
</path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
4
assets/search.svg
Normal file
4
assets/search.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 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M11 6C13.7614 6 16 8.23858 16 11M16.6588 16.6549L21 21M19 11C19 15.4183 15.4183 19 11 19C6.58172 19 3 15.4183 3 11C3 6.58172 6.58172 3 11 3C15.4183 3 19 6.58172 19 11Z" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 493 B |
1214
manifest.json
1214
manifest.json
File diff suppressed because it is too large
Load Diff
5
src/data.rs
Normal file
5
src/data.rs
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
|
||||||
|
// 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");
|
|
@ -143,8 +143,8 @@ impl Downloader {
|
||||||
log::debug!("File {dl_file} doesnt exist, downloading");
|
log::debug!("File {dl_file} doesnt exist, downloading");
|
||||||
let mut cmd = match song.get_type() {
|
let mut cmd = match song.get_type() {
|
||||||
|
|
||||||
&SongType::Youtube => {
|
SongType::Youtube | SongType::Soundcloud=> {
|
||||||
log::debug!("Song {} is from yotube", song.get_url_str());
|
log::debug!("Song {} is from youtube or sondclound", song.get_url_str());
|
||||||
let mut cmd = tokio::process::Command::new(&cfg.cfg.ytdlp.path);
|
let mut cmd = tokio::process::Command::new(&cfg.cfg.ytdlp.path);
|
||||||
cmd.args([
|
cmd.args([
|
||||||
"-x",
|
"-x",
|
||||||
|
@ -168,7 +168,7 @@ impl Downloader {
|
||||||
]);
|
]);
|
||||||
cmd
|
cmd
|
||||||
}
|
}
|
||||||
url @ SongType::Soundcloud => {
|
url => {
|
||||||
log::error!("Unknown or unsupported hostname '{:?}'", url);
|
log::error!("Unknown or unsupported hostname '{:?}'", url);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#![feature(downcast_unchecked)]
|
#![feature(downcast_unchecked)]
|
||||||
|
#![feature(async_closure)]
|
||||||
|
|
||||||
use config::ConfigWrapper;
|
use config::ConfigWrapper;
|
||||||
|
|
||||||
|
@ -13,8 +14,10 @@ mod constants;
|
||||||
mod process_manager;
|
mod process_manager;
|
||||||
mod ui;
|
mod ui;
|
||||||
mod prompt;
|
mod prompt;
|
||||||
|
mod data;
|
||||||
|
|
||||||
fn main() {
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
let Ok(cfg) = ConfigWrapper::parse() else {
|
let Ok(cfg) = ConfigWrapper::parse() else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,7 +18,6 @@ lazy_static::lazy_static!(
|
||||||
static PROC_INC: AtomicUsize = AtomicUsize::new(0);
|
static PROC_INC: AtomicUsize = AtomicUsize::new(0);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pub fn add_proc(mut cmd: Command, msg: String) -> anyhow::Result<()> {
|
pub fn add_proc(mut cmd: Command, msg: String) -> anyhow::Result<()> {
|
||||||
let mut proc = cmd.spawn()?;
|
let mut proc = cmd.spawn()?;
|
||||||
let id = PROC_INC.fetch_add(1, Ordering::AcqRel);
|
let id = PROC_INC.fetch_add(1, Ordering::AcqRel);
|
||||||
|
@ -65,7 +64,7 @@ pub fn purge_done_procs() -> usize {
|
||||||
finish_count
|
finish_count
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Waits for processes to finish untill the proc count is lower or equal to `max`
|
/// Waits for processes to finish until the proc count is lower or equal to `max`
|
||||||
pub fn wait_for_procs_untill(max: usize) -> anyhow::Result<usize> {
|
pub fn wait_for_procs_untill(max: usize) -> anyhow::Result<usize> {
|
||||||
// NOTE: This looks really fucked because i dont want to deadlock the processes so i lock PROCESSES for as little as possible
|
// NOTE: This looks really fucked because i dont want to deadlock the processes so i lock PROCESSES for as little as possible
|
||||||
// NOTE: So its also kinda really slow
|
// NOTE: So its also kinda really slow
|
||||||
|
|
|
@ -9,7 +9,7 @@ impl /* ComponentUi for */ ContextMenu {
|
||||||
pub fn ui(gui: &mut crate::ui::gui::Gui, ui: &mut egui::Ui, pname: &String, sname: &String, song: &Song) {
|
pub fn ui(gui: &mut crate::ui::gui::Gui, ui: &mut egui::Ui, pname: &String, sname: &String, song: &Song) {
|
||||||
if ui.button("Edit").clicked() {
|
if ui.button("Edit").clicked() {
|
||||||
let w = gui.windows.get_window::<GuiSongEditor>(WindowIndex::SongEdit);
|
let w = gui.windows.get_window::<GuiSongEditor>(WindowIndex::SongEdit);
|
||||||
w.set_active_song(pname, sname, song.get_url_str());
|
w.set_active_song(pname, sname, song.get_url_str(), song.get_type());
|
||||||
gui.windows.open(WindowIndex::SongEdit, true);
|
gui.windows.open(WindowIndex::SongEdit, true);
|
||||||
ui.close_menu();
|
ui.close_menu();
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,8 @@ use super::Gui;
|
||||||
pub mod nav;
|
pub mod nav;
|
||||||
pub mod song_list;
|
pub mod song_list;
|
||||||
pub mod context_menu;
|
pub mod context_menu;
|
||||||
|
pub mod side_nav;
|
||||||
|
pub mod search_bar;
|
||||||
|
|
||||||
pub trait Component {
|
pub trait Component {
|
||||||
fn ui(gui: &mut Gui, ctx: &egui::Context);
|
fn ui(gui: &mut Gui, ctx: &egui::Context);
|
||||||
|
@ -12,3 +14,7 @@ pub trait Component {
|
||||||
pub trait ComponentUi {
|
pub trait ComponentUi {
|
||||||
fn ui(gui: &mut Gui, ui: &mut egui::Ui);
|
fn ui(gui: &mut Gui, ui: &mut egui::Ui);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait ComponentUiMut {
|
||||||
|
fn ui(&mut self, gui: &mut Gui, ui: &mut egui::Ui);
|
||||||
|
}
|
||||||
|
|
53
src/ui/gui/components/search_bar.rs
Normal file
53
src/ui/gui/components/search_bar.rs
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
use egui::Color32;
|
||||||
|
|
||||||
|
use super::ComponentUiMut;
|
||||||
|
|
||||||
|
#[derive(Debug, Default, Clone)]
|
||||||
|
pub struct SearchBar {
|
||||||
|
text: String
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum SearchType {
|
||||||
|
Generic,
|
||||||
|
Song,
|
||||||
|
Url,
|
||||||
|
Source,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SearchBar {
|
||||||
|
pub fn get_search(&self) -> (SearchType, String) {
|
||||||
|
if self.text.starts_with("source:") {
|
||||||
|
(
|
||||||
|
SearchType::Source,
|
||||||
|
self.text.strip_prefix("source:").unwrap_or("").to_string().to_lowercase()
|
||||||
|
)
|
||||||
|
} else if self.text.starts_with("song:") {
|
||||||
|
(
|
||||||
|
SearchType::Song,
|
||||||
|
self.text.strip_prefix("song:").unwrap_or("").to_string().to_lowercase()
|
||||||
|
)
|
||||||
|
} else if self.text.starts_with("url:") {
|
||||||
|
(
|
||||||
|
SearchType::Url,
|
||||||
|
self.text.strip_prefix("url:").unwrap_or("").to_string().to_lowercase()
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
(
|
||||||
|
SearchType::Generic,
|
||||||
|
self.text.clone()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ComponentUiMut for SearchBar {
|
||||||
|
fn ui(&mut self, _: &mut crate::ui::gui::Gui, ui: &mut egui::Ui) {
|
||||||
|
ui.vertical(|ui| {
|
||||||
|
ui.horizontal(|ui| {
|
||||||
|
let tint = Color32::from_hex("#333377").unwrap();
|
||||||
|
ui.add(egui::Image::new(crate::data::SEARCH_ICON).tint(tint));
|
||||||
|
ui.text_edit_singleline(&mut self.text);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
45
src/ui/gui/components/side_nav.rs
Normal file
45
src/ui/gui/components/side_nav.rs
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
use std::borrow::BorrowMut;
|
||||||
|
|
||||||
|
use egui::{Button, Color32, Label, RichText, Sense};
|
||||||
|
|
||||||
|
use super::ComponentUi;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pub struct SideNav;
|
||||||
|
|
||||||
|
impl ComponentUi for SideNav {
|
||||||
|
fn ui(gui: &mut crate::ui::gui::Gui, ui: &mut egui::Ui) {
|
||||||
|
let mut playlist_names = gui.manifest
|
||||||
|
.get_playlists()
|
||||||
|
.keys().cloned().collect::<Vec<String>>();
|
||||||
|
|
||||||
|
playlist_names.sort_by_key(|name| name.to_lowercase());
|
||||||
|
ui.with_layout(egui::Layout::top_down(egui::Align::TOP), |ui| {
|
||||||
|
|
||||||
|
for pname in playlist_names {
|
||||||
|
if gui.current_playlist.is_empty() {
|
||||||
|
gui.current_playlist = pname.to_string();
|
||||||
|
}
|
||||||
|
ui.horizontal(|ui| {
|
||||||
|
|
||||||
|
let tint = Color32::from_hex("#333377").unwrap();
|
||||||
|
ui.add(egui::Image::new(crate::data::NOTE_ICON).tint(tint));
|
||||||
|
ui.horizontal(|ui| {
|
||||||
|
let text;
|
||||||
|
if gui.current_playlist == *pname {
|
||||||
|
text = RichText::new(&pname).color(tint);
|
||||||
|
} else {
|
||||||
|
text = RichText::new(&pname);
|
||||||
|
}
|
||||||
|
let button = Label::new(text).sense(Sense::click());
|
||||||
|
if ui.add(button).clicked() {
|
||||||
|
gui.current_playlist = pname.to_string();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// #333377
|
||||||
|
}
|
|
@ -3,35 +3,21 @@ use egui_extras::{Column, TableBuilder};
|
||||||
|
|
||||||
use crate::manifest::song::SongType;
|
use crate::manifest::song::SongType;
|
||||||
|
|
||||||
use super::{context_menu::ContextMenu, ComponentUi};
|
use super::{context_menu::ContextMenu, search_bar::SearchType, ComponentUi};
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
pub struct SongList;
|
pub struct SongList {
|
||||||
|
}
|
||||||
|
|
||||||
impl ComponentUi for SongList {
|
impl ComponentUi for SongList {
|
||||||
fn ui(gui: &mut crate::ui::gui::Gui, ui: &mut egui::Ui) {
|
fn ui(gui: &mut crate::ui::gui::Gui, ui: &mut egui::Ui) {
|
||||||
let fltr_by;
|
|
||||||
let filter_clean;
|
|
||||||
if gui.filter.starts_with("playlist:") {
|
|
||||||
fltr_by = "playlist";
|
|
||||||
filter_clean = gui.filter.strip_prefix("playlist:").unwrap_or("").to_string().to_lowercase();
|
|
||||||
} else if gui.filter.starts_with("source:") {
|
|
||||||
fltr_by = "source";
|
|
||||||
filter_clean = gui.filter.strip_prefix("source:").unwrap_or("").to_string().to_lowercase();
|
|
||||||
} else if gui.filter.starts_with("url:") {
|
|
||||||
fltr_by = "url";
|
|
||||||
filter_clean = gui.filter.strip_prefix("url:").unwrap_or("").to_string();
|
|
||||||
} else {
|
|
||||||
fltr_by = "";
|
|
||||||
filter_clean = gui.filter.clone();
|
|
||||||
}
|
|
||||||
|
|
||||||
ui.vertical(|ui| {
|
ui.vertical(|ui| {
|
||||||
ui.horizontal(|ui| {
|
{
|
||||||
ui.colored_label(Color32::from_hex("#4444aa").unwrap(), "Filter: ");
|
use crate::ui::gui::components::ComponentUiMut;
|
||||||
ui.text_edit_singleline(&mut gui.filter);
|
let mut search = gui.search.clone();
|
||||||
});
|
search.ui(gui, ui);
|
||||||
});
|
gui.search = search;
|
||||||
|
}
|
||||||
|
|
||||||
ui.vertical(|ui| {
|
ui.vertical(|ui| {
|
||||||
let available_height = ui.available_height();
|
let available_height = ui.available_height();
|
||||||
|
@ -40,7 +26,7 @@ impl ComponentUi for SongList {
|
||||||
.cell_layout(egui::Layout::left_to_right(egui::Align::Center))
|
.cell_layout(egui::Layout::left_to_right(egui::Align::Center))
|
||||||
.resizable(true)
|
.resizable(true)
|
||||||
//.column(Column::auto())
|
//.column(Column::auto())
|
||||||
.column(Column::auto())
|
//.column(Column::auto())
|
||||||
//.column(
|
//.column(
|
||||||
// Column::remainder()
|
// Column::remainder()
|
||||||
// .at_least(40.0)
|
// .at_least(40.0)
|
||||||
|
@ -63,14 +49,16 @@ impl ComponentUi for SongList {
|
||||||
songs.push((pname.clone(), sname, s));
|
songs.push((pname.clone(), sname, s));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
songs.sort_by_key(|song| song.1.to_lowercase());
|
||||||
songs
|
songs
|
||||||
};
|
};
|
||||||
|
|
||||||
table.header(20.0, |mut header| {
|
table.header(20.0, |mut header| {
|
||||||
// header.col(|_|{});
|
// header.col(|_|{});
|
||||||
header.col(|ui| {
|
//header.col(|ui| {
|
||||||
ui.strong("Playlist");
|
// ui.strong("Playlist");vec.sort_by_key(|name| name.to_lowercase());
|
||||||
});
|
//});
|
||||||
header.col(|ui| {
|
header.col(|ui| {
|
||||||
ui.strong("Source");
|
ui.strong("Source");
|
||||||
});
|
});
|
||||||
|
@ -79,27 +67,41 @@ impl ComponentUi for SongList {
|
||||||
});
|
});
|
||||||
}).body(|mut body| {
|
}).body(|mut body| {
|
||||||
for (pname, sname, s) in songs {
|
for (pname, sname, s) in songs {
|
||||||
if fltr_by == "playlist" && !filter_clean.is_empty() {
|
if pname != gui.current_playlist {
|
||||||
if !pname.to_lowercase().contains(&filter_clean) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if fltr_by == "type" && !filter_clean.is_empty(){
|
match gui.search.get_search() {
|
||||||
if !s.get_type().to_string().to_lowercase().contains(&filter_clean) {
|
(SearchType::Generic, filter) if !filter.is_empty() => {
|
||||||
|
if !pname.to_lowercase().contains(&filter) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if fltr_by == "url" && !filter_clean.is_empty(){
|
}
|
||||||
if !s.get_url_str().contains(&filter_clean) {
|
(SearchType::Song, filter) if !filter.is_empty() => {
|
||||||
|
if !sname.to_lowercase().contains(&filter) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if !filter_clean.is_empty() && !sname.to_lowercase().contains(&filter_clean) {
|
}
|
||||||
|
(SearchType::Source, filter) if !filter.is_empty() => {
|
||||||
|
if !s.get_type().to_string().to_lowercase().contains(&filter) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
(SearchType::Url, filter) if !filter.is_empty() => {
|
||||||
|
if !s.get_url_str().contains(&filter) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(SearchType::Source, _) => (),
|
||||||
|
(SearchType::Song, _) => (),
|
||||||
|
(SearchType::Generic, _) => (),
|
||||||
|
(SearchType::Url, _) => (),
|
||||||
|
}
|
||||||
body.row(18.0, |mut row| {
|
body.row(18.0, |mut row| {
|
||||||
|
|
||||||
row.col(|ui| {
|
//row.col(|ui| {
|
||||||
ui.label(pname.clone())
|
// ui.label(pname.clone())
|
||||||
.context_menu(|ui| ContextMenu::ui(gui, ui, &pname, &sname, &s));
|
// .context_menu(|ui| ContextMenu::ui(gui, ui, &pname, &sname, &s));
|
||||||
});
|
//});
|
||||||
row.col(|ui| {
|
row.col(|ui| {
|
||||||
let color =
|
let color =
|
||||||
match s.get_type() {
|
match s.get_type() {
|
||||||
|
@ -123,6 +125,6 @@ impl ComponentUi for SongList {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ mod windows;
|
||||||
mod components;
|
mod components;
|
||||||
|
|
||||||
use components::{Component, ComponentUi};
|
use components::{Component, ComponentUi};
|
||||||
|
use egui_extras::install_image_loaders;
|
||||||
use windows::{State, WindowIndex, WindowManager};
|
use windows::{State, WindowIndex, WindowManager};
|
||||||
use crate::{config::ConfigWrapper, downloader::Downloader, manifest::Manifest};
|
use crate::{config::ConfigWrapper, downloader::Downloader, manifest::Manifest};
|
||||||
|
|
||||||
|
@ -10,10 +11,11 @@ use crate::{config::ConfigWrapper, downloader::Downloader, manifest::Manifest};
|
||||||
pub struct Gui {
|
pub struct Gui {
|
||||||
windows: WindowManager,
|
windows: WindowManager,
|
||||||
manifest: Manifest,
|
manifest: Manifest,
|
||||||
filter: String,
|
|
||||||
downloader: Downloader,
|
downloader: Downloader,
|
||||||
cfg: ConfigWrapper,
|
cfg: ConfigWrapper,
|
||||||
downloading: bool,
|
downloading: bool,
|
||||||
|
search: components::search_bar::SearchBar,
|
||||||
|
current_playlist: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Gui {
|
impl Gui {
|
||||||
|
@ -33,13 +35,13 @@ impl Gui {
|
||||||
.with_inner_size([400.0, 300.0])
|
.with_inner_size([400.0, 300.0])
|
||||||
.with_min_inner_size([300.0, 220.0])
|
.with_min_inner_size([300.0, 220.0])
|
||||||
.with_icon(
|
.with_icon(
|
||||||
eframe::icon_data::from_png_bytes(&include_bytes!("../../../assets/icon.png")[..])?,
|
eframe::icon_data::from_png_bytes(crate::data::APP_ICON_BYTES)?,
|
||||||
),
|
),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Err(e) = eframe::run_native(
|
if let Err(e) = eframe::run_native(
|
||||||
"eframe template",
|
"McMG",
|
||||||
native_options,
|
native_options,
|
||||||
Box::new(|cc| Box::new(Gui::new(cc, manifest, downloader, cfg))),
|
Box::new(|cc| Box::new(Gui::new(cc, manifest, downloader, cfg))),
|
||||||
) {
|
) {
|
||||||
|
@ -59,7 +61,7 @@ impl Gui {
|
||||||
|
|
||||||
impl eframe::App for Gui {
|
impl eframe::App for Gui {
|
||||||
fn update(&mut self, ctx: &egui::Context, _: &mut eframe::Frame) {
|
fn update(&mut self, ctx: &egui::Context, _: &mut eframe::Frame) {
|
||||||
components::nav::NavBar::ui(self, ctx);
|
install_image_loaders(ctx);
|
||||||
{
|
{
|
||||||
let mut state = State {
|
let mut state = State {
|
||||||
cfg: self.cfg.clone(),
|
cfg: self.cfg.clone(),
|
||||||
|
@ -72,15 +74,25 @@ impl eframe::App for Gui {
|
||||||
self.manifest = state.manifest;
|
self.manifest = state.manifest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
components::nav::NavBar::ui(self, ctx);
|
||||||
egui::CentralPanel::default().show(ctx, |ui| {
|
egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
|
let avail_height = ui.available_height();
|
||||||
// The central panel the region left after adding TopPanel's and SidePanel's
|
// The central panel the region left after adding TopPanel's and SidePanel's
|
||||||
//ui.heading(format!("Songs ({})", self.manifest.get_song_count()));
|
//ui.heading(format!("Songs ({})", self.manifest.get_song_count()));
|
||||||
|
ui.vertical_centered_justified(|ui| {
|
||||||
|
ui.with_layout(egui::Layout::top_down_justified(egui::Align::TOP), |ui| {
|
||||||
|
ui.horizontal(|ui| {
|
||||||
|
ui.set_height(avail_height);
|
||||||
|
components::side_nav::SideNav::ui(self, ui);
|
||||||
components::song_list::SongList::ui(self, ui);
|
components::song_list::SongList::ui(self, ui);
|
||||||
|
});
|
||||||
ui.separator();
|
ui.separator();
|
||||||
|
|
||||||
ui.with_layout(egui::Layout::bottom_up(egui::Align::LEFT), |ui| {
|
ui.with_layout(egui::Layout::bottom_up(egui::Align::LEFT), |ui| {
|
||||||
egui::warn_if_debug_build(ui);
|
egui::warn_if_debug_build(ui);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,16 @@
|
||||||
|
use crate::manifest::song::{Song, SongType};
|
||||||
|
|
||||||
use super::{State, Window};
|
use super::{State, Window};
|
||||||
|
|
||||||
|
|
||||||
#[allow(clippy::pedantic)]
|
#[allow(clippy::pedantic)]
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
pub struct GuiImportPlaylist {
|
pub struct GuiImportPlaylist {
|
||||||
|
ed_type: SongType,
|
||||||
ed_name: String,
|
ed_name: String,
|
||||||
ed_url: String,
|
ed_url: String,
|
||||||
|
urls_to_add: Vec<String>,
|
||||||
|
playlist_name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,7 +21,15 @@ impl Window for GuiImportPlaylist {
|
||||||
.open(open)
|
.open(open)
|
||||||
.show(ctx, |ui| {
|
.show(ctx, |ui| {
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
ui.label("Type: Youtube");
|
ui.label("Type: ");
|
||||||
|
egui::ComboBox::from_id_source("new_playlist_window_type")
|
||||||
|
.selected_text(format!("{:?}", self.ed_type))
|
||||||
|
.show_ui(ui, |ui| {
|
||||||
|
ui.selectable_value(&mut self.ed_type, SongType::Youtube, "Youtube");
|
||||||
|
ui.selectable_value(&mut self.ed_type, SongType::Spotify, "Spotify");
|
||||||
|
// ui.selectable_value(&mut self.ed_type, SongType::Soundcloud, "Soundcloud");
|
||||||
|
}
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
|
@ -33,6 +46,20 @@ impl Window for GuiImportPlaylist {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if let Some(url) = self.urls_to_add.pop() {
|
||||||
|
todo!();
|
||||||
|
//let client = reqwest::blocking::Client::new();
|
||||||
|
// let song_name = crate::crawler::spotify::get_song_name(&client, url.clone())?;
|
||||||
|
|
||||||
|
//if let Some(playlist) = state.manifest.get_playlist_mut(&self.playlist_name) {
|
||||||
|
// let mut song = Song::from_url_str(url)?;
|
||||||
|
// song.set_type(SongType::Spotify);
|
||||||
|
// playlist.add_song(song_name, song);
|
||||||
|
//}
|
||||||
|
//let _ = state.manifest.save(None);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if save {
|
if save {
|
||||||
let name = self.ed_name.clone();
|
let name = self.ed_name.clone();
|
||||||
let url = self.ed_url.clone();
|
let url = self.ed_url.clone();
|
||||||
|
@ -40,7 +67,13 @@ impl Window for GuiImportPlaylist {
|
||||||
if state.manifest.get_playlist(&name).is_some() {
|
if state.manifest.get_playlist(&name).is_some() {
|
||||||
log::error!("Playlist {name} already exists");
|
log::error!("Playlist {name} already exists");
|
||||||
}
|
}
|
||||||
|
if self.ed_type == SongType::Spotify {
|
||||||
|
todo!()
|
||||||
|
//let client = reqwest::blocking::Client::new();
|
||||||
|
//self.urls_to_add = crate::crawler::spotify::get_playlist_song_urls(&client, self.ed_url.clone())?;
|
||||||
|
//self.playlist_name = self.ed_name.clone();
|
||||||
|
//state.manifest.add_playlist(name.clone());
|
||||||
|
} else if self.ed_type == SongType::Youtube {
|
||||||
let songs = state.downloader.download_playlist_nb(&state.cfg, &url, &name, state.manifest.get_format()).unwrap();
|
let songs = state.downloader.download_playlist_nb(&state.cfg, &url, &name, state.manifest.get_format()).unwrap();
|
||||||
state.manifest.add_playlist(name.clone());
|
state.manifest.add_playlist(name.clone());
|
||||||
|
|
||||||
|
@ -50,6 +83,7 @@ impl Window for GuiImportPlaylist {
|
||||||
log::info!("Added: {sname}");
|
log::info!("Added: {sname}");
|
||||||
playlist.add_song(sname, song);
|
playlist.add_song(sname, song);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
let _ = state.manifest.save(None);
|
let _ = state.manifest.save(None);
|
||||||
*open = false;
|
*open = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
use anyhow::bail;
|
use anyhow::bail;
|
||||||
use egui::Color32;
|
use egui::Color32;
|
||||||
|
|
||||||
|
use crate::manifest::song::SongType;
|
||||||
|
|
||||||
use super::{State, Window};
|
use super::{State, Window};
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,19 +11,20 @@ pub struct GuiSongEditor {
|
||||||
song: (String, String),
|
song: (String, String),
|
||||||
ed_url: String,
|
ed_url: String,
|
||||||
ed_name: String,
|
ed_name: String,
|
||||||
|
ed_type: SongType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl Window for GuiSongEditor {
|
impl Window for GuiSongEditor {
|
||||||
fn ui(&mut self, state: &mut State, ctx: &egui::Context, open: &mut bool) -> anyhow::Result<()> {
|
fn ui(&mut self, state: &mut State, ctx: &egui::Context, open: &mut bool) -> anyhow::Result<()> {
|
||||||
let mut save = false;
|
let mut save = false;
|
||||||
let (playlist, song_name) = self.song.clone();
|
let (playlist_name, song_name) = self.song.clone();
|
||||||
|
|
||||||
if playlist.is_empty() {
|
if playlist_name.is_empty() {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
let Some(song) = state.manifest.get_song(&playlist, &song_name) else {
|
let Some(song) = state.manifest.get_song(&playlist_name, &song_name) else {
|
||||||
bail!("Failed to get song (1)");
|
bail!("Failed to get song (1)");
|
||||||
};
|
};
|
||||||
let song = song.clone();
|
let song = song.clone();
|
||||||
|
@ -36,7 +39,7 @@ impl Window for GuiSongEditor {
|
||||||
ui.label("[");
|
ui.label("[");
|
||||||
ui.hyperlink_to("link", song.get_url().unwrap());
|
ui.hyperlink_to("link", song.get_url().unwrap());
|
||||||
ui.label("] ");
|
ui.label("] ");
|
||||||
ui.colored_label(Color32::LIGHT_BLUE, &playlist);
|
ui.colored_label(Color32::LIGHT_BLUE, &playlist_name);
|
||||||
ui.label(": ");
|
ui.label(": ");
|
||||||
ui.label(&song_name)
|
ui.label(&song_name)
|
||||||
});
|
});
|
||||||
|
@ -44,6 +47,14 @@ impl Window for GuiSongEditor {
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
ui.label("Type: ");
|
ui.label("Type: ");
|
||||||
ui.label(song.get_type().to_string());
|
ui.label(song.get_type().to_string());
|
||||||
|
egui::ComboBox::from_id_source("song_edit_window_type")
|
||||||
|
.selected_text(format!("{:?}", self.ed_type))
|
||||||
|
.show_ui(ui, |ui| {
|
||||||
|
ui.selectable_value(&mut self.ed_type, SongType::Youtube, "Youtube");
|
||||||
|
ui.selectable_value(&mut self.ed_type, SongType::Spotify, "Spotify");
|
||||||
|
ui.selectable_value(&mut self.ed_type, SongType::Soundcloud, "Soundcloud");
|
||||||
|
}
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
|
@ -61,21 +72,23 @@ impl Window for GuiSongEditor {
|
||||||
});
|
});
|
||||||
|
|
||||||
if save {
|
if save {
|
||||||
{
|
let song = {
|
||||||
let Some(song) = state.manifest.get_song_mut(&playlist, &song_name) else {
|
let Some(song) = state.manifest.get_song_mut(&playlist_name, &song_name) else {
|
||||||
bail!("Failed to get song (2)");
|
bail!("Failed to get song (2)");
|
||||||
};
|
};
|
||||||
|
|
||||||
song.get_url_str_mut().clone_from(&self.ed_url);
|
song.get_url_str_mut().clone_from(&self.ed_url);
|
||||||
}
|
song.get_type_mut().clone_from(&self.ed_type);
|
||||||
|
song.clone()
|
||||||
let Some(playlist) = state.manifest.get_playlist_mut(&playlist) else {
|
|
||||||
bail!("Failed to get playlist");
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
let Some(playlist) = state.manifest.get_playlist_mut(&playlist_name) else {
|
||||||
|
bail!("Failed to get playlist");
|
||||||
|
};
|
||||||
|
|
||||||
playlist.remove_song(&song_name);
|
playlist.remove_song(&song_name);
|
||||||
playlist.add_song(self.ed_name.clone(), song);
|
playlist.add_song(self.ed_name.clone(), song.clone());
|
||||||
*open = false;
|
*open = false;
|
||||||
let _ = state.manifest.save(None);
|
let _ = state.manifest.save(None);
|
||||||
}
|
}
|
||||||
|
@ -85,10 +98,11 @@ impl Window for GuiSongEditor {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GuiSongEditor {
|
impl GuiSongEditor {
|
||||||
pub fn set_active_song(&mut self, pname: &str, sname: &str, url: &str) {
|
pub fn set_active_song(&mut self, pname: &str, sname: &str, url: &str, typ: &SongType) {
|
||||||
self.song.0 = pname.to_string();
|
self.song.0 = pname.to_string();
|
||||||
self.song.1 = sname.to_string();
|
self.song.1 = sname.to_string();
|
||||||
self.ed_name = sname.to_string();
|
self.ed_name = sname.to_string();
|
||||||
self.ed_url = url.to_string();
|
self.ed_url = url.to_string();
|
||||||
|
self.ed_type = typ.clone();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user