diff --git a/.gitignore b/.gitignore index 6a3cea84..823592fe 100644 --- a/.gitignore +++ b/.gitignore @@ -16,10 +16,8 @@ libhydra.a lib/* build .vscode -Cargo.lock target cli/target -cli/Cargo.lock libfinewave.a _deps docs/html diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..1c052834 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2444 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "anstream" +version = "0.6.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +dependencies = [ + "windows-sys 0.60.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.60.2", +] + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "atlas-cli" +version = "0.1.0" +dependencies = [ + "clap", + "colored", + "dialoguer", + "indicatif", + "openssl", + "reqwest", + "serde", + "serde_json", + "tokio", + "toml", + "zip", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link 0.2.0", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "bzip2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ecfb22d906f800d4fe833b6282cf4dc1c298f5057ca0b5445e5c209735ca47" +dependencies = [ + "bzip2-sys", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.13+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "cc" +version = "1.2.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clap" +version = "4.5.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "colored" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" +dependencies = [ + "lazy_static", + "windows-sys 0.59.0", +] + +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width", + "windows-sys 0.59.0", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "deflate64" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "807800ff3288b621186fe0a8f3392c4652068257302709c24efd918c3dffcdc2" + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dialoguer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +dependencies = [ + "console", + "shell-words", + "tempfile", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.1", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.7+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "indicatif" +version = "0.17.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width", + "web-time", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.176" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "lzma-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" +dependencies = [ + "byteorder", + "crc", +] + +[[package]] +name = "lzma-sys" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "num-conv" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-src" +version = "300.5.2+3.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d270b79e2926f5150189d475bc7e9d2c69f9c4697b185fa917d5a32b792d21b4" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.0", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "reqwest" +version = "0.12.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.1", +] + +[[package]] +name = "rustls" +version = "0.23.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.1", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shell-words" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.61.1", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +dependencies = [ + "backtrace", + "bytes", + "io-uring", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "slab", + "socket2", + "tokio-macros", + "windows-sys 0.59.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link 0.1.3", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.4", +] + +[[package]] +name = "windows-sys" +version = "0.61.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" +dependencies = [ + "windows-link 0.2.0", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" +dependencies = [ + "windows-link 0.2.0", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "xz2" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" +dependencies = [ + "lzma-sys", +] + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zip" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" +dependencies = [ + "aes", + "arbitrary", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "deflate64", + "displaydoc", + "flate2", + "getrandom 0.3.3", + "hmac", + "indexmap", + "lzma-rs", + "memchr", + "pbkdf2", + "sha1", + "thiserror 2.0.18", + "time", + "xz2", + "zeroize", + "zopfli", + "zstd", +] + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/editor/CMakeLists.txt b/editor/CMakeLists.txt index 30f07967..47608e5e 100644 --- a/editor/CMakeLists.txt +++ b/editor/CMakeLists.txt @@ -92,6 +92,8 @@ qt_add_resources(AtlasEditor "atlas_editor_assets" "${CMAKE_SOURCE_DIR}/editor/assets/Icon-iOS-Default-1024x1024@1x.png" "${CMAKE_SOURCE_DIR}/editor/assets/iconFile-iOS-Dark-1024x1024@1x.png" "${CMAKE_SOURCE_DIR}/editor/assets/Manrope-VariableFont_wght.ttf" + "${CMAKE_SOURCE_DIR}/editor/assets/Phosphor.ttf" + "${CMAKE_SOURCE_DIR}/editor/assets/PHOSPHOR_LICENSE.txt" ) target_include_directories(AtlasEditor diff --git a/editor/assets/PHOSPHOR_LICENSE.txt b/editor/assets/PHOSPHOR_LICENSE.txt new file mode 100644 index 00000000..c04a19d1 --- /dev/null +++ b/editor/assets/PHOSPHOR_LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020-2021 Phosphor Icons + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/editor/assets/Phosphor.ttf b/editor/assets/Phosphor.ttf new file mode 100644 index 00000000..7c1b8a7a Binary files /dev/null and b/editor/assets/Phosphor.ttf differ diff --git a/editor/main.cpp b/editor/main.cpp index a5c9814f..ed83a49b 100644 --- a/editor/main.cpp +++ b/editor/main.cpp @@ -23,12 +23,12 @@ #include "DockWidget.h" #include "../include/editor/application/styling.h" #include "editor/debug.h" +#include "editor/styling/icons.h" #include "editor/views/editorWindow.h" #include "editor/views/projectBrowser.h" #include "editor/views/splashScreen.h" int main(int argc, char **argv) { - QApplication::setAttribute(Qt::AA_DontShowIconsInMenus); QApplication app(argc, argv); app.setApplicationName("Atlas Engine"); app.setApplicationDisplayName("Atlas Engine"); @@ -41,9 +41,15 @@ int main(int argc, char **argv) { qWarning() << "Failed to load Manrope"; } - const QFont systemFont = - QFontDatabase::systemFont(QFontDatabase::GeneralFont); - app.setFont(systemFont); + const QStringList manropeFamilies = + QFontDatabase::applicationFontFamilies(manropeFont); + QFont applicationFont = manropeFamilies.isEmpty() + ? QFontDatabase::systemFont( + QFontDatabase::GeneralFont) + : QFont(manropeFamilies.first()); + applicationFont.setPointSizeF(11.0); + app.setFont(applicationFont); + styling::loadIconFont(); #ifdef ATLAS_DEBUG_BUILD app.setWindowIcon( diff --git a/editor/styling/dark.qss b/editor/styling/dark.qss index 461a2d73..e45929f7 100644 --- a/editor/styling/dark.qss +++ b/editor/styling/dark.qss @@ -1,104 +1,92 @@ * { - font-family: "Helvetica Neue", "Segoe UI", Arial, sans-serif; + font-family: "Manrope"; font-size: 12px; - color: #DCE2E5; - selection-background-color: #3D8BFF; + color: #E7ECF3; + selection-background-color: #647B8D; selection-color: #FFFFFF; } QWidget { - background-color: #222526; - color: #DCE2E5; + background-color: #18191B; + color: #E7ECF3; } QMainWindow, QDialog, QFrame { - background-color: #222526; -} - -QToolTip { - background-color: #151819; - color: #F4F7F8; - border: 1px solid #3C4245; - border-radius: 3px; - padding: 4px 6px; + background-color: #18191B; } QLabel { - background-color: transparent; - color: #DCE2E5; + background: transparent; } QLabel:disabled { - color: #727B80; + color: #566174; +} + +QToolTip { + background-color: #34373A; + color: #F7F9FC; + border: 1px solid #505459; + border-radius: 8px; + padding: 4px 6px; } QGroupBox { - background-color: #222526; - border: 1px solid #3A4144; - border-radius: 3px; - margin-top: 15px; + background-color: #242628; + border: 1px solid #3A3D40; + border-radius: 10px; + margin-top: 14px; padding: 8px; - color: #E7ECEF; - font-weight: 600; + color: #F1F4F8; + font-weight: 650; } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; - left: 7px; - padding: 0 4px; - color: #AEB8BE; - background-color: #222526; -} - -QGroupBox > QWidget { - background-color: #222526; + left: 9px; + padding: 0 6px; + color: #AEB8C8; + background-color: #242628; } QScrollArea, QAbstractScrollArea { - background-color: #222526; - border: 1px solid #343A3D; - border-radius: 3px; + background-color: #1E2022; + border: none; } QAbstractScrollArea::corner { - background-color: #222526; + background-color: #1E2022; } QScrollBar:vertical { - background-color: #1E2122; - width: 10px; - margin: 0; + background-color: transparent; + width: 9px; + margin: 2px; border: none; } QScrollBar:horizontal { - background-color: #1E2122; - height: 10px; - margin: 0; + background-color: transparent; + height: 9px; + margin: 2px; border: none; } QScrollBar::handle:vertical, QScrollBar::handle:horizontal { - background-color: #444C50; - border: 2px solid #1E2122; + background-color: #505357; border-radius: 4px; - min-height: 28px; - min-width: 28px; + min-height: 30px; + min-width: 30px; } QScrollBar::handle:vertical:hover, QScrollBar::handle:horizontal:hover { - background-color: #5A6469; -} - -QScrollBar::handle:vertical:pressed, -QScrollBar::handle:horizontal:pressed { - background-color: #6A757B; + background-color: #65696E; } QScrollBar::add-line, @@ -113,194 +101,59 @@ QScrollBar::sub-page { QPushButton, QToolButton { - background-color: #303538; - border: 1px solid #444B4F; - border-radius: 3px; - padding: 3px 7px; - color: #EEF3F5; + background-color: #2B2E31; + border: 1px solid #45494D; + border-radius: 8px; + padding: 4px 8px; + color: #E9EDF4; min-height: 18px; + font-weight: 550; } QPushButton:hover, QToolButton:hover { - background-color: #394045; - border-color: #59656C; + background-color: #363A3E; + border-color: #5A5F65; } QPushButton:pressed, QToolButton:pressed { - background-color: #24282A; - border-color: #3D8BFF; + background-color: #232527; + border-color: #6F7B84; } QPushButton:checked, QToolButton:checked { - background-color: #22496D; - border-color: #5FB3FF; + background-color: #3A4248; + border-color: #6F7B84; color: #FFFFFF; } -QPushButton:default { - background-color: #346FA8; - border-color: #68BFFF; +QPushButton:default, +#primaryAction { + background-color: #596A76; + border-color: #73838E; color: #FFFFFF; + font-weight: 650; +} + +QPushButton:default:hover, +#primaryAction:hover { + background-color: #667985; + border-color: #82919B; } QPushButton:disabled, QToolButton:disabled { - background-color: #292D2F; - border-color: #33393C; - color: #6F787D; + background-color: #202224; + border-color: #303235; + color: #566174; } QToolButton::menu-indicator { image: none; } -#viewportToolbar { - background-color: #1B1E20; - border-bottom: 1px solid #353B3E; -} - -#viewportPlaybackButton, -#viewportModeButton, -#viewportOptionButton { - min-width: 22px; - min-height: 20px; - padding: 2px 4px; -} - -#viewportPlaybackButton { - border-radius: 3px; -} - -#viewportShadingMode { - min-width: 92px; - padding-top: 2px; - padding-bottom: 2px; -} - -#viewportFpsLabel { - color: #9DA8AE; -} - -#viewportShortcutHint { - background-color: #181B1D; - border-top: 1px solid #303639; - color: #8F9AA0; - font-size: 10px; - padding: 4px 8px; -} - -#sceneTabs { - background-color: #171A1C; - border-bottom: 1px solid #343A3E; -} - -#sceneTabs::tab { - background-color: #202427; - border-right: 1px solid #343A3E; - color: #98A3A9; - min-width: 120px; - padding: 5px 10px; -} - -#sceneTabs::tab:selected { - background-color: #2B3134; - color: #EDF2F4; - border-bottom: 2px solid #4EA4E8; -} - -#sceneTabs::close-button { - subcontrol-position: right; -} - -#materialEditorHeader { - background-color: #1B1E20; - border-bottom: 1px solid #363C3F; -} - -#materialEditorTitle { - color: #F3F6F7; - font-size: 14px; - font-weight: 650; -} - -#materialEditorStatus { - color: #89959B; -} - -#materialEditorScroll, -#materialEditorBody { - border: none; - background-color: #202324; -} - -#materialPreview { - background-color: #191C1D; - border: 1px solid #3A4144; - border-radius: 3px; -} - -#materialEditorEmpty { - color: #879299; - padding: 40px; -} - -#postProcessingToolbar { - background-color: #1B1E20; - border-bottom: 1px solid #363C3F; -} - -#postProcessingTitle, -#postProcessingSectionTitle, -#inspectorCameraTitle { - color: #F3F6F7; - font-size: 14px; - font-weight: 650; -} - -#postProcessingStatus { - color: #89959B; -} - -#postProcessingScroll, -#postProcessingBody { - border: none; - background-color: #202324; -} - -#postProcessingEmpty { - color: #879299; - padding: 40px; -} - -#materialTextureSlot { - background-color: #1B1E20; - border: 1px solid #343B3E; - border-radius: 3px; -} - -#materialTexturePreview { - background-color: #25292B; - border: 1px solid #41494D; - border-radius: 3px; - color: #EF8C7B; - font-weight: 700; - qproperty-alignment: AlignCenter; -} - -#materialTextureLabel { - color: #CDD4D8; - font-weight: 600; -} - -#materialTexturePath { - color: #8F9AA0; - padding-top: 3px; - padding-bottom: 3px; -} - QLineEdit, QTextEdit, QPlainTextEdit, @@ -310,16 +163,11 @@ QDoubleSpinBox, QDateEdit, QTimeEdit, QDateTimeEdit { - background-color: #1A1D1E; - border: 1px solid #363D41; - border-radius: 3px; - padding: 3px 6px; - color: #EDF2F4; -} - -QTextEdit, -QPlainTextEdit { - selection-background-color: #315D90; + background-color: #1B1D1F; + border: 1px solid #3B3E42; + border-radius: 8px; + padding: 4px 6px; + color: #EEF2F7; } QLineEdit:hover, @@ -327,11 +175,8 @@ QTextEdit:hover, QPlainTextEdit:hover, QComboBox:hover, QSpinBox:hover, -QDoubleSpinBox:hover, -QDateEdit:hover, -QTimeEdit:hover, -QDateTimeEdit:hover { - border-color: #4A555B; +QDoubleSpinBox:hover { + border-color: #54585D; } QLineEdit:focus, @@ -339,1391 +184,1186 @@ QTextEdit:focus, QPlainTextEdit:focus, QComboBox:focus, QSpinBox:focus, -QDoubleSpinBox:focus, -QDateEdit:focus, -QTimeEdit:focus, -QDateTimeEdit:focus { - border-color: #5FB3FF; - background-color: #171A1B; +QDoubleSpinBox:focus { + background-color: #222426; + border-color: #71808A; } QLineEdit:disabled, QTextEdit:disabled, -QPlainTextEdit:disabled, QComboBox:disabled, QSpinBox:disabled, -QDoubleSpinBox:disabled, -QDateEdit:disabled, -QTimeEdit:disabled, -QDateTimeEdit:disabled { - background-color: #25292B; - border-color: #303638; - color: #727B80; +QDoubleSpinBox:disabled { + background-color: #202224; + border-color: #303235; + color: #566174; } QComboBox { - padding-right: 23px; + padding-right: 24px; } QComboBox::drop-down { subcontrol-origin: padding; subcontrol-position: top right; width: 22px; - border-left: 1px solid #343B3F; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - background-color: #252A2C; -} - -QComboBox::down-arrow { - image: none; - width: 0; - height: 0; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 5px solid #AEB8BE; + border-left: 1px solid #3B3E42; } QComboBox QAbstractItemView { - background-color: #1C2021; - border: 1px solid #444D52; - border-radius: 3px; + background-color: #292C2F; + border: 1px solid #494D52; + border-radius: 10px; padding: 3px; - color: #E8EEF1; - selection-background-color: #315D90; + selection-background-color: #3A4248; } QAbstractSpinBox::up-button, QAbstractSpinBox::down-button { - background-color: #252A2C; - border-left: 1px solid #343B3F; + background-color: #292C2F; + border: none; width: 16px; } QAbstractSpinBox::up-button:hover, QAbstractSpinBox::down-button:hover { - background-color: #333A3E; -} - -QAbstractSpinBox::up-arrow { - image: none; - width: 0; - height: 0; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-bottom: 5px solid #AEB8BE; -} - -QAbstractSpinBox::down-arrow { - image: none; - width: 0; - height: 0; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 5px solid #AEB8BE; + background-color: #3E4246; } QCheckBox, QRadioButton { - spacing: 6px; - background-color: transparent; - color: #DCE2E5; + spacing: 7px; + color: #C9D1DE; } QCheckBox::indicator, QRadioButton::indicator { - width: 13px; - height: 13px; - background-color: #171A1B; - border: 1px solid #515B61; -} - -QCheckBox::indicator { - border-radius: 2px; -} - -QRadioButton::indicator { - border-radius: 7px; + width: 15px; + height: 15px; + background-color: #1B1D1F; + border: 1px solid #55595D; + border-radius: 5px; } QCheckBox::indicator:hover, QRadioButton::indicator:hover { - border-color: #6FBFFF; - background-color: #1D252B; -} - -QCheckBox::indicator:checked { - background-color: #3D8BFF; - border-color: #72C7FF; - border-radius: 2px; + border-color: #747B81; } +QCheckBox::indicator:checked, QRadioButton::indicator:checked { - background-color: #3D8BFF; - border: 4px solid #171A1B; -} - -QCheckBox::indicator:disabled, -QRadioButton::indicator:disabled { - background-color: #2A2F31; - border-color: #3A4145; + background-color: #71808A; + border-color: #89969F; } QSlider::groove:horizontal { + background-color: #34373A; height: 4px; - background-color: #171A1B; - border-radius: 2px; -} - -QSlider::groove:vertical { - width: 4px; - background-color: #171A1B; - border-radius: 2px; -} - -QSlider::sub-page:horizontal, -QSlider::add-page:vertical { - background-color: #3D8BFF; border-radius: 2px; } QSlider::handle:horizontal { - width: 16px; - height: 16px; - margin: -6px 0; - background-color: #DCE2E5; - border: 1px solid #FFFFFF; - border-radius: 8px; -} - -QSlider::handle:vertical { - width: 16px; - height: 16px; - margin: 0 -6px; - background-color: #DCE2E5; - border: 1px solid #FFFFFF; - border-radius: 8px; -} - -QSlider::handle:horizontal:hover, -QSlider::handle:vertical:hover { - background-color: #FFFFFF; - border-color: #72C7FF; + background-color: #7D8991; + border: 2px solid #A8AFB4; + width: 12px; + margin: -5px 0; + border-radius: 7px; } QProgressBar { - background-color: #171A1B; - border: 1px solid #343B3F; - border-radius: 5px; + background-color: #26282B; + border: 1px solid #42464A; + border-radius: 6px; + height: 8px; text-align: center; - color: #DCE2E5; - min-height: 8px; } QProgressBar::chunk { - background-color: #3D8BFF; - border-radius: 4px; + background-color: #71808A; + border-radius: 6px; } +QTreeView, QListView, QListWidget, -QTreeView, -QTreeWidget, QTableView, QTableWidget { - background-color: #1C2021; - alternate-background-color: #202526; - border: 1px solid #343B3F; - border-radius: 3px; - padding: 2px; - color: #DCE2E5; - gridline-color: #303638; + background-color: #1E2022; + alternate-background-color: #232527; + border: none; + color: #DCE3EC; + show-decoration-selected: 1; } +QTreeView::item, QListView::item, QListWidget::item, -QTreeView::item, -QTreeWidget::item, QTableView::item, QTableWidget::item { - min-height: 20px; - padding: 2px 6px; - border-radius: 3px; + border: 1px solid transparent; + border-radius: 7px; + padding: 3px 5px; } +QTreeView::item:hover, QListView::item:hover, QListWidget::item:hover, -QTreeView::item:hover, -QTreeWidget::item:hover, QTableView::item:hover, QTableWidget::item:hover { - background-color: #2D363B; + background-color: #2B2E31; + border-color: #43474B; } +QTreeView::item:selected, QListView::item:selected, QListWidget::item:selected, -QTreeView::item:selected, -QTreeWidget::item:selected, QTableView::item:selected, QTableWidget::item:selected { - background-color: #315D90; + background-color: #393F44; + border-color: #66737C; color: #FFFFFF; } -#panelToolbar { - background-color: #222526; - border: none; +QHeaderView { + background-color: #202224; } -#panelAddButton { - background-color: #2C3235; - border-color: #414A4F; - padding: 2px 7px; - min-height: 19px; +QHeaderView::section { + background-color: #292C2F; + border: none; + border-right: 1px solid #404347; + border-bottom: 1px solid #404347; + padding: 5px 7px; + color: #98A4B7; font-weight: 600; } -#panelMoreButton, -#browserRevealButton, -#browserNavigationButton { - background-color: transparent; - border-color: transparent; - padding: 2px; - min-width: 20px; - min-height: 19px; +QTabWidget::pane { + background-color: #1E2022; + border: 1px solid #3B3E42; + border-radius: 0 0 10px 10px; } -#panelMoreButton:hover, -#browserRevealButton:hover, -#browserNavigationButton:hover { - background-color: #30373A; - border-color: #424B50; +QTabBar::tab { + background-color: #202224; + border: none; + border-right: 1px solid #383B3F; + border-bottom: 1px solid #3B3E42; + color: #7F8B9D; + min-width: 88px; + padding: 5px 10px; + margin: 2px 1px; + border-radius: 8px; } -#contentPathField { - background-color: #191D1F; - border-color: #30373B; - color: #AEB8BE; - padding: 2px 6px; - min-height: 19px; +QTabBar::tab:hover { + background-color: #2B2E31; + color: #C8D1DF; } -#contentSearchField { +QTabBar::tab:selected { + background-color: #36393C; + color: #F2F5F9; + border-bottom: 2px solid #78858E; +} + +QMenuBar#atlasMenuBar { + background-color: #141517; + border-bottom: 1px solid #303236; padding: 2px 6px; - min-height: 19px; } -QTreeView#hierarchyTree { - background-color: #1B1F20; - border: none; - border-radius: 4px; - padding: 3px; - show-decoration-selected: 1; +QMenuBar#atlasMenuBar::item { + background: transparent; + color: #B8C2D0; + padding: 5px 9px; + border-radius: 7px; } -QTreeView#hierarchyTree::item { - min-height: 20px; - padding: 2px 5px; +QMenuBar#atlasMenuBar::item:selected, +QMenuBar#atlasMenuBar::item:pressed { + background-color: #34373A; + color: #FFFFFF; } -QListView#contentGrid { - background-color: #1B1F20; - border: none; - border-radius: 4px; - padding: 8px; +QMenu { + background-color: #292C2F; + border: 1px solid #494D52; + border-radius: 10px; + padding: 3px; } -QListView#contentGrid::item { - min-height: 88px; - padding: 6px; - margin: 2px; - border: 1px solid transparent; +QMenu::item { + background: transparent; border-radius: 7px; + padding: 5px 30px 5px 8px; + color: #DCE3EC; } -QListView#contentGrid::item:hover { - background-color: #272E31; - border-color: #353F44; +QMenu::item:selected { + background-color: #3A3E42; + color: #FFFFFF; } -QListView#contentGrid::item:selected { - background-color: #284E73; - border-color: #579FE3; - color: #FFFFFF; +QMenu::item:disabled { + color: #596477; } -QScrollArea#inspectorScroll { - background-color: #1B1F20; - border: none; - border-radius: 0; +QMenu::separator { + background-color: #424549; + height: 1px; + margin: 5px 8px; } -#inspectorContent { - background-color: #1B1F20; +QSplitter::handle { + background-color: #111214; } -#inspectorHeader { - background-color: #24292B; - border: 1px solid #353D41; - border-radius: 3px; +QSplitter::handle:horizontal { + width: 4px; } -#inspectorObjectIcon { - background-color: #1C2022; - border: 1px solid #3B4449; - border-radius: 3px; - padding: 2px; +QSplitter::handle:vertical { + height: 4px; } -#inspectorNameField { - background-color: transparent; - border: 1px solid transparent; - border-radius: 4px; - color: #F4F7F8; - font-size: 14px; - font-weight: 650; - padding: 2px 4px; - min-height: 20px; +QSplitter::handle:hover { + background-color: #71889A; } -#inspectorNameField:hover { - background-color: #1D2123; - border-color: #3C464B; +QStatusBar { + background-color: #141517; + border-top: 1px solid #303236; + color: #8490A4; } -#inspectorNameField:focus { - background-color: #171A1B; - border-color: #5FB3FF; +#atlasStatusBar { + min-height: 21px; + padding: 0 6px; } -#inspectorTypeLabel { - color: #879299; - padding-left: 5px; - font-size: 11px; -} - -#inspectorComponent { - background-color: #23282A; - border: 1px solid #363E42; - border-radius: 3px; -} - -#inspectorComponentHeaderRow { - background-color: #2A3033; - border: none; - border-bottom: 1px solid #343D41; - border-radius: 3px; -} - -#inspectorComponentHeader { - background-color: transparent; - border: none; - border-radius: 3px; - padding: 4px 7px; - color: #EEF2F4; - font-weight: 650; - text-align: left; -} - -#inspectorComponentHeader:hover { - background-color: #30373A; -} - -#inspectorComponentRemoveButton { - background-color: transparent; - border-color: transparent; - min-width: 20px; - min-height: 20px; - padding: 1px; -} - -#inspectorComponentRemoveButton:hover { - background-color: #543136; - border-color: #78444C; -} - -#inspectorComponentBody { - background-color: transparent; -} - -#inspectorPropertyRow { - background-color: transparent; - border: none; -} - -#inspectorPropertyLabel { - color: #ABB5BA; - font-size: 12px; -} - -#inspectorVectorField, -#inspectorColorField, -#inspectorNumericField { - background-color: #191C1D; - border: 1px solid #363D41; - border-radius: 3px; +#statusRuntimeIcon { + padding: 0 4px; } -#inspectorAxisLabel { - color: #748088; - font-size: 10px; +#statusRenderer { + background-color: #2B2E30; + border: 1px solid #45494D; + border-radius: 8px; + color: #B6BCB8; + font-size: 9px; font-weight: 700; - min-width: 10px; -} - -#inspectorVectorField QDoubleSpinBox { - background-color: transparent; - border: none; - border-radius: 0; - padding: 2px; -} - -#inspectorNumericField QDoubleSpinBox { - background-color: transparent; - border: none; -} - -#inspectorSyncButton { - background-color: transparent; - border: none; - min-width: 20px; - min-height: 20px; - padding: 1px; -} - -#inspectorSyncButton:hover { - background-color: #30373A; -} - -#inspectorSyncButton[matched="true"] { - background-color: #242A2D; - border: 1px solid #465158; - color: #D5DDE1; padding: 2px 6px; - text-align: left; } -#inspectorSyncButton[matched="true"]:hover { - background-color: #30383C; - border-color: #5B6A72; +#statusVersion { + color: #68758A; + font-size: 9px; + padding: 0 6px; } -#inspectorColorSwatch { - border: 1px solid #566167; - border-radius: 4px; - padding: 0; - min-height: 18px; +#workspaceBar { + background-color: #1E2022; + border: none; + border-bottom: 1px solid #3B3E42; + spacing: 3px; + padding: 2px 5px 2px 0; } -#inspectorColorText { - background-color: transparent; - border: none; - padding: 3px; +#workspaceIdentity { + background: transparent; + border-right: 1px solid #424549; } -#inspectorNestedGroup { - background-color: #202426; - border-top: 1px solid #30373A; - border-bottom: 1px solid #30373A; +#workspaceMark { + background: transparent; } -#inspectorNestedTitle { - color: #D1D8DC; - font-weight: 650; - padding: 2px 1px 4px 1px; +#workspaceBrand { + color: #F5F7FA; + font-size: 12px; + font-weight: 800; } -#inspectorArrayTitle { - color: #7FB9EC; +#workspaceProject { + color: #7F8B9D; font-size: 11px; - font-weight: 650; - padding: 5px 2px 1px 2px; } -#inspectorArrayButton { +#workspaceModeButton { background-color: transparent; border: 1px solid transparent; - border-radius: 4px; - color: #AEB8BE; - min-width: 20px; - min-height: 18px; - padding: 1px 4px; -} - -#inspectorArrayButton:hover { - background-color: #30373A; - border-color: #465157; - color: #FFFFFF; -} - -#inspectorEmptyTitle { - color: #DDE3E6; - font-size: 15px; - font-weight: 650; -} - -#inspectorEmptyHint { - color: #77838A; - font-size: 12px; -} - -#inspectorOpenAssetButton { - min-height: 24px; + border-radius: 9px; + color: #94A0B2; + padding: 4px 8px; + margin: 0 1px; } -#inspectorAddComponentButton { - background-color: #2B3235; - border: 1px solid #465158; - border-radius: 3px; - color: #E9EEF0; - font-weight: 600; - min-height: 20px; - padding: 3px 8px; +#workspaceModeButton:hover { + background-color: #303336; + color: #DDE4ED; } -#inspectorAddComponentButton:hover { - background-color: #343C40; - border-color: #5B6970; +#workspaceModeButton:checked { + background-color: #3A3E42; + border-color: #5E656B; + color: #FFFFFF; } -#inspectorAudioControls { - background-color: #202426; - border: 1px solid #343D41; - border-top: none; - border-bottom-left-radius: 7px; - border-bottom-right-radius: 7px; +#workspaceUtilityButton { + background: transparent; + border-color: transparent; + min-width: 26px; + padding: 3px 5px; } -QHeaderView { - background-color: #252A2C; - border: none; +#workspaceBuildButton, +#workspaceLaunchButton { + min-width: 26px; + padding: 3px 5px; + background-color: #292C2F; + border-color: #45494D; + margin-left: 3px; } -QHeaderView::section { - background-color: #252A2C; - color: #AEB8BE; - border: none; - border-right: 1px solid #343B3F; - border-bottom: 1px solid #343B3F; - padding: 4px 6px; - font-weight: 600; +#workspaceBuildButton:hover, +#workspaceLaunchButton:hover { + background-color: #363A3E; + border-color: #5A5F65; } -QHeaderView::section:hover { - background-color: #2E3538; - color: #EAF0F2; +#sceneTabs { + background-color: #191A1C; + border-bottom: 1px solid #3B3E42; } -QTabWidget::pane { - background-color: #222526; - border: 1px solid #343B3F; - border-radius: 3px; - top: -1px; +#sceneTabs::tab { + background-color: #202224; + border-right: 1px solid #3A3D40; + color: #7F8B9D; + min-width: 112px; + padding: 5px 10px; + margin: 2px; + border-radius: 8px; } -QTabBar::tab { - background-color: #252A2C; - color: #9EA9AF; - border: 1px solid #343B3F; - border-bottom-color: #343B3F; - border-top-left-radius: 3px; - border-top-right-radius: 3px; - padding: 4px 9px; - min-width: 46px; +#sceneTabs::tab:selected { + background-color: #36393C; + color: #F3F6FA; + border-bottom: 2px solid #78858E; } -QTabBar::tab:first { - border-top-left-radius: 5px; +#viewportTools { + background-color: #141517; } -QTabBar::tab:last { - border-top-right-radius: 5px; +#viewportToolbar { + background-color: #202224; + border-bottom: 1px solid #3B3E42; } -QTabBar::tab:hover { - background-color: #30383B; - color: #E3EAED; +#viewportPlaybackButton, +#viewportModeButton, +#viewportOptionButton, +#viewportShadingButton { + background-color: #292C2F; + border-color: #414549; + min-width: 25px; + min-height: 22px; + padding: 3px 5px; } -QTabBar::tab:selected { - background-color: #303638; - color: #FFFFFF; - border-top: 1px solid #343B3F; - border-bottom-color: #303638; +#viewportPlaybackButton:hover, +#viewportModeButton:hover, +#viewportOptionButton:hover, +#viewportShadingButton:hover { + background-color: #363A3E; + border-color: #5A5F65; } -QMenuBar { - background-color: #222526; - color: #CCD4D8; - border-bottom: none; +#viewportModeButton:checked, +#viewportShadingButton:checked { + background-color: #3A4248; + border-color: #6F7B84; } -QMenuBar::item { - background-color: transparent; - padding: 4px 8px; +#viewportFpsLabel { + color: #9CA5A0; + font-size: 10px; + font-weight: 650; } -QMenuBar::item:selected { - background-color: #30383B; - color: #FFFFFF; +#viewportShortcutHint { + background-color: #141517; + border-top: 1px solid #303236; + color: #68758A; + font-size: 10px; + padding: 3px 7px; } -QMenu { - background-color: #1B1F20; - color: #E5ECEF; - border: 1px solid #3D454A; - border-radius: 3px; +#panelToolbar, +#materialEditorHeader, +#postProcessingToolbar, +#workspaceToolbar { + background-color: #232527; + border-bottom: 1px solid #404347; padding: 3px; } -QMenu::item { - padding: 4px 24px 4px 8px; - border-radius: 3px; -} - -QMenu::item:selected { - background-color: #315D90; - color: #FFFFFF; -} - -QMenu::separator { - height: 1px; - background-color: #343B3F; - margin: 3px 5px; -} - -QSplitter::handle { - background-color: #222526; -} - -QSplitter::handle:horizontal { - width: 6px; -} - -QSplitter::handle:vertical { - height: 6px; -} - -QSplitter::handle:hover { - background-color: #4FAAFF; +#panelAddButton, +#materialSaveButton, +#workspaceApplyButton { + background-color: #303438; + border-color: #4C5257; + color: #D8DBDE; } -QStatusBar { - background-color: #1B1E1F; - color: #AEB8BE; - border-top: 1px solid #303638; +#panelMoreButton, +#browserNavigationButton, +#browserRevealButton { + background-color: transparent; + border-color: transparent; + min-width: 24px; } -QStatusBar::item { - border: none; +#panelMoreButton:hover, +#browserNavigationButton:hover, +#browserRevealButton:hover { + background-color: #34373A; + border-color: #484C50; } -ads--CDockContainerWidget { - background-color: #222526; +#contentPathField { + background-color: #1B1D1F; + color: #8490A4; + font-size: 11px; } -ads--CDockContainerWidget > QSplitter { - padding: 1px; +#contentSearchField { + min-width: 130px; } -ads--CDockSplitter::handle, -ads--CDockContainerWidget ads--CDockSplitter::handle { - background-color: #222526; +QTreeView#hierarchyTree { + background-color: #1E2022; + border-top: 1px solid #303236; + padding: 5px 3px; } -ads--CDockSplitter::handle:hover, -ads--CDockContainerWidget ads--CDockSplitter::handle:hover { - background-color: #4FAAFF; +QTreeView#hierarchyTree::item { + min-height: 24px; + padding: 3px 5px; } -ads--CDockAreaWidget { - background-color: #222526; - border: none; - border-radius: 0; +QTreeView#hierarchyTree::item:selected { + background-color: #343C43; + border-left: 2px solid #8498A8; } -ads--CDockAreaWidget[focused="true"] { - border: none; +QListView#contentGrid { + background-color: #1A1C1E; + border-top: 1px solid #303236; + padding: 6px; } -ads--CDockAreaTitleBar { - background-color: #222526; - border-bottom: none; - border-radius: 0; - padding: 0; +QListView#contentGrid::item { + background-color: #232527; + border: 1px solid #34373A; + border-radius: 11px; + padding: 7px; + color: #BCC6D4; } -ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar { - background-color: #222526; - border-bottom: none; +QListView#contentGrid::item:hover { + background-color: #2E3134; + border-color: #4B5055; } -ads--CDockAreaTabBar, -#tabsContainerWidget { - background-color: #222526; - border: none; - border-radius: 0; +QListView#contentGrid::item:selected { + background-color: #393F44; + border-color: #66737C; + color: #FFFFFF; } -ads--CTitleBarButton { - background-color: transparent; +QScrollArea#inspectorScroll, +#inspectorContent, +#materialEditorBody, +#postProcessingBody { + background-color: #1E2022; border: none; - border-radius: 4px; - padding: 2px; - margin: 2px; - min-width: 18px; - min-height: 18px; -} - -ads--CTitleBarButton:hover { - background-color: #394045; } -ads--CTitleBarButton:pressed { - background-color: #1A1D1E; +#inspectorHeader { + background-color: #25272A; + border: 1px solid #404347; + border-radius: 12px; + padding: 6px; } -#tabsMenuButton::menu-indicator { - image: none; +#inspectorObjectIcon { + background-color: #34373B; + border: 1px solid #4E5257; + border-radius: 10px; + padding: 4px; } -#tabsMenuButton { - qproperty-icon: url(:/ads/images/tabs-menu-button_dark.svg); - qproperty-iconSize: 16px; +#inspectorNameField { + background: transparent; + border: 1px solid transparent; + color: #F3F6FA; + font-size: 14px; + font-weight: 700; } -#dockAreaCloseButton { - qproperty-icon: url(:/ads/images/close-button_dark.svg), url(:/ads/images/close-button-disabled_dark.svg) disabled; - qproperty-iconSize: 16px; +#inspectorNameField:hover, +#inspectorNameField:focus { + background-color: #1E2022; + border-color: #5A5F65; } -#detachGroupButton { - qproperty-icon: url(:/ads/images/detach-button_dark.svg), url(:/ads/images/detach-button-disabled_dark.svg) disabled; - qproperty-iconSize: 16px; +#inspectorTypeLabel { + color: #7E8A9E; + font-size: 10px; + font-weight: 600; } -#dockAreaAutoHideButton { - qproperty-icon: url(:/ads/images/vs-pin-button_dark.svg), url(:/ads/images/vs-pin-button-disabled_dark.svg) disabled; - qproperty-iconSize: 16px; +#inspectorComponent { + background-color: #242628; + border: 1px solid #3B3E41; + border-radius: 11px; + margin-top: 3px; } -#dockAreaMinimizeButton { - qproperty-icon: url(:/ads/images/minimize-button-focused_dark.svg); - qproperty-iconSize: 16px; +#inspectorComponentHeaderRow { + background-color: #292C2F; + border-bottom: 1px solid #3B3E41; + border-radius: 11px 11px 0 0; } -ads--CDockWidgetTab { - background-color: #252A2C; +#inspectorComponentHeader { + background: transparent; border: none; - border-right: 1px solid #303638; - border-top-left-radius: 3px; - border-top-right-radius: 3px; - margin: 2px 1px 0 0; - padding: 0 7px; - qproperty-iconSize: 14px 14px; -} - -ads--CDockWidgetTab:hover { - background-color: #30383B; -} - -ads--CDockWidgetTab[activeTab="true"] { - background-color: #303638; - border-top: none; - border-right: 1px solid #343B3F; -} - -ads--CDockWidgetTab[focused="true"] { - background-color: #303638; - border-top: none; -} - -ads--CDockWidgetTab QLabel, -ads--CDockWidgetTab #dockWidgetTabLabel { - color: #9EA9AF; - background-color: transparent; -} - -ads--CDockWidgetTab:hover QLabel, -ads--CDockWidgetTab:hover #dockWidgetTabLabel { - color: #E3EAED; + color: #E8ECF2; + font-weight: 650; + text-align: left; + padding: 5px 7px; } -ads--CDockWidgetTab[activeTab="true"] QLabel, -ads--CDockWidgetTab[activeTab="true"] #dockWidgetTabLabel, -ads--CDockWidgetTab[focused="true"] QLabel, -ads--CDockWidgetTab[focused="true"] #dockWidgetTabLabel { - color: #FFFFFF; +#inspectorComponentHeader:hover { + background-color: #303337; } -#tabCloseButton { - background-color: transparent; +#inspectorComponentRemoveButton { + background: transparent; border: none; - border-radius: 4px; - padding: 1px; - margin: 2px 0 2px 4px; - qproperty-icon: url(:/ads/images/close-button_dark.svg), url(:/ads/images/close-button-disabled_dark.svg) disabled; - qproperty-iconSize: 16px; -} - -#tabCloseButton:hover { - background-color: #3D454A; -} - -#tabCloseButton:pressed { - background-color: #16191A; + min-width: 22px; } -ads--CDockWidgetTab[focused="true"] > #tabCloseButton { - qproperty-icon: url(:/ads/images/close-button-focused_dark.svg); +#inspectorComponentRemoveButton:hover { + background-color: #3A3031; + border: 1px solid #695556; } -ads--CDockWidget { - background-color: #222526; - border-top: 1px solid #303638; +#inspectorComponentBody { + background-color: #242628; + padding: 5px; } -QScrollArea#dockWidgetScrollArea { - background-color: #222526; - border: none; - border-radius: 0; - padding: 0; +#inspectorPropertyRow { + background: transparent; + min-height: 27px; } -QWidget[dockWidgetContent="true"] { - background-color: #222526; +#inspectorPropertyLabel { + color: #929EB0; + font-size: 11px; } -QWidget#collapsibleSection { - background-color: #222526; - border: none; - border-radius: 0; +#inspectorVectorField, +#inspectorColorField, +#inspectorNumericField { + background-color: #1B1D1F; + border: 1px solid #404448; + border-radius: 9px; } -QToolButton#collapsibleHeader { - background-color: transparent; +#inspectorVectorField QDoubleSpinBox, +#inspectorNumericField QDoubleSpinBox { + background: transparent; border: none; - border-radius: 0; - padding: 4px 0; - color: #E7ECEF; - font-weight: 600; - text-align: left; } -QToolButton#collapsibleHeader:hover { - background-color: transparent; - color: #FFFFFF; -} - -QToolButton#collapsibleHeader:checked { - background-color: transparent; -} - -QToolButton#collapsibleHeader::menu-indicator { - image: none; +#inspectorAxisLabel { + background-color: #34373A; + border-radius: 7px; + color: #AAB5C5; + font-size: 9px; + font-weight: 750; + padding: 2px 4px; } -QWidget#collapsibleBody { - background-color: #222526; - border: none; - border-radius: 0; +#inspectorSyncButton, +#inspectorArrayButton { + background: transparent; + border-color: transparent; + min-width: 22px; } -#autoHideTitleLabel { - color: #EAF0F2; - background-color: transparent; - padding-left: 6px; - font-weight: 600; +#inspectorSyncButton[matched="true"] { + background-color: #343936; + border-color: #555F59; + color: #B6BEB9; } -ads--CAutoHideSideBar { - background-color: #1B1E1F; - border: none; - qproperty-spacing: 8; +#inspectorColorSwatch { + background-color: #292C2F; + border: 1px solid #4D5155; + border-radius: 8px; + padding: 2px; } -#sideTabsContainerWidget { - background-color: transparent; +#inspectorColorText { + color: #9CA8BA; + font-family: "Menlo"; + font-size: 10px; } -ads--CAutoHideSideBar[sideBarLocation="0"] { - border-bottom: 1px solid #303638; +#inspectorNestedGroup { + background-color: #202224; + border: 1px solid #383B3F; + border-radius: 10px; + margin: 3px 0; + padding: 5px; } -ads--CAutoHideSideBar[sideBarLocation="1"] { - border-right: 1px solid #303638; +#inspectorNestedTitle, +#inspectorArrayTitle { + color: #AEB8C8; + font-weight: 650; } -ads--CAutoHideSideBar[sideBarLocation="2"] { - border-left: 1px solid #303638; +#inspectorEmptyTitle, +#materialEditorEmpty, +#postProcessingEmpty { + color: #C4CDDA; + font-size: 14px; + font-weight: 650; } -ads--CAutoHideSideBar[sideBarLocation="3"] { - border-top: 1px solid #303638; +#inspectorEmptyHint { + color: #728096; } -ads--CAutoHideTab { - background-color: transparent; - border: none; - color: #AEB8BE; - padding: 4px 6px; - min-height: 24px; - qproperty-iconSize: 16px 16px; +#inspectorOpenAssetButton, +#inspectorAddComponentButton { + background-color: #292C2F; + border: 1px dashed #5A5F65; + color: #C7D0DD; + padding: 6px; } -ads--CAutoHideTab:hover { - background-color: #30383B; +#inspectorAddComponentButton:hover { + background-color: #363A3E; + border-color: #646B70; color: #FFFFFF; } -ads--CAutoHideTab[activeTab="true"] { - background-color: #303638; - color: #FFFFFF; +#inspectorAudioControls { + background-color: #202224; + border-radius: 9px; } -ads--CAutoHideTab[iconOnly="false"][sideBarLocation="0"], -ads--CAutoHideTab[iconOnly="false"][sideBarLocation="2"], -ads--CAutoHideTab[iconOnly="true"][sideBarLocation="0"] { - border-top: 3px solid #465157; +#materialEditorTitle, +#postProcessingTitle, +#postProcessingSectionTitle, +#inspectorCameraTitle, +#workspaceTitle { + color: #F3F6FA; + font-size: 13px; + font-weight: 700; } -ads--CAutoHideTab[iconOnly="false"][sideBarLocation="1"], -ads--CAutoHideTab[iconOnly="false"][sideBarLocation="3"], -ads--CAutoHideTab[iconOnly="true"][sideBarLocation="3"] { - border-bottom: 3px solid #465157; +#materialEditorStatus, +#postProcessingStatus, +#workspaceStatus, +#workspaceAutoApply { + color: #7E8A9E; + font-size: 10px; } -ads--CAutoHideTab[iconOnly="true"][sideBarLocation="1"] { - border-left: 3px solid #465157; +#materialPreview { + background-color: #141517; + border: 1px solid #44484C; + border-radius: 12px; } -ads--CAutoHideTab[iconOnly="true"][sideBarLocation="2"] { - border-right: 3px solid #465157; +#materialColorButton { + background-color: #292C2F; + border-color: #45494D; + border-radius: 9px; + color: #C9CDD0; + text-align: left; + padding: 4px 8px; } -ads--CAutoHideTab:hover[iconOnly="false"][sideBarLocation="0"], -ads--CAutoHideTab:hover[iconOnly="false"][sideBarLocation="2"], -ads--CAutoHideTab[iconOnly="false"][sideBarLocation="0"][activeTab="true"], -ads--CAutoHideTab[iconOnly="false"][sideBarLocation="2"][activeTab="true"], -ads--CAutoHideTab:hover[iconOnly="true"][sideBarLocation="0"], -ads--CAutoHideTab[iconOnly="true"][sideBarLocation="0"][activeTab="true"] { - border-top: 3px solid #AEB8BE; +#materialColorButton:hover { + background-color: #34383B; + border-color: #5A5F65; } -ads--CAutoHideTab:hover[iconOnly="false"][sideBarLocation="1"], -ads--CAutoHideTab:hover[iconOnly="false"][sideBarLocation="3"], -ads--CAutoHideTab[iconOnly="false"][sideBarLocation="1"][activeTab="true"], -ads--CAutoHideTab[iconOnly="false"][sideBarLocation="3"][activeTab="true"], -ads--CAutoHideTab:hover[iconOnly="true"][sideBarLocation="3"], -ads--CAutoHideTab[iconOnly="true"][sideBarLocation="3"][activeTab="true"] { - border-bottom: 3px solid #AEB8BE; +#materialTextureSlot { + background-color: #232527; + border: 1px solid #404448; + border-radius: 10px; + padding: 4px; } -ads--CAutoHideTab:hover[iconOnly="true"][sideBarLocation="1"], -ads--CAutoHideTab[iconOnly="true"][sideBarLocation="1"][activeTab="true"] { - border-left: 3px solid #AEB8BE; +#materialTexturePreview { + background-color: #1A1C1E; + border: 1px solid #494D52; + border-radius: 9px; + color: #9E897D; + font-weight: 750; } -ads--CAutoHideTab:hover[iconOnly="true"][sideBarLocation="2"], -ads--CAutoHideTab[iconOnly="true"][sideBarLocation="2"][activeTab="true"] { - border-right: 3px solid #AEB8BE; +#materialTextureLabel { + color: #D6DDE7; + font-weight: 650; } -ads--CAutoHideDockContainer { - background-color: #222526; - border: 1px solid #6A7479; +#materialTexturePath { + color: #7D899C; } -ads--CAutoHideDockContainer ads--CDockAreaTitleBar, -ads--CAutoHideDockContainer ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar { - background-color: #2B3032; +#environmentPages, +#environmentWorkspace, +#environmentPage { + background-color: #1E2022; border: none; - padding: 0; } -ads--CAutoHideDockContainer #autoHideTitleLabel { - color: #FFFFFF; +QListWidget#environmentCategories { + background-color: #1B1D1F; + border-right: 1px solid #3B3E42; + padding: 5px; } -ads--CAutoHideDockContainer #dockAreaAutoHideButton { - qproperty-icon: url(:/ads/images/vs-pin-button-pinned-focused_dark.svg); - qproperty-iconSize: 16px; +QListWidget#environmentCategories::item { + padding: 6px 8px; + margin: 2px 0; } -ads--CAutoHideDockContainer #dockAreaCloseButton { - qproperty-icon: url(:/ads/images/close-button-focused_dark.svg); +QListWidget#environmentCategories::item:selected { + background-color: #343C43; + border-left: 2px solid #8498A8; } -ads--CAutoHideDockContainer ads--CTitleBarButton:hover { - background-color: #34536A; +#environmentPageTitle { + color: #F3F6FA; + font-size: 17px; + font-weight: 750; } -ads--CAutoHideDockContainer ads--CTitleBarButton:pressed { - background-color: #17222A; +#environmentPageSubtitle { + color: #778499; } -ads--CResizeHandle { - background-color: #1B1E1F; +QGroupBox#environmentSection { + background-color: #242628; + border-color: #3B3E42; } -ads--CAutoHideDockContainer[sideBarLocation="0"] ads--CResizeHandle, -ads--CAutoHideDockContainer[sideBarLocation="3"] ads--CResizeHandle { - border-top: 1px solid #6A7479; +ads--CDockContainerWidget { + background-color: #111214; } -ads--CAutoHideDockContainer[sideBarLocation="1"] ads--CResizeHandle { - border-left: 1px solid #6A7479; +ads--CDockContainerWidget > QSplitter { + background-color: #111214; } -ads--CAutoHideDockContainer[sideBarLocation="2"] ads--CResizeHandle { - border-right: 1px solid #6A7479; +ads--CDockContainerWidget ads--CDockSplitter::handle { + background-color: #111214; } -#DockWidgetAreaLabel { - background-color: rgba(61, 139, 255, 64); - border: 1px solid rgba(114, 199, 255, 190); - border-radius: 6px; +ads--CDockContainerWidget ads--CDockSplitter::handle:hover { + background-color: #71889A; } -#workspaceToolbar { - background-color: #191C1D; - border-bottom: 1px solid #32383B; +ads--CDockAreaWidget { + background-color: #1E2022; + border: 1px solid #34373A; } -#workspaceTitle { - color: #F2F5F6; - font-size: 14px; - font-weight: 650; +ads--CDockAreaWidget[focused="true"] { + border-color: #50545A; } -#workspaceStatus, -#workspaceAutoApply { - color: #89949A; - font-size: 11px; +ads--CDockAreaTitleBar { + background-color: #202224; + border-bottom: 1px solid #3B3E42; + min-height: 26px; } -#workspaceApplyButton { - background-color: #293238; - border-color: #3C4C55; - min-height: 19px; - padding: 2px 7px; +ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar { + background-color: #26282B; } -#environmentWorkspace, -#environmentPages { - background-color: #202324; - border: none; +#tabsContainerWidget { + background-color: transparent; } -QListWidget#environmentCategories { - background-color: #191C1D; +ads--CTitleBarButton { + background: transparent; border: none; - border-right: 1px solid #32383B; - border-radius: 0; - padding: 5px 3px; - outline: none; + border-radius: 7px; + min-width: 22px; + min-height: 22px; + padding: 2px; } -QListWidget#environmentCategories::item { - min-height: 26px; - padding: 3px 6px; - border: 1px solid transparent; - border-radius: 3px; +ads--CTitleBarButton:hover { + background-color: #3E4246; } -QListWidget#environmentCategories::item:hover { - background-color: #282E31; +ads--CDockWidgetTab { + background-color: #202224; + border: none; + border-right: 1px solid #3A3D40; + border-bottom: 1px solid #3B3E42; + padding: 1px 5px; + margin: 2px 1px; + border-radius: 7px; } -QListWidget#environmentCategories::item:selected { - background-color: #303A40; - border-color: #46545C; - color: #FFFFFF; +ads--CDockWidgetTab:hover { + background-color: #2C2F32; } -QScrollArea#environmentScroll, -#environmentPage { - background-color: #202324; - border: none; - border-radius: 0; +ads--CDockWidgetTab[activeTab="true"] { + background-color: #373A3D; + border-bottom: 2px solid #78858E; } -#environmentPageTitle { - color: #F0F3F4; - font-size: 17px; - font-weight: 650; +ads--CDockWidgetTab[focused="true"] { + background-color: #2B2E31; } -#environmentPageSubtitle { - color: #838E94; +ads--CDockWidgetTab #dockWidgetTabLabel { + color: #7F8B9D; font-size: 11px; + padding: 4px 2px; } -QGroupBox#environmentSection { - background-color: #242829; - border: 1px solid #363D40; - border-radius: 3px; - margin-top: 15px; - padding: 7px; +ads--CDockWidgetTab[activeTab="true"] #dockWidgetTabLabel, +ads--CDockWidgetTab[focused="true"] #dockWidgetTabLabel { + color: #F1F4F8; } -QGroupBox#environmentSection::title { - background-color: #242829; - color: #BDC6CA; - left: 7px; - padding: 0 4px; +#tabCloseButton, +#dockAreaCloseButton, +#detachGroupButton, +#dockAreaAutoHideButton, +#dockAreaMinimizeButton, +#tabsMenuButton { + background: transparent; + border: none; + min-width: 20px; + min-height: 20px; } -#compactVectorField { - background-color: #191C1D; - border: 1px solid #363D41; - border-radius: 3px; +#tabCloseButton:hover, +#dockAreaCloseButton:hover, +#detachGroupButton:hover, +#dockAreaAutoHideButton:hover, +#dockAreaMinimizeButton:hover, +#tabsMenuButton:hover { + background-color: #424549; } -#compactAxisLabel { - color: #718087; - font-size: 10px; - font-weight: 700; - min-width: 9px; +ads--CDockWidget { + background-color: #1E2022; } -#compactVectorField QDoubleSpinBox { - background-color: transparent; - border: none; - border-radius: 0; - padding: 2px 1px; +ads--CAutoHideSideBar, +#sideTabsContainerWidget { + background-color: #141517; +} + +ads--CAutoHideTab { + background-color: #202224; + border: 1px solid #404448; + color: #7F8B9D; + padding: 4px; + border-radius: 8px; } -#compactColorButton { - border: 1px solid #566167; +ads--CAutoHideTab:hover, +ads--CAutoHideTab[activeTab="true"] { + background-color: #393F44; + border-color: #66737C; color: #FFFFFF; - font-weight: 650; - text-align: left; } #projectBrowserRoot, -#projectBrowserContent, -#createProjectDialog { - background-color: #181B1D; - font-family: "Manrope", "Helvetica Neue", sans-serif; +#projectBrowserContent { + background-color: #18191B; } #projectSidebar { - background-color: #111315; - border-right: 1px solid #2A2E31; + background-color: #151618; + border-right: 1px solid #303236; } #projectBrand { - background: transparent; - color: #F4F7F8; - font-size: 22px; - font-weight: 700; + color: #F5F7FA; + font-size: 16px; + font-weight: 750; +} + +#projectSidebarVersion { + color: #68758A; + font-size: 10px; + font-weight: 600; } #projectNavSelected { - background-color: #252A2D; - border: 1px solid #32383C; - border-radius: 8px; - color: #F4F7F8; - padding: 9px 12px; + background-color: #34383C; + border: 1px solid #51575C; + border-left: 3px solid #79868F; + border-radius: 10px; + color: #DCE9FA; + padding: 6px 9px; text-align: left; } #projectNavSelected:disabled { - background-color: #252A2D; - border-color: #32383C; - color: #F4F7F8; -} - -#projectSidebarVersion { - background: transparent; - color: #697277; - font-size: 11px; + color: #DCE9FA; } #projectBrowserTitle, #dialogTitle { - background: transparent; - color: #F7F9FA; - font-size: 28px; - font-weight: 700; + color: #F4F6FA; + font-size: 24px; + font-weight: 750; } #projectBrowserSubtitle, #dialogSubtitle, -#emptyStateSubtitle { - background: transparent; - color: #889197; - font-size: 13px; -} - -#primaryAction { - background-color: #2F85F5; - border: 1px solid #55A0FF; - border-radius: 7px; - color: #FFFFFF; - font-weight: 600; - padding: 8px 14px; -} - -#primaryAction:hover { - background-color: #3B91FF; - border-color: #72B1FF; -} - -#primaryAction:pressed { - background-color: #2876DA; -} - -#primaryAction:disabled { - background-color: #2A3034; - border-color: #363D41; - color: #697277; -} - -QPushButton[secondary="true"] { - background-color: #252A2D; - border: 1px solid #3A4145; - border-radius: 7px; - color: #DDE3E6; - padding: 8px 14px; -} - -QPushButton[secondary="true"]:hover { - background-color: #2D3337; - border-color: #4A5358; +#emptyStateSubtitle, +#templateDescription { + color: #7F8B9D; } #projectSearch { - background-color: #222629; - border: 1px solid #343A3E; - border-radius: 8px; - color: #EEF2F4; - padding: 9px 12px; + background-color: #202224; + border: 1px solid #43474B; + border-radius: 11px; + padding: 7px 9px; + font-size: 13px; } #projectSearch:focus { - border-color: #4B9EFF; + border-color: #71808A; } #projectList { - background: transparent; + background-color: transparent; border: none; - outline: none; } #projectList::item { background: transparent; border: none; + padding: 0; } #projectRow { - background-color: #222629; - border: 1px solid #30363A; - border-radius: 10px; + background-color: #242628; + border: 1px solid #3B3E41; + border-radius: 13px; } #projectRow:hover { - background-color: #282D31; - border-color: #465057; + background-color: #2C2F32; + border-color: #565B61; } #projectRow[available="false"] { - background-color: #1D2022; - border-color: #532F34; + background-color: #202224; + border-color: #303235; +} + +#projectIcon, +#templateIcon { + background-color: #303337; + border: 1px solid #484C50; + border-radius: 10px; } #projectName { - background: transparent; - color: #F0F4F5; + color: #EEF2F7; font-size: 14px; - font-weight: 650; + font-weight: 700; } #projectPath, #projectDate { - background: transparent; - color: #788187; - font-size: 11px; + color: #768398; + font-size: 10px; } #rendererBadge { - background-color: #243B51; - border: 1px solid #31536E; - border-radius: 9px; - color: #9ED1FF; - font-size: 10px; - font-weight: 600; - padding: 3px 8px; + background-color: #2C302E; + border: 1px solid #494F4B; + border-radius: 8px; + color: #B4BBB6; + padding: 3px 7px; + font-size: 9px; + font-weight: 700; } #projectMoreButton { background: transparent; - border: none; - color: #98A2A8; - font-size: 14px; - padding: 6px; + border-color: transparent; } #projectMoreButton:hover { - background-color: #363D41; - border-radius: 6px; - color: #FFFFFF; + background-color: #3E4246; + border-color: #51565B; } #projectEmptyState { - background-color: #1D2022; - border: 1px dashed #343A3E; - border-radius: 12px; + background-color: #1E2022; + border: 1px dashed #484C51; + border-radius: 14px; } #emptyStateTitle { - background: transparent; - color: #E9EEF0; - font-size: 17px; - font-weight: 650; + color: #CDD5E1; + font-size: 16px; + font-weight: 700; +} + +#createProjectDialog { + background-color: #1E2022; } QFrame[templateCard="true"] { - background-color: #222629; - border: 1px solid #343A3E; - border-radius: 10px; + background-color: #242628; + border: 1px solid #42464A; + border-radius: 13px; } QFrame[templateCard="true"]:hover { - background-color: #282E32; - border-color: #4B5961; + background-color: #2B2E31; + border-color: #5A5F65; } QFrame[templateCard="true"][selected="true"] { - background-color: #20354A; - border: 2px solid #4B9EFF; + background-color: #393F44; + border-color: #66737C; } #templateOption { - background: transparent; - color: #F3F6F7; - font-size: 14px; + color: #E7ECF3; font-weight: 650; } -#templateDescription { - background: transparent; - color: #879096; +#fieldLabel { + color: #AAB5C5; font-size: 11px; + font-weight: 650; } -#fieldLabel { - background: transparent; - color: #B3BCC1; +#dialogError { + color: #FF7D8A; font-size: 11px; - font-weight: 600; } -#dialogError { - background-color: #41262A; - border: 1px solid #704048; - border-radius: 7px; - color: #FFB4BE; - padding: 8px 10px; +QPushButton[secondary="true"] { + background-color: #292C2F; + border-color: #494D52; +} + +QPushButton[secondary="true"]:hover { + background-color: #363A3E; + border-color: #5D6268; +} + +#projectSettingsDialog, +#exportDialog { + background-color: #18191B; +} + +#dialogHero { + background-color: #242628; + border: 1px solid #42464A; + border-radius: 13px; + padding: 6px; +} + +#dialogHeroIcon { + background-color: #2B3034; + border: 1px solid #50575C; + border-radius: 10px; + padding: 6px; +} + +#dialogHeroTitle { + color: #F3F6FA; + font-size: 17px; + font-weight: 750; +} + +#dialogHeroSubtitle, +#exportSummary { + color: #7F8B9D; +} + +#exportSummary { + background-color: #232527; + border: 1px solid #3B3E42; + border-radius: 10px; + padding: 6px; +} + +#exportLog { + background-color: #141517; + border-color: #404448; + color: #B7BDBC; + font-family: "Menlo"; + font-size: 10px; +} + +#commandPaletteDialog, +#globalSearchDialog { + background-color: #202224; + border: 1px solid #5A5F65; + border-radius: 14px; +} + +#commandPaletteSearch, +#globalSearchField { + background-color: #1A1C1E; + border: 1px solid #505459; + border-radius: 11px; + padding: 7px 9px; + font-size: 14px; +} + +#commandPaletteSearch:focus, +#globalSearchField:focus { + border-color: #71808A; +} + +#commandPaletteList, +#globalSearchResults { + background-color: #202224; + border: none; + padding: 5px; +} + +#commandPaletteList::item, +#globalSearchResults::item { + min-height: 30px; + padding: 6px 8px; } diff --git a/editor/styling/icons.cpp b/editor/styling/icons.cpp new file mode 100644 index 00000000..7eaadb58 --- /dev/null +++ b/editor/styling/icons.cpp @@ -0,0 +1,242 @@ +#include "editor/styling/icons.h" + +#include +#include +#include +#include +#include +#include + +namespace { + +QString iconFamily; +bool iconFontAttempted = false; + +ushort codepoint(styling::Icon icon) { + switch (icon) { + case styling::Icon::Aperture: + return 0xE00A; + case styling::Icon::ArrowClockwise: + return 0xE036; + case styling::Icon::ArrowCounterClockwise: + return 0xE038; + case styling::Icon::ArrowLeft: + return 0xE058; + case styling::Icon::ArrowRight: + case styling::Icon::Assign: + return 0xE06C; + case styling::Icon::ArrowUp: + return 0xE08E; + case styling::Icon::ArrowsOutCardinal: + return 0xE0A4; + case styling::Icon::BoundingBox: + return 0xE6CE; + case styling::Icon::Camera: + return 0xE10E; + case styling::Icon::CaretDown: + return 0xE136; + case styling::Icon::CaretLeft: + return 0xE138; + case styling::Icon::CaretRight: + return 0xE13A; + case styling::Icon::CaretUp: + return 0xE13C; + case styling::Icon::Check: + return 0xE182; + case styling::Icon::Close: + return 0xE4F6; + case styling::Icon::Cloud: + return 0xE1AA; + case styling::Icon::Code: + return 0xE1BC; + case styling::Icon::Crosshair: + return 0xE1D6; + case styling::Icon::Cube: + return 0xE1DA; + case styling::Icon::CubeFocus: + return 0xED0A; + case styling::Icon::CubeTransparent: + return 0xEC7C; + case styling::Icon::CursorClick: + return 0xE7C8; + case styling::Icon::Database: + return 0xE1DE; + case styling::Icon::DotsVertical: + return 0xE208; + case styling::Icon::DotsNine: + return 0xE1FC; + case styling::Icon::Export: + return 0xEAF0; + case styling::Icon::Eye: + return 0xE220; + case styling::Icon::EyeSlash: + return 0xE224; + case styling::Icon::File: + return 0xE230; + case styling::Icon::FileCode: + return 0xE914; + case styling::Icon::FilmStrip: + return 0xE792; + case styling::Icon::FloppyDisk: + return 0xE248; + case styling::Icon::Folder: + return 0xE24A; + case styling::Icon::FolderOpen: + return 0xE256; + case styling::Icon::GameController: + return 0xE26E; + case styling::Icon::Gear: + return 0xE270; + case styling::Icon::Globe: + return 0xE288; + case styling::Icon::Hand: + return 0xE298; + case styling::Icon::HardDrives: + return 0xE2A0; + case styling::Icon::Image: + return 0xE2CA; + case styling::Icon::Info: + return 0xE2CE; + case styling::Icon::Layout: + return 0xE6D6; + case styling::Icon::Lightbulb: + return 0xE2DC; + case styling::Icon::MagnifyingGlass: + return 0xE30C; + case styling::Icon::Material: + return 0xE6F0; + case styling::Icon::Monitor: + return 0xE32E; + case styling::Icon::MonitorPlay: + return 0xE58C; + case styling::Icon::Mountains: + return 0xE7AE; + case styling::Icon::MusicNote: + return 0xE33C; + case styling::Icon::Package: + return 0xE390; + case styling::Icon::PaintBrush: + return 0xE6F0; + case styling::Icon::Palette: + return 0xE6C8; + case styling::Icon::Pause: + return 0xE39E; + case styling::Icon::Play: + return 0xE3D0; + case styling::Icon::Plus: + return 0xE3D4; + case styling::Icon::RocketLaunch: + return 0xE3FE; + case styling::Icon::Rows: + return 0xE5A2; + case styling::Icon::Sidebar: + return 0xEAB6; + case styling::Icon::SkipForward: + return 0xE5A6; + case styling::Icon::SlidersHorizontal: + return 0xE434; + case styling::Icon::Sparkle: + return 0xE6A2; + case styling::Icon::SpeakerHigh: + return 0xE44A; + case styling::Icon::Sphere: + return 0xEE66; + case styling::Icon::SquaresFour: + return 0xE464; + case styling::Icon::Stack: + return 0xE466; + case styling::Icon::Stop: + return 0xE46C; + case styling::Icon::Sun: + return 0xE472; + case styling::Icon::TerminalWindow: + return 0xEAE8; + case styling::Icon::Trash: + return 0xE4A6; + case styling::Icon::TreeStructure: + return 0xE67C; + case styling::Icon::Warning: + return 0xE4E0; + case styling::Icon::Waveform: + return 0xE802; + case styling::Icon::Wrench: + return 0xE5D4; + } + return 0xE230; +} + +QPixmap renderIcon(styling::Icon icon, const QColor &color, int size) { + QPixmap pixmap(size, size); + pixmap.fill(Qt::transparent); + QPainter painter(&pixmap); + painter.setRenderHint(QPainter::Antialiasing); + painter.setRenderHint(QPainter::TextAntialiasing); + painter.setPen(color); + QFont font(iconFamily); + font.setPixelSize(qRound(size * 0.82)); + font.setStyleStrategy(QFont::PreferAntialias); + painter.setFont(font); + painter.drawText(pixmap.rect(), Qt::AlignCenter, + QString(QChar(codepoint(icon)))); + return pixmap; +} + +} + +bool styling::loadIconFont() { + if (iconFontAttempted) + return !iconFamily.isEmpty(); + iconFontAttempted = true; + const int id = QFontDatabase::addApplicationFont( + ":/editor/assets/Phosphor.ttf"); + const QStringList families = QFontDatabase::applicationFontFamilies(id); + if (!families.isEmpty()) + iconFamily = families.first(); + return !iconFamily.isEmpty(); +} + +QIcon styling::icon(Icon icon, const QColor &color) { + loadIconFont(); + if (iconFamily.isEmpty()) + return {}; + QIcon result; + const QColor disabled("#566174"); + const QColor active = color.lighter(118); + for (const int size : {16, 20, 24, 32, 48}) { + result.addPixmap(renderIcon(icon, color, size), QIcon::Normal, + QIcon::Off); + result.addPixmap(renderIcon(icon, active, size), QIcon::Active, + QIcon::Off); + result.addPixmap(renderIcon(icon, disabled, size), QIcon::Disabled, + QIcon::Off); + } + return result; +} + +QIcon styling::colorSwatch(const QColor &color, const QSize &size) { + const QSize swatchSize = size.expandedTo(QSize(8, 8)); + QPixmap pixmap(swatchSize); + pixmap.fill(Qt::transparent); + QPainter painter(&pixmap); + painter.setRenderHint(QPainter::Antialiasing); + const QRectF bounds = QRectF(pixmap.rect()).adjusted(0.5, 0.5, -0.5, -0.5); + painter.setPen(Qt::NoPen); + painter.setBrush(QColor("#D0D0D0")); + painter.drawRoundedRect(bounds, 4.0, 4.0); + painter.save(); + QPainterPath clip; + clip.addRoundedRect(bounds, 4.0, 4.0); + painter.setClipPath(clip); + painter.fillRect(QRectF(bounds.left(), bounds.top(), bounds.width() / 2.0, + bounds.height() / 2.0), + QColor("#8A8A8A")); + painter.fillRect(QRectF(bounds.center().x(), bounds.center().y(), + bounds.width() / 2.0, bounds.height() / 2.0), + QColor("#8A8A8A")); + painter.fillRect(bounds, color); + painter.restore(); + painter.setBrush(Qt::NoBrush); + painter.setPen(QColor("#5B5D60")); + painter.drawRoundedRect(bounds, 4.0, 4.0); + return QIcon(pixmap); +} diff --git a/editor/styling/theme.cpp b/editor/styling/theme.cpp index b4d824d5..13440703 100644 --- a/editor/styling/theme.cpp +++ b/editor/styling/theme.cpp @@ -16,12 +16,12 @@ void styling::applyColorPalette(QApplication& app) { QPalette p; - const QColor bg = QColor("#222526"); - const QColor panel = QColor("#282C2E"); - const QColor panel2 = QColor("#1A1D1E"); - const QColor text = QColor("#DCE2E5"); - const QColor mutedText = QColor("#8F9AA0"); - const QColor accent = QColor("#3D8BFF"); + const QColor bg = QColor("#18191B"); + const QColor panel = QColor("#25272A"); + const QColor panel2 = QColor("#1E2022"); + const QColor text = QColor("#E7ECF3"); + const QColor mutedText = QColor("#8D9094"); + const QColor accent = QColor("#71808A"); p.setColor(QPalette::Window, bg); p.setColor(QPalette::WindowText, text); @@ -30,24 +30,24 @@ void styling::applyColorPalette(QApplication& app) { p.setColor(QPalette::ToolTipBase, panel2); p.setColor(QPalette::ToolTipText, text); p.setColor(QPalette::Text, text); - p.setColor(QPalette::Button, QColor("#303538")); + p.setColor(QPalette::Button, QColor("#2B2E31")); p.setColor(QPalette::ButtonText, text); p.setColor(QPalette::BrightText, QColor("#FFFFFF")); - p.setColor(QPalette::Light, QColor("#4A555B")); - p.setColor(QPalette::Midlight, QColor("#3A4246")); - p.setColor(QPalette::Mid, QColor("#303638")); - p.setColor(QPalette::Dark, QColor("#151819")); - p.setColor(QPalette::Shadow, QColor("#0D0F10")); + p.setColor(QPalette::Light, QColor("#505357")); + p.setColor(QPalette::Midlight, QColor("#424549")); + p.setColor(QPalette::Mid, QColor("#34373A")); + p.setColor(QPalette::Dark, QColor("#141517")); + p.setColor(QPalette::Shadow, QColor("#0D0E0F")); p.setColor(QPalette::Highlight, accent); p.setColor(QPalette::HighlightedText, QColor("#FFFFFF")); p.setColor(QPalette::PlaceholderText, mutedText); - p.setColor(QPalette::Disabled, QPalette::WindowText, QColor("#727B80")); - p.setColor(QPalette::Disabled, QPalette::Text, QColor("#727B80")); - p.setColor(QPalette::Disabled, QPalette::ButtonText, QColor("#727B80")); - p.setColor(QPalette::Disabled, QPalette::Button, QColor("#292D2F")); - p.setColor(QPalette::Disabled, QPalette::Base, QColor("#25292B")); - p.setColor(QPalette::Disabled, QPalette::Highlight, QColor("#34404A")); + p.setColor(QPalette::Disabled, QPalette::WindowText, QColor("#566174")); + p.setColor(QPalette::Disabled, QPalette::Text, QColor("#566174")); + p.setColor(QPalette::Disabled, QPalette::ButtonText, QColor("#566174")); + p.setColor(QPalette::Disabled, QPalette::Button, QColor("#232527")); + p.setColor(QPalette::Disabled, QPalette::Base, QColor("#202224")); + p.setColor(QPalette::Disabled, QPalette::Highlight, QColor("#3A4146")); app.setPalette(p); } diff --git a/editor/views/editor/editor.cpp b/editor/views/editor/editor.cpp index d80694e3..62b98f67 100644 --- a/editor/views/editor/editor.cpp +++ b/editor/views/editor/editor.cpp @@ -12,7 +12,9 @@ #include #include +#include #include +#include #include #include #include @@ -25,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -44,18 +47,24 @@ #include #include #include +#include #include #include #include +#include #include #include #include #include #include +#include +#include #include #include #include +#include #include +#include #include #include @@ -64,6 +73,7 @@ #include "DockManager.h" #include "editor/debug.h" +#include "editor/styling/icons.h" #include "editor/views/fileExplorer.h" #include "editor/views/hierarchyPanel.h" #include "editor/views/inspectorView.h" @@ -73,8 +83,52 @@ #include "editor/views/viewportTools.h" namespace { -constexpr int DockStateVersion = 8; -constexpr auto DockStateKey = "docking/state/v8"; +constexpr int DockStateVersion = 9; +constexpr auto DockStateKey = "docking/state/v9"; + +QIcon commandIcon(const QString &name) { + const QString command = name.toLower(); + if (command.contains("save")) + return styling::icon(styling::Icon::FloppyDisk, "#A1957D"); + if (command.contains("open")) + return styling::icon(styling::Icon::FolderOpen, "#7E929C"); + if (command.contains("new") || command.contains("create") || + command.contains("add")) + return styling::icon(styling::Icon::Plus, "#8498A8"); + if (command.contains("export")) + return styling::icon(styling::Icon::Export, "#7E929C"); + if (command.contains("build")) + return styling::icon(styling::Icon::Package, "#A1957D"); + if (command.contains("run") || command.contains("play")) + return styling::icon(styling::Icon::RocketLaunch, "#849589"); + if (command.contains("stop")) + return styling::icon(styling::Icon::Stop, "#A17F7F"); + if (command.contains("reload") || command.contains("refresh") || + command.contains("undo")) + return styling::icon(styling::Icon::ArrowCounterClockwise, "#7E929C"); + if (command.contains("redo")) + return styling::icon(styling::Icon::ArrowClockwise, "#7E929C"); + if (command.contains("settings")) + return styling::icon(styling::Icon::Gear, "#8498A8"); + if (command.contains("find") || command.contains("search") || + command.contains("palette")) + return styling::icon(styling::Icon::MagnifyingGlass, "#7E929C"); + if (command.contains("screenshot")) + return styling::icon(styling::Icon::Camera, "#9E897D"); + if (command.contains("delete") || command.contains("remove")) + return styling::icon(styling::Icon::Trash, "#A17F7F"); + if (command.contains("layout") || command.contains("window")) + return styling::icon(styling::Icon::Layout, "#8498A8"); + if (command.contains("close") || command.contains("quit")) + return styling::icon(styling::Icon::Close, "#A17F7F"); + if (command.contains("camera")) + return styling::icon(styling::Icon::Camera, "#9E897D"); + if (command.contains("light")) + return styling::icon(styling::Icon::Lightbulb, "#A1957D"); + if (command.contains("object")) + return styling::icon(styling::Icon::Cube, "#8498A8"); + return {}; +} bool copyExportPath(const QString &sourcePath, const QString &destinationPath, QString *error) { @@ -176,6 +230,7 @@ EditorWindow::EditorWindow(const QString &projectFile, QWidget *parent) setupWindow(); setupMenus(); setupDocks(); + setupWorkspaceBar(); restoreLayout(); qApp->installEventFilter(this); @@ -186,8 +241,10 @@ void EditorWindow::setupWindow() { const auto project = ProjectStore::projectInfo(projectFile); projectName = project.has_value() ? project->name : QStringLiteral("Project"); updateWindowTitle(false); - resize(1280, 720); + setMinimumSize(1100, 700); + resize(1440, 900); menuBar()->setNativeMenuBar(true); + menuBar()->setObjectName("atlasMenuBar"); ads::CDockManager::setConfigFlag(ads::CDockManager::OpaqueSplitterResize, true); @@ -229,6 +286,7 @@ void EditorWindow::setupMenus() { const QString &shortcut, const std::function &handler) { QAction *action = menu->addAction(name, this, handler); + action->setIcon(commandIcon(name)); if (!shortcut.isEmpty()) { const bool plainShift = shortcut.startsWith("Shift+") && !shortcut.contains("Meta+") && @@ -248,6 +306,8 @@ void EditorWindow::setupMenus() { addCommand(fileMenu, "New Scene", "Meta+N", [this] { createScene(); }); addCommand(fileMenu, "Open Scene…", "Meta+O", [this] { openScene(); }); auto *saveAction = fileMenu->addAction("Save Scene"); + saveAction->setIcon( + styling::icon(styling::Icon::FloppyDisk, "#A1957D")); saveAction->setShortcut(QKeySequence::Save); saveAction->setShortcutContext(Qt::ApplicationShortcut); connect(saveAction, &QAction::triggered, this, [this] { @@ -279,6 +339,8 @@ void EditorWindow::setupMenus() { auto *editMenu = menuBar()->addMenu("Edit"); auto *undoAction = editMenu->addAction("Undo"); + undoAction->setIcon( + styling::icon(styling::Icon::ArrowCounterClockwise, "#7E929C")); undoAction->setShortcut(QKeySequence::Undo); undoAction->setShortcutContext(Qt::ApplicationShortcut); connect(undoAction, &QAction::triggered, this, [this] { @@ -293,6 +355,8 @@ void EditorWindow::setupMenus() { } }); auto *redoAction = editMenu->addAction("Redo"); + redoAction->setIcon( + styling::icon(styling::Icon::ArrowClockwise, "#7E929C")); redoAction->setShortcut(QKeySequence::Redo); redoAction->setShortcutContext(Qt::ApplicationShortcut); connect(redoAction, &QAction::triggered, this, [this] { @@ -416,13 +480,15 @@ void EditorWindow::setupMenus() { viewMenu = menuBar()->addMenu("View"); auto *resetLayoutAction = viewMenu->addAction("Reset Layout"); + resetLayoutAction->setIcon( + styling::icon(styling::Icon::Layout, "#8498A8")); connect(resetLayoutAction, &QAction::triggered, this, [this] { if (coreManager != nullptr && !defaultDockState.isEmpty()) { restoringLayout = true; coreManager->restoreState(defaultDockState, DockStateVersion); restoringLayout = false; configureDockSplitters(); - if (auto *dock = dockManager->panel("viewport")) + if (auto *dock = dockManager->panel("workspace")) dock->setAsCurrentTab(); scheduleLayoutSave(); } @@ -498,6 +564,7 @@ void EditorWindow::setupMenus() { QStringLiteral("Atlas Engine %1\nby Neutral Software") .arg(QStringLiteral(ATLAS_VERSION))); }); + aboutAction->setIcon(styling::icon(styling::Icon::Info, "#7E929C")); aboutAction->setMenuRole(QAction::AboutRole); } @@ -515,20 +582,29 @@ void EditorWindow::setupDocks() { emit startupReady(success, message); }); viewportTools = new ViewportTools(viewportPanel, projectFile); - auto *viewportDock = dockManager->addPanel( - {.id = "viewport", - .title = "Viewport", - .widget = viewportTools, + materialEditorPanel = new MaterialEditorPanel(viewportPanel); + postProcessingPanel = new PostProcessingPanel(viewportPanel); + workspaceStack = new QStackedWidget(this); + workspaceStack->setObjectName("editorWorkspaceStack"); + workspaceStack->addWidget(viewportTools); + workspaceStack->addWidget(materialEditorPanel); + workspaceStack->addWidget(postProcessingPanel); + workspaceStack->setCurrentIndex(0); + auto *workspaceDock = dockManager->addPanel( + {.id = "workspace", + .title = "Workspace", + .widget = workspaceStack, .area = EditorDockArea::Center, - .icon = style()->standardIcon(QStyle::SP_DirOpenIcon)}); + .icon = styling::icon(styling::Icon::CubeFocus, "#7E929C")}); + workspaceDock->setFeature(ads::CDockWidget::NoTab, true); hierarchyPanel = new HierarchyPanel(viewportPanel); auto *hierarchyDock = dockManager->addPanel( {.id = "hierarchy", - .title = "Hierarchy Panel", + .title = "Scene", .widget = hierarchyPanel, .area = EditorDockArea::Left, - .icon = style()->standardIcon(QStyle::SP_DirOpenIcon)}); + .icon = styling::icon(styling::Icon::TreeStructure, "#8498A8")}); inspectorPanel = new InspectorPanel(viewportPanel, projectFile); auto *inspectorDock = dockManager->addPanel( @@ -536,7 +612,7 @@ void EditorWindow::setupDocks() { .title = "Inspector", .widget = inspectorPanel, .area = EditorDockArea::Right, - .icon = style()->standardIcon(QStyle::SP_DirOpenIcon)}); + .icon = styling::icon(styling::Icon::SlidersHorizontal, "#A1957D")}); contentBrowser = new ContentBrowserPanel(projectFile); auto *contentDock = dockManager->addPanel( @@ -544,34 +620,13 @@ void EditorWindow::setupDocks() { .title = "Content Browser", .widget = contentBrowser, .area = EditorDockArea::Bottom, - .icon = style()->standardIcon(QStyle::SP_DirOpenIcon)}); + .icon = styling::icon(styling::Icon::FolderOpen, "#7E929C")}); - materialEditorPanel = new MaterialEditorPanel(viewportPanel); - auto *materialDock = dockManager->addPanel( - {.id = "materialEditor", - .title = "Material Editor", - .widget = materialEditorPanel, - .area = EditorDockArea::Right, - .icon = style()->standardIcon(QStyle::SP_FileDialogContentsView)}); - coreManager->addDockWidgetTabToArea(materialDock, - viewportDock->dockAreaWidget()); - - postProcessingPanel = new PostProcessingPanel(viewportPanel); - auto *postProcessingDock = dockManager->addPanel( - {.id = "postProcessing", - .title = "Post Processing", - .widget = postProcessingPanel, - .area = EditorDockArea::Right, - .icon = style()->standardIcon(QStyle::SP_ComputerIcon)}); - coreManager->addDockWidgetTabToArea(postProcessingDock, - viewportDock->dockAreaWidget()); - - viewportDock->setAsCurrentTab(); + workspaceDock->setAsCurrentTab(); defaultDockState = coreManager->saveState(DockStateVersion); const QList managedDocks{ - viewportDock, hierarchyDock, inspectorDock, contentDock, - materialDock, postProcessingDock}; + workspaceDock, hierarchyDock, inspectorDock, contentDock}; for (ads::CDockWidget *dock : managedDocks) { connect(dock, &ads::CDockWidget::topLevelChanged, this, [this](bool) { scheduleLayoutSave(); }); @@ -588,29 +643,48 @@ void EditorWindow::setupDocks() { if (windowMenu != nullptr) { windowMenu->addSeparator(); for (ads::CDockWidget *dock : managedDocks) { - dock->toggleViewAction()->setIcon({}); + dock->toggleViewAction()->setIcon(dock->icon()); windowMenu->addAction(dock->toggleViewAction()); } windowMenu->addSeparator(); - const QList> workspaces{ - {"Viewport", viewportDock}, - {"Material Editor", materialDock}, - {"Post Processing", postProcessingDock}, - {"Hierarchy", hierarchyDock}, + const QList> panels{ + {"Workspace", workspaceDock}, {"Hierarchy", hierarchyDock}, {"Inspector", inspectorDock}, {"Content Browser", contentDock}}; - for (int index = 0; index < workspaces.size(); ++index) { - const auto &[name, dock] = workspaces.at(index); + for (int index = 0; index < panels.size(); ++index) { + const auto &[name, dock] = panels.at(index); auto *action = windowMenu->addAction( QStringLiteral("Focus %1").arg(name), this, [dock] { dock->toggleView(true); dock->setAsCurrentTab(); dock->raise(); }); + action->setIcon(dock->icon()); action->setShortcut(QKeySequence( QStringLiteral("Ctrl+%1").arg(index + 1))); action->setShortcutContext(Qt::ApplicationShortcut); } + windowMenu->addSeparator(); + const QList> workspaceModes{ + {"Scene", 0}, {"Shading", 1}, {"Post-Processing", 2}}; + for (const auto &[name, index] : workspaceModes) { + auto *action = windowMenu->addAction( + QStringLiteral("Open %1 Workspace").arg(name), this, + [this, workspaceDock, index] { + activateWorkspace(index); + workspaceDock->toggleView(true); + workspaceDock->setAsCurrentTab(); + workspaceDock->raise(); + }); + action->setIcon(index == 0 + ? styling::icon(styling::Icon::CubeFocus, + "#7E929C") + : index == 1 + ? styling::icon(styling::Icon::Material, + "#A1957D") + : styling::icon(styling::Icon::FilmStrip, + "#849589")); + } } connect(hierarchyPanel, &HierarchyPanel::objectActivated, inspectorPanel, @@ -635,10 +709,9 @@ void EditorWindow::setupDocks() { this->inspectorPanel->inspectFile(path); }); connect(contentBrowser, &ContentBrowserPanel::assetActivated, this, - [this, materialDock](const QString &path) { + [this](const QString &path) { materialEditorPanel->openMaterial(path); - materialDock->toggleView(true); - materialDock->raise(); + activateWorkspace(1); }); connect(contentBrowser, &ContentBrowserPanel::sceneActivated, this, [this](const QString &path) { @@ -650,6 +723,124 @@ void EditorWindow::setupDocks() { }); } +void EditorWindow::setupWorkspaceBar() { + auto *bar = new QToolBar("Workspace", this); + bar->setObjectName("workspaceBar"); + bar->setMovable(false); + bar->setFloatable(false); + bar->setIconSize(QSize(17, 17)); + bar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + addToolBar(Qt::TopToolBarArea, bar); + + auto *identity = new QWidget(bar); + identity->setObjectName("workspaceIdentity"); + auto *identityLayout = new QHBoxLayout(identity); + identityLayout->setContentsMargins(10, 0, 14, 0); + identityLayout->setSpacing(8); + auto *mark = new QLabel(identity); + mark->setObjectName("workspaceMark"); + mark->setPixmap(windowIcon().pixmap(22, 22)); + auto *brand = new QLabel("ATLAS", identity); + brand->setObjectName("workspaceBrand"); + auto *project = new QLabel(projectName, identity); + project->setObjectName("workspaceProject"); + identityLayout->addWidget(mark); + identityLayout->addWidget(brand); + identityLayout->addWidget(project); + bar->addWidget(identity); + + workspaceModeGroup = new QButtonGroup(bar); + workspaceModeGroup->setExclusive(true); + auto addMode = [this, bar](const QString &text, styling::Icon icon, + const QColor &color, int index, + bool selected = false) { + auto *button = new QToolButton(bar); + button->setObjectName("workspaceModeButton"); + button->setText(text); + button->setIcon(styling::icon(icon, color)); + button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + button->setCheckable(true); + button->setChecked(selected); + workspaceModeGroup->addButton(button, index); + bar->addWidget(button); + connect(button, &QToolButton::clicked, this, + [this, index] { activateWorkspace(index); }); + }; + addMode("Scene", styling::Icon::CubeFocus, "#7E929C", 0, true); + addMode("Shading", styling::Icon::Material, "#A1957D", 1); + addMode("Post-Processing", styling::Icon::FilmStrip, "#849589", 2); + + auto *spacer = new QWidget(bar); + spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + bar->addWidget(spacer); + + auto *save = new QToolButton(bar); + save->setObjectName("workspaceUtilityButton"); + save->setIcon(styling::icon(styling::Icon::FloppyDisk, "#A1957D")); + save->setToolTip("Save Scene"); + bar->addWidget(save); + connect(save, &QToolButton::clicked, this, [this] { + if (materialEditorPanel != nullptr && materialEditorPanel->isVisible()) + materialEditorPanel->saveMaterial(); + if (viewportPanel != nullptr) + viewportPanel->saveRuntimeScene(); + }); + + auto *build = new QToolButton(bar); + build->setObjectName("workspaceBuildButton"); + build->setIcon(styling::icon(styling::Icon::Package, "#A1957D")); + build->setToolTip("Build Project"); + bar->addWidget(build); + connect(build, &QToolButton::clicked, this, + [this] { runProjectCommand(true); }); + + auto *launch = new QToolButton(bar); + launch->setObjectName("workspaceLaunchButton"); + launch->setIcon(styling::icon(styling::Icon::RocketLaunch, "#849589")); + launch->setToolTip("Run Project"); + bar->addWidget(launch); + connect(launch, &QToolButton::clicked, this, + [this] { runProjectCommand(false); }); + + statusBar()->setObjectName("atlasStatusBar"); + statusBar()->showMessage("Ready"); + auto *runtimeIcon = new QLabel(statusBar()); + runtimeIcon->setObjectName("statusRuntimeIcon"); + runtimeIcon->setPixmap( + styling::icon(styling::Icon::Check, "#849589").pixmap(14, 14)); + auto *renderer = new QLabel(statusBar()); + renderer->setObjectName("statusRenderer"); + const auto projectInfo = ProjectStore::projectInfo(projectFile); + renderer->setText(projectInfo.has_value() ? projectInfo->renderer + : QStringLiteral("ATLAS")); + auto *version = new QLabel(QStringLiteral(ATLAS_VERSION), statusBar()); + version->setObjectName("statusVersion"); + statusBar()->addPermanentWidget(runtimeIcon); + statusBar()->addPermanentWidget(renderer); + statusBar()->addPermanentWidget(version); + connect(viewportPanel, &ViewportPanel::runtimeAvailabilityChanged, this, + [this, runtimeIcon](bool available) { + runtimeIcon->setPixmap(styling::icon( + available ? styling::Icon::Check : styling::Icon::Warning, + available ? QColor("#849589") : QColor("#A1957D")) + .pixmap(14, 14)); + statusBar()->showMessage(available ? "Runtime ready" + : "Runtime unavailable", + 3000); + }); +} + +void EditorWindow::activateWorkspace(int index) { + if (workspaceStack == nullptr || index < 0 || + index >= workspaceStack->count()) + return; + workspaceStack->setCurrentIndex(index); + if (workspaceModeGroup != nullptr) { + if (auto *button = workspaceModeGroup->button(index)) + button->setChecked(true); + } +} + void EditorWindow::createScene() { const QString root = QFileInfo(projectFile).absolutePath(); QString path = QFileDialog::getSaveFileName( @@ -716,23 +907,44 @@ void EditorWindow::saveSceneAs() { void EditorWindow::showProjectSettings() { QDialog dialog(this); + dialog.setObjectName("projectSettingsDialog"); dialog.setWindowTitle("Project Settings"); dialog.resize(720, 520); auto *layout = new QVBoxLayout(&dialog); + auto *header = new QFrame(&dialog); + header->setObjectName("dialogHero"); + auto *headerLayout = new QHBoxLayout(header); + auto *headerIcon = new QLabel(header); + headerIcon->setObjectName("dialogHeroIcon"); + headerIcon->setPixmap( + styling::icon(styling::Icon::Gear, "#8498A8").pixmap(28, 28)); + auto *headerCopy = new QVBoxLayout(); + auto *headerTitle = new QLabel("Project Settings", header); + headerTitle->setObjectName("dialogHeroTitle"); + auto *headerSubtitle = new QLabel( + "Configure runtime, rendering, controls, and packaging for this project.", + header); + headerSubtitle->setObjectName("dialogHeroSubtitle"); + headerCopy->addWidget(headerTitle); + headerCopy->addWidget(headerSubtitle); + headerLayout->addWidget(headerIcon); + headerLayout->addLayout(headerCopy, 1); + layout->addWidget(header); auto *tabs = new QTabWidget(&dialog); const QString settingsDirectory = QDir(QFileInfo(projectFile).absolutePath()).filePath(".atlas"); QDir().mkpath(settingsDirectory); QSettings settings(QDir(settingsDirectory).filePath("project-settings.ini"), QSettings::IniFormat); - auto addPage = [tabs](const QString &name) { + auto addPage = [tabs](const QString &name, styling::Icon icon, + const QColor &color) { auto *page = new QWidget(tabs); auto *form = new QFormLayout(page); form->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); - tabs->addTab(page, name); + tabs->addTab(page, styling::icon(icon, color), name); return form; }; - auto *general = addPage("General"); + auto *general = addPage("General", styling::Icon::Gear, "#8498A8"); auto *defaultScene = new QComboBox(&dialog); QDirIterator sceneIterator(QFileInfo(projectFile).absolutePath(), {"*.ascene"}, QDir::Files, @@ -769,7 +981,8 @@ void EditorWindow::showProjectSettings() { general->addRow("Window width", windowWidth); general->addRow("Window height", windowHeight); general->addRow(QString(), fullscreen); - auto *rendering = addPage("Rendering"); + auto *rendering = + addPage("Rendering", styling::Icon::Aperture, "#9E897D"); auto *renderer = new QComboBox(&dialog); renderer->addItems({"PBR", "PBR + DDGI", "Path Tracing"}); renderer->setCurrentText(settings.value("project/renderer", "PBR").toString()); @@ -778,31 +991,33 @@ void EditorWindow::showProjectSettings() { frameLimit->setValue(settings.value("project/frameLimit", 0).toInt()); rendering->addRow("Renderer", renderer); rendering->addRow("Frame limit (0 = unlimited)", frameLimit); - auto *physics = addPage("Physics"); + auto *physics = addPage("Physics", styling::Icon::Wrench, "#A1957D"); auto *gravity = new QLineEdit(settings.value("project/gravity", "0, -9.81, 0").toString(), &dialog); auto *fixedStep = new QLineEdit(settings.value("project/fixedStep", "0.0166667").toString(), &dialog); physics->addRow("Gravity", gravity); physics->addRow("Fixed timestep", fixedStep); - auto *input = addPage("Input"); + auto *input = + addPage("Input", styling::Icon::GameController, "#849589"); auto *inputMap = new QLineEdit(settings.value("project/inputMap", "input.json").toString(), &dialog); auto *controller = new QComboBox(&dialog); controller->addItems({"Automatic", "Keyboard + Mouse", "Gamepad"}); controller->setCurrentText(settings.value("project/controller", "Automatic").toString()); input->addRow("Input map", inputMap); input->addRow("Primary controller", controller); - auto *build = addPage("Build & Run"); + auto *build = addPage("Build & Run", styling::Icon::Package, "#A1957D"); auto *buildCommand = new QLineEdit(settings.value("project/buildCommand", "atlas pack --backend METAL").toString(), &dialog); auto *runCommand = new QLineEdit(settings.value("project/runCommand", "atlas run project.atlas").toString(), &dialog); build->addRow("Build command", buildCommand); build->addRow("Run command", runCommand); - auto *editor = addPage("Editor"); + auto *editor = addPage("Editor", styling::Icon::Layout, "#7E929C"); auto *autosave = new QSpinBox(&dialog); autosave->setRange(0, 120); autosave->setValue(settings.value("project/autosaveMinutes", 5).toInt()); auto *snap = new QLineEdit(settings.value("project/snapIncrement", "0.5").toString(), &dialog); editor->addRow("Autosave interval (minutes)", autosave); editor->addRow("Transform snapping", snap); - auto *packaging = addPage("Packaging"); + auto *packaging = + addPage("Packaging", styling::Icon::Export, "#8498A8"); auto *identifier = new QLineEdit( settings.value("project/bundleIdentifier", "org.atlasengine." + projectName.toLower().replace(' ', '-')) @@ -820,6 +1035,8 @@ void EditorWindow::showProjectSettings() { layout->addWidget(tabs); auto *buttons = new QDialogButtonBox( QDialogButtonBox::Cancel | QDialogButtonBox::Save, &dialog); + buttons->button(QDialogButtonBox::Save) + ->setIcon(styling::icon(styling::Icon::FloppyDisk, "#A1957D")); layout->addWidget(buttons); connect(buttons, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); connect(buttons, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); @@ -888,9 +1105,29 @@ void EditorWindow::showProjectSettings() { void EditorWindow::showExportDialog() { QDialog dialog(this); + dialog.setObjectName("exportDialog"); dialog.setWindowTitle("Export Atlas Project"); dialog.resize(660, 460); auto *layout = new QVBoxLayout(&dialog); + auto *header = new QFrame(&dialog); + header->setObjectName("dialogHero"); + auto *headerLayout = new QHBoxLayout(header); + auto *headerIcon = new QLabel(header); + headerIcon->setObjectName("dialogHeroIcon"); + headerIcon->setPixmap( + styling::icon(styling::Icon::Export, "#849589").pixmap(28, 28)); + auto *headerCopy = new QVBoxLayout(); + auto *headerTitle = new QLabel("Export Project", header); + headerTitle->setObjectName("dialogHeroTitle"); + auto *headerSubtitle = new QLabel( + "Package the current project into a distributable application.", + header); + headerSubtitle->setObjectName("dialogHeroSubtitle"); + headerCopy->addWidget(headerTitle); + headerCopy->addWidget(headerSubtitle); + headerLayout->addWidget(headerIcon); + headerLayout->addLayout(headerCopy, 1); + layout->addWidget(header); auto *form = new QFormLayout; auto *platform = new QComboBox(&dialog); #ifdef Q_OS_MACOS @@ -921,6 +1158,8 @@ void EditorWindow::showExportDialog() { .toString(), &dialog); auto *browse = new QPushButton("Choose…", &dialog); + browse->setIcon( + styling::icon(styling::Icon::FolderOpen, "#7E929C")); auto *outputRow = new QWidget(&dialog); auto *outputLayout = new QHBoxLayout(outputRow); outputLayout->setContentsMargins(0, 0, 0, 0); @@ -934,6 +1173,7 @@ void EditorWindow::showExportDialog() { auto *summary = new QLabel( "Atlas will save the current scene and package the configured runtime with the project resources.", &dialog); + summary->setObjectName("exportSummary"); summary->setWordWrap(true); layout->addWidget(summary); auto *progress = new QProgressBar(&dialog); @@ -941,12 +1181,17 @@ void EditorWindow::showExportDialog() { progress->setVisible(false); layout->addWidget(progress); auto *log = new QPlainTextEdit(&dialog); + log->setObjectName("exportLog"); log->setReadOnly(true); log->setPlaceholderText("Packaging output will appear here."); layout->addWidget(log, 1); auto *buttons = new QDialogButtonBox(QDialogButtonBox::Cancel, &dialog); auto *exportButton = buttons->addButton("Export", QDialogButtonBox::AcceptRole); + exportButton->setIcon( + styling::icon(styling::Icon::RocketLaunch, "#849589")); auto *revealButton = buttons->addButton("Reveal Export", QDialogButtonBox::ActionRole); + revealButton->setIcon( + styling::icon(styling::Icon::FolderOpen, "#7E929C")); revealButton->setEnabled(false); layout->addWidget(buttons); connect(browse, &QPushButton::clicked, &dialog, [&dialog, output] { @@ -1063,13 +1308,16 @@ void EditorWindow::showExportDialog() { void EditorWindow::showCommandPalette() { QDialog dialog(this); + dialog.setObjectName("commandPaletteDialog"); dialog.setWindowTitle("Command Palette"); dialog.setWindowFlags(dialog.windowFlags() | Qt::FramelessWindowHint); dialog.resize(620, 430); auto *layout = new QVBoxLayout(&dialog); auto *search = new QLineEdit(&dialog); + search->setObjectName("commandPaletteSearch"); search->setPlaceholderText("Type a command…"); auto *commands = new QListWidget(&dialog); + commands->setObjectName("commandPaletteList"); layout->addWidget(search); layout->addWidget(commands, 1); const QList actions = findChildren(); @@ -1080,6 +1328,7 @@ void EditorWindow::showCommandPalette() { } auto *item = new QListWidgetItem(commands); item->setText(action->text().remove('&')); + item->setIcon(action->icon()); item->setData(Qt::UserRole, QVariant::fromValue( reinterpret_cast(action))); @@ -1160,13 +1409,16 @@ void EditorWindow::showCommandPalette() { void EditorWindow::showGlobalSearch() { QDialog dialog(this); + dialog.setObjectName("globalSearchDialog"); dialog.setWindowTitle("Search Atlas Project"); dialog.setWindowFlags(dialog.windowFlags() | Qt::FramelessWindowHint); dialog.resize(680, 460); auto *layout = new QVBoxLayout(&dialog); auto *search = new QLineEdit(&dialog); + search->setObjectName("globalSearchField"); search->setPlaceholderText("Search scenes, assets, and commands…"); auto *results = new QListWidget(&dialog); + results->setObjectName("globalSearchResults"); layout->addWidget(search); layout->addWidget(results, 1); constexpr int SearchKindRole = Qt::UserRole + 1; @@ -1182,6 +1434,7 @@ void EditorWindow::showGlobalSearch() { continue; auto *item = new QListWidgetItem( QStringLiteral("Asset %1").arg(relative), results); + item->setIcon(styling::icon(styling::Icon::File, "#7E929C")); item->setToolTip(path); item->setData(SearchKindRole, 0); item->setData(SearchValueRole, path); @@ -1200,6 +1453,8 @@ void EditorWindow::showGlobalSearch() { if (!name.isEmpty() && id >= 0) { auto *item = new QListWidgetItem( QStringLiteral("Object %1").arg(name), results); + item->setIcon( + styling::icon(styling::Icon::Cube, "#8498A8")); item->setToolTip(object.value("type").toString()); item->setData(SearchKindRole, 1); item->setData(SearchValueRole, id); @@ -1216,6 +1471,7 @@ void EditorWindow::showGlobalSearch() { auto *item = new QListWidgetItem( QStringLiteral("Command %1").arg(action->text().remove('&')), results); + item->setIcon(action->icon()); item->setData(SearchKindRole, 2); item->setData( SearchValueRole, @@ -1442,7 +1698,7 @@ void EditorWindow::configureDockSplitters() { if (coreManager == nullptr) return; for (QSplitter *splitter : coreManager->findChildren()) { - splitter->setHandleWidth(6); + splitter->setHandleWidth(4); splitter->setOpaqueResize(true); splitter->setChildrenCollapsible(false); if (!splitter->property("atlasLayoutTracking").toBool()) { diff --git a/editor/views/editor/hierarchy.cpp b/editor/views/editor/hierarchy.cpp index c1857df3..27c08682 100644 --- a/editor/views/editor/hierarchy.cpp +++ b/editor/views/editor/hierarchy.cpp @@ -8,6 +8,7 @@ */ #include +#include #include #include @@ -40,43 +41,27 @@ namespace { constexpr int ObjectIdRole = Qt::UserRole + 1; constexpr int ObjectTypeRole = Qt::UserRole + 2; -QIcon hierarchyIcon(QWidget *widget, const QString &type) { +QIcon hierarchyIcon(QWidget *, const QString &type) { const QString normalized = type.toLower(); - QStyle::StandardPixmap fallback = QStyle::SP_FileIcon; - QString themeName = "application-x-executable"; - - if (normalized == "scene") { - fallback = QStyle::SP_DesktopIcon; - themeName = "view-grid"; - } else if (normalized == "compound" || normalized == "group") { - fallback = QStyle::SP_DirClosedIcon; - themeName = "folder"; - } else if (normalized == "camera") { - fallback = QStyle::SP_ComputerIcon; - themeName = "camera-photo"; - } else if (normalized == "environment") { - fallback = QStyle::SP_DesktopIcon; - themeName = "weather-clear"; - } else if (normalized.contains("light") || normalized == "sun") { - fallback = QStyle::SP_MessageBoxInformation; - themeName = "weather-clear"; - } else if (normalized == "terrain" || normalized == "landscape") { - fallback = QStyle::SP_DriveHDIcon; - themeName = "applications-graphics"; - } else if (normalized == "particleemitter" || normalized == "particles") { - fallback = QStyle::SP_BrowserReload; - themeName = "weather-showers-scattered"; - } else if (normalized == "model") { - fallback = QStyle::SP_FileDialogContentsView; - themeName = "model"; - } else if (normalized == "cube" || normalized == "sphere" || - normalized == "plane" || normalized == "pyramid" || - normalized == "capsule" || normalized == "solid") { - fallback = QStyle::SP_DirIcon; - themeName = "applications-games"; - } - - return QIcon::fromTheme(themeName, widget->style()->standardIcon(fallback)); + if (normalized == "scene") + return styling::icon(styling::Icon::CubeFocus, "#7E929C"); + if (normalized == "compound" || normalized == "group") + return styling::icon(styling::Icon::Folder, "#8490A4"); + if (normalized == "camera") + return styling::icon(styling::Icon::Camera, "#9E897D"); + if (normalized == "environment") + return styling::icon(styling::Icon::Globe, "#7E929C"); + if (normalized.contains("light") || normalized == "sun") + return styling::icon(styling::Icon::Lightbulb, "#A1957D"); + if (normalized == "terrain" || normalized == "landscape") + return styling::icon(styling::Icon::Mountains, "#849589"); + if (normalized == "particleemitter" || normalized == "particles") + return styling::icon(styling::Icon::Sparkle, "#8498A8"); + if (normalized == "model") + return styling::icon(styling::Icon::Cube, "#7E929C"); + if (normalized == "sphere") + return styling::icon(styling::Icon::Sphere, "#8498A8"); + return styling::icon(styling::Icon::Cube, "#8498A8"); } QString objectSignature(const QJsonArray &objects) { @@ -109,7 +94,7 @@ HierarchyPanel::HierarchyPanel(ViewportPanel *viewport, QWidget *parent) addButton = new QToolButton(toolbar); addButton->setObjectName("panelAddButton"); - addButton->setIcon(style()->standardIcon(QStyle::SP_FileDialogNewFolder)); + addButton->setIcon(styling::icon(styling::Icon::Plus, "#8498A8")); addButton->setText("Add"); addButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); addButton->setPopupMode(QToolButton::InstantPopup); @@ -118,7 +103,7 @@ HierarchyPanel::HierarchyPanel(ViewportPanel *viewport, QWidget *parent) moreButton = new QToolButton(toolbar); moreButton->setObjectName("panelMoreButton"); moreButton->setIcon( - style()->standardIcon(QStyle::SP_ToolBarHorizontalExtensionButton)); + styling::icon(styling::Icon::DotsVertical, "#8490A4")); moreButton->setPopupMode(QToolButton::InstantPopup); moreButton->setToolTip("Hierarchy actions"); @@ -447,12 +432,16 @@ void HierarchyPanel::showContextMenu(const QPoint &position) { } if (index.isValid() && selectedObjectId() >= 0) { menu.addSeparator(); - menu.addAction("Focus", this, &HierarchyPanel::focusSelectedObject); - menu.addAction("Rename", this, &HierarchyPanel::renameSelectedObject); - menu.addAction("Move to Scene Root", this, + menu.addAction(styling::icon(styling::Icon::Crosshair, "#7E929C"), + "Focus", this, &HierarchyPanel::focusSelectedObject); + menu.addAction(styling::icon(styling::Icon::File, "#8498A8"), + "Rename", this, &HierarchyPanel::renameSelectedObject); + menu.addAction(styling::icon(styling::Icon::TreeStructure, "#849589"), + "Move to Scene Root", this, &HierarchyPanel::moveSelectedObjectToRoot); menu.addSeparator(); - menu.addAction("Delete", this, &HierarchyPanel::deleteSelectedObject); + menu.addAction(styling::icon(styling::Icon::Trash, "#A17F7F"), + "Delete", this, &HierarchyPanel::deleteSelectedObject); } menu.exec(treeView->viewport()->mapToGlobal(position)); } diff --git a/editor/views/editor/inspector.cpp b/editor/views/editor/inspector.cpp index 8b371482..c5294485 100644 --- a/editor/views/editor/inspector.cpp +++ b/editor/views/editor/inspector.cpp @@ -8,6 +8,7 @@ */ #include +#include #include #include @@ -170,44 +171,35 @@ bool isColorProperty(const QString &name, const QJsonArray &array) { (array.size() == 3 || array.size() == 4) && isNumericArray(array); } -QIcon inspectorIcon(QWidget *widget, const QString &type) { +QIcon inspectorIcon(QWidget *, const QString &type) { const QString normalized = type.toLower(); - QStyle::StandardPixmap fallback = QStyle::SP_FileIcon; - QString themeName = "application-x-executable"; - if (normalized == "folder") { - fallback = QStyle::SP_DirIcon; - themeName = "folder"; - } else if (normalized.contains("camera")) { - fallback = QStyle::SP_ComputerIcon; - themeName = "camera-photo"; - } else if (normalized.contains("environment") || - normalized.contains("atmosphere")) { - fallback = QStyle::SP_DesktopIcon; - themeName = "weather-clear"; - } else if (normalized.contains("light") || normalized == "sun") { - fallback = QStyle::SP_MessageBoxInformation; - themeName = "weather-clear"; - } else if (normalized.contains("terrain")) { - fallback = QStyle::SP_DriveHDIcon; - themeName = "applications-graphics"; - } else if (normalized.contains("particle")) { - fallback = QStyle::SP_BrowserReload; - themeName = "weather-showers-scattered"; - } else if (normalized.contains("audio") || normalized == "wav" || - normalized == "mp3" || normalized == "ogg" || - normalized == "flac") { - fallback = QStyle::SP_MediaVolume; - themeName = "audio-x-generic"; - } else if (normalized == "model") { - fallback = QStyle::SP_FileDialogContentsView; - themeName = "model"; - } else if (normalized == "solid" || normalized == "cube" || - normalized == "sphere" || normalized == "plane" || - normalized == "pyramid" || normalized == "capsule") { - fallback = QStyle::SP_DirIcon; - themeName = "applications-games"; - } - return QIcon::fromTheme(themeName, widget->style()->standardIcon(fallback)); + if (normalized == "folder") + return styling::icon(styling::Icon::Folder, "#7E929C"); + if (normalized.contains("camera")) + return styling::icon(styling::Icon::Camera, "#9E897D"); + if (normalized.contains("environment") || + normalized.contains("atmosphere")) + return styling::icon(styling::Icon::Globe, "#7E929C"); + if (normalized.contains("light") || normalized == "sun") + return styling::icon(styling::Icon::Lightbulb, "#A1957D"); + if (normalized.contains("terrain")) + return styling::icon(styling::Icon::Mountains, "#849589"); + if (normalized.contains("particle")) + return styling::icon(styling::Icon::Sparkle, "#8498A8"); + if (normalized.contains("audio") || normalized == "wav" || + normalized == "mp3" || normalized == "ogg" || + normalized == "flac") + return styling::icon(styling::Icon::MusicNote, "#849589"); + if (normalized.contains("material")) + return styling::icon(styling::Icon::Material, "#9E897D"); + if (normalized.contains("script") || normalized == "ts" || + normalized == "js") + return styling::icon(styling::Icon::FileCode, "#7E929C"); + if (normalized.contains("rigidbody") || normalized.contains("joint")) + return styling::icon(styling::Icon::Wrench, "#A1957D"); + if (normalized == "sphere") + return styling::icon(styling::Icon::Sphere, "#8498A8"); + return styling::icon(styling::Icon::Cube, "#8498A8"); } QString componentTitle(const QString &type) { @@ -619,7 +611,7 @@ void addSyncPicker(QHBoxLayout *layout, const QString &path, auto *button = new QToolButton(parent); button->setObjectName("inspectorSyncButton"); button->setIcon( - parent->style()->standardIcon(QStyle::SP_BrowserReload)); + styling::icon(styling::Icon::ArrowCounterClockwise, "#849589")); button->setToolTip("Match this value with another property"); button->setPopupMode(QToolButton::InstantPopup); auto showMatch = [button, valueEditor](const QString &name) { @@ -800,12 +792,8 @@ QWidget *colorField(const QJsonArray &value, const PropertyChanged &changed, auto *text = new QLineEdit(field); text->setObjectName("inspectorColorText"); auto updateDisplay = [swatch, text](const QColor &next) { - swatch->setStyleSheet( - QStringLiteral("background-color: rgba(%1,%2,%3,%4);") - .arg(next.red()) - .arg(next.green()) - .arg(next.blue()) - .arg(next.alpha())); + swatch->setIcon(styling::colorSwatch(next, QSize(22, 14))); + swatch->setIconSize(QSize(22, 14)); text->setText(next.name(QColor::HexArgb).toUpper()); }; updateDisplay(color); @@ -982,7 +970,9 @@ void addPropertyRows(QVBoxLayout *layout, const QJsonObject &properties, title->setObjectName("inspectorNestedTitle"); auto *add = new QToolButton(heading); add->setObjectName("inspectorArrayButton"); - add->setText("+"); + add->setIcon( + styling::icon(styling::Icon::Plus, "#8498A8")); + add->setToolTip("Add item"); add->setToolTip(QStringLiteral("Add %1").arg(humanize(key))); headingLayout->addWidget(title, 1); headingLayout->addWidget(add); @@ -1012,7 +1002,9 @@ void addPropertyRows(QVBoxLayout *layout, const QJsonObject &properties, itemTitle->setObjectName("inspectorArrayTitle"); auto *remove = new QToolButton(itemHeading); remove->setObjectName("inspectorArrayButton"); - remove->setText("−"); + remove->setIcon( + styling::icon(styling::Icon::Trash, "#A17F7F")); + remove->setToolTip("Remove item"); remove->setToolTip("Remove"); itemHeadingLayout->addWidget(itemTitle, 1); itemHeadingLayout->addWidget(remove); @@ -1166,14 +1158,14 @@ QFrame *componentCard(const QString &title, const QJsonObject &properties, header->setText(title); header->setCheckable(true); header->setChecked(true); - header->setArrowType(Qt::DownArrow); + header->setIcon(styling::icon(styling::Icon::CaretDown, "#8490A4")); header->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); headerLayout->addWidget(header, 1); if (remove) { auto *removeButton = new QToolButton(headerRow); removeButton->setObjectName("inspectorComponentRemoveButton"); removeButton->setIcon( - card->style()->standardIcon(QStyle::SP_DialogDiscardButton)); + styling::icon(styling::Icon::Trash, "#A17F7F")); removeButton->setToolTip(QStringLiteral("Remove %1").arg(title)); headerLayout->addWidget(removeButton); QObject::connect(removeButton, &QToolButton::clicked, card, remove); @@ -1189,7 +1181,9 @@ QFrame *componentCard(const QString &title, const QJsonObject &properties, QObject::connect( header, &QToolButton::toggled, card, [header, body](bool expanded) { body->setVisible(expanded); - header->setArrowType(expanded ? Qt::DownArrow : Qt::RightArrow); + header->setIcon(styling::icon( + expanded ? styling::Icon::CaretDown : styling::Icon::CaretRight, + "#8490A4")); }); return card; } @@ -1512,15 +1506,17 @@ void InspectorPanel::showObject(const QJsonObject &object) { controlsLayout->setContentsMargins(8, 4, 8, 6); controlsLayout->setSpacing(5); const QStringList audioActions{"Play", "Pause", "Stop"}; - const QList audioIcons{ - QStyle::SP_MediaPlay, QStyle::SP_MediaPause, - QStyle::SP_MediaStop}; + const QList audioIcons{ + styling::Icon::Play, styling::Icon::Pause, + styling::Icon::Stop}; + const QList audioColors{ + QColor("#849589"), QColor("#A1957D"), QColor("#A17F7F")}; for (int actionIndex = 0; actionIndex < audioActions.size(); ++actionIndex) { const QString &action = audioActions.at(actionIndex); auto *button = new QToolButton(controls); - button->setIcon( - style()->standardIcon(audioIcons.at(actionIndex))); + button->setIcon(styling::icon( + audioIcons.at(actionIndex), audioColors.at(actionIndex))); button->setToolTip(action); controlsLayout->addWidget(button); connect(button, &QToolButton::clicked, this, @@ -1538,7 +1534,7 @@ void InspectorPanel::showObject(const QJsonObject &object) { auto *addComponent = new QToolButton(content); addComponent->setObjectName("inspectorAddComponentButton"); addComponent->setIcon( - style()->standardIcon(QStyle::SP_FileDialogNewFolder)); + styling::icon(styling::Icon::Plus, "#8498A8")); addComponent->setText("Add Component"); addComponent->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); addComponent->setPopupMode(QToolButton::InstantPopup); diff --git a/editor/views/editor/materialEditor.cpp b/editor/views/editor/materialEditor.cpp index c2d9f1aa..4bae91be 100644 --- a/editor/views/editor/materialEditor.cpp +++ b/editor/views/editor/materialEditor.cpp @@ -1,5 +1,6 @@ #include #include +#include #include @@ -59,14 +60,12 @@ QJsonArray colorJson(const QColor &color) { void displayColor(QPushButton *button, const QColor &color) { button->setProperty("materialColor", color); - button->setText(color.name(QColor::HexRgb).toUpper()); - button->setStyleSheet( - QStringLiteral("background-color: rgba(%1,%2,%3,%4); color: %5;") - .arg(color.red()) - .arg(color.green()) - .arg(color.blue()) - .arg(color.alpha()) - .arg(color.lightnessF() > 0.55 ? "#111111" : "#FFFFFF")); + button->setObjectName("materialColorButton"); + button->setText(color.name(color.alpha() < 255 ? QColor::HexArgb + : QColor::HexRgb) + .toUpper()); + button->setIcon(styling::colorSwatch(color, QSize(18, 18))); + button->setIconSize(QSize(18, 18)); } QDoubleSpinBox *scalarField(double minimum, double maximum, double step, @@ -363,10 +362,12 @@ MaterialEditorPanel::MaterialEditorPanel(ViewportPanel *viewport, statusLabel->setObjectName("materialEditorStatus"); auto *saveButton = new QPushButton("Save", header); saveButton->setObjectName("materialSaveButton"); - saveButton->setIcon(style()->standardIcon(QStyle::SP_DialogSaveButton)); + saveButton->setIcon( + styling::icon(styling::Icon::FloppyDisk, "#A1957D")); auto *assignButton = new QPushButton("Assign to Selected", header); assignButton->setObjectName("materialAssignButton"); - assignButton->setIcon(style()->standardIcon(QStyle::SP_ArrowRight)); + assignButton->setIcon( + styling::icon(styling::Icon::Assign, "#9E897D")); headerLayout->addWidget(titleLabel, 1); headerLayout->addWidget(statusLabel); headerLayout->addWidget(assignButton); @@ -604,8 +605,11 @@ void MaterialEditorPanel::showMaterial() { field->setPlaceholderText("No image"); auto *choose = new QToolButton(row); choose->setText("Choose…"); + choose->setIcon( + styling::icon(styling::Icon::FolderOpen, "#7E929C")); + choose->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); auto *clear = new QToolButton(row); - clear->setText("×"); + clear->setIcon(styling::icon(styling::Icon::Close, "#A17F7F")); clear->setToolTip("Remove texture"); auto *identity = new QWidget(row); auto *identityLayout = new QVBoxLayout(identity); diff --git a/editor/views/editor/postProcessing.cpp b/editor/views/editor/postProcessing.cpp index af87f406..1e86d178 100644 --- a/editor/views/editor/postProcessing.cpp +++ b/editor/views/editor/postProcessing.cpp @@ -1,5 +1,6 @@ #include #include +#include #include @@ -104,15 +105,16 @@ PostProcessingPanel::PostProcessingPanel(ViewportPanel *viewport, targetSelector->setMinimumWidth(180); auto *addTargetButton = new QToolButton(toolbar); addTargetButton->setIcon( - style()->standardIcon(QStyle::SP_FileDialogNewFolder)); + styling::icon(styling::Icon::Plus, "#8498A8")); addTargetButton->setText("Target"); addTargetButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); removeTargetButton = new QToolButton(toolbar); removeTargetButton->setText("Remove"); removeTargetButton->setIcon( - style()->standardIcon(QStyle::SP_DialogDiscardButton)); + styling::icon(styling::Icon::Trash, "#A17F7F")); auto *applyButton = new QPushButton("Apply to Preview", toolbar); - applyButton->setIcon(style()->standardIcon(QStyle::SP_BrowserReload)); + applyButton->setIcon( + styling::icon(styling::Icon::Sparkle, "#849589")); statusLabel = new QLabel(toolbar); statusLabel->setObjectName("postProcessingStatus"); toolbarLayout->addWidget(title); @@ -243,7 +245,7 @@ void PostProcessingPanel::rebuildEditor() { effectsTitle->setObjectName("postProcessingSectionTitle"); auto *addEffectButton = new QToolButton(effectsHeading); addEffectButton->setIcon( - style()->standardIcon(QStyle::SP_FileDialogNewFolder)); + styling::icon(styling::Icon::Plus, "#8498A8")); addEffectButton->setText("Add Effect"); addEffectButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); addEffectButton->setPopupMode(QToolButton::InstantPopup); @@ -255,7 +257,9 @@ void PostProcessingPanel::rebuildEditor() { "posterization", "pixelation", "dilation", "film_grain"}; for (const QString &effect : effects) { - effectMenu->addAction(effectTitle(effect), this, + effectMenu->addAction( + styling::icon(styling::Icon::Sparkle, "#849589"), + effectTitle(effect), this, [this, effect] { addEffect(effect); }); } addEffectButton->setMenu(effectMenu); @@ -325,12 +329,21 @@ void PostProcessingPanel::rebuildEditor() { actionsLayout->setSpacing(4); auto *moveUp = new QToolButton(actions); moveUp->setText("Move Up"); + moveUp->setIcon( + styling::icon(styling::Icon::CaretUp, "#7E929C")); + moveUp->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); moveUp->setEnabled(effectIndex > 0); auto *moveDown = new QToolButton(actions); moveDown->setText("Move Down"); + moveDown->setIcon( + styling::icon(styling::Icon::CaretDown, "#7E929C")); + moveDown->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); moveDown->setEnabled(effectIndex + 1 < effectStack.size()); auto *remove = new QToolButton(actions); remove->setText("Remove Effect"); + remove->setIcon( + styling::icon(styling::Icon::Trash, "#A17F7F")); + remove->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); actionsLayout->addStretch(); actionsLayout->addWidget(moveUp); actionsLayout->addWidget(moveDown); diff --git a/editor/views/editor/viewport.cpp b/editor/views/editor/viewport.cpp index 0d0fd3a1..9163a3ed 100644 --- a/editor/views/editor/viewport.cpp +++ b/editor/views/editor/viewport.cpp @@ -74,9 +74,10 @@ int runtimeMouseButton(Qt::MouseButton button) { } } -int activeRuntimeMouseButton(Qt::MouseButtons buttons) { +int activeRuntimeMouseButton(Qt::MouseButtons buttons, + int rightDragRuntimeButton) { if (buttons.testFlag(Qt::RightButton)) { - return runtimeMouseButton(Qt::RightButton); + return rightDragRuntimeButton; } if (buttons.testFlag(Qt::MiddleButton)) { return runtimeMouseButton(Qt::MiddleButton); @@ -412,9 +413,16 @@ void ViewportPanel::mousePressEvent(QMouseEvent *event) { .toArray(), selected); } + int pointerButton = runtimeMouseButton(event->button()); + if (event->button() == Qt::RightButton) { + rightDragRuntimeButton = + event->modifiers().testFlag(Qt::ShiftModifier) + ? runtimeMouseButton(Qt::RightButton) + : runtimeMouseButton(Qt::MiddleButton); + pointerButton = rightDragRuntimeButton; + } sendPointerEvent(0, static_cast(event->position().x()), - static_cast(event->position().y()), - runtimeMouseButton(event->button())); + static_cast(event->position().y()), pointerButton); if (event->button() == Qt::LeftButton && runtimeContext != nullptr) { emit runtimeObjectActivated(runtimeContext->selectedObjectId()); } @@ -426,7 +434,8 @@ void ViewportPanel::mouseMoveEvent(QMouseEvent *event) { leftPointerMoved = true; sendPointerEvent(1, static_cast(event->position().x()), static_cast(event->position().y()), - activeRuntimeMouseButton(event->buttons())); + activeRuntimeMouseButton(event->buttons(), + rightDragRuntimeButton)); if (keyboardTransformActive) { const QRect bounds(mapToGlobal(QPoint(0, 0)), size()); QPoint cursor = event->globalPosition().toPoint(); @@ -452,9 +461,11 @@ void ViewportPanel::mouseMoveEvent(QMouseEvent *event) { } void ViewportPanel::mouseReleaseEvent(QMouseEvent *event) { + const int pointerButton = event->button() == Qt::RightButton + ? rightDragRuntimeButton + : runtimeMouseButton(event->button()); sendPointerEvent(2, static_cast(event->position().x()), - static_cast(event->position().y()), - runtimeMouseButton(event->button())); + static_cast(event->position().y()), pointerButton); if (event->button() == Qt::LeftButton && leftPointerMoved && runtimeContext != nullptr && selectedRuntimeObjectId() >= 0) { const int selected = selectedRuntimeObjectId(); @@ -466,6 +477,8 @@ void ViewportPanel::mouseReleaseEvent(QMouseEvent *event) { emit runtimeObjectActivated(selected); } leftPointerMoved = false; + if (event->button() == Qt::RightButton) + rightDragRuntimeButton = 0; event->accept(); } diff --git a/editor/views/editor/viewportTools.cpp b/editor/views/editor/viewportTools.cpp index babd20c5..8616c1ce 100644 --- a/editor/views/editor/viewportTools.cpp +++ b/editor/views/editor/viewportTools.cpp @@ -1,9 +1,9 @@ #include #include +#include #include -#include #include #include #include @@ -41,49 +41,48 @@ ViewportTools::ViewportTools(ViewportPanel *viewport, playButton = new QToolButton(toolbar); playButton->setObjectName("viewportPlaybackButton"); - playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); + playButton->setIcon(styling::icon(styling::Icon::Play, "#849589")); playButton->setToolTip("Play"); pauseButton = new QToolButton(toolbar); pauseButton->setObjectName("viewportPlaybackButton"); - pauseButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause)); + pauseButton->setIcon(styling::icon(styling::Icon::Pause, "#A1957D")); pauseButton->setToolTip("Pause"); stepButton = new QToolButton(toolbar); stepButton->setObjectName("viewportPlaybackButton"); - stepButton->setIcon(style()->standardIcon(QStyle::SP_MediaSkipForward)); + stepButton->setIcon( + styling::icon(styling::Icon::SkipForward, "#7E929C")); stepButton->setToolTip("Step one frame"); stopButton = new QToolButton(toolbar); stopButton->setObjectName("viewportPlaybackButton"); - stopButton->setIcon(style()->standardIcon(QStyle::SP_MediaStop)); + stopButton->setIcon(styling::icon(styling::Icon::Stop, "#A17F7F")); stopButton->setToolTip("Stop and restore the scene"); reloadButton = new QToolButton(toolbar); reloadButton->setObjectName("viewportPlaybackButton"); - reloadButton->setIcon(style()->standardIcon(QStyle::SP_BrowserReload)); + reloadButton->setIcon( + styling::icon(styling::Icon::ArrowCounterClockwise, "#71889A")); reloadButton->setToolTip("Reload runtime"); playButton->setShortcut(QKeySequence("Ctrl+P")); pauseButton->setShortcut(QKeySequence("Ctrl+Shift+P")); stepButton->setShortcut(QKeySequence("Ctrl+Alt+P")); - tools->addStretch(); - tools->addWidget(playButton); - tools->addWidget(pauseButton); - tools->addWidget(stepButton); - tools->addWidget(stopButton); - tools->addWidget(reloadButton); - tools->addSpacing(10); - auto *transformGroup = new QActionGroup(toolbar); transformGroup->setExclusive(true); const QStringList transformNames{"Select", "Move", "Rotate", "Scale"}; - const QList transformIcons{ - QStyle::SP_ArrowUp, QStyle::SP_ArrowRight, QStyle::SP_BrowserReload, - QStyle::SP_TitleBarMaxButton}; + const QList transformIcons{ + styling::Icon::CursorClick, styling::Icon::ArrowsOutCardinal, + styling::Icon::ArrowClockwise, styling::Icon::BoundingBox}; + const QList transformColors{ + QColor("#7E929C"), QColor("#849589"), QColor("#A1957D"), + QColor("#71889A")}; for (int index = 0; index < transformNames.size(); ++index) { auto *button = new QToolButton(toolbar); button->setObjectName("viewportModeButton"); - button->setIcon(style()->standardIcon(transformIcons.at(index))); - button->setToolTip(transformNames.at(index) + " tool"); + button->setToolButtonStyle(Qt::ToolButtonIconOnly); button->setCheckable(true); auto *action = new QAction(transformNames.at(index), button); + action->setIcon( + styling::icon(transformIcons.at(index), transformColors.at(index))); + action->setToolTip(transformNames.at(index) + " tool"); action->setCheckable(true); action->setData(index); button->setDefaultAction(action); @@ -97,37 +96,59 @@ ViewportTools::ViewportTools(ViewportPanel *viewport, tools->addSpacing(10); spaceButton = new QToolButton(toolbar); spaceButton->setObjectName("viewportOptionButton"); - spaceButton->setText("World"); - spaceButton->setToolButtonStyle(Qt::ToolButtonTextOnly); - spaceButton->setToolTip("Transform space (Shift+T)"); + spaceButton->setIcon(styling::icon(styling::Icon::Globe, "#7E929C")); + spaceButton->setToolTip("World transform space · Shift+T"); tools->addWidget(spaceButton); - tools->addSpacing(10); - auto *shading = new QComboBox(toolbar); - shading->setObjectName("viewportShadingMode"); - shading->addItems({"Lit", "Wireframe", "Points"}); - shading->setToolTip("Viewport shading"); - tools->addWidget(shading); + tools->addStretch(); + tools->addWidget(playButton); + tools->addWidget(pauseButton); + tools->addWidget(stepButton); + tools->addWidget(stopButton); + tools->addWidget(reloadButton); + tools->addStretch(); + + auto *shadingGroup = new QActionGroup(toolbar); + shadingGroup->setExclusive(true); + const QStringList shadingNames{"Lit", "Wireframe", "Points"}; + const QList shadingIcons{ + styling::Icon::Sphere, styling::Icon::CubeTransparent, + styling::Icon::DotsNine}; + for (int index = 0; index < shadingNames.size(); ++index) { + auto *button = new QToolButton(toolbar); + button->setObjectName("viewportShadingButton"); + button->setToolButtonStyle(Qt::ToolButtonIconOnly); + button->setCheckable(true); + auto *action = new QAction(shadingNames.at(index), button); + action->setIcon( + styling::icon(shadingIcons.at(index), "#9AA6B8")); + action->setToolTip(shadingNames.at(index) + " shading"); + action->setCheckable(true); + action->setData(index); + button->setDefaultAction(action); + shadingGroup->addAction(action); + tools->addWidget(button); + if (index == 0) + action->setChecked(true); + } auto *fpsButton = new QToolButton(toolbar); fpsButton->setObjectName("viewportOptionButton"); - fpsButton->setIcon(style()->standardIcon(QStyle::SP_ComputerIcon)); - fpsButton->setText("FPS"); - fpsButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + fpsButton->setIcon( + styling::icon(styling::Icon::Monitor, "#849589")); fpsButton->setCheckable(true); fpsButton->setChecked(true); - fpsButton->setToolTip("Show frame rate"); + fpsButton->setToolTip("Toggle frame rate"); fpsLabel = new QLabel("-- FPS", toolbar); fpsLabel->setObjectName("viewportFpsLabel"); fpsLabel->setMinimumWidth(62); tools->addWidget(fpsButton); tools->addWidget(fpsLabel); - tools->addStretch(); layout->addWidget(toolbar); layout->addWidget(viewport, 1); shortcutHint = new QLabel( - "Tab Frame · Right-Drag Pan · Middle-Drag Orbit · G Move · R Rotate · S Scale", + "Tab Frame · Right-Drag Orbit · Shift + Right-Drag Pan · G Move · R Rotate · S Scale", this); shortcutHint->setObjectName("viewportShortcutHint"); shortcutHint->setTextInteractionFlags(Qt::NoTextInteraction); @@ -147,13 +168,20 @@ ViewportTools::ViewportTools(ViewportPanel *viewport, [viewport](QAction *action) { viewport->setRuntimeControlMode(action->data().toInt()); }); - connect(shading, &QComboBox::currentIndexChanged, viewport, - &ViewportPanel::setRuntimeShadingMode); + connect(shadingGroup, &QActionGroup::triggered, this, + [viewport](QAction *action) { + viewport->setRuntimeShadingMode(action->data().toInt()); + }); connect(spaceButton, &QToolButton::clicked, viewport, &ViewportPanel::toggleTransformSpace); connect(viewport, &ViewportPanel::transformSpaceChanged, this, [this](bool local) { - spaceButton->setText(local ? "Local" : "World"); + spaceButton->setIcon(styling::icon( + local ? styling::Icon::Cube : styling::Icon::Globe, + local ? QColor("#71889A") : QColor("#7E929C"))); + spaceButton->setToolTip( + local ? "Local transform space · Shift+T" + : "World transform space · Shift+T"); }); connect(fpsButton, &QToolButton::toggled, fpsLabel, &QWidget::setVisible); connect(viewport, &ViewportPanel::frameRateChanged, this, diff --git a/editor/views/general/contentBrowser.cpp b/editor/views/general/contentBrowser.cpp index 1890f70b..85a1bef9 100644 --- a/editor/views/general/contentBrowser.cpp +++ b/editor/views/general/contentBrowser.cpp @@ -8,6 +8,7 @@ */ #include "editor/views/fileExplorer.h" +#include "editor/styling/icons.h" #include #include @@ -17,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -92,6 +94,37 @@ bool copyEntry(const QString &source, const QString &destination) { } return QFile::copy(source, destination); } + +class AtlasFileIconProvider : public QFileIconProvider { +public: + QIcon icon(const QFileInfo &info) const override { + if (info.isDir()) + return styling::icon(styling::Icon::Folder, "#7E929C"); + const QString suffix = info.suffix().toLower(); + if (suffix == "ascene") + return styling::icon(styling::Icon::CubeFocus, "#8498A8"); + if (suffix == "amat" || suffix == "material") + return styling::icon(styling::Icon::Material, "#9E897D"); + if (suffix == "ts" || suffix == "js" || suffix == "cpp" || + suffix == "h" || suffix == "json") + return styling::icon(styling::Icon::FileCode, "#7E929C"); + if (suffix == "png" || suffix == "jpg" || suffix == "jpeg" || + suffix == "hdr") + return styling::icon(styling::Icon::Image, "#A1957D"); + if (suffix == "wav" || suffix == "mp3" || suffix == "ogg" || + suffix == "flac") + return styling::icon(styling::Icon::MusicNote, "#849589"); + return styling::icon(styling::Icon::File, "#8490A4"); + } + + QIcon icon(IconType type) const override { + if (type == Folder || type == Drive) + return styling::icon(styling::Icon::Folder, "#7E929C"); + return styling::icon(styling::Icon::File, "#8490A4"); + } +}; + +AtlasFileIconProvider atlasFileIconProvider; } // namespace ContentBrowserPanel::ContentBrowserPanel(const QString &projectFile, @@ -116,15 +149,17 @@ ContentBrowserPanel::ContentBrowserPanel(const QString &projectFile, backButton = new QToolButton(toolbar); backButton->setObjectName("browserNavigationButton"); - backButton->setIcon(style()->standardIcon(QStyle::SP_ArrowBack)); + backButton->setIcon( + styling::icon(styling::Icon::ArrowLeft, "#AAB4C4")); backButton->setToolTip("Back"); forwardButton = new QToolButton(toolbar); forwardButton->setObjectName("browserNavigationButton"); - forwardButton->setIcon(style()->standardIcon(QStyle::SP_ArrowForward)); + forwardButton->setIcon( + styling::icon(styling::Icon::ArrowRight, "#AAB4C4")); forwardButton->setToolTip("Forward"); upButton = new QToolButton(toolbar); upButton->setObjectName("browserNavigationButton"); - upButton->setIcon(style()->standardIcon(QStyle::SP_ArrowUp)); + upButton->setIcon(styling::icon(styling::Icon::ArrowUp, "#AAB4C4")); upButton->setToolTip("Parent Folder"); pathField = new QLineEdit(toolbar); @@ -139,21 +174,21 @@ ContentBrowserPanel::ContentBrowserPanel(const QString &projectFile, createButton = new QToolButton(toolbar); createButton->setObjectName("panelAddButton"); - createButton->setIcon( - style()->standardIcon(QStyle::SP_FileDialogNewFolder)); + createButton->setIcon(styling::icon(styling::Icon::Plus, "#8498A8")); createButton->setText("Create"); createButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); createButton->setPopupMode(QToolButton::InstantPopup); revealButton = new QToolButton(toolbar); revealButton->setObjectName("browserRevealButton"); - revealButton->setIcon(style()->standardIcon(QStyle::SP_DirOpenIcon)); + revealButton->setIcon( + styling::icon(styling::Icon::FolderOpen, "#7E929C")); revealButton->setToolTip("Reveal in Finder"); moreButton = new QToolButton(toolbar); moreButton->setObjectName("panelMoreButton"); moreButton->setIcon( - style()->standardIcon(QStyle::SP_ToolBarHorizontalExtensionButton)); + styling::icon(styling::Icon::DotsVertical, "#8490A4")); moreButton->setPopupMode(QToolButton::InstantPopup); moreButton->setToolTip("Content actions"); @@ -168,6 +203,7 @@ ContentBrowserPanel::ContentBrowserPanel(const QString &projectFile, layout->addWidget(toolbar); model = new QFileSystemModel(this); + model->setIconProvider(&atlasFileIconProvider); model->setFilter(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot); model->setReadOnly(false); model->setRootPath(projectRoot); @@ -181,8 +217,8 @@ ContentBrowserPanel::ContentBrowserPanel(const QString &projectFile, gridView->setWrapping(true); gridView->setResizeMode(QListView::Adjust); gridView->setMovement(QListView::Static); - gridView->setGridSize(QSize(176, 142)); - gridView->setIconSize(QSize(64, 64)); + gridView->setGridSize(QSize(154, 118)); + gridView->setIconSize(QSize(50, 50)); gridView->setWordWrap(true); gridView->setTextElideMode(Qt::ElideNone); gridView->setSelectionMode(QAbstractItemView::ExtendedSelection); @@ -195,31 +231,38 @@ ContentBrowserPanel::ContentBrowserPanel(const QString &projectFile, layout->addWidget(gridView, 1); auto *createMenu = new QMenu(createButton); - createMenu->addAction(style()->standardIcon(QStyle::SP_DirIcon), "Folder", + createMenu->addAction(styling::icon(styling::Icon::Folder, "#7E929C"), "Folder", this, &ContentBrowserPanel::createFolder); createMenu->addSeparator(); - createMenu->addAction(style()->standardIcon(QStyle::SP_FileIcon), "Scene", + createMenu->addAction(styling::icon(styling::Icon::CubeFocus, "#8498A8"), "Scene", this, &ContentBrowserPanel::createScene); - createMenu->addAction(style()->standardIcon(QStyle::SP_FileIcon), + createMenu->addAction(styling::icon(styling::Icon::Material, "#9E897D"), "Material", this, &ContentBrowserPanel::createMaterial); - createMenu->addAction(style()->standardIcon(QStyle::SP_FileIcon), + createMenu->addAction(styling::icon(styling::Icon::FileCode, "#7E929C"), "TypeScript Script", this, &ContentBrowserPanel::createScript); createButton->setMenu(createMenu); auto *moreMenu = new QMenu(moreButton); - moreMenu->addAction("Open", this, [this] { + moreMenu->addAction( + styling::icon(styling::Icon::FolderOpen, "#7E929C"), "Open", this, [this] { if (gridView->currentIndex().isValid()) { openIndex(gridView->currentIndex()); } }); - moreMenu->addAction("Rename", this, &ContentBrowserPanel::renameSelection); - moreMenu->addAction("Delete", this, &ContentBrowserPanel::deleteSelection); + moreMenu->addAction(styling::icon(styling::Icon::File, "#8498A8"), + "Rename", this, + &ContentBrowserPanel::renameSelection); + moreMenu->addAction(styling::icon(styling::Icon::Trash, "#A17F7F"), + "Delete", this, + &ContentBrowserPanel::deleteSelection); moreMenu->addSeparator(); - moreMenu->addAction("Reveal in Finder", this, + moreMenu->addAction(styling::icon(styling::Icon::FolderOpen, "#7E929C"), + "Reveal in Finder", this, &ContentBrowserPanel::revealSelection); - moreMenu->addAction("Copy Path", this, + moreMenu->addAction(styling::icon(styling::Icon::FileCode, "#8490A4"), + "Copy Path", this, &ContentBrowserPanel::copySelectionPath); moreButton->setMenu(moreMenu); diff --git a/editor/views/general/projectBrowser.cpp b/editor/views/general/projectBrowser.cpp index ef30ae45..0c5924f0 100644 --- a/editor/views/general/projectBrowser.cpp +++ b/editor/views/general/projectBrowser.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include @@ -42,6 +43,7 @@ constexpr int ProjectAvailableRole = Qt::UserRole + 1; class TemplateCard : public QFrame { public: TemplateCard(const QString& title, const QString& description, + styling::Icon icon, const QColor& color, QWidget* parent = nullptr) : QFrame(parent) { setProperty("templateCard", true); @@ -53,10 +55,19 @@ class TemplateCard : public QFrame { auto* layout = new QVBoxLayout(this); layout->setContentsMargins(16, 14, 16, 14); layout->setSpacing(8); + auto* heading = new QHBoxLayout(); + heading->setSpacing(8); + auto* iconLabel = new QLabel(this); + iconLabel->setObjectName("templateIcon"); + iconLabel->setPixmap(styling::icon(icon, color).pixmap(24, 24)); + iconLabel->setFixedSize(28, 28); + iconLabel->setAlignment(Qt::AlignCenter); option = new QRadioButton(title, this); option->setObjectName("templateOption"); option->setCursor(Qt::PointingHandCursor); - layout->addWidget(option); + heading->addWidget(iconLabel); + heading->addWidget(option, 1); + layout->addLayout(heading); auto* descriptionLabel = new QLabel(description, this); descriptionLabel->setObjectName("templateDescription"); descriptionLabel->setWordWrap(true); @@ -115,13 +126,15 @@ class CreateProjectDialog : public QDialog { templateGroup->setExclusive(true); auto* pbr = new TemplateCard( "PBR", "Deferred physically based rendering for most 3D projects.", - this); + styling::Icon::Cube, "#8498A8", this); auto* ddgi = new TemplateCard( "PBR + DDGI", - "PBR with dynamic diffuse global illumination enabled.", this); + "PBR with dynamic diffuse global illumination enabled.", + styling::Icon::Sun, "#A1957D", this); auto* pathTracing = new TemplateCard( "Path Tracing", - "Progressive ray-traced lighting for high-fidelity scenes.", this); + "Progressive ray-traced lighting for high-fidelity scenes.", + styling::Icon::Aperture, "#9E897D", this); templateGroup->addButton(pbr->button(), static_cast(AtlasProjectTemplate::Pbr)); templateGroup->addButton( @@ -159,6 +172,8 @@ class CreateProjectDialog : public QDialog { locationLayout->addWidget(locationField, 1); auto* browse = new QPushButton("Browse…", this); browse->setProperty("secondary", true); + browse->setIcon( + styling::icon(styling::Icon::FolderOpen, "#7E929C")); locationLayout->addWidget(browse); fields->addLayout(locationLayout); root->addLayout(fields); @@ -176,6 +191,8 @@ class CreateProjectDialog : public QDialog { actions->addWidget(cancel); createButton = new QPushButton("Create project", this); createButton->setObjectName("primaryAction"); + createButton->setIcon( + styling::icon(styling::Icon::RocketLaunch, "#FFFFFF")); createButton->setDefault(true); createButton->setEnabled(false); actions->addWidget(createButton); @@ -239,6 +256,15 @@ class ProjectRow : public QFrame { layout->setContentsMargins(16, 12, 12, 12); layout->setSpacing(14); + auto* projectIcon = new QLabel(this); + projectIcon->setObjectName("projectIcon"); + projectIcon->setPixmap( + styling::icon(styling::Icon::GameController, "#8498A8") + .pixmap(30, 30)); + projectIcon->setFixedSize(36, 36); + projectIcon->setAlignment(Qt::AlignCenter); + layout->addWidget(projectIcon); + auto* copy = new QVBoxLayout(); copy->setSpacing(3); auto* title = new QLabel(project.name, this); @@ -266,7 +292,7 @@ class ProjectRow : public QFrame { moreButton = new QToolButton(this); moreButton->setObjectName("projectMoreButton"); moreButton->setIcon( - style()->standardIcon(QStyle::SP_ToolBarHorizontalExtensionButton)); + styling::icon(styling::Icon::DotsVertical, "#8490A4")); moreButton->setToolTip("Project options"); layout->addWidget(moreButton); } @@ -327,7 +353,8 @@ void ProjectBrowser::setupUi() { auto* projectsNav = new QPushButton("Projects", sidebar); projectsNav->setObjectName("projectNavSelected"); - projectsNav->setIcon(style()->standardIcon(QStyle::SP_DirHomeIcon)); + projectsNav->setIcon( + styling::icon(styling::Icon::SquaresFour, "#8498A8")); projectsNav->setEnabled(false); sidebarLayout->addWidget(projectsNav); sidebarLayout->addStretch(); @@ -354,11 +381,13 @@ void ProjectBrowser::setupUi() { auto* openButton = new QPushButton("Open existing", content); openButton->setProperty("secondary", true); - openButton->setIcon(style()->standardIcon(QStyle::SP_DialogOpenButton)); + openButton->setIcon( + styling::icon(styling::Icon::FolderOpen, "#7E929C")); headingLayout->addWidget(openButton); auto* createButton = new QPushButton("New project", content); createButton->setObjectName("primaryAction"); - createButton->setIcon(style()->standardIcon(QStyle::SP_FileDialogNewFolder)); + createButton->setIcon( + styling::icon(styling::Icon::Plus, "#FFFFFF")); headingLayout->addWidget(createButton); contentLayout->addLayout(headingLayout); @@ -510,12 +539,18 @@ void ProjectBrowser::showProjectMenu(const QPoint& position) { const bool available = ProjectStore::isProjectFile(projectFile); QMenu menu(this); - QAction* open = menu.addAction("Open project"); + QAction* open = menu.addAction( + styling::icon(styling::Icon::GameController, "#8498A8"), + "Open project"); open->setEnabled(available); - QAction* reveal = menu.addAction("Show in Finder"); + QAction* reveal = menu.addAction( + styling::icon(styling::Icon::FolderOpen, "#7E929C"), + "Show in Finder"); reveal->setEnabled(QFileInfo::exists(QFileInfo(projectFile).absolutePath())); menu.addSeparator(); - QAction* remove = menu.addAction("Remove from list"); + QAction* remove = menu.addAction( + styling::icon(styling::Icon::Trash, "#A17F7F"), + "Remove from list"); QAction* selected = menu.exec(projectList->viewport()->mapToGlobal(position)); if (selected == open) { openSelectedProject(); diff --git a/editor/views/general/splashScreen.cpp b/editor/views/general/splashScreen.cpp index c8ae66b1..54e7b4e7 100644 --- a/editor/views/general/splashScreen.cpp +++ b/editor/views/general/splashScreen.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #ifndef ATLAS_VERSION @@ -22,11 +23,11 @@ SplashScreen::SplashScreen(QWidget *parent) setAttribute(Qt::WA_TranslucentBackground); setModal(true); setObjectName("atlasSplash"); - setFixedSize(708, 218); + setFixedSize(708, 252); auto *card = new QFrame(this); card->setObjectName("splashCard"); - card->setGeometry(0, 0, 708, 218); + card->setGeometry(0, 0, 708, 252); auto *shadow = new QGraphicsDropShadowEffect(card); shadow->setBlurRadius(20.0); shadow->setOffset(0.0, 5.0); @@ -35,7 +36,7 @@ SplashScreen::SplashScreen(QWidget *parent) auto *icon = new QLabel(card); icon->setObjectName("splashIcon"); - icon->setGeometry(28, 32, 110, 110); + icon->setGeometry(30, 38, 108, 108); #ifdef ATLAS_DEBUG_BUILD icon->setPixmap(QPixmap(":/editor/assets/Icon-iOS-Default-1024x1024@1x.png") .scaled(icon->size(), Qt::KeepAspectRatio, @@ -49,7 +50,7 @@ SplashScreen::SplashScreen(QWidget *parent) auto *title = new QLabel(card); title->setObjectName("splashTitle"); - title->setGeometry(162, 42, 530, 44); + title->setGeometry(164, 42, 514, 44); QFont titleFont = title->font(); titleFont.setLetterSpacing(QFont::AbsoluteSpacing, -0.3); @@ -65,7 +66,7 @@ SplashScreen::SplashScreen(QWidget *parent) auto *version = new QLabel(card); version->setObjectName("splashVersion"); - version->setGeometry(162, 85, 500, 32); + version->setGeometry(164, 86, 500, 28); #ifdef ATLAS_DEBUG_BUILD version->setText(QStringLiteral("%1 (build %2)") .arg(QStringLiteral(ATLAS_VERSION), @@ -77,13 +78,19 @@ SplashScreen::SplashScreen(QWidget *parent) auto *company = new QLabel("by neutral software", card); company->setObjectName("splashCompany"); - company->setGeometry(162, 116, 400, 23); + company->setGeometry(164, 114, 400, 22); company->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); statusLabel = new QLabel("Loading the engine…", card); statusLabel->setObjectName("splashStatus"); - statusLabel->setGeometry(0, 136, 708, 22); - statusLabel->setAlignment(Qt::AlignCenter); + statusLabel->setGeometry(164, 151, 500, 22); + statusLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); + + auto *progress = new QProgressBar(card); + progress->setObjectName("splashProgress"); + progress->setGeometry(164, 181, 500, 5); + progress->setRange(0, 0); + progress->setTextVisible(false); #ifdef ATLAS_DEBUG_BUILD auto *warning = new QLabel( @@ -95,7 +102,7 @@ SplashScreen::SplashScreen(QWidget *parent) "appropriate runtime in your system that works with this version.", card); warning->setObjectName("splashWarning"); - warning->setGeometry(40, 161, 628, 48); + warning->setGeometry(40, 199, 628, 44); warning->setWordWrap(true); warning->setAlignment(Qt::AlignLeft | Qt::AlignTop); #endif @@ -105,38 +112,47 @@ SplashScreen::SplashScreen(QWidget *parent) background: transparent; } #splashCard { - background: #1F2427; - border: 1px solid rgba(20, 24, 28, 18); - border-radius: 40px; + background: #202224; + border: 1px solid #494D52; + border-radius: 18px; } #splashTitle { background: transparent; - color: #FFFFFF; - font-size: 40px; - font-weight: 700; + color: #F5F7FA; + font-size: 34px; + font-weight: 750; } #splashVersion { background: transparent; - color: #A1A5A8; - font-size: 18px; + color: #8498A8; + font-size: 14px; font-weight: 700; } #splashCompany { background: transparent; - color: #A1A5A8; + color: #7F8B9D; font-family: "Manrope"; font-size: 12px; font-weight: 650; } #splashStatus { background: transparent; - color: #9A9EA1; - font-size: 9px; - font-weight: 450; + color: #B7C1CF; + font-size: 10px; + font-weight: 550; +} +#splashProgress { + background: #34373A; + border: none; + border-radius: 2px; +} +#splashProgress::chunk { + background: #71889A; + border-radius: 2px; } #splashWarning { background: transparent; - color: #A4A8AB; + color: #68758A; font-size: 9px; font-weight: 450; } diff --git a/include/editor/core/themes.h b/include/editor/core/themes.h index 1e614f2b..b3f15739 100644 --- a/include/editor/core/themes.h +++ b/include/editor/core/themes.h @@ -6,106 +6,94 @@ // Source: /Users/maxvdec/Coding/Projects/Atlas/editor/styling/dark.qss inline constexpr const char* DARK_THEME = "* {\n" -" font-family: \"Helvetica Neue\", \"Segoe UI\", Arial, sans-serif;\n" +" font-family: \"Manrope\";\n" " font-size: 12px;\n" -" color: #DCE2E5;\n" -" selection-background-color: #3D8BFF;\n" +" color: #E7ECF3;\n" +" selection-background-color: #647B8D;\n" " selection-color: #FFFFFF;\n" "}\n" "\n" "QWidget {\n" -" background-color: #222526;\n" -" color: #DCE2E5;\n" +" background-color: #18191B;\n" +" color: #E7ECF3;\n" "}\n" "\n" "QMainWindow,\n" "QDialog,\n" "QFrame {\n" -" background-color: #222526;\n" -"}\n" -"\n" -"QToolTip {\n" -" background-color: #151819;\n" -" color: #F4F7F8;\n" -" border: 1px solid #3C4245;\n" -" border-radius: 3px;\n" -" padding: 4px 6px;\n" +" background-color: #18191B;\n" "}\n" "\n" "QLabel {\n" -" background-color: transparent;\n" -" color: #DCE2E5;\n" +" background: transparent;\n" "}\n" "\n" "QLabel:disabled {\n" -" color: #727B80;\n" +" color: #566174;\n" +"}\n" +"\n" +"QToolTip {\n" +" background-color: #34373A;\n" +" color: #F7F9FC;\n" +" border: 1px solid #505459;\n" +" border-radius: 8px;\n" +" padding: 4px 6px;\n" "}\n" "\n" "QGroupBox {\n" -" background-color: #222526;\n" -" border: 1px solid #3A4144;\n" -" border-radius: 3px;\n" -" margin-top: 15px;\n" +" background-color: #242628;\n" +" border: 1px solid #3A3D40;\n" +" border-radius: 10px;\n" +" margin-top: 14px;\n" " padding: 8px;\n" -" color: #E7ECEF;\n" -" font-weight: 600;\n" +" color: #F1F4F8;\n" +" font-weight: 650;\n" "}\n" "\n" "QGroupBox::title {\n" " subcontrol-origin: margin;\n" " subcontrol-position: top left;\n" -" left: 7px;\n" -" padding: 0 4px;\n" -" color: #AEB8BE;\n" -" background-color: #222526;\n" -"}\n" -"\n" -"QGroupBox > QWidget {\n" -" background-color: #222526;\n" +" left: 9px;\n" +" padding: 0 6px;\n" +" color: #AEB8C8;\n" +" background-color: #242628;\n" "}\n" "\n" "QScrollArea,\n" "QAbstractScrollArea {\n" -" background-color: #222526;\n" -" border: 1px solid #343A3D;\n" -" border-radius: 3px;\n" +" background-color: #1E2022;\n" +" border: none;\n" "}\n" "\n" "QAbstractScrollArea::corner {\n" -" background-color: #222526;\n" +" background-color: #1E2022;\n" "}\n" "\n" "QScrollBar:vertical {\n" -" background-color: #1E2122;\n" -" width: 10px;\n" -" margin: 0;\n" +" background-color: transparent;\n" +" width: 9px;\n" +" margin: 2px;\n" " border: none;\n" "}\n" "\n" "QScrollBar:horizontal {\n" -" background-color: #1E2122;\n" -" height: 10px;\n" -" margin: 0;\n" +" background-color: transparent;\n" +" height: 9px;\n" +" margin: 2px;\n" " border: none;\n" "}\n" "\n" "QScrollBar::handle:vertical,\n" "QScrollBar::handle:horizontal {\n" -" background-color: #444C50;\n" -" border: 2px solid #1E2122;\n" +" background-color: #505357;\n" " border-radius: 4px;\n" -" min-height: 28px;\n" -" min-width: 28px;\n" +" min-height: 30px;\n" +" min-width: 30px;\n" "}\n" "\n" "QScrollBar::handle:vertical:hover,\n" "QScrollBar::handle:horizontal:hover {\n" -" background-color: #5A6469;\n" -"}\n" -"\n" -"QScrollBar::handle:vertical:pressed,\n" -"QScrollBar::handle:horizontal:pressed {\n" -" background-color: #6A757B;\n" +" background-color: #65696E;\n" "}\n" "\n" "QScrollBar::add-line,\n" @@ -120,194 +108,59 @@ inline constexpr const char* DARK_THEME = "\n" "QPushButton,\n" "QToolButton {\n" -" background-color: #303538;\n" -" border: 1px solid #444B4F;\n" -" border-radius: 3px;\n" -" padding: 3px 7px;\n" -" color: #EEF3F5;\n" +" background-color: #2B2E31;\n" +" border: 1px solid #45494D;\n" +" border-radius: 8px;\n" +" padding: 4px 8px;\n" +" color: #E9EDF4;\n" " min-height: 18px;\n" +" font-weight: 550;\n" "}\n" "\n" "QPushButton:hover,\n" "QToolButton:hover {\n" -" background-color: #394045;\n" -" border-color: #59656C;\n" +" background-color: #363A3E;\n" +" border-color: #5A5F65;\n" "}\n" "\n" "QPushButton:pressed,\n" "QToolButton:pressed {\n" -" background-color: #24282A;\n" -" border-color: #3D8BFF;\n" +" background-color: #232527;\n" +" border-color: #6F7B84;\n" "}\n" "\n" "QPushButton:checked,\n" "QToolButton:checked {\n" -" background-color: #22496D;\n" -" border-color: #5FB3FF;\n" +" background-color: #3A4248;\n" +" border-color: #6F7B84;\n" " color: #FFFFFF;\n" "}\n" "\n" -"QPushButton:default {\n" -" background-color: #346FA8;\n" -" border-color: #68BFFF;\n" +"QPushButton:default,\n" +"#primaryAction {\n" +" background-color: #596A76;\n" +" border-color: #73838E;\n" " color: #FFFFFF;\n" +" font-weight: 650;\n" +"}\n" +"\n" +"QPushButton:default:hover,\n" +"#primaryAction:hover {\n" +" background-color: #667985;\n" +" border-color: #82919B;\n" "}\n" "\n" "QPushButton:disabled,\n" "QToolButton:disabled {\n" -" background-color: #292D2F;\n" -" border-color: #33393C;\n" -" color: #6F787D;\n" +" background-color: #202224;\n" +" border-color: #303235;\n" +" color: #566174;\n" "}\n" "\n" "QToolButton::menu-indicator {\n" " image: none;\n" "}\n" "\n" -"#viewportToolbar {\n" -" background-color: #1B1E20;\n" -" border-bottom: 1px solid #353B3E;\n" -"}\n" -"\n" -"#viewportPlaybackButton,\n" -"#viewportModeButton,\n" -"#viewportOptionButton {\n" -" min-width: 22px;\n" -" min-height: 20px;\n" -" padding: 2px 4px;\n" -"}\n" -"\n" -"#viewportPlaybackButton {\n" -" border-radius: 3px;\n" -"}\n" -"\n" -"#viewportShadingMode {\n" -" min-width: 92px;\n" -" padding-top: 2px;\n" -" padding-bottom: 2px;\n" -"}\n" -"\n" -"#viewportFpsLabel {\n" -" color: #9DA8AE;\n" -"}\n" -"\n" -"#viewportShortcutHint {\n" -" background-color: #181B1D;\n" -" border-top: 1px solid #303639;\n" -" color: #8F9AA0;\n" -" font-size: 10px;\n" -" padding: 4px 8px;\n" -"}\n" -"\n" -"#sceneTabs {\n" -" background-color: #171A1C;\n" -" border-bottom: 1px solid #343A3E;\n" -"}\n" -"\n" -"#sceneTabs::tab {\n" -" background-color: #202427;\n" -" border-right: 1px solid #343A3E;\n" -" color: #98A3A9;\n" -" min-width: 120px;\n" -" padding: 5px 10px;\n" -"}\n" -"\n" -"#sceneTabs::tab:selected {\n" -" background-color: #2B3134;\n" -" color: #EDF2F4;\n" -" border-bottom: 2px solid #4EA4E8;\n" -"}\n" -"\n" -"#sceneTabs::close-button {\n" -" subcontrol-position: right;\n" -"}\n" -"\n" -"#materialEditorHeader {\n" -" background-color: #1B1E20;\n" -" border-bottom: 1px solid #363C3F;\n" -"}\n" -"\n" -"#materialEditorTitle {\n" -" color: #F3F6F7;\n" -" font-size: 14px;\n" -" font-weight: 650;\n" -"}\n" -"\n" -"#materialEditorStatus {\n" -" color: #89959B;\n" -"}\n" -"\n" -"#materialEditorScroll,\n" -"#materialEditorBody {\n" -" border: none;\n" -" background-color: #202324;\n" -"}\n" -"\n" -"#materialPreview {\n" -" background-color: #191C1D;\n" -" border: 1px solid #3A4144;\n" -" border-radius: 3px;\n" -"}\n" -"\n" -"#materialEditorEmpty {\n" -" color: #879299;\n" -" padding: 40px;\n" -"}\n" -"\n" -"#postProcessingToolbar {\n" -" background-color: #1B1E20;\n" -" border-bottom: 1px solid #363C3F;\n" -"}\n" -"\n" -"#postProcessingTitle,\n" -"#postProcessingSectionTitle,\n" -"#inspectorCameraTitle {\n" -" color: #F3F6F7;\n" -" font-size: 14px;\n" -" font-weight: 650;\n" -"}\n" -"\n" -"#postProcessingStatus {\n" -" color: #89959B;\n" -"}\n" -"\n" -"#postProcessingScroll,\n" -"#postProcessingBody {\n" -" border: none;\n" -" background-color: #202324;\n" -"}\n" -"\n" -"#postProcessingEmpty {\n" -" color: #879299;\n" -" padding: 40px;\n" -"}\n" -"\n" -"#materialTextureSlot {\n" -" background-color: #1B1E20;\n" -" border: 1px solid #343B3E;\n" -" border-radius: 3px;\n" -"}\n" -"\n" -"#materialTexturePreview {\n" -" background-color: #25292B;\n" -" border: 1px solid #41494D;\n" -" border-radius: 3px;\n" -" color: #EF8C7B;\n" -" font-weight: 700;\n" -" qproperty-alignment: AlignCenter;\n" -"}\n" -"\n" -"#materialTextureLabel {\n" -" color: #CDD4D8;\n" -" font-weight: 600;\n" -"}\n" -"\n" -"#materialTexturePath {\n" -" color: #8F9AA0;\n" -" padding-top: 3px;\n" -" padding-bottom: 3px;\n" -"}\n" -"\n" "QLineEdit,\n" "QTextEdit,\n" "QPlainTextEdit,\n" @@ -317,16 +170,11 @@ inline constexpr const char* DARK_THEME = "QDateEdit,\n" "QTimeEdit,\n" "QDateTimeEdit {\n" -" background-color: #1A1D1E;\n" -" border: 1px solid #363D41;\n" -" border-radius: 3px;\n" -" padding: 3px 6px;\n" -" color: #EDF2F4;\n" -"}\n" -"\n" -"QTextEdit,\n" -"QPlainTextEdit {\n" -" selection-background-color: #315D90;\n" +" background-color: #1B1D1F;\n" +" border: 1px solid #3B3E42;\n" +" border-radius: 8px;\n" +" padding: 4px 6px;\n" +" color: #EEF2F7;\n" "}\n" "\n" "QLineEdit:hover,\n" @@ -334,11 +182,8 @@ inline constexpr const char* DARK_THEME = "QPlainTextEdit:hover,\n" "QComboBox:hover,\n" "QSpinBox:hover,\n" -"QDoubleSpinBox:hover,\n" -"QDateEdit:hover,\n" -"QTimeEdit:hover,\n" -"QDateTimeEdit:hover {\n" -" border-color: #4A555B;\n" +"QDoubleSpinBox:hover {\n" +" border-color: #54585D;\n" "}\n" "\n" "QLineEdit:focus,\n" @@ -346,1392 +191,1187 @@ inline constexpr const char* DARK_THEME = "QPlainTextEdit:focus,\n" "QComboBox:focus,\n" "QSpinBox:focus,\n" -"QDoubleSpinBox:focus,\n" -"QDateEdit:focus,\n" -"QTimeEdit:focus,\n" -"QDateTimeEdit:focus {\n" -" border-color: #5FB3FF;\n" -" background-color: #171A1B;\n" +"QDoubleSpinBox:focus {\n" +" background-color: #222426;\n" +" border-color: #71808A;\n" "}\n" "\n" "QLineEdit:disabled,\n" "QTextEdit:disabled,\n" -"QPlainTextEdit:disabled,\n" "QComboBox:disabled,\n" "QSpinBox:disabled,\n" -"QDoubleSpinBox:disabled,\n" -"QDateEdit:disabled,\n" -"QTimeEdit:disabled,\n" -"QDateTimeEdit:disabled {\n" -" background-color: #25292B;\n" -" border-color: #303638;\n" -" color: #727B80;\n" +"QDoubleSpinBox:disabled {\n" +" background-color: #202224;\n" +" border-color: #303235;\n" +" color: #566174;\n" "}\n" "\n" "QComboBox {\n" -" padding-right: 23px;\n" +" padding-right: 24px;\n" "}\n" "\n" "QComboBox::drop-down {\n" " subcontrol-origin: padding;\n" " subcontrol-position: top right;\n" " width: 22px;\n" -" border-left: 1px solid #343B3F;\n" -" border-top-right-radius: 3px;\n" -" border-bottom-right-radius: 3px;\n" -" background-color: #252A2C;\n" -"}\n" -"\n" -"QComboBox::down-arrow {\n" -" image: none;\n" -" width: 0;\n" -" height: 0;\n" -" border-left: 4px solid transparent;\n" -" border-right: 4px solid transparent;\n" -" border-top: 5px solid #AEB8BE;\n" +" border-left: 1px solid #3B3E42;\n" "}\n" "\n" "QComboBox QAbstractItemView {\n" -" background-color: #1C2021;\n" -" border: 1px solid #444D52;\n" -" border-radius: 3px;\n" +" background-color: #292C2F;\n" +" border: 1px solid #494D52;\n" +" border-radius: 10px;\n" " padding: 3px;\n" -" color: #E8EEF1;\n" -" selection-background-color: #315D90;\n" +" selection-background-color: #3A4248;\n" "}\n" "\n" "QAbstractSpinBox::up-button,\n" "QAbstractSpinBox::down-button {\n" -" background-color: #252A2C;\n" -" border-left: 1px solid #343B3F;\n" +" background-color: #292C2F;\n" +" border: none;\n" " width: 16px;\n" "}\n" "\n" "QAbstractSpinBox::up-button:hover,\n" "QAbstractSpinBox::down-button:hover {\n" -" background-color: #333A3E;\n" -"}\n" -"\n" -"QAbstractSpinBox::up-arrow {\n" -" image: none;\n" -" width: 0;\n" -" height: 0;\n" -" border-left: 4px solid transparent;\n" -" border-right: 4px solid transparent;\n" -" border-bottom: 5px solid #AEB8BE;\n" -"}\n" -"\n" -"QAbstractSpinBox::down-arrow {\n" -" image: none;\n" -" width: 0;\n" -" height: 0;\n" -" border-left: 4px solid transparent;\n" -" border-right: 4px solid transparent;\n" -" border-top: 5px solid #AEB8BE;\n" +" background-color: #3E4246;\n" "}\n" "\n" "QCheckBox,\n" "QRadioButton {\n" -" spacing: 6px;\n" -" background-color: transparent;\n" -" color: #DCE2E5;\n" +" spacing: 7px;\n" +" color: #C9D1DE;\n" "}\n" "\n" "QCheckBox::indicator,\n" "QRadioButton::indicator {\n" -" width: 13px;\n" -" height: 13px;\n" -" background-color: #171A1B;\n" -" border: 1px solid #515B61;\n" -"}\n" -"\n" -"QCheckBox::indicator {\n" -" border-radius: 2px;\n" -"}\n" -"\n" -"QRadioButton::indicator {\n" -" border-radius: 7px;\n" +" width: 15px;\n" +" height: 15px;\n" +" background-color: #1B1D1F;\n" +" border: 1px solid #55595D;\n" +" border-radius: 5px;\n" "}\n" "\n" "QCheckBox::indicator:hover,\n" "QRadioButton::indicator:hover {\n" -" border-color: #6FBFFF;\n" -" background-color: #1D252B;\n" -"}\n" -"\n" -"QCheckBox::indicator:checked {\n" -" background-color: #3D8BFF;\n" -" border-color: #72C7FF;\n" -" border-radius: 2px;\n" +" border-color: #747B81;\n" "}\n" "\n" +"QCheckBox::indicator:checked,\n" "QRadioButton::indicator:checked {\n" -" background-color: #3D8BFF;\n" -" border: 4px solid #171A1B;\n" -"}\n" -"\n" -"QCheckBox::indicator:disabled,\n" -"QRadioButton::indicator:disabled {\n" -" background-color: #2A2F31;\n" -" border-color: #3A4145;\n" +" background-color: #71808A;\n" +" border-color: #89969F;\n" "}\n" "\n" "QSlider::groove:horizontal {\n" +" background-color: #34373A;\n" " height: 4px;\n" -" background-color: #171A1B;\n" -" border-radius: 2px;\n" -"}\n" -"\n" -"QSlider::groove:vertical {\n" -" width: 4px;\n" -" background-color: #171A1B;\n" -" border-radius: 2px;\n" -"}\n" -"\n" -"QSlider::sub-page:horizontal,\n" -"QSlider::add-page:vertical {\n" -" background-color: #3D8BFF;\n" " border-radius: 2px;\n" "}\n" "\n" "QSlider::handle:horizontal {\n" -" width: 16px;\n" -" height: 16px;\n" -" margin: -6px 0;\n" -" background-color: #DCE2E5;\n" -" border: 1px solid #FFFFFF;\n" -" border-radius: 8px;\n" -"}\n" -"\n" -"QSlider::handle:vertical {\n" -" width: 16px;\n" -" height: 16px;\n" -" margin: 0 -6px;\n" -" background-color: #DCE2E5;\n" -" border: 1px solid #FFFFFF;\n" -" border-radius: 8px;\n" -"}\n" -"\n" -"QSlider::handle:horizontal:hover,\n" -"QSlider::handle:vertical:hover {\n" -" background-color: #FFFFFF;\n" -" border-color: #72C7FF;\n" +" background-color: #7D8991;\n" +" border: 2px solid #A8AFB4;\n" +" width: 12px;\n" +" margin: -5px 0;\n" +" border-radius: 7px;\n" "}\n" "\n" "QProgressBar {\n" -" background-color: #171A1B;\n" -" border: 1px solid #343B3F;\n" -" border-radius: 5px;\n" +" background-color: #26282B;\n" +" border: 1px solid #42464A;\n" +" border-radius: 6px;\n" +" height: 8px;\n" " text-align: center;\n" -" color: #DCE2E5;\n" -" min-height: 8px;\n" "}\n" "\n" "QProgressBar::chunk {\n" -" background-color: #3D8BFF;\n" -" border-radius: 4px;\n" +" background-color: #71808A;\n" +" border-radius: 6px;\n" "}\n" "\n" +"QTreeView,\n" "QListView,\n" "QListWidget,\n" -"QTreeView,\n" -"QTreeWidget,\n" "QTableView,\n" "QTableWidget {\n" -" background-color: #1C2021;\n" -" alternate-background-color: #202526;\n" -" border: 1px solid #343B3F;\n" -" border-radius: 3px;\n" -" padding: 2px;\n" -" color: #DCE2E5;\n" -" gridline-color: #303638;\n" +" background-color: #1E2022;\n" +" alternate-background-color: #232527;\n" +" border: none;\n" +" color: #DCE3EC;\n" +" show-decoration-selected: 1;\n" "}\n" "\n" +"QTreeView::item,\n" "QListView::item,\n" "QListWidget::item,\n" -"QTreeView::item,\n" -"QTreeWidget::item,\n" "QTableView::item,\n" "QTableWidget::item {\n" -" min-height: 20px;\n" -" padding: 2px 6px;\n" -" border-radius: 3px;\n" +" border: 1px solid transparent;\n" +" border-radius: 7px;\n" +" padding: 3px 5px;\n" "}\n" "\n" +"QTreeView::item:hover,\n" "QListView::item:hover,\n" "QListWidget::item:hover,\n" -"QTreeView::item:hover,\n" -"QTreeWidget::item:hover,\n" "QTableView::item:hover,\n" "QTableWidget::item:hover {\n" -" background-color: #2D363B;\n" +" background-color: #2B2E31;\n" +" border-color: #43474B;\n" "}\n" "\n" +"QTreeView::item:selected,\n" "QListView::item:selected,\n" "QListWidget::item:selected,\n" -"QTreeView::item:selected,\n" -"QTreeWidget::item:selected,\n" "QTableView::item:selected,\n" "QTableWidget::item:selected {\n" -" background-color: #315D90;\n" +" background-color: #393F44;\n" +" border-color: #66737C;\n" " color: #FFFFFF;\n" "}\n" "\n" -"#panelToolbar {\n" -" background-color: #222526;\n" -" border: none;\n" +"QHeaderView {\n" +" background-color: #202224;\n" "}\n" "\n" -"#panelAddButton {\n" -" background-color: #2C3235;\n" -" border-color: #414A4F;\n" -" padding: 2px 7px;\n" -" min-height: 19px;\n" +"QHeaderView::section {\n" +" background-color: #292C2F;\n" +" border: none;\n" +" border-right: 1px solid #404347;\n" +" border-bottom: 1px solid #404347;\n" +" padding: 5px 7px;\n" +" color: #98A4B7;\n" " font-weight: 600;\n" "}\n" "\n" -"#panelMoreButton,\n" -"#browserRevealButton,\n" -"#browserNavigationButton {\n" -" background-color: transparent;\n" -" border-color: transparent;\n" -" padding: 2px;\n" -" min-width: 20px;\n" -" min-height: 19px;\n" +"QTabWidget::pane {\n" +" background-color: #1E2022;\n" +" border: 1px solid #3B3E42;\n" +" border-radius: 0 0 10px 10px;\n" "}\n" "\n" -"#panelMoreButton:hover,\n" -"#browserRevealButton:hover,\n" -"#browserNavigationButton:hover {\n" -" background-color: #30373A;\n" -" border-color: #424B50;\n" +"QTabBar::tab {\n" +" background-color: #202224;\n" +" border: none;\n" +" border-right: 1px solid #383B3F;\n" +" border-bottom: 1px solid #3B3E42;\n" +" color: #7F8B9D;\n" +" min-width: 88px;\n" +" padding: 5px 10px;\n" +" margin: 2px 1px;\n" +" border-radius: 8px;\n" "}\n" "\n" -"#contentPathField {\n" -" background-color: #191D1F;\n" -" border-color: #30373B;\n" -" color: #AEB8BE;\n" -" padding: 2px 6px;\n" -" min-height: 19px;\n" +"QTabBar::tab:hover {\n" +" background-color: #2B2E31;\n" +" color: #C8D1DF;\n" "}\n" "\n" -"#contentSearchField {\n" +"QTabBar::tab:selected {\n" +" background-color: #36393C;\n" +" color: #F2F5F9;\n" +" border-bottom: 2px solid #78858E;\n" +"}\n" +"\n" +"QMenuBar#atlasMenuBar {\n" +" background-color: #141517;\n" +" border-bottom: 1px solid #303236;\n" " padding: 2px 6px;\n" -" min-height: 19px;\n" "}\n" "\n" -"QTreeView#hierarchyTree {\n" -" background-color: #1B1F20;\n" -" border: none;\n" -" border-radius: 4px;\n" -" padding: 3px;\n" -" show-decoration-selected: 1;\n" +"QMenuBar#atlasMenuBar::item {\n" +" background: transparent;\n" +" color: #B8C2D0;\n" +" padding: 5px 9px;\n" +" border-radius: 7px;\n" "}\n" "\n" -"QTreeView#hierarchyTree::item {\n" -" min-height: 20px;\n" -" padding: 2px 5px;\n" +"QMenuBar#atlasMenuBar::item:selected,\n" +"QMenuBar#atlasMenuBar::item:pressed {\n" +" background-color: #34373A;\n" +" color: #FFFFFF;\n" "}\n" "\n" -"QListView#contentGrid {\n" -" background-color: #1B1F20;\n" -" border: none;\n" -" border-radius: 4px;\n" -" padding: 8px;\n" +"QMenu {\n" +" background-color: #292C2F;\n" +" border: 1px solid #494D52;\n" +" border-radius: 10px;\n" +" padding: 3px;\n" "}\n" "\n" -"QListView#contentGrid::item {\n" -" min-height: 88px;\n" -" padding: 6px;\n" -" margin: 2px;\n" -" border: 1px solid transparent;\n" +"QMenu::item {\n" +" background: transparent;\n" " border-radius: 7px;\n" +" padding: 5px 30px 5px 8px;\n" +" color: #DCE3EC;\n" "}\n" "\n" -"QListView#contentGrid::item:hover {\n" -" background-color: #272E31;\n" -" border-color: #353F44;\n" +"QMenu::item:selected {\n" +" background-color: #3A3E42;\n" +" color: #FFFFFF;\n" "}\n" "\n" -"QListView#contentGrid::item:selected {\n" -" background-color: #284E73;\n" -" border-color: #579FE3;\n" -" color: #FFFFFF;\n" +"QMenu::item:disabled {\n" +" color: #596477;\n" "}\n" "\n" -"QScrollArea#inspectorScroll {\n" -" background-color: #1B1F20;\n" -" border: none;\n" -" border-radius: 0;\n" +"QMenu::separator {\n" +" background-color: #424549;\n" +" height: 1px;\n" +" margin: 5px 8px;\n" "}\n" "\n" -"#inspectorContent {\n" -" background-color: #1B1F20;\n" +"QSplitter::handle {\n" +" background-color: #111214;\n" "}\n" "\n" -"#inspectorHeader {\n" -" background-color: #24292B;\n" -" border: 1px solid #353D41;\n" -" border-radius: 3px;\n" +"QSplitter::handle:horizontal {\n" +" width: 4px;\n" "}\n" "\n" -"#inspectorObjectIcon {\n" -" background-color: #1C2022;\n" -" border: 1px solid #3B4449;\n" -" border-radius: 3px;\n" -" padding: 2px;\n" +"QSplitter::handle:vertical {\n" +" height: 4px;\n" "}\n" "\n" -"#inspectorNameField {\n" -" background-color: transparent;\n" -" border: 1px solid transparent;\n" -" border-radius: 4px;\n" -" color: #F4F7F8;\n" -" font-size: 14px;\n" -" font-weight: 650;\n" -" padding: 2px 4px;\n" -" min-height: 20px;\n" +"QSplitter::handle:hover {\n" +" background-color: #71889A;\n" "}\n" "\n" -"#inspectorNameField:hover {\n" -" background-color: #1D2123;\n" -" border-color: #3C464B;\n" +"QStatusBar {\n" +" background-color: #141517;\n" +" border-top: 1px solid #303236;\n" +" color: #8490A4;\n" "}\n" "\n" -"#inspectorNameField:focus {\n" -" background-color: #171A1B;\n" -" border-color: #5FB3FF;\n" +"#atlasStatusBar {\n" +" min-height: 21px;\n" +" padding: 0 6px;\n" "}\n" "\n" -"#inspectorTypeLabel {\n" -" color: #879299;\n" -" padding-left: 5px;\n" -" font-size: 11px;\n" -"}\n" -"\n" -"#inspectorComponent {\n" -" background-color: #23282A;\n" -" border: 1px solid #363E42;\n" -" border-radius: 3px;\n" -"}\n" -"\n" -"#inspectorComponentHeaderRow {\n" -" background-color: #2A3033;\n" -" border: none;\n" -" border-bottom: 1px solid #343D41;\n" -" border-radius: 3px;\n" -"}\n" -"\n" -"#inspectorComponentHeader {\n" -" background-color: transparent;\n" -" border: none;\n" -" border-radius: 3px;\n" -" padding: 4px 7px;\n" -" color: #EEF2F4;\n" -" font-weight: 650;\n" -" text-align: left;\n" -"}\n" -"\n" -"#inspectorComponentHeader:hover {\n" -" background-color: #30373A;\n" -"}\n" -"\n" -"#inspectorComponentRemoveButton {\n" -" background-color: transparent;\n" -" border-color: transparent;\n" -" min-width: 20px;\n" -" min-height: 20px;\n" -" padding: 1px;\n" -"}\n" -"\n" -"#inspectorComponentRemoveButton:hover {\n" -" background-color: #543136;\n" -" border-color: #78444C;\n" -"}\n" -"\n" -"#inspectorComponentBody {\n" -" background-color: transparent;\n" -"}\n" -"\n" -"#inspectorPropertyRow {\n" -" background-color: transparent;\n" -" border: none;\n" -"}\n" -"\n" -"#inspectorPropertyLabel {\n" -" color: #ABB5BA;\n" -" font-size: 12px;\n" -"}\n" -"\n" -"#inspectorVectorField,\n" -"#inspectorColorField,\n" -"#inspectorNumericField {\n" -" background-color: #191C1D;\n" -" border: 1px solid #363D41;\n" -" border-radius: 3px;\n" +"#statusRuntimeIcon {\n" +" padding: 0 4px;\n" "}\n" "\n" -"#inspectorAxisLabel {\n" -" color: #748088;\n" -" font-size: 10px;\n" +"#statusRenderer {\n" +" background-color: #2B2E30;\n" +" border: 1px solid #45494D;\n" +" border-radius: 8px;\n" +" color: #B6BCB8;\n" +" font-size: 9px;\n" " font-weight: 700;\n" -" min-width: 10px;\n" -"}\n" -"\n" -"#inspectorVectorField QDoubleSpinBox {\n" -" background-color: transparent;\n" -" border: none;\n" -" border-radius: 0;\n" -" padding: 2px;\n" -"}\n" -"\n" -"#inspectorNumericField QDoubleSpinBox {\n" -" background-color: transparent;\n" -" border: none;\n" -"}\n" -"\n" -"#inspectorSyncButton {\n" -" background-color: transparent;\n" -" border: none;\n" -" min-width: 20px;\n" -" min-height: 20px;\n" -" padding: 1px;\n" -"}\n" -"\n" -"#inspectorSyncButton:hover {\n" -" background-color: #30373A;\n" -"}\n" -"\n" -"#inspectorSyncButton[matched=\"true\"] {\n" -" background-color: #242A2D;\n" -" border: 1px solid #465158;\n" -" color: #D5DDE1;\n" " padding: 2px 6px;\n" -" text-align: left;\n" "}\n" "\n" -"#inspectorSyncButton[matched=\"true\"]:hover {\n" -" background-color: #30383C;\n" -" border-color: #5B6A72;\n" +"#statusVersion {\n" +" color: #68758A;\n" +" font-size: 9px;\n" +" padding: 0 6px;\n" "}\n" "\n" -"#inspectorColorSwatch {\n" -" border: 1px solid #566167;\n" -" border-radius: 4px;\n" -" padding: 0;\n" -" min-height: 18px;\n" +"#workspaceBar {\n" +" background-color: #1E2022;\n" +" border: none;\n" +" border-bottom: 1px solid #3B3E42;\n" +" spacing: 3px;\n" +" padding: 2px 5px 2px 0;\n" "}\n" "\n" -"#inspectorColorText {\n" -" background-color: transparent;\n" -" border: none;\n" -" padding: 3px;\n" +"#workspaceIdentity {\n" +" background: transparent;\n" +" border-right: 1px solid #424549;\n" "}\n" "\n" -"#inspectorNestedGroup {\n" -" background-color: #202426;\n" -" border-top: 1px solid #30373A;\n" -" border-bottom: 1px solid #30373A;\n" +"#workspaceMark {\n" +" background: transparent;\n" "}\n" "\n" -"#inspectorNestedTitle {\n" -" color: #D1D8DC;\n" -" font-weight: 650;\n" -" padding: 2px 1px 4px 1px;\n" +"#workspaceBrand {\n" +" color: #F5F7FA;\n" +" font-size: 12px;\n" +" font-weight: 800;\n" "}\n" "\n" -"#inspectorArrayTitle {\n" -" color: #7FB9EC;\n" +"#workspaceProject {\n" +" color: #7F8B9D;\n" " font-size: 11px;\n" -" font-weight: 650;\n" -" padding: 5px 2px 1px 2px;\n" "}\n" "\n" -"#inspectorArrayButton {\n" +"#workspaceModeButton {\n" " background-color: transparent;\n" " border: 1px solid transparent;\n" -" border-radius: 4px;\n" -" color: #AEB8BE;\n" -" min-width: 20px;\n" -" min-height: 18px;\n" -" padding: 1px 4px;\n" -"}\n" -"\n" -"#inspectorArrayButton:hover {\n" -" background-color: #30373A;\n" -" border-color: #465157;\n" -" color: #FFFFFF;\n" -"}\n" -"\n" -"#inspectorEmptyTitle {\n" -" color: #DDE3E6;\n" -" font-size: 15px;\n" -" font-weight: 650;\n" -"}\n" -"\n" -"#inspectorEmptyHint {\n" -" color: #77838A;\n" -" font-size: 12px;\n" -"}\n" -"\n" -"#inspectorOpenAssetButton {\n" -" min-height: 24px;\n" +" border-radius: 9px;\n" +" color: #94A0B2;\n" +" padding: 4px 8px;\n" +" margin: 0 1px;\n" "}\n" "\n" -"#inspectorAddComponentButton {\n" -" background-color: #2B3235;\n" -" border: 1px solid #465158;\n" -" border-radius: 3px;\n" -" color: #E9EEF0;\n" -" font-weight: 600;\n" -" min-height: 20px;\n" -" padding: 3px 8px;\n" +"#workspaceModeButton:hover {\n" +" background-color: #303336;\n" +" color: #DDE4ED;\n" "}\n" "\n" -"#inspectorAddComponentButton:hover {\n" -" background-color: #343C40;\n" -" border-color: #5B6970;\n" +"#workspaceModeButton:checked {\n" +" background-color: #3A3E42;\n" +" border-color: #5E656B;\n" +" color: #FFFFFF;\n" "}\n" "\n" -"#inspectorAudioControls {\n" -" background-color: #202426;\n" -" border: 1px solid #343D41;\n" -" border-top: none;\n" -" border-bottom-left-radius: 7px;\n" -" border-bottom-right-radius: 7px;\n" +"#workspaceUtilityButton {\n" +" background: transparent;\n" +" border-color: transparent;\n" +" min-width: 26px;\n" +" padding: 3px 5px;\n" "}\n" "\n" -"QHeaderView {\n" -" background-color: #252A2C;\n" -" border: none;\n" +"#workspaceBuildButton,\n" +"#workspaceLaunchButton {\n" +" min-width: 26px;\n" +" padding: 3px 5px;\n" +" background-color: #292C2F;\n" +" border-color: #45494D;\n" +" margin-left: 3px;\n" "}\n" "\n" -"QHeaderView::section {\n" -" background-color: #252A2C;\n" -" color: #AEB8BE;\n" -" border: none;\n" -" border-right: 1px solid #343B3F;\n" -" border-bottom: 1px solid #343B3F;\n" -" padding: 4px 6px;\n" -" font-weight: 600;\n" +"#workspaceBuildButton:hover,\n" +"#workspaceLaunchButton:hover {\n" +" background-color: #363A3E;\n" +" border-color: #5A5F65;\n" "}\n" "\n" -"QHeaderView::section:hover {\n" -" background-color: #2E3538;\n" -" color: #EAF0F2;\n" +"#sceneTabs {\n" +" background-color: #191A1C;\n" +" border-bottom: 1px solid #3B3E42;\n" "}\n" "\n" -"QTabWidget::pane {\n" -" background-color: #222526;\n" -" border: 1px solid #343B3F;\n" -" border-radius: 3px;\n" -" top: -1px;\n" +"#sceneTabs::tab {\n" +" background-color: #202224;\n" +" border-right: 1px solid #3A3D40;\n" +" color: #7F8B9D;\n" +" min-width: 112px;\n" +" padding: 5px 10px;\n" +" margin: 2px;\n" +" border-radius: 8px;\n" "}\n" "\n" -"QTabBar::tab {\n" -" background-color: #252A2C;\n" -" color: #9EA9AF;\n" -" border: 1px solid #343B3F;\n" -" border-bottom-color: #343B3F;\n" -" border-top-left-radius: 3px;\n" -" border-top-right-radius: 3px;\n" -" padding: 4px 9px;\n" -" min-width: 46px;\n" +"#sceneTabs::tab:selected {\n" +" background-color: #36393C;\n" +" color: #F3F6FA;\n" +" border-bottom: 2px solid #78858E;\n" "}\n" "\n" -"QTabBar::tab:first {\n" -" border-top-left-radius: 5px;\n" +"#viewportTools {\n" +" background-color: #141517;\n" "}\n" "\n" -"QTabBar::tab:last {\n" -" border-top-right-radius: 5px;\n" +"#viewportToolbar {\n" +" background-color: #202224;\n" +" border-bottom: 1px solid #3B3E42;\n" "}\n" "\n" -"QTabBar::tab:hover {\n" -" background-color: #30383B;\n" -" color: #E3EAED;\n" +"#viewportPlaybackButton,\n" +"#viewportModeButton,\n" +"#viewportOptionButton,\n" +"#viewportShadingButton {\n" +" background-color: #292C2F;\n" +" border-color: #414549;\n" +" min-width: 25px;\n" +" min-height: 22px;\n" +" padding: 3px 5px;\n" "}\n" "\n" -"QTabBar::tab:selected {\n" -" background-color: #303638;\n" -" color: #FFFFFF;\n" -" border-top: 1px solid #343B3F;\n" -" border-bottom-color: #303638;\n" +"#viewportPlaybackButton:hover,\n" +"#viewportModeButton:hover,\n" +"#viewportOptionButton:hover,\n" +"#viewportShadingButton:hover {\n" +" background-color: #363A3E;\n" +" border-color: #5A5F65;\n" "}\n" "\n" -"QMenuBar {\n" -" background-color: #222526;\n" -" color: #CCD4D8;\n" -" border-bottom: none;\n" +"#viewportModeButton:checked,\n" +"#viewportShadingButton:checked {\n" +" background-color: #3A4248;\n" +" border-color: #6F7B84;\n" "}\n" "\n" -"QMenuBar::item {\n" -" background-color: transparent;\n" -" padding: 4px 8px;\n" +"#viewportFpsLabel {\n" +" color: #9CA5A0;\n" +" font-size: 10px;\n" +" font-weight: 650;\n" "}\n" "\n" -"QMenuBar::item:selected {\n" -" background-color: #30383B;\n" -" color: #FFFFFF;\n" +"#viewportShortcutHint {\n" +" background-color: #141517;\n" +" border-top: 1px solid #303236;\n" +" color: #68758A;\n" +" font-size: 10px;\n" +" padding: 3px 7px;\n" "}\n" "\n" -"QMenu {\n" -" background-color: #1B1F20;\n" -" color: #E5ECEF;\n" -" border: 1px solid #3D454A;\n" -" border-radius: 3px;\n" +"#panelToolbar,\n" +"#materialEditorHeader,\n" +"#postProcessingToolbar,\n" +"#workspaceToolbar {\n" +" background-color: #232527;\n" +" border-bottom: 1px solid #404347;\n" " padding: 3px;\n" "}\n" "\n" -"QMenu::item {\n" -" padding: 4px 24px 4px 8px;\n" -" border-radius: 3px;\n" -"}\n" -"\n" -"QMenu::item:selected {\n" -" background-color: #315D90;\n" -" color: #FFFFFF;\n" -"}\n" -"\n" -"QMenu::separator {\n" -" height: 1px;\n" -" background-color: #343B3F;\n" -" margin: 3px 5px;\n" -"}\n" -"\n" -"QSplitter::handle {\n" -" background-color: #222526;\n" -"}\n" -"\n" -"QSplitter::handle:horizontal {\n" -" width: 6px;\n" -"}\n" -"\n" -"QSplitter::handle:vertical {\n" -" height: 6px;\n" -"}\n" -"\n" -"QSplitter::handle:hover {\n" -" background-color: #4FAAFF;\n" +"#panelAddButton,\n" +"#materialSaveButton,\n" +"#workspaceApplyButton {\n" +" background-color: #303438;\n" +" border-color: #4C5257;\n" +" color: #D8DBDE;\n" "}\n" "\n" -"QStatusBar {\n" -" background-color: #1B1E1F;\n" -" color: #AEB8BE;\n" -" border-top: 1px solid #303638;\n" +"#panelMoreButton,\n" +"#browserNavigationButton,\n" +"#browserRevealButton {\n" +" background-color: transparent;\n" +" border-color: transparent;\n" +" min-width: 24px;\n" "}\n" "\n" -"QStatusBar::item {\n" -" border: none;\n" +"#panelMoreButton:hover,\n" +"#browserNavigationButton:hover,\n" +"#browserRevealButton:hover {\n" +" background-color: #34373A;\n" +" border-color: #484C50;\n" "}\n" "\n" -"ads--CDockContainerWidget {\n" -" background-color: #222526;\n" +"#contentPathField {\n" +" background-color: #1B1D1F;\n" +" color: #8490A4;\n" +" font-size: 11px;\n" "}\n" "\n" -"ads--CDockContainerWidget > QSplitter {\n" -" padding: 1px;\n" +"#contentSearchField {\n" +" min-width: 130px;\n" "}\n" "\n" -"ads--CDockSplitter::handle,\n" -"ads--CDockContainerWidget ads--CDockSplitter::handle {\n" -" background-color: #222526;\n" +"QTreeView#hierarchyTree {\n" +" background-color: #1E2022;\n" +" border-top: 1px solid #303236;\n" +" padding: 5px 3px;\n" "}\n" "\n" -"ads--CDockSplitter::handle:hover,\n" -"ads--CDockContainerWidget ads--CDockSplitter::handle:hover {\n" -" background-color: #4FAAFF;\n" +"QTreeView#hierarchyTree::item {\n" +" min-height: 24px;\n" +" padding: 3px 5px;\n" "}\n" "\n" -"ads--CDockAreaWidget {\n" -" background-color: #222526;\n" -" border: none;\n" -" border-radius: 0;\n" +"QTreeView#hierarchyTree::item:selected {\n" +" background-color: #343C43;\n" +" border-left: 2px solid #8498A8;\n" "}\n" "\n" -"ads--CDockAreaWidget[focused=\"true\"] {\n" -" border: none;\n" +"QListView#contentGrid {\n" +" background-color: #1A1C1E;\n" +" border-top: 1px solid #303236;\n" +" padding: 6px;\n" "}\n" "\n" -"ads--CDockAreaTitleBar {\n" -" background-color: #222526;\n" -" border-bottom: none;\n" -" border-radius: 0;\n" -" padding: 0;\n" +"QListView#contentGrid::item {\n" +" background-color: #232527;\n" +" border: 1px solid #34373A;\n" +" border-radius: 11px;\n" +" padding: 7px;\n" +" color: #BCC6D4;\n" "}\n" "\n" -"ads--CDockAreaWidget[focused=\"true\"] ads--CDockAreaTitleBar {\n" -" background-color: #222526;\n" -" border-bottom: none;\n" +"QListView#contentGrid::item:hover {\n" +" background-color: #2E3134;\n" +" border-color: #4B5055;\n" "}\n" "\n" -"ads--CDockAreaTabBar,\n" -"#tabsContainerWidget {\n" -" background-color: #222526;\n" -" border: none;\n" -" border-radius: 0;\n" +"QListView#contentGrid::item:selected {\n" +" background-color: #393F44;\n" +" border-color: #66737C;\n" +" color: #FFFFFF;\n" "}\n" "\n" -"ads--CTitleBarButton {\n" -" background-color: transparent;\n" +"QScrollArea#inspectorScroll,\n" +"#inspectorContent,\n" +"#materialEditorBody,\n" +"#postProcessingBody {\n" +" background-color: #1E2022;\n" " border: none;\n" -" border-radius: 4px;\n" -" padding: 2px;\n" -" margin: 2px;\n" -" min-width: 18px;\n" -" min-height: 18px;\n" -"}\n" -"\n" -"ads--CTitleBarButton:hover {\n" -" background-color: #394045;\n" "}\n" "\n" -"ads--CTitleBarButton:pressed {\n" -" background-color: #1A1D1E;\n" +"#inspectorHeader {\n" +" background-color: #25272A;\n" +" border: 1px solid #404347;\n" +" border-radius: 12px;\n" +" padding: 6px;\n" "}\n" "\n" -"#tabsMenuButton::menu-indicator {\n" -" image: none;\n" +"#inspectorObjectIcon {\n" +" background-color: #34373B;\n" +" border: 1px solid #4E5257;\n" +" border-radius: 10px;\n" +" padding: 4px;\n" "}\n" "\n" -"#tabsMenuButton {\n" -" qproperty-icon: url(:/ads/images/tabs-menu-button_dark.svg);\n" -" qproperty-iconSize: 16px;\n" +"#inspectorNameField {\n" +" background: transparent;\n" +" border: 1px solid transparent;\n" +" color: #F3F6FA;\n" +" font-size: 14px;\n" +" font-weight: 700;\n" "}\n" "\n" -"#dockAreaCloseButton {\n" -" qproperty-icon: url(:/ads/images/close-button_dark.svg), url(:/ads/images/close-button-disabled_dark.svg) disabled;\n" -" qproperty-iconSize: 16px;\n" +"#inspectorNameField:hover,\n" +"#inspectorNameField:focus {\n" +" background-color: #1E2022;\n" +" border-color: #5A5F65;\n" "}\n" "\n" -"#detachGroupButton {\n" -" qproperty-icon: url(:/ads/images/detach-button_dark.svg), url(:/ads/images/detach-button-disabled_dark.svg) disabled;\n" -" qproperty-iconSize: 16px;\n" +"#inspectorTypeLabel {\n" +" color: #7E8A9E;\n" +" font-size: 10px;\n" +" font-weight: 600;\n" "}\n" "\n" -"#dockAreaAutoHideButton {\n" -" qproperty-icon: url(:/ads/images/vs-pin-button_dark.svg), url(:/ads/images/vs-pin-button-disabled_dark.svg) disabled;\n" -" qproperty-iconSize: 16px;\n" +"#inspectorComponent {\n" +" background-color: #242628;\n" +" border: 1px solid #3B3E41;\n" +" border-radius: 11px;\n" +" margin-top: 3px;\n" "}\n" "\n" -"#dockAreaMinimizeButton {\n" -" qproperty-icon: url(:/ads/images/minimize-button-focused_dark.svg);\n" -" qproperty-iconSize: 16px;\n" +"#inspectorComponentHeaderRow {\n" +" background-color: #292C2F;\n" +" border-bottom: 1px solid #3B3E41;\n" +" border-radius: 11px 11px 0 0;\n" "}\n" "\n" -"ads--CDockWidgetTab {\n" -" background-color: #252A2C;\n" +"#inspectorComponentHeader {\n" +" background: transparent;\n" " border: none;\n" -" border-right: 1px solid #303638;\n" -" border-top-left-radius: 3px;\n" -" border-top-right-radius: 3px;\n" -" margin: 2px 1px 0 0;\n" -" padding: 0 7px;\n" -" qproperty-iconSize: 14px 14px;\n" -"}\n" -"\n" -"ads--CDockWidgetTab:hover {\n" -" background-color: #30383B;\n" -"}\n" -"\n" -"ads--CDockWidgetTab[activeTab=\"true\"] {\n" -" background-color: #303638;\n" -" border-top: none;\n" -" border-right: 1px solid #343B3F;\n" -"}\n" -"\n" -"ads--CDockWidgetTab[focused=\"true\"] {\n" -" background-color: #303638;\n" -" border-top: none;\n" -"}\n" -"\n" -"ads--CDockWidgetTab QLabel,\n" -"ads--CDockWidgetTab #dockWidgetTabLabel {\n" -" color: #9EA9AF;\n" -" background-color: transparent;\n" -"}\n" -"\n" -"ads--CDockWidgetTab:hover QLabel,\n" -"ads--CDockWidgetTab:hover #dockWidgetTabLabel {\n" -" color: #E3EAED;\n" +" color: #E8ECF2;\n" +" font-weight: 650;\n" +" text-align: left;\n" +" padding: 5px 7px;\n" "}\n" "\n" -"ads--CDockWidgetTab[activeTab=\"true\"] QLabel,\n" -"ads--CDockWidgetTab[activeTab=\"true\"] #dockWidgetTabLabel,\n" -"ads--CDockWidgetTab[focused=\"true\"] QLabel,\n" -"ads--CDockWidgetTab[focused=\"true\"] #dockWidgetTabLabel {\n" -" color: #FFFFFF;\n" +"#inspectorComponentHeader:hover {\n" +" background-color: #303337;\n" "}\n" "\n" -"#tabCloseButton {\n" -" background-color: transparent;\n" +"#inspectorComponentRemoveButton {\n" +" background: transparent;\n" " border: none;\n" -" border-radius: 4px;\n" -" padding: 1px;\n" -" margin: 2px 0 2px 4px;\n" -" qproperty-icon: url(:/ads/images/close-button_dark.svg), url(:/ads/images/close-button-disabled_dark.svg) disabled;\n" -" qproperty-iconSize: 16px;\n" -"}\n" -"\n" -"#tabCloseButton:hover {\n" -" background-color: #3D454A;\n" -"}\n" -"\n" -"#tabCloseButton:pressed {\n" -" background-color: #16191A;\n" +" min-width: 22px;\n" "}\n" "\n" -"ads--CDockWidgetTab[focused=\"true\"] > #tabCloseButton {\n" -" qproperty-icon: url(:/ads/images/close-button-focused_dark.svg);\n" +"#inspectorComponentRemoveButton:hover {\n" +" background-color: #3A3031;\n" +" border: 1px solid #695556;\n" "}\n" "\n" -"ads--CDockWidget {\n" -" background-color: #222526;\n" -" border-top: 1px solid #303638;\n" +"#inspectorComponentBody {\n" +" background-color: #242628;\n" +" padding: 5px;\n" "}\n" "\n" -"QScrollArea#dockWidgetScrollArea {\n" -" background-color: #222526;\n" -" border: none;\n" -" border-radius: 0;\n" -" padding: 0;\n" +"#inspectorPropertyRow {\n" +" background: transparent;\n" +" min-height: 27px;\n" "}\n" "\n" -"QWidget[dockWidgetContent=\"true\"] {\n" -" background-color: #222526;\n" +"#inspectorPropertyLabel {\n" +" color: #929EB0;\n" +" font-size: 11px;\n" "}\n" "\n" -"QWidget#collapsibleSection {\n" -" background-color: #222526;\n" -" border: none;\n" -" border-radius: 0;\n" +"#inspectorVectorField,\n" +"#inspectorColorField,\n" +"#inspectorNumericField {\n" +" background-color: #1B1D1F;\n" +" border: 1px solid #404448;\n" +" border-radius: 9px;\n" "}\n" "\n" -"QToolButton#collapsibleHeader {\n" -" background-color: transparent;\n" +"#inspectorVectorField QDoubleSpinBox,\n" +"#inspectorNumericField QDoubleSpinBox {\n" +" background: transparent;\n" " border: none;\n" -" border-radius: 0;\n" -" padding: 4px 0;\n" -" color: #E7ECEF;\n" -" font-weight: 600;\n" -" text-align: left;\n" "}\n" "\n" -"QToolButton#collapsibleHeader:hover {\n" -" background-color: transparent;\n" -" color: #FFFFFF;\n" -"}\n" -"\n" -"QToolButton#collapsibleHeader:checked {\n" -" background-color: transparent;\n" -"}\n" -"\n" -"QToolButton#collapsibleHeader::menu-indicator {\n" -" image: none;\n" +"#inspectorAxisLabel {\n" +" background-color: #34373A;\n" +" border-radius: 7px;\n" +" color: #AAB5C5;\n" +" font-size: 9px;\n" +" font-weight: 750;\n" +" padding: 2px 4px;\n" "}\n" "\n" -"QWidget#collapsibleBody {\n" -" background-color: #222526;\n" -" border: none;\n" -" border-radius: 0;\n" +"#inspectorSyncButton,\n" +"#inspectorArrayButton {\n" +" background: transparent;\n" +" border-color: transparent;\n" +" min-width: 22px;\n" "}\n" "\n" -"#autoHideTitleLabel {\n" -" color: #EAF0F2;\n" -" background-color: transparent;\n" -" padding-left: 6px;\n" -" font-weight: 600;\n" +"#inspectorSyncButton[matched=\"true\"] {\n" +" background-color: #343936;\n" +" border-color: #555F59;\n" +" color: #B6BEB9;\n" "}\n" "\n" -"ads--CAutoHideSideBar {\n" -" background-color: #1B1E1F;\n" -" border: none;\n" -" qproperty-spacing: 8;\n" +"#inspectorColorSwatch {\n" +" background-color: #292C2F;\n" +" border: 1px solid #4D5155;\n" +" border-radius: 8px;\n" +" padding: 2px;\n" "}\n" "\n" -"#sideTabsContainerWidget {\n" -" background-color: transparent;\n" +"#inspectorColorText {\n" +" color: #9CA8BA;\n" +" font-family: \"Menlo\";\n" +" font-size: 10px;\n" "}\n" "\n" -"ads--CAutoHideSideBar[sideBarLocation=\"0\"] {\n" -" border-bottom: 1px solid #303638;\n" +"#inspectorNestedGroup {\n" +" background-color: #202224;\n" +" border: 1px solid #383B3F;\n" +" border-radius: 10px;\n" +" margin: 3px 0;\n" +" padding: 5px;\n" "}\n" "\n" -"ads--CAutoHideSideBar[sideBarLocation=\"1\"] {\n" -" border-right: 1px solid #303638;\n" +"#inspectorNestedTitle,\n" +"#inspectorArrayTitle {\n" +" color: #AEB8C8;\n" +" font-weight: 650;\n" "}\n" "\n" -"ads--CAutoHideSideBar[sideBarLocation=\"2\"] {\n" -" border-left: 1px solid #303638;\n" +"#inspectorEmptyTitle,\n" +"#materialEditorEmpty,\n" +"#postProcessingEmpty {\n" +" color: #C4CDDA;\n" +" font-size: 14px;\n" +" font-weight: 650;\n" "}\n" "\n" -"ads--CAutoHideSideBar[sideBarLocation=\"3\"] {\n" -" border-top: 1px solid #303638;\n" +"#inspectorEmptyHint {\n" +" color: #728096;\n" "}\n" "\n" -"ads--CAutoHideTab {\n" -" background-color: transparent;\n" -" border: none;\n" -" color: #AEB8BE;\n" -" padding: 4px 6px;\n" -" min-height: 24px;\n" -" qproperty-iconSize: 16px 16px;\n" +"#inspectorOpenAssetButton,\n" +"#inspectorAddComponentButton {\n" +" background-color: #292C2F;\n" +" border: 1px dashed #5A5F65;\n" +" color: #C7D0DD;\n" +" padding: 6px;\n" "}\n" "\n" -"ads--CAutoHideTab:hover {\n" -" background-color: #30383B;\n" +"#inspectorAddComponentButton:hover {\n" +" background-color: #363A3E;\n" +" border-color: #646B70;\n" " color: #FFFFFF;\n" "}\n" "\n" -"ads--CAutoHideTab[activeTab=\"true\"] {\n" -" background-color: #303638;\n" -" color: #FFFFFF;\n" +"#inspectorAudioControls {\n" +" background-color: #202224;\n" +" border-radius: 9px;\n" "}\n" "\n" -"ads--CAutoHideTab[iconOnly=\"false\"][sideBarLocation=\"0\"],\n" -"ads--CAutoHideTab[iconOnly=\"false\"][sideBarLocation=\"2\"],\n" -"ads--CAutoHideTab[iconOnly=\"true\"][sideBarLocation=\"0\"] {\n" -" border-top: 3px solid #465157;\n" +"#materialEditorTitle,\n" +"#postProcessingTitle,\n" +"#postProcessingSectionTitle,\n" +"#inspectorCameraTitle,\n" +"#workspaceTitle {\n" +" color: #F3F6FA;\n" +" font-size: 13px;\n" +" font-weight: 700;\n" "}\n" "\n" -"ads--CAutoHideTab[iconOnly=\"false\"][sideBarLocation=\"1\"],\n" -"ads--CAutoHideTab[iconOnly=\"false\"][sideBarLocation=\"3\"],\n" -"ads--CAutoHideTab[iconOnly=\"true\"][sideBarLocation=\"3\"] {\n" -" border-bottom: 3px solid #465157;\n" +"#materialEditorStatus,\n" +"#postProcessingStatus,\n" +"#workspaceStatus,\n" +"#workspaceAutoApply {\n" +" color: #7E8A9E;\n" +" font-size: 10px;\n" "}\n" "\n" -"ads--CAutoHideTab[iconOnly=\"true\"][sideBarLocation=\"1\"] {\n" -" border-left: 3px solid #465157;\n" +"#materialPreview {\n" +" background-color: #141517;\n" +" border: 1px solid #44484C;\n" +" border-radius: 12px;\n" "}\n" "\n" -"ads--CAutoHideTab[iconOnly=\"true\"][sideBarLocation=\"2\"] {\n" -" border-right: 3px solid #465157;\n" +"#materialColorButton {\n" +" background-color: #292C2F;\n" +" border-color: #45494D;\n" +" border-radius: 9px;\n" +" color: #C9CDD0;\n" +" text-align: left;\n" +" padding: 4px 8px;\n" "}\n" "\n" -"ads--CAutoHideTab:hover[iconOnly=\"false\"][sideBarLocation=\"0\"],\n" -"ads--CAutoHideTab:hover[iconOnly=\"false\"][sideBarLocation=\"2\"],\n" -"ads--CAutoHideTab[iconOnly=\"false\"][sideBarLocation=\"0\"][activeTab=\"true\"],\n" -"ads--CAutoHideTab[iconOnly=\"false\"][sideBarLocation=\"2\"][activeTab=\"true\"],\n" -"ads--CAutoHideTab:hover[iconOnly=\"true\"][sideBarLocation=\"0\"],\n" -"ads--CAutoHideTab[iconOnly=\"true\"][sideBarLocation=\"0\"][activeTab=\"true\"] {\n" -" border-top: 3px solid #AEB8BE;\n" +"#materialColorButton:hover {\n" +" background-color: #34383B;\n" +" border-color: #5A5F65;\n" "}\n" "\n" -"ads--CAutoHideTab:hover[iconOnly=\"false\"][sideBarLocation=\"1\"],\n" -"ads--CAutoHideTab:hover[iconOnly=\"false\"][sideBarLocation=\"3\"],\n" -"ads--CAutoHideTab[iconOnly=\"false\"][sideBarLocation=\"1\"][activeTab=\"true\"],\n" -"ads--CAutoHideTab[iconOnly=\"false\"][sideBarLocation=\"3\"][activeTab=\"true\"],\n" -"ads--CAutoHideTab:hover[iconOnly=\"true\"][sideBarLocation=\"3\"],\n" -"ads--CAutoHideTab[iconOnly=\"true\"][sideBarLocation=\"3\"][activeTab=\"true\"] {\n" -" border-bottom: 3px solid #AEB8BE;\n" +"#materialTextureSlot {\n" +" background-color: #232527;\n" +" border: 1px solid #404448;\n" +" border-radius: 10px;\n" +" padding: 4px;\n" "}\n" "\n" -"ads--CAutoHideTab:hover[iconOnly=\"true\"][sideBarLocation=\"1\"],\n" -"ads--CAutoHideTab[iconOnly=\"true\"][sideBarLocation=\"1\"][activeTab=\"true\"] {\n" -" border-left: 3px solid #AEB8BE;\n" +"#materialTexturePreview {\n" +" background-color: #1A1C1E;\n" +" border: 1px solid #494D52;\n" +" border-radius: 9px;\n" +" color: #9E897D;\n" +" font-weight: 750;\n" "}\n" "\n" -"ads--CAutoHideTab:hover[iconOnly=\"true\"][sideBarLocation=\"2\"],\n" -"ads--CAutoHideTab[iconOnly=\"true\"][sideBarLocation=\"2\"][activeTab=\"true\"] {\n" -" border-right: 3px solid #AEB8BE;\n" +"#materialTextureLabel {\n" +" color: #D6DDE7;\n" +" font-weight: 650;\n" "}\n" "\n" -"ads--CAutoHideDockContainer {\n" -" background-color: #222526;\n" -" border: 1px solid #6A7479;\n" +"#materialTexturePath {\n" +" color: #7D899C;\n" "}\n" "\n" -"ads--CAutoHideDockContainer ads--CDockAreaTitleBar,\n" -"ads--CAutoHideDockContainer ads--CDockAreaWidget[focused=\"true\"] ads--CDockAreaTitleBar {\n" -" background-color: #2B3032;\n" +"#environmentPages,\n" +"#environmentWorkspace,\n" +"#environmentPage {\n" +" background-color: #1E2022;\n" " border: none;\n" -" padding: 0;\n" "}\n" "\n" -"ads--CAutoHideDockContainer #autoHideTitleLabel {\n" -" color: #FFFFFF;\n" +"QListWidget#environmentCategories {\n" +" background-color: #1B1D1F;\n" +" border-right: 1px solid #3B3E42;\n" +" padding: 5px;\n" "}\n" "\n" -"ads--CAutoHideDockContainer #dockAreaAutoHideButton {\n" -" qproperty-icon: url(:/ads/images/vs-pin-button-pinned-focused_dark.svg);\n" -" qproperty-iconSize: 16px;\n" +"QListWidget#environmentCategories::item {\n" +" padding: 6px 8px;\n" +" margin: 2px 0;\n" "}\n" "\n" -"ads--CAutoHideDockContainer #dockAreaCloseButton {\n" -" qproperty-icon: url(:/ads/images/close-button-focused_dark.svg);\n" +"QListWidget#environmentCategories::item:selected {\n" +" background-color: #343C43;\n" +" border-left: 2px solid #8498A8;\n" "}\n" "\n" -"ads--CAutoHideDockContainer ads--CTitleBarButton:hover {\n" -" background-color: #34536A;\n" +"#environmentPageTitle {\n" +" color: #F3F6FA;\n" +" font-size: 17px;\n" +" font-weight: 750;\n" "}\n" "\n" -"ads--CAutoHideDockContainer ads--CTitleBarButton:pressed {\n" -" background-color: #17222A;\n" +"#environmentPageSubtitle {\n" +" color: #778499;\n" "}\n" "\n" -"ads--CResizeHandle {\n" -" background-color: #1B1E1F;\n" +"QGroupBox#environmentSection {\n" +" background-color: #242628;\n" +" border-color: #3B3E42;\n" "}\n" "\n" -"ads--CAutoHideDockContainer[sideBarLocation=\"0\"] ads--CResizeHandle,\n" -"ads--CAutoHideDockContainer[sideBarLocation=\"3\"] ads--CResizeHandle {\n" -" border-top: 1px solid #6A7479;\n" +"ads--CDockContainerWidget {\n" +" background-color: #111214;\n" "}\n" "\n" -"ads--CAutoHideDockContainer[sideBarLocation=\"1\"] ads--CResizeHandle {\n" -" border-left: 1px solid #6A7479;\n" +"ads--CDockContainerWidget > QSplitter {\n" +" background-color: #111214;\n" "}\n" "\n" -"ads--CAutoHideDockContainer[sideBarLocation=\"2\"] ads--CResizeHandle {\n" -" border-right: 1px solid #6A7479;\n" +"ads--CDockContainerWidget ads--CDockSplitter::handle {\n" +" background-color: #111214;\n" "}\n" "\n" -"#DockWidgetAreaLabel {\n" -" background-color: rgba(61, 139, 255, 64);\n" -" border: 1px solid rgba(114, 199, 255, 190);\n" -" border-radius: 6px;\n" +"ads--CDockContainerWidget ads--CDockSplitter::handle:hover {\n" +" background-color: #71889A;\n" "}\n" "\n" -"#workspaceToolbar {\n" -" background-color: #191C1D;\n" -" border-bottom: 1px solid #32383B;\n" +"ads--CDockAreaWidget {\n" +" background-color: #1E2022;\n" +" border: 1px solid #34373A;\n" "}\n" "\n" -"#workspaceTitle {\n" -" color: #F2F5F6;\n" -" font-size: 14px;\n" -" font-weight: 650;\n" +"ads--CDockAreaWidget[focused=\"true\"] {\n" +" border-color: #50545A;\n" "}\n" "\n" -"#workspaceStatus,\n" -"#workspaceAutoApply {\n" -" color: #89949A;\n" -" font-size: 11px;\n" +"ads--CDockAreaTitleBar {\n" +" background-color: #202224;\n" +" border-bottom: 1px solid #3B3E42;\n" +" min-height: 26px;\n" "}\n" "\n" -"#workspaceApplyButton {\n" -" background-color: #293238;\n" -" border-color: #3C4C55;\n" -" min-height: 19px;\n" -" padding: 2px 7px;\n" +"ads--CDockAreaWidget[focused=\"true\"] ads--CDockAreaTitleBar {\n" +" background-color: #26282B;\n" "}\n" "\n" -"#environmentWorkspace,\n" -"#environmentPages {\n" -" background-color: #202324;\n" -" border: none;\n" +"#tabsContainerWidget {\n" +" background-color: transparent;\n" "}\n" "\n" -"QListWidget#environmentCategories {\n" -" background-color: #191C1D;\n" +"ads--CTitleBarButton {\n" +" background: transparent;\n" " border: none;\n" -" border-right: 1px solid #32383B;\n" -" border-radius: 0;\n" -" padding: 5px 3px;\n" -" outline: none;\n" +" border-radius: 7px;\n" +" min-width: 22px;\n" +" min-height: 22px;\n" +" padding: 2px;\n" "}\n" "\n" -"QListWidget#environmentCategories::item {\n" -" min-height: 26px;\n" -" padding: 3px 6px;\n" -" border: 1px solid transparent;\n" -" border-radius: 3px;\n" +"ads--CTitleBarButton:hover {\n" +" background-color: #3E4246;\n" "}\n" "\n" -"QListWidget#environmentCategories::item:hover {\n" -" background-color: #282E31;\n" +"ads--CDockWidgetTab {\n" +" background-color: #202224;\n" +" border: none;\n" +" border-right: 1px solid #3A3D40;\n" +" border-bottom: 1px solid #3B3E42;\n" +" padding: 1px 5px;\n" +" margin: 2px 1px;\n" +" border-radius: 7px;\n" "}\n" "\n" -"QListWidget#environmentCategories::item:selected {\n" -" background-color: #303A40;\n" -" border-color: #46545C;\n" -" color: #FFFFFF;\n" +"ads--CDockWidgetTab:hover {\n" +" background-color: #2C2F32;\n" "}\n" "\n" -"QScrollArea#environmentScroll,\n" -"#environmentPage {\n" -" background-color: #202324;\n" -" border: none;\n" -" border-radius: 0;\n" +"ads--CDockWidgetTab[activeTab=\"true\"] {\n" +" background-color: #373A3D;\n" +" border-bottom: 2px solid #78858E;\n" "}\n" "\n" -"#environmentPageTitle {\n" -" color: #F0F3F4;\n" -" font-size: 17px;\n" -" font-weight: 650;\n" +"ads--CDockWidgetTab[focused=\"true\"] {\n" +" background-color: #2B2E31;\n" "}\n" "\n" -"#environmentPageSubtitle {\n" -" color: #838E94;\n" +"ads--CDockWidgetTab #dockWidgetTabLabel {\n" +" color: #7F8B9D;\n" " font-size: 11px;\n" +" padding: 4px 2px;\n" "}\n" "\n" -"QGroupBox#environmentSection {\n" -" background-color: #242829;\n" -" border: 1px solid #363D40;\n" -" border-radius: 3px;\n" -" margin-top: 15px;\n" -" padding: 7px;\n" +"ads--CDockWidgetTab[activeTab=\"true\"] #dockWidgetTabLabel,\n" +"ads--CDockWidgetTab[focused=\"true\"] #dockWidgetTabLabel {\n" +" color: #F1F4F8;\n" "}\n" "\n" -"QGroupBox#environmentSection::title {\n" -" background-color: #242829;\n" -" color: #BDC6CA;\n" -" left: 7px;\n" -" padding: 0 4px;\n" +"#tabCloseButton,\n" +"#dockAreaCloseButton,\n" +"#detachGroupButton,\n" +"#dockAreaAutoHideButton,\n" +"#dockAreaMinimizeButton,\n" +"#tabsMenuButton {\n" +" background: transparent;\n" +" border: none;\n" +" min-width: 20px;\n" +" min-height: 20px;\n" "}\n" "\n" -"#compactVectorField {\n" -" background-color: #191C1D;\n" -" border: 1px solid #363D41;\n" -" border-radius: 3px;\n" +"#tabCloseButton:hover,\n" +"#dockAreaCloseButton:hover,\n" +"#detachGroupButton:hover,\n" +"#dockAreaAutoHideButton:hover,\n" +"#dockAreaMinimizeButton:hover,\n" +"#tabsMenuButton:hover {\n" +" background-color: #424549;\n" "}\n" "\n" -"#compactAxisLabel {\n" -" color: #718087;\n" -" font-size: 10px;\n" -" font-weight: 700;\n" -" min-width: 9px;\n" +"ads--CDockWidget {\n" +" background-color: #1E2022;\n" "}\n" "\n" -"#compactVectorField QDoubleSpinBox {\n" -" background-color: transparent;\n" -" border: none;\n" -" border-radius: 0;\n" -" padding: 2px 1px;\n" +"ads--CAutoHideSideBar,\n" +"#sideTabsContainerWidget {\n" +" background-color: #141517;\n" +"}\n" +"\n" +"ads--CAutoHideTab {\n" +" background-color: #202224;\n" +" border: 1px solid #404448;\n" +" color: #7F8B9D;\n" +" padding: 4px;\n" +" border-radius: 8px;\n" "}\n" "\n" -"#compactColorButton {\n" -" border: 1px solid #566167;\n" +"ads--CAutoHideTab:hover,\n" +"ads--CAutoHideTab[activeTab=\"true\"] {\n" +" background-color: #393F44;\n" +" border-color: #66737C;\n" " color: #FFFFFF;\n" -" font-weight: 650;\n" -" text-align: left;\n" "}\n" "\n" "#projectBrowserRoot,\n" -"#projectBrowserContent,\n" -"#createProjectDialog {\n" -" background-color: #181B1D;\n" -" font-family: \"Manrope\", \"Helvetica Neue\", sans-serif;\n" +"#projectBrowserContent {\n" +" background-color: #18191B;\n" "}\n" "\n" "#projectSidebar {\n" -" background-color: #111315;\n" -" border-right: 1px solid #2A2E31;\n" +" background-color: #151618;\n" +" border-right: 1px solid #303236;\n" "}\n" "\n" "#projectBrand {\n" -" background: transparent;\n" -" color: #F4F7F8;\n" -" font-size: 22px;\n" -" font-weight: 700;\n" +" color: #F5F7FA;\n" +" font-size: 16px;\n" +" font-weight: 750;\n" +"}\n" +"\n" +"#projectSidebarVersion {\n" +" color: #68758A;\n" +" font-size: 10px;\n" +" font-weight: 600;\n" "}\n" "\n" "#projectNavSelected {\n" -" background-color: #252A2D;\n" -" border: 1px solid #32383C;\n" -" border-radius: 8px;\n" -" color: #F4F7F8;\n" -" padding: 9px 12px;\n" +" background-color: #34383C;\n" +" border: 1px solid #51575C;\n" +" border-left: 3px solid #79868F;\n" +" border-radius: 10px;\n" +" color: #DCE9FA;\n" +" padding: 6px 9px;\n" " text-align: left;\n" "}\n" "\n" "#projectNavSelected:disabled {\n" -" background-color: #252A2D;\n" -" border-color: #32383C;\n" -" color: #F4F7F8;\n" -"}\n" -"\n" -"#projectSidebarVersion {\n" -" background: transparent;\n" -" color: #697277;\n" -" font-size: 11px;\n" +" color: #DCE9FA;\n" "}\n" "\n" "#projectBrowserTitle,\n" "#dialogTitle {\n" -" background: transparent;\n" -" color: #F7F9FA;\n" -" font-size: 28px;\n" -" font-weight: 700;\n" +" color: #F4F6FA;\n" +" font-size: 24px;\n" +" font-weight: 750;\n" "}\n" "\n" "#projectBrowserSubtitle,\n" "#dialogSubtitle,\n" -"#emptyStateSubtitle {\n" -" background: transparent;\n" -" color: #889197;\n" -" font-size: 13px;\n" -"}\n" -"\n" -"#primaryAction {\n" -" background-color: #2F85F5;\n" -" border: 1px solid #55A0FF;\n" -" border-radius: 7px;\n" -" color: #FFFFFF;\n" -" font-weight: 600;\n" -" padding: 8px 14px;\n" -"}\n" -"\n" -"#primaryAction:hover {\n" -" background-color: #3B91FF;\n" -" border-color: #72B1FF;\n" -"}\n" -"\n" -"#primaryAction:pressed {\n" -" background-color: #2876DA;\n" -"}\n" -"\n" -"#primaryAction:disabled {\n" -" background-color: #2A3034;\n" -" border-color: #363D41;\n" -" color: #697277;\n" -"}\n" -"\n" -"QPushButton[secondary=\"true\"] {\n" -" background-color: #252A2D;\n" -" border: 1px solid #3A4145;\n" -" border-radius: 7px;\n" -" color: #DDE3E6;\n" -" padding: 8px 14px;\n" -"}\n" -"\n" -"QPushButton[secondary=\"true\"]:hover {\n" -" background-color: #2D3337;\n" -" border-color: #4A5358;\n" +"#emptyStateSubtitle,\n" +"#templateDescription {\n" +" color: #7F8B9D;\n" "}\n" "\n" "#projectSearch {\n" -" background-color: #222629;\n" -" border: 1px solid #343A3E;\n" -" border-radius: 8px;\n" -" color: #EEF2F4;\n" -" padding: 9px 12px;\n" +" background-color: #202224;\n" +" border: 1px solid #43474B;\n" +" border-radius: 11px;\n" +" padding: 7px 9px;\n" +" font-size: 13px;\n" "}\n" "\n" "#projectSearch:focus {\n" -" border-color: #4B9EFF;\n" +" border-color: #71808A;\n" "}\n" "\n" "#projectList {\n" -" background: transparent;\n" +" background-color: transparent;\n" " border: none;\n" -" outline: none;\n" "}\n" "\n" "#projectList::item {\n" " background: transparent;\n" " border: none;\n" +" padding: 0;\n" "}\n" "\n" "#projectRow {\n" -" background-color: #222629;\n" -" border: 1px solid #30363A;\n" -" border-radius: 10px;\n" +" background-color: #242628;\n" +" border: 1px solid #3B3E41;\n" +" border-radius: 13px;\n" "}\n" "\n" "#projectRow:hover {\n" -" background-color: #282D31;\n" -" border-color: #465057;\n" +" background-color: #2C2F32;\n" +" border-color: #565B61;\n" "}\n" "\n" "#projectRow[available=\"false\"] {\n" -" background-color: #1D2022;\n" -" border-color: #532F34;\n" +" background-color: #202224;\n" +" border-color: #303235;\n" +"}\n" +"\n" +"#projectIcon,\n" +"#templateIcon {\n" +" background-color: #303337;\n" +" border: 1px solid #484C50;\n" +" border-radius: 10px;\n" "}\n" "\n" "#projectName {\n" -" background: transparent;\n" -" color: #F0F4F5;\n" +" color: #EEF2F7;\n" " font-size: 14px;\n" -" font-weight: 650;\n" +" font-weight: 700;\n" "}\n" "\n" "#projectPath,\n" "#projectDate {\n" -" background: transparent;\n" -" color: #788187;\n" -" font-size: 11px;\n" +" color: #768398;\n" +" font-size: 10px;\n" "}\n" "\n" "#rendererBadge {\n" -" background-color: #243B51;\n" -" border: 1px solid #31536E;\n" -" border-radius: 9px;\n" -" color: #9ED1FF;\n" -" font-size: 10px;\n" -" font-weight: 600;\n" -" padding: 3px 8px;\n" +" background-color: #2C302E;\n" +" border: 1px solid #494F4B;\n" +" border-radius: 8px;\n" +" color: #B4BBB6;\n" +" padding: 3px 7px;\n" +" font-size: 9px;\n" +" font-weight: 700;\n" "}\n" "\n" "#projectMoreButton {\n" " background: transparent;\n" -" border: none;\n" -" color: #98A2A8;\n" -" font-size: 14px;\n" -" padding: 6px;\n" +" border-color: transparent;\n" "}\n" "\n" "#projectMoreButton:hover {\n" -" background-color: #363D41;\n" -" border-radius: 6px;\n" -" color: #FFFFFF;\n" +" background-color: #3E4246;\n" +" border-color: #51565B;\n" "}\n" "\n" "#projectEmptyState {\n" -" background-color: #1D2022;\n" -" border: 1px dashed #343A3E;\n" -" border-radius: 12px;\n" +" background-color: #1E2022;\n" +" border: 1px dashed #484C51;\n" +" border-radius: 14px;\n" "}\n" "\n" "#emptyStateTitle {\n" -" background: transparent;\n" -" color: #E9EEF0;\n" -" font-size: 17px;\n" -" font-weight: 650;\n" +" color: #CDD5E1;\n" +" font-size: 16px;\n" +" font-weight: 700;\n" +"}\n" +"\n" +"#createProjectDialog {\n" +" background-color: #1E2022;\n" "}\n" "\n" "QFrame[templateCard=\"true\"] {\n" -" background-color: #222629;\n" -" border: 1px solid #343A3E;\n" -" border-radius: 10px;\n" +" background-color: #242628;\n" +" border: 1px solid #42464A;\n" +" border-radius: 13px;\n" "}\n" "\n" "QFrame[templateCard=\"true\"]:hover {\n" -" background-color: #282E32;\n" -" border-color: #4B5961;\n" +" background-color: #2B2E31;\n" +" border-color: #5A5F65;\n" "}\n" "\n" "QFrame[templateCard=\"true\"][selected=\"true\"] {\n" -" background-color: #20354A;\n" -" border: 2px solid #4B9EFF;\n" +" background-color: #393F44;\n" +" border-color: #66737C;\n" "}\n" "\n" "#templateOption {\n" -" background: transparent;\n" -" color: #F3F6F7;\n" -" font-size: 14px;\n" +" color: #E7ECF3;\n" " font-weight: 650;\n" "}\n" "\n" -"#templateDescription {\n" -" background: transparent;\n" -" color: #879096;\n" +"#fieldLabel {\n" +" color: #AAB5C5;\n" " font-size: 11px;\n" +" font-weight: 650;\n" "}\n" "\n" -"#fieldLabel {\n" -" background: transparent;\n" -" color: #B3BCC1;\n" +"#dialogError {\n" +" color: #FF7D8A;\n" " font-size: 11px;\n" -" font-weight: 600;\n" "}\n" "\n" -"#dialogError {\n" -" background-color: #41262A;\n" -" border: 1px solid #704048;\n" -" border-radius: 7px;\n" -" color: #FFB4BE;\n" -" padding: 8px 10px;\n" +"QPushButton[secondary=\"true\"] {\n" +" background-color: #292C2F;\n" +" border-color: #494D52;\n" +"}\n" +"\n" +"QPushButton[secondary=\"true\"]:hover {\n" +" background-color: #363A3E;\n" +" border-color: #5D6268;\n" +"}\n" +"\n" +"#projectSettingsDialog,\n" +"#exportDialog {\n" +" background-color: #18191B;\n" +"}\n" +"\n" +"#dialogHero {\n" +" background-color: #242628;\n" +" border: 1px solid #42464A;\n" +" border-radius: 13px;\n" +" padding: 6px;\n" +"}\n" +"\n" +"#dialogHeroIcon {\n" +" background-color: #2B3034;\n" +" border: 1px solid #50575C;\n" +" border-radius: 10px;\n" +" padding: 6px;\n" +"}\n" +"\n" +"#dialogHeroTitle {\n" +" color: #F3F6FA;\n" +" font-size: 17px;\n" +" font-weight: 750;\n" +"}\n" +"\n" +"#dialogHeroSubtitle,\n" +"#exportSummary {\n" +" color: #7F8B9D;\n" +"}\n" +"\n" +"#exportSummary {\n" +" background-color: #232527;\n" +" border: 1px solid #3B3E42;\n" +" border-radius: 10px;\n" +" padding: 6px;\n" +"}\n" +"\n" +"#exportLog {\n" +" background-color: #141517;\n" +" border-color: #404448;\n" +" color: #B7BDBC;\n" +" font-family: \"Menlo\";\n" +" font-size: 10px;\n" +"}\n" +"\n" +"#commandPaletteDialog,\n" +"#globalSearchDialog {\n" +" background-color: #202224;\n" +" border: 1px solid #5A5F65;\n" +" border-radius: 14px;\n" +"}\n" +"\n" +"#commandPaletteSearch,\n" +"#globalSearchField {\n" +" background-color: #1A1C1E;\n" +" border: 1px solid #505459;\n" +" border-radius: 11px;\n" +" padding: 7px 9px;\n" +" font-size: 14px;\n" +"}\n" +"\n" +"#commandPaletteSearch:focus,\n" +"#globalSearchField:focus {\n" +" border-color: #71808A;\n" +"}\n" +"\n" +"#commandPaletteList,\n" +"#globalSearchResults {\n" +" background-color: #202224;\n" +" border: none;\n" +" padding: 5px;\n" +"}\n" +"\n" +"#commandPaletteList::item,\n" +"#globalSearchResults::item {\n" +" min-height: 30px;\n" +" padding: 6px 8px;\n" "}\n" ; diff --git a/include/editor/styling/icons.h b/include/editor/styling/icons.h new file mode 100644 index 00000000..784290bb --- /dev/null +++ b/include/editor/styling/icons.h @@ -0,0 +1,93 @@ +#ifndef ATLAS_EDITOR_ICONS_H +#define ATLAS_EDITOR_ICONS_H + +#include +#include +#include + +namespace styling { + +enum class Icon { + Aperture, + ArrowClockwise, + ArrowCounterClockwise, + ArrowLeft, + ArrowRight, + ArrowUp, + ArrowsOutCardinal, + Assign, + BoundingBox, + Camera, + CaretDown, + CaretLeft, + CaretRight, + CaretUp, + Check, + Close, + Cloud, + Code, + Crosshair, + Cube, + CubeFocus, + CubeTransparent, + CursorClick, + Database, + DotsVertical, + DotsNine, + Export, + Eye, + EyeSlash, + File, + FileCode, + FilmStrip, + FloppyDisk, + Folder, + FolderOpen, + GameController, + Gear, + Globe, + Hand, + HardDrives, + Image, + Info, + Layout, + Lightbulb, + MagnifyingGlass, + Material, + Monitor, + MonitorPlay, + Mountains, + MusicNote, + Package, + PaintBrush, + Palette, + Pause, + Play, + Plus, + RocketLaunch, + Rows, + Sidebar, + SkipForward, + SlidersHorizontal, + Sparkle, + SpeakerHigh, + Sphere, + SquaresFour, + Stack, + Stop, + Sun, + TerminalWindow, + Trash, + TreeStructure, + Warning, + Waveform, + Wrench +}; + +bool loadIconFont(); +QIcon icon(Icon icon, const QColor &color = QColor("#AAB4C4")); +QIcon colorSwatch(const QColor &color, const QSize &size = QSize(18, 18)); + +} + +#endif diff --git a/include/editor/views/editorWindow.h b/include/editor/views/editorWindow.h index 69ea91ca..f6bf24c1 100644 --- a/include/editor/views/editorWindow.h +++ b/include/editor/views/editorWindow.h @@ -29,6 +29,8 @@ class ViewportTools; class MaterialEditorPanel; class PostProcessingPanel; class QMenu; +class QButtonGroup; +class QStackedWidget; class QShowEvent; class QTimer; class QFileSystemWatcher; @@ -49,6 +51,8 @@ class EditorWindow : public QMainWindow { void setupWindow(); void setupMenus(); void setupDocks(); + void setupWorkspaceBar(); + void activateWorkspace(int index); void saveLayout(); void restoreLayout(); @@ -76,6 +80,8 @@ class EditorWindow : public QMainWindow { HierarchyPanel* hierarchyPanel = nullptr; ContentBrowserPanel* contentBrowser = nullptr; ViewportTools* viewportTools = nullptr; + QStackedWidget* workspaceStack = nullptr; + QButtonGroup* workspaceModeGroup = nullptr; QMenu* viewMenu = nullptr; QMenu* windowMenu = nullptr; QTimer* layoutSaveTimer = nullptr; diff --git a/include/editor/views/viewport.h b/include/editor/views/viewport.h index 6892b622..c0935f8c 100644 --- a/include/editor/views/viewport.h +++ b/include/editor/views/viewport.h @@ -168,6 +168,7 @@ class ViewportPanel : public QWidget { int keyboardTransformAxes = 7; int playbackState = 0; int shadingMode = 0; + int rightDragRuntimeButton = 0; }; #endif // ATLAS_VIEWPORT_H