diff --git a/.github/workflows/check_source_code.yml b/.github/workflows/check_source_code.yml index a72d2ae..9397c72 100644 --- a/.github/workflows/check_source_code.yml +++ b/.github/workflows/check_source_code.yml @@ -27,7 +27,7 @@ jobs: - name: Install dependencies run: | apt update - apt install -y libgtk-4-dev libadwaita-1-dev git curl + apt install -y build-essential libgtk-4-dev libadwaita-1-dev git curl - uses: dtolnay/rust-toolchain@stable with: diff --git a/.github/workflows/compile_release_build.yml b/.github/workflows/compile_release_build.yml index 295a1b8..a70b8c4 100644 --- a/.github/workflows/compile_release_build.yml +++ b/.github/workflows/compile_release_build.yml @@ -26,7 +26,7 @@ jobs: - name: Install dependencies run: | apt update - apt install -y libgtk-4-dev libadwaita-1-dev git curl + apt install -y build-essential libgtk-4-dev libadwaita-1-dev git curl - uses: dtolnay/rust-toolchain@stable with: diff --git a/CHANGELOG.md b/CHANGELOG.md index 657b876..9e1cb4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Bundle `applications-system-symbolic` icon to the app +- Added "force grab cursor" option to the gamescope settings +- Added Thai +- Added Ukrainian + +### Changed + +- Update wish url +- Updated dependencies +- Improved app args parsing +- Updated locales + +### Fixed + +- Fixed GtkSwitch UI state representation + ## [3.9.4] - 29.12.2023 ### Changed diff --git a/Cargo.lock b/Cargo.lock index d141f71..762c60f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -57,8 +57,8 @@ checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] name = "anime-game-core" -version = "1.17.4" -source = "git+https://github.com/an-anime-team/anime-game-core?tag=1.17.4#74a7c5a18cc4a870ff78e12d63ec136b3ef2d424" +version = "1.17.5" +source = "git+https://github.com/an-anime-team/anime-game-core?tag=1.17.5#55dd60f6b5f78aa80e2217404c3ee1151657f011" dependencies = [ "anyhow", "bzip2", @@ -87,6 +87,7 @@ dependencies = [ "anime-launcher-sdk", "anyhow", "cached", + "enum-ordinalize", "fluent-templates", "glib-build-tools", "gtk4", @@ -106,8 +107,8 @@ dependencies = [ [[package]] name = "anime-launcher-sdk" -version = "1.12.5" -source = "git+https://github.com/an-anime-team/anime-launcher-sdk?tag=1.12.5#fae9497c43f9d7636d32ba755163808f805049b1" +version = "1.12.7" +source = "git+https://github.com/an-anime-team/anime-launcher-sdk?tag=1.12.7#f4133c0875af54b07b4c0dac04df4598193ac9ec" dependencies = [ "anime-game-core", "anyhow", @@ -199,41 +200,31 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "ashpd" -version = "0.6.7" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c018490e423efb6f032ef575f873ea57b61d44bec763cfe027b8e8852a027cf" +checksum = "dd884d7c72877a94102c3715f3b1cd09ff4fac28221add3e57cfbe25c236d093" dependencies = [ - "async-std", "enumflags2", "futures-channel", "futures-util", - "once_cell", "rand", "serde", "serde_repr", + "tokio", "url", "zbus", ] [[package]] name = "async-broadcast" -version = "0.5.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +checksum = "258b52a1aa741b9f09783b2d86cf0aeeb617bbf847f6933340a39644227acbdb" dependencies = [ - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", + "event-listener 5.2.0", + "event-listener-strategy 0.5.0", "futures-core", + "pin-project-lite", ] [[package]] @@ -244,72 +235,11 @@ checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" dependencies = [ "concurrent-queue", "event-listener 4.0.1", - "event-listener-strategy", + "event-listener-strategy 0.4.0", "futures-core", "pin-project-lite", ] -[[package]] -name = "async-executor" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" -dependencies = [ - "async-lock 3.2.0", - "async-task", - "concurrent-queue", - "fastrand 2.0.1", - "futures-lite 2.1.0", - "slab", -] - -[[package]] -name = "async-fs" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" -dependencies = [ - "async-lock 2.8.0", - "autocfg", - "blocking", - "futures-lite 1.13.0", -] - -[[package]] -name = "async-global-executor" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" -dependencies = [ - "async-channel 2.1.1", - "async-executor", - "async-io 2.2.2", - "async-lock 3.2.0", - "blocking", - "futures-lite 2.1.0", - "once_cell", -] - -[[package]] -name = "async-io" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" -dependencies = [ - "async-lock 2.8.0", - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-lite 1.13.0", - "log", - "parking", - "polling 2.8.0", - "rustix 0.37.27", - "slab", - "socket2 0.4.10", - "waker-fn", -] - [[package]] name = "async-io" version = "2.2.2" @@ -320,10 +250,10 @@ dependencies = [ "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.1.0", + "futures-lite", "parking", - "polling 3.3.1", - "rustix 0.38.28", + "polling", + "rustix", "slab", "tracing", "windows-sys 0.52.0", @@ -345,25 +275,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c" dependencies = [ "event-listener 4.0.1", - "event-listener-strategy", + "event-listener-strategy 0.4.0", "pin-project-lite", ] [[package]] name = "async-process" -version = "1.8.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +checksum = "451e3cf68011bd56771c79db04a9e333095ab6349f7e47592b788e9b98720cc8" dependencies = [ - "async-io 1.13.0", - "async-lock 2.8.0", + "async-channel", + "async-io", + "async-lock 3.2.0", "async-signal", "blocking", "cfg-if", - "event-listener 3.1.0", - "futures-lite 1.13.0", - "rustix 0.38.28", - "windows-sys 0.48.0", + "event-listener 5.2.0", + "futures-lite", + "rustix", + "windows-sys 0.52.0", ] [[package]] @@ -383,44 +314,18 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" dependencies = [ - "async-io 2.2.2", + "async-io", "async-lock 2.8.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.28", + "rustix", "signal-hook-registry", "slab", "windows-sys 0.48.0", ] -[[package]] -name = "async-std" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" -dependencies = [ - "async-channel 1.9.0", - "async-global-executor", - "async-io 1.13.0", - "async-lock 2.8.0", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite 1.13.0", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - [[package]] name = "async-task" version = "4.6.0" @@ -529,12 +434,12 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ - "async-channel 2.1.1", + "async-channel", "async-lock 3.2.0", "async-task", - "fastrand 2.0.1", + "fastrand", "futures-io", - "futures-lite 2.1.0", + "futures-lite", "piper", "tracing", ] @@ -561,6 +466,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + [[package]] name = "bzip2" version = "0.4.4" @@ -584,9 +495,9 @@ dependencies = [ [[package]] name = "cached" -version = "0.46.1" +version = "0.49.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c8c50262271cdf5abc979a5f76515c234e764fa025d1ba4862c0f0bcda0e95" +checksum = "f251fd1e72720ca07bf5d8e310f54a193fd053479a1f6342c6663ee4fa01cf96" dependencies = [ "ahash", "cached_proc_macro", @@ -599,9 +510,9 @@ dependencies = [ [[package]] name = "cached_proc_macro" -version = "0.18.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c878c71c2821aa2058722038a59a67583a4240524687c6028571c9b395ded61f" +checksum = "ad9f16c0d84de31a2ab7fdf5f7783c14631f7075cf464eb3bb43119f61c9cb2a" dependencies = [ "darling", "proc-macro2", @@ -611,29 +522,28 @@ dependencies = [ [[package]] name = "cached_proc_macro_types" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a4f925191b4367301851c6d99b09890311d74b0d43f274c0b34c86d308a3663" +checksum = "ade8366b8bd5ba243f0a58f036cc0ca8a2f069cff1a2351ef1cac6b083e16fc0" [[package]] name = "cairo-rs" -version = "0.18.3" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f33613627f0dea6a731b0605101fad59ba4f193a52c96c4687728d822605a8a1" +checksum = "2650f66005301bd33cc486dec076e1293c4cecf768bc7ba9bf5d2b1be339b99c" dependencies = [ "bitflags 2.4.1", "cairo-sys-rs", "glib", "libc", - "once_cell", "thiserror", ] [[package]] name = "cairo-sys-rs" -version = "0.18.2" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +checksum = "fd3bb3119664efbd78b5e6c93957447944f16bdbced84c17a9f41c7829b81e64" dependencies = [ "glib-sys", "libc", @@ -881,7 +791,7 @@ checksum = "e5766087c2235fec47fafa4cfecc81e494ee679d0fd4a59887ea0919bfb0e4fc" dependencies = [ "cfg-if", "libc", - "socket2 0.5.5", + "socket2", "windows-sys 0.48.0", ] @@ -898,13 +808,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] -name = "enum-ordinalize" -version = "3.1.15" +name = "endi" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ - "num-bigint", - "num-traits", "proc-macro2", "quote", "syn 2.0.43", @@ -955,9 +878,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "3.1.0" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +checksum = "84f2cdcf274580f2d63697192d744727b3198894b1bf02923643bf59e2c26712" dependencies = [ "concurrent-queue", "parking", @@ -966,9 +889,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "4.0.1" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84f2cdcf274580f2d63697192d744727b3198894b1bf02923643bf59e2c26712" +checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91" dependencies = [ "concurrent-queue", "parking", @@ -986,12 +909,13 @@ dependencies = [ ] [[package]] -name = "fastrand" -version = "1.9.0" +name = "event-listener-strategy" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" dependencies = [ - "instant", + "event-listener 5.2.0", + "pin-project-lite", ] [[package]] @@ -1006,7 +930,7 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ - "memoffset 0.9.0", + "memoffset", "rustc_version", ] @@ -1078,24 +1002,24 @@ dependencies = [ [[package]] name = "fluent-template-macros" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec7592cd1f45c1afe9084ce59c62a3a7c266c125c4c2ec97e95b0563c4aa914" +checksum = "5659bd41653516a2e46d76a58e67aa4885024c78fb5d00303f0673bbd53ad781" dependencies = [ "flume 0.10.14", "ignore", "once_cell", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.43", "unic-langid", ] [[package]] name = "fluent-templates" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3ef2c2152757885365abce32ddf682746062f1b6b3c0824a29fbed6ee4d080" +checksum = "8f755e319f6f8f836b94b28c6094c414d29a17cee76e24374c7cd61f7696b3f6" dependencies = [ "arc-swap", "fluent", @@ -1104,7 +1028,7 @@ dependencies = [ "fluent-syntax", "fluent-template-macros", "flume 0.10.14", - "heck", + "heck 0.4.1", "ignore", "intl-memoizer", "lazy_static", @@ -1211,28 +1135,13 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - [[package]] name = "futures-lite" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aeee267a1883f7ebef3700f262d2d54de95dfaf38189015a74fdc4e0c7ad8143" dependencies = [ - "fastrand 2.0.1", + "fastrand", "futures-core", "futures-io", "parking", @@ -1282,22 +1191,21 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.18.3" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446f32b74d22c33b7b258d4af4ffde53c2bf96ca2e29abdf1a785fe59bd6c82c" +checksum = "f6a23f8a0b5090494fd04924662d463f8386cc678dd3915015a838c1a3679b92" dependencies = [ "gdk-pixbuf-sys", "gio", "glib", "libc", - "once_cell", ] [[package]] name = "gdk-pixbuf-sys" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +checksum = "3dcbd04c1b2c4834cc008b4828bc917d062483b88d26effde6342e5622028f96" dependencies = [ "gio-sys", "glib-sys", @@ -1308,9 +1216,9 @@ dependencies = [ [[package]] name = "gdk4" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edb019ad581f8ecf8ea8e4baa6df7c483a95b5a59be3140be6a9c3b0c632af6" +checksum = "9100b25604183f2fd97f55ef087fae96ab4934d7215118a35303e422688e6e4b" dependencies = [ "cairo-rs", "gdk-pixbuf", @@ -1323,9 +1231,9 @@ dependencies = [ [[package]] name = "gdk4-sys" -version = "0.7.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbab43f332a3cf1df9974da690b5bb0e26720ed09a228178ce52175372dcfef0" +checksum = "d0b76874c40bb8d1c7d03a7231e23ac75fa577a456cd53af32ec17ec8f121626" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -1369,9 +1277,9 @@ checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "gio" -version = "0.18.4" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +checksum = "c64947d08d7fbb03bf8ad1f25a8ac6cf4329bc772c9b7e5abe7bf9493c81194f" dependencies = [ "futures-channel", "futures-core", @@ -1380,7 +1288,6 @@ dependencies = [ "gio-sys", "glib", "libc", - "once_cell", "pin-project-lite", "smallvec", "thiserror", @@ -1388,22 +1295,22 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +checksum = "bcf8e1d9219bb294636753d307b030c1e8a032062cba74f493c431a5c8b81ce4" dependencies = [ "glib-sys", "gobject-sys", "libc", "system-deps", - "winapi", + "windows-sys 0.52.0", ] [[package]] name = "glib" -version = "0.18.4" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951bbd7fdc5c044ede9f05170f05a3ae9479239c3afdfe2d22d537a3add15c4e" +checksum = "01e191cc1af1f35b9699213107068cd3fe05d9816275ac118dc785a0dd8faebf" dependencies = [ "bitflags 2.4.1", "futures-channel", @@ -1417,26 +1324,27 @@ dependencies = [ "gobject-sys", "libc", "memchr", - "once_cell", "smallvec", "thiserror", ] [[package]] name = "glib-build-tools" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3431c56f463443cba9bc3600248bc6d680cb614c2ee1cdd39dab5415bd12ac5c" +checksum = "108f374fff60efd14b0d70d8916e7213aed18d7dd071ba3e9334ed2dac1dc86a" +dependencies = [ + "gio", +] [[package]] name = "glib-macros" -version = "0.18.3" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72793962ceece3863c2965d7f10c8786323b17c7adea75a515809fa20ab799a5" +checksum = "9972bb91643d589c889654693a4f1d07697fdcb5d104b5c44fb68649ba1bf68d" dependencies = [ - "heck", - "proc-macro-crate 2.0.0", - "proc-macro-error", + "heck 0.5.0", + "proc-macro-crate 3.1.0", "proc-macro2", "quote", "syn 2.0.43", @@ -1444,9 +1352,9 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +checksum = "630f097773d7c7a0bb3258df4e8157b47dc98bbfa0e60ad9ab56174813feced4" dependencies = [ "libc", "system-deps", @@ -1465,23 +1373,11 @@ dependencies = [ "regex-syntax", ] -[[package]] -name = "gloo-timers" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - [[package]] name = "gobject-sys" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +checksum = "c85e2b1080b9418dd0c58b498da3a5c826030343e0ef07bde6a955d28de54979" dependencies = [ "glib-sys", "libc", @@ -1490,9 +1386,9 @@ dependencies = [ [[package]] name = "graphene-rs" -version = "0.18.1" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2228cda1505613a7a956cca69076892cfbda84fc2b7a62b94a41a272c0c401" +checksum = "99e4d388e96c5f29e2b2f67045d229ddf826d0a8d6d282f94ed3b34452222c91" dependencies = [ "glib", "graphene-sys", @@ -1501,9 +1397,9 @@ dependencies = [ [[package]] name = "graphene-sys" -version = "0.18.1" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4144cee8fc8788f2a9b73dc5f1d4e1189d1f95305c4cb7bd9c1af1cfa31f59" +checksum = "236ed66cc9b18d8adf233716f75de803d0bf6fc806f60d14d948974a12e240d0" dependencies = [ "glib-sys", "libc", @@ -1513,9 +1409,9 @@ dependencies = [ [[package]] name = "gsk4" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d958e351d2f210309b32d081c832d7de0aca0b077aa10d88336c6379bd01f7e" +checksum = "c65036fc8f99579e8cb37b12487969b707ab23ec8ab953682ff347cbd15d396e" dependencies = [ "cairo-rs", "gdk4", @@ -1528,9 +1424,9 @@ dependencies = [ [[package]] name = "gsk4-sys" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12bd9e3effea989f020e8f1ff3fa3b8c63ba93d43b899c11a118868853a56d55" +checksum = "bd24c814379f9c3199dc53e52253ee8d0f657eae389ab282c330505289d24738" dependencies = [ "cairo-sys-rs", "gdk4-sys", @@ -1544,9 +1440,9 @@ dependencies = [ [[package]] name = "gtk4" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeb51aa3e9728575a053e1f43543cd9992ac2477e1b186ad824fd4adfb70842" +checksum = "aa82753b8c26277e4af1446c70e35b19aad4fb794a7b143859e7eeb9a4025d83" dependencies = [ "cairo-rs", "field-offset", @@ -1565,12 +1461,12 @@ dependencies = [ [[package]] name = "gtk4-macros" -version = "0.7.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d57ec49cf9b657f69a05bca8027cff0a8dfd0c49e812be026fc7311f2163832f" +checksum = "40300bf071d2fcd4c94eacc09e84ec6fe73129d2ceb635cf7e55b026b5443567" dependencies = [ "anyhow", - "proc-macro-crate 1.3.1", + "proc-macro-crate 3.1.0", "proc-macro-error", "proc-macro2", "quote", @@ -1579,9 +1475,9 @@ dependencies = [ [[package]] name = "gtk4-sys" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54d8c4aa23638ce9faa2caf7e2a27d4a1295af2155c8e8d28c4d4eeca7a65eb8" +checksum = "0db1b104138f087ccdc81d2c332de5dd049b89de3d384437cc1093b17cd2da18" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -1612,6 +1508,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.3" @@ -1728,17 +1630,6 @@ dependencies = [ "unic-langid", ] -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "is-docker" version = "0.2.0" @@ -1788,15 +1679,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca9325aac17917b5650f25d477ce2909f2e9539688227fdee3ceb5093f666c9e" -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - [[package]] name = "lazy_static" version = "1.4.0" @@ -1805,9 +1687,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libadwaita" -version = "0.5.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fe7e70c06507ed10a16cda707f358fbe60fe0dc237498f78c686ade92fd979c" +checksum = "91b4990248b9e1ec5e72094a2ccaea70ec3809f88f6fd52192f2af306b87c5d9" dependencies = [ "gdk-pixbuf", "gdk4", @@ -1821,9 +1703,9 @@ dependencies = [ [[package]] name = "libadwaita-sys" -version = "0.5.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e10aaa38de1d53374f90deeb4535209adc40cc5dba37f9704724169bceec69a" +checksum = "23a748e4e92be1265cd9e93d569c0b5dfc7814107985aa6743d670ab281ea1a8" dependencies = [ "gdk4-sys", "gio-sys", @@ -1841,12 +1723,6 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - [[package]] name = "linux-raw-sys" version = "0.4.12" @@ -1868,9 +1744,6 @@ name = "log" version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" -dependencies = [ - "value-bag", -] [[package]] name = "lzma-sys" @@ -1918,15 +1791,6 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.0" @@ -1962,6 +1826,17 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + [[package]] name = "nanorand" version = "0.7.0" @@ -1980,7 +1855,18 @@ dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "memoffset 0.7.1", +] + +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.4.1", + "cfg-if", + "libc", + "memoffset", ] [[package]] @@ -2002,36 +1888,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" -dependencies = [ - "autocfg", -] - [[package]] name = "num_cpus" version = "1.16.0" @@ -2132,22 +1988,21 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pango" -version = "0.18.3" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +checksum = "b1264d13deb823cc652f26cfe59afb1ec4b9db2a5bd27c41b738c879cc1bfaa1" dependencies = [ "gio", "glib", "libc", - "once_cell", "pango-sys", ] [[package]] name = "pango-sys" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +checksum = "f52ef6a881c19fbfe3b1484df5cad411acaaba29dbec843941c3110d19f340ea" dependencies = [ "glib-sys", "gobject-sys", @@ -2215,31 +2070,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" dependencies = [ "atomic-waker", - "fastrand 2.0.1", + "fastrand", "futures-io", ] [[package]] name = "pkg-config" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" - -[[package]] -name = "polling" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", -] +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "polling" @@ -2250,7 +2089,7 @@ dependencies = [ "cfg-if", "concurrent-queue", "pin-project-lite", - "rustix 0.38.28", + "rustix", "tracing", "windows-sys 0.52.0", ] @@ -2285,11 +2124,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit 0.20.7", + "toml_edit 0.21.0", ] [[package]] @@ -2372,9 +2211,9 @@ dependencies = [ [[package]] name = "raw-window-handle" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" +checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544" [[package]] name = "rayon" @@ -2436,11 +2275,10 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "relm4" -version = "0.7.0-beta.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f505ac255c34dc85b8b189cbc8e12d012765aa9294727c6082e76777e56a50bf" +checksum = "e6e0e187b58db367305e8486d3228158251da1c8ba1e18baa9de61894e822649" dependencies = [ - "async-trait", "flume 0.11.0", "fragile", "futures", @@ -2454,9 +2292,9 @@ dependencies = [ [[package]] name = "relm4-macros" -version = "0.7.0-beta.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "086047e49d6426fd9f53109950f205d2ed88027d5fecfece724e6722904fe473" +checksum = "0774e846889823aa5766f5b62cface3189a5b36280e65b2faaa6df0319da1726" dependencies = [ "proc-macro2", "quote", @@ -2465,15 +2303,13 @@ dependencies = [ [[package]] name = "rfd" -version = "0.12.1" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9e7b57df6e8472152674607f6cc68aa14a748a3157a857a94f516e11aeacc2" +checksum = "25a73a7337fc24366edfca76ec521f51877b114e42dab584008209cca6719251" dependencies = [ "ashpd", - "async-io 1.13.0", "block", "dispatch", - "futures-util", "js-sys", "log", "objc", @@ -2523,20 +2359,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "0.37.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - [[package]] name = "rustix" version = "0.38.28" @@ -2546,7 +2368,7 @@ dependencies = [ "bitflags 2.4.1", "errno", "libc", - "linux-raw-sys 0.4.12", + "linux-raw-sys", "windows-sys 0.52.0", ] @@ -2779,9 +2601,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "snafu" @@ -2799,22 +2621,12 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "syn 1.0.109", ] -[[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "socket2" version = "0.5.5" @@ -2896,7 +2708,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2d580ff6a20c55dfb86be5f9c238f67835d0e81cbdea8bf5680e0897320331" dependencies = [ "cfg-expr", - "heck", + "heck 0.4.1", "pkg-config", "toml", "version-compare", @@ -2926,9 +2738,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ "cfg-if", - "fastrand 2.0.1", + "fastrand", "redox_syscall", - "rustix 0.38.28", + "rustix", "windows-sys 0.52.0", ] @@ -3006,13 +2818,20 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", + "bytes", + "libc", + "mio", "num_cpus", "pin-project-lite", + "signal-hook-registry", + "socket2", + "tracing", + "windows-sys 0.48.0", ] [[package]] @@ -3047,17 +2866,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "toml_edit" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow", -] - [[package]] name = "toml_edit" version = "0.21.0" @@ -3149,7 +2957,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" dependencies = [ - "memoffset 0.9.0", + "memoffset", "tempfile", "winapi", ] @@ -3272,12 +3080,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" -[[package]] -name = "value-bag" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a72e1902dde2bd6441347de2b70b7f5d59bf157c6c62f0c44572607a1d55bbe" - [[package]] name = "version-compare" version = "0.1.1" @@ -3290,12 +3092,6 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "waker-fn" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" - [[package]] name = "walkdir" version = "2.4.0" @@ -3609,8 +3405,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "914566e6413e7fa959cc394fb30e563ba80f3541fbd40816d4c05a0fc3f2a0f1" dependencies = [ "libc", - "linux-raw-sys 0.4.12", - "rustix 0.38.28", + "linux-raw-sys", + "rustix", ] [[package]] @@ -3619,7 +3415,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd" dependencies = [ - "nix", + "nix 0.26.4", "winapi", ] @@ -3643,39 +3439,32 @@ dependencies = [ [[package]] name = "zbus" -version = "3.14.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948" +checksum = "7b8e3d6ae3342792a6cc2340e4394334c7402f3d793b390d2c5494a4032b3030" dependencies = [ "async-broadcast", - "async-executor", - "async-fs", - "async-io 1.13.0", - "async-lock 2.8.0", "async-process", "async-recursion", - "async-task", "async-trait", - "blocking", - "byteorder", "derivative", "enumflags2", - "event-listener 2.5.3", + "event-listener 5.2.0", "futures-core", "futures-sink", "futures-util", "hex", - "nix", - "once_cell", + "nix 0.27.1", "ordered-stream", "rand", "serde", "serde_repr", "sha1", "static_assertions", + "tokio", "tracing", "uds_windows", - "winapi", + "windows-sys 0.52.0", "xdg-home", "zbus_macros", "zbus_names", @@ -3684,9 +3473,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "3.14.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d" +checksum = "b7a3e850ff1e7217a3b7a07eba90d37fe9bb9e89a310f718afcde5885ca9b6d7" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -3698,9 +3487,9 @@ dependencies = [ [[package]] name = "zbus_names" -version = "2.6.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" dependencies = [ "serde", "static_assertions", @@ -3778,13 +3567,12 @@ dependencies = [ [[package]] name = "zvariant" -version = "3.15.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c" +checksum = "4e09e8be97d44eeab994d752f341e67b3b0d80512a8b315a0671d47232ef1b65" dependencies = [ - "byteorder", + "endi", "enumflags2", - "libc", "serde", "static_assertions", "url", @@ -3793,9 +3581,9 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "3.15.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd" +checksum = "72a5857e2856435331636a9fbb415b09243df4521a267c5bedcd5289b4d5799e" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -3806,9 +3594,9 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 61ff755..483d438 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,34 +15,35 @@ lto = true opt-level = "s" [build-dependencies] -glib-build-tools = "0.18" +glib-build-tools = "0.19" [dependencies.anime-launcher-sdk] git = "https://github.com/an-anime-team/anime-launcher-sdk" -tag = "1.12.5" +tag = "1.12.7" features = ["all", "genshin"] # path = "../anime-launcher-sdk" # ! for dev purposes only [dependencies] -relm4 = { version = "0.7.0-beta.2", features = ["macros", "libadwaita"] } -gtk = { package = "gtk4", version = "0.7.3", features = ["v4_12"] } -adw = { package = "libadwaita", version = "0.5.3", features = ["v1_3"] } +relm4 = { version = "0.8.1", features = ["macros", "libadwaita"] } +gtk = { package = "gtk4", version = "0.8.1", features = ["v4_12"] } +adw = { package = "libadwaita", version = "0.6.0", features = ["v1_4"] } -rfd = { version = "0.12.1", features = ["xdg-portal"], default-features = false } +rfd = { version = "0.14.1", features = ["xdg-portal", "tokio"], default-features = false } open = "5.0.0" whatadistro = "0.1.0" serde_json = "1.0" anyhow = "1.0" lazy_static = "1.4.0" -cached = { version = "0.46", features = ["proc_macro"] } +cached = { version = "0.49", features = ["proc_macro"] } md-5 = { version = "0.10", features = ["asm"] } +enum-ordinalize = "4.3" tracing = "0.1" tracing-subscriber = "0.3" -fluent-templates = "0.8" +fluent-templates = "0.9" unic-langid = "0.9" human-panic = "1.2.2" diff --git a/assets/images/icons/applications-system-symbolic.svg b/assets/images/icons/applications-system-symbolic.svg new file mode 100644 index 0000000..0d780a6 --- /dev/null +++ b/assets/images/icons/applications-system-symbolic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/locales/common.ftl b/assets/locales/common.ftl index 2e88c1e..632d9e5 100644 --- a/assets/locales/common.ftl +++ b/assets/locales/common.ftl @@ -32,3 +32,4 @@ ko-kr = 한국어 id-id = Indonesia vi-vn = Tiếng Việt uk-ua = Українська +th-th = ไทย diff --git a/assets/locales/de/gamescope.ftl b/assets/locales/de/gamescope.ftl index f222a66..600c6c2 100644 --- a/assets/locales/de/gamescope.ftl +++ b/assets/locales/de/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = Eine Open-Source-Upscaling-Technik, die von Nvidia als herstel other-settings = Andere Einstellungen framerate-limit = Framerate-Limit unfocused-framerate-limit = Unfokussiert Framerate-Limit + +force-grab-cursor = Cursor greifen erzwingen +force-grab-cursor-description = Verwende immer den relativen Mausmodus, anstatt abhängig von der Sichtbarkeit des Cursors umzuschalten. Der Mauszeiger wird korrekt in der Mitte des Spiels zentriert. diff --git a/assets/locales/en/gamescope.ftl b/assets/locales/en/gamescope.ftl index 6fbb639..7e7ed77 100644 --- a/assets/locales/en/gamescope.ftl +++ b/assets/locales/en/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = An open source upscaling technique developed by Nvidia as a cr other-settings = Other settings framerate-limit = Framerate limit unfocused-framerate-limit = Unfocused framerate limit + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/es/gamescope.ftl b/assets/locales/es/gamescope.ftl index b04ff36..d65d0dd 100644 --- a/assets/locales/es/gamescope.ftl +++ b/assets/locales/es/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = Una técnica de escalado de código abierto desarrollada por N other-settings = Otras opciones framerate-limit = Límite de framerate unfocused-framerate-limit = Límite de framerate en segundo plano + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/fr/gamescope.ftl b/assets/locales/fr/gamescope.ftl index 2df9d55..53eda0c 100644 --- a/assets/locales/fr/gamescope.ftl +++ b/assets/locales/fr/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = Une technologie de mise à l'échelle Open Source développée other-settings = Autres paramètres framerate-limit = Limitation des FPS unfocused-framerate-limit = Limitation des FPS hors focus + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/hu/enhancements.ftl b/assets/locales/hu/enhancements.ftl index dbf0337..3add58c 100644 --- a/assets/locales/hu/enhancements.ftl +++ b/assets/locales/hu/enhancements.ftl @@ -48,8 +48,8 @@ fps-unlocker-description = Eltávolítja az fps limitet. Az anti-cheat észreveh enabled = Bekapcsolva -fps-unlocker-interval = Overwrite interval -fps-unlocker-interval-description = Delay in milliseconds between overwriting the FPS limit value. Periodic overwrites are necessary to prevent it from resetting +fps-unlocker-interval = Felülírási időköz +fps-unlocker-interval-description = Milliszekundumban (ms) hogy mekkora időközönként van felülírva az fps limit értéke. Erre szükség van hogy ne állítsa vissza magát az fps limit window-mode = Ablak mód borderless = Keretmentes diff --git a/assets/locales/hu/gamescope.ftl b/assets/locales/hu/gamescope.ftl index 7b0b993..758ffac 100644 --- a/assets/locales/hu/gamescope.ftl +++ b/assets/locales/hu/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = Open source upscaling technika az Nvidia-tól, alternatíva a other-settings = Egyéb beállítások framerate-limit = FPS limit unfocused-framerate-limit = Fókuszon kívüli FPS limit + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/id/enhancements.ftl b/assets/locales/id/enhancements.ftl index cbac656..5684fb6 100644 --- a/assets/locales/id/enhancements.ftl +++ b/assets/locales/id/enhancements.ftl @@ -48,8 +48,8 @@ fps-unlocker-description = Meniadakan batas maksimum frame yang dapat dirender o enabled = Aktifkan -fps-unlocker-interval = Overwrite interval -fps-unlocker-interval-description = Delay in milliseconds between overwriting the FPS limit value. Periodic overwrites are necessary to prevent it from resetting +fps-unlocker-interval = Interval penulisan ulang FPS +fps-unlocker-interval-description = Jeda antara penulisan ulang nilai batas FPS dalam milidetik. Penulisan ulang secara berkala dibutuhkan untuk mencegah nilai batas FPS kembali seperti semula window-mode = Window Mode borderless = Tanpa border diff --git a/assets/locales/id/gamescope.ftl b/assets/locales/id/gamescope.ftl index 9be40bb..8c9e95c 100644 --- a/assets/locales/id/gamescope.ftl +++ b/assets/locales/id/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = Teknik peningkatan skala yang dikembangkan oleh Nvidia sebagai other-settings = Pengaturan lainnya framerate-limit = Batas framerate unfocused-framerate-limit = Batas framerate saat tidak fokus + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/it/enhancements.ftl b/assets/locales/it/enhancements.ftl index e178a82..bdcd3ff 100644 --- a/assets/locales/it/enhancements.ftl +++ b/assets/locales/it/enhancements.ftl @@ -48,8 +48,8 @@ fps-unlocker-description = Rimuovi la limitazione del rendering dei frame modifi enabled = Abilitato -fps-unlocker-interval = Overwrite interval -fps-unlocker-interval-description = Delay in milliseconds between overwriting the FPS limit value. Periodic overwrites are necessary to prevent it from resetting +fps-unlocker-interval = Intervallo di sovrascrittura +fps-unlocker-interval-description = Ritardo in millisecondi tra le sovrascritture del valore limite FPS. Sovrascritture periodiche sono necessarie per impedire che si reimposti al valore predefinito window-mode = Modalità della finestra borderless = Senza bordi diff --git a/assets/locales/it/gamescope.ftl b/assets/locales/it/gamescope.ftl index 9ebaa4d..06fdc7a 100644 --- a/assets/locales/it/gamescope.ftl +++ b/assets/locales/it/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = Una tecnica di upscaling open-source sviluppata da Nvidia per other-settings = Altre impostazioni framerate-limit = Limite del framerate unfocused-framerate-limit = Limite del framerate quando fuori dal focus + +force-grab-cursor = Forza la cattura del cursore +force-grab-cursor-description = Usa sempre la modalità relativa del mouse invece di cambiare in base alla visibilità del cursore. Il cursore del mouse verrà correttamente centrato nel gioco diff --git a/assets/locales/ja/gamescope.ftl b/assets/locales/ja/gamescope.ftl index 5bcefa8..48c5bff 100644 --- a/assets/locales/ja/gamescope.ftl +++ b/assets/locales/ja/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = An open source upscaling technique developed by Nvidia as a cr other-settings = その他の設定 framerate-limit = FPS制限 unfocused-framerate-limit = 非フォーカス時の最大FPS + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/ko/gamescope.ftl b/assets/locales/ko/gamescope.ftl index fbe9709..eeb0407 100644 --- a/assets/locales/ko/gamescope.ftl +++ b/assets/locales/ko/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = Nvidia가 독점 DLSS 솔루션에 대한 낮은 오버헤드 other-settings = 기타 설정 framerate-limit = 프레임 속도 제한 unfocused-framerate-limit = 초점이 맞지 않는 프레임 속도 제한 + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/nl/gamescope.ftl b/assets/locales/nl/gamescope.ftl index c72b5bf..6f6dc12 100644 --- a/assets/locales/nl/gamescope.ftl +++ b/assets/locales/nl/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = Een open source opschalingstechniek ontwikkeld door Nvidia als other-settings = Andere instellingen framerate-limit = Frameratelimiet unfocused-framerate-limit = Ongefocuste frameratelimiet + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/pl/gamescope.ftl b/assets/locales/pl/gamescope.ftl index 53441fd..5305bc8 100644 --- a/assets/locales/pl/gamescope.ftl +++ b/assets/locales/pl/gamescope.ftl @@ -10,4 +10,7 @@ nis-description = Technika skalowania otwartego źródła opracowana przez Nvidi other-settings = Inne ustawienia framerate-limit = Limit klatek na sekundę -unfocused-framerate-limit = Limit klatek na sekundę po utraceniu skupienia \ No newline at end of file +unfocused-framerate-limit = Limit klatek na sekundę po utraceniu skupienia + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/pt/gamescope.ftl b/assets/locales/pt/gamescope.ftl index 722ec94..d4bbdbe 100644 --- a/assets/locales/pt/gamescope.ftl +++ b/assets/locales/pt/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = Uma técnica de upscaling de código aberto desenvolvida pela other-settings = Outras configuraões framerate-limit = Limite de taxa de quadros unfocused-framerate-limit = Limite de taxa de quadros desfocado + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/ru/gamescope.ftl b/assets/locales/ru/gamescope.ftl index 478608e..48aff04 100644 --- a/assets/locales/ru/gamescope.ftl +++ b/assets/locales/ru/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = Открытая техника масштабирования other-settings = Другие настройки framerate-limit = Лимит числа кадров unfocused-framerate-limit = Лимит числа кадров вне фокуса + +force-grab-cursor = Принудительный захват курсора +force-grab-cursor-description = Использовать относительный режим мыши вместо переворачивания в зависимости от видимости курсора. Курсор мыши будет правильно центрирован в игре diff --git a/assets/locales/sv/gamescope.ftl b/assets/locales/sv/gamescope.ftl index 959b29e..8cd626b 100644 --- a/assets/locales/sv/gamescope.ftl +++ b/assets/locales/sv/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = En uppskalningsteknik med öppen källkod som utvecklats av Nv other-settings = Andra inställningar framerate-limit = Gräns för bilduppdateringshastighet unfocused-framerate-limit = Gräns för bilduppdateringshastighet utan fokus + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/th/components.ftl b/assets/locales/th/components.ftl new file mode 100644 index 0000000..b15072b --- /dev/null +++ b/assets/locales/th/components.ftl @@ -0,0 +1,20 @@ +components = ส่วนประกอบ +components-description = จัดการเวอร์ชัน Wine และ DXVK + +selected-version = เวอร์ชันที่เลือก +recommended-only = แสดงเเวอร์ชั่นที่แนะนำเท่านั้น + +wine-version = เวอร์ชันของ Wine +wine-recommended-description = แสดงเฉพาะเวอร์ชัน Wine ที่แนะนำเท่านั้น + +wine-options = การตั้งค่าของ Wine + +wine-use-shared-libraries = ใช้ไลบรารีที่ใช้ร่วมกันของ Wine +wine-use-shared-libraries-description = ตั้งค่าตัว LD_LIBRARY_PATH เพื่อโหลดไลบรารีระบบจากบิลด์ Wine ที่เลือก + +gstreamer-use-shared-libraries = ใช้ไลบรารีที่ใช้ร่วมกันของ gstreamer +gstreamer-use-shared-libraries-description = ตั้งค่าตัวแปร GST_PLUGIN_PATH เพื่อโหลดไลบรารี gstreamer จากบิลด์ Wine ที่เลือก + +dxvk-version = เวอร์ชันของ DXVK +dxvk-selection-disabled = การเลือก DXVK ถูกปิดใช้งานโดยการตั้งค่ากลุ่ม Wine ของคุณ +dxvk-recommended-description = แสดงเฉพาะเวอร์ชัน DXVK ที่แนะนำเท่านั้น diff --git a/assets/locales/th/enhancements.ftl b/assets/locales/th/enhancements.ftl new file mode 100644 index 0000000..b818234 --- /dev/null +++ b/assets/locales/th/enhancements.ftl @@ -0,0 +1,57 @@ +game-settings-description = จัดการการตั้งค่าในเกมและเซสชันบัญชี +sandbox-settings-description = รันเกมในแซนด์บ็อกซ์ คล้ายกับที่ Flatpak ทำ +environment-settings-description = ระบุตัวแปรสภาวะแวดล้อมและคำสั่งเปิดเกม + +wine = Wine + +synchronization = การซิงโครไนซ์ +wine-sync-description = เทคโนโลยีที่ใช้ในการประสานเหตุการณ์ Wine ภายใน + +language = ภาษา +wine-lang-description = ภาษาที่ใช้ในสภาพแวดล้อมไวน์ สามารถแก้ไขปัญหารูปแบบแป้นพิมพ์ได้ +system = ระบบ + +borderless-window = หน้าต่างไร้ขอบ +virtual-desktop = เดสก์ท็อปเสมือน + +map-drive-c = เชื่อม ไดรฟ์ C: +map-drive-c-description = เชื่อมโยง ไดรฟ์ C: จาก Wine prefix ไปยังระบบ dosdevices โดยอัตโนมัติ + +map-game-folder = เชื่อม โฟลเดอร์เกม +map-game-folder-description = เชื่อมโยงโฟลเดอร์เกมไปยังระบบ dosdevices โดยอัตโนมัติ + +game = เกม + +hud = HUD + +fsr = FSR +fsr-description = ยกระดับความชัดเกมให้เข้ากับขนาดจอภาพของคุณ หากต้องการใช้เลือกความละเอียดที่ต่ำกว่าในการตั้งค่าของเกมแล้วกด Alt+Enter +ultra-quality = คุณภาพเยี่ยม +quality = คุณภาพ +balanced = พอประมาณ +performance = เร็วที่สุด + +gamemode = Gamemode +gamemode-description = จัดลำดับความสำคัญของเกมเหนือกระบวนการอื่น + +gamescope = Gamescope +gamescope-description = Gamescope เป็นเครื่องมือจาก Valve ที่ช่วยให้เกมทำงานในอินสแตนซ์ Xwayland ที่แยกจากระบบ และรองรับ GPU ของ AMD, Intel และ Nvidia + +discord-rpc = Discord RPC +discord-rpc-description = Discord RPC อนุญาตให้คุณให้ข้อมูล Discord ที่คุณกำลังเล่นเกมอยู่เพื่อแจ้งให้เพื่อนของคุณทราบ +icon = ไอคอน +title = หัวข้อ +description = คำอธิบาย + +fps-unlocker = FPS Unlocker +fps-unlocker-description = ลบข้อจำกัดในการเรนเดอร์เฟรมโดยการปรับเปลี่ยนหน่วยความจำของเกม สามารถตรวจจับได้โดยระบบการป้องกันการโกงของเกม + +enabled = เปิดใช้งาน + +fps-unlocker-interval = เขียนทับช่วงเวลา +fps-unlocker-interval-description = การเขียนทับค่าจำกัด FPS ทุกมิลลิวินาที จำเป็นต้องเขียนทับเป็นระยะเพื่อป้องกันไม่ให้รีเซ็ต + +window-mode = โหมดหน้าต่างเกม +borderless = โหมดไร้ขอบเขต +popup = ป๊อปอัพ +fullscreen = เต็มจอ diff --git a/assets/locales/th/environment.ftl b/assets/locales/th/environment.ftl new file mode 100644 index 0000000..d3b20a8 --- /dev/null +++ b/assets/locales/th/environment.ftl @@ -0,0 +1,7 @@ +environment = สภาวะแวดล้อม +game-command = คำสั่งเกม +game-command-description = คำสั่งที่ใช้ในการเปิดเกม ตัวยึดตำแหน่ง %command% ถูกสร้างขึ้นโดยอัตโนมัติโดยตัวเรียกใช้งาน ตัวอย่างเช่น: gamemoderun '%command%' +new-variable = ตัวแปรใหม่ +name = ชื่อ +value = ค่า +add = เพิ่ม diff --git a/assets/locales/th/errors.ftl b/assets/locales/th/errors.ftl new file mode 100644 index 0000000..0a06f96 --- /dev/null +++ b/assets/locales/th/errors.ftl @@ -0,0 +1,66 @@ +launcher-folder-opening-error = ไม่สามารถเปิดโฟลเดอร์ Launcher ได้ +game-folder-opening-error = ไม่สามารถเปิดโฟลเดอร์เกมได้ +config-file-opening-error = ไม่สามารถเปิดไฟล์ config ได้ +debug-file-opening-error = ไม่สามารถเปิดไฟล์ debug ได้ + +wish-url-search-failed = ไม่พบ URL การอธิษฐาน +wish-url-opening-error = ไม่สามารถเปิด URL การอธิษฐานได้ + +wine-run-error = ล้มเหลวในการปฏิบัติการเรียกใช้ไฟล์ {$executable} โดยใช้ Wine + +game-launching-failed = ไม่สามารถเปิดเกมได้ +failed-get-selected-wine = ไม่สามารถดาวน์โหลดเวอร์ชัน wine ที่เลือกไปได้ +downloading-failed = การดาวน์โหลดล้มเหลว +unpacking-failed = การแกะไฟล์ล้มเหลว + +kill-game-process-failed = ไม่สามารถฆ่ากระบวนการของเกมได้ + +game-file-repairing-error = ไม่สามารถซ่อมแซมไฟล์เกมได้ +integrity-files-getting-error = ไม่สามารถรับไฟล์การตรวจสอบความสมบูรณ์ได้ + +background-downloading-failed = ดาวน์โหลดภาพพื้นหลังไม่สำเร็จ +components-index-sync-failed = ไม่สามารถซิงค์ index ส่วนประกอบ +components-index-verify-failed = ไม่สามารถตรวจสอบ index ส่วนประกอบได้ +config-update-error = บันทึกการกำหนดค่าไม่สำเร็จ +wine-prefix-update-failed = ไม่สามารถอัปเดตการตั้งค่า Wine +dxvk-install-failed = ติดตั้ง DXVK ไม่สำเร็จ +voice-package-deletion-error = ลบแพ็คเกจเสียงไม่สำเร็จ + +game-diff-finding-error = ไม่พบความแตกต่างของเกม +patch-info-fetching-error = ไม่สามารถเรียกข้อมูลแพตช์ได้ +launcher-state-updating-error = อัปเดตสถานะ launcher ไม่สำเร็จ + +package-not-available = ไม่พบแพ็คเกจนี้: {$package} +wine-download-error = ดาวน์โหลด Wine ไม่สำเร็จ +wine-unpack-errror = ไม่สามารถแกะไฟล์ Wine ได้ +wine-install-failed = ไม่สามารถติดตั้ง Wine ได้ +dxvk-download-error = ดาวน์โหลด DXVK ไม่สำเร็จ +dxvk-unpack-error = ไม่สามารถแกะไฟล์ DXVK ได้ +dxvk-apply-error = ไม่สามารถติดตั้ง DXVK ได้ + +downloaded-wine-list-failed = ไม่สามารถแสดงเวอร์ชัน Wine ที่ดาวน์โหลดไปแล้วได้ + +patch-sync-failed = ไม่สามารถซิงค์โฟลเดอร์แพตช์ได้ +patch-state-check-failed = ไม่สามารถตรวจสอบสถานะโฟลเดอร์แพตช์ได้ +game-patching-error = ไม่สามารถแพตช์เกมได้ + +# Disable telemetry + +telemetry-servers-disabling-error = ไม่สามารถปิดใช้งานเซิร์ฟเวอร์การวัดและส่งข้อมูล + +# Sandbox + +documentation-url-open-failed = ไม่สามารถเปิด URL เอกสารประกอบ + +# Game + +game-session-add-failed = ไม่สามารถเพิ่มเซสชันเกมได้ +game-session-update-failed = ไม่สามารถอัปเดตเซสชันเกมได้ +game-session-remove-failed = ไม่สามารถลบเซสชันเกมได้ +game-session-set-current-failed = ไม่สามารถตั้งเซสชันเกมปัจจุบันได้ +game-session-apply-failed = ไม่สามารถติดตั้งเซสชันเกมได้ + +# Enhancements + +discord-rpc-icons-fetch-failed = ไม่สามารถดึงไอคอน Discord RPC +discord-rpc-icon-download-failed = ไม่สามารถดาวน์โหลดไอคอน Discord RPC diff --git a/assets/locales/th/first_run.ftl b/assets/locales/th/first_run.ftl new file mode 100644 index 0000000..696a456 --- /dev/null +++ b/assets/locales/th/first_run.ftl @@ -0,0 +1,64 @@ +welcome = ยินดีต้อนรับ + +welcome-page-message = + สวัสดี! ยินดีต้อนรับสู่ An Anime Game Launcher + + เราจำเป็นต้องเตรียมบางสิ่งและดาวน์โหลดส่วนประกอบเริ่มต้นก่อนที่คุณจะสามารถเล่นเกมได้ + +tos-violation-warning = คำเตือนการละเมิดข้อตกลงการใช้บริการของเกม + +tos-violation-warning-message = + Launcher นี้เป็นเครื่องมือที่ไม่การเกี่ยวข้องแต่อย่างใดกับ {company-name} หรือ {company-alter-name}. + + เครื่องมือนี้ออกแบบมาเพื่ออำนวยความสะดวกในการเล่น {game-name} บน Linux และสร้างขึ้นโดยมีวัตถุประสงค์เพียงอย่างเดียวในการติดตั้งและรันเกมโดยมีความยุ่งยากที่น้อยลง + + Launcher นี้ทำงานได้โดยใช้คอมโพเนนต์ที่มีอยู่แล้ว ผู้ใช้จึงจะได้รับประสบการณ์ที่เรียบง่าย + + อย่างไรก็ตาม ส่วนประกอบบางอย่างที่ใช้อาจฝ่าฝืนข้อกำหนดในการให้บริการของ {company-name} สำหรับเกม {game-name} + + หากคุณใช้ Launcher นี้ บัญชีของคุณอาจถูกระบุว่าไม่เป็นไปตามข้อกำหนดของ {company-name}/{company-alter-name}. + + หากเกิดเหตุการณ์เช่นนี้ เนื่องจากบัญชีของคุณไม่ปฏิบัติตามข้อกำหนด, {company-name}/{company-alter-name} จึงมีอิสระที่จะทำสิ่งที่พวกเขาอยาก รวมถึงการแบนบัญชีของคุณ + + หากคุณเข้าใจถึงความเสี่ยงในการพยายามเล่นเกมอย่างไม่เป็นทางการ ให้กด ตกลง เพื่อดำเนินการต่อ + +tos-dialog-title = คุณแน่ใจหรือว่าคุณเข้าใจสิ่งที่เราพูด? +tos-dialog-message = + 1. อย่าเผยแพร่ข้อมูลใดๆ เกี่ยวกับโครงการนี้ + 2. อย่าใช้มันในทางที่ผิดโดยใช้ไคลเอนต์ดัดแปลง + 3. ถามคำถามเป็นพิเศษในเซิร์ฟเวอร์ Discord หรือ Matrix ของเรา + + +dependencies = โปรแกรมที่จำเป็น +missing-dependencies-title = คุณขาดโปรแกรมที่จำเป็น! +missing-dependencies-message = คุณต้องติดตั้งแพ็คเกจบางอย่างให้กับระบบของคุณก่อนที่จะดำเนินการติดตั้งต่อ + + +default-paths = เส้นทางเริ่มต้น +choose-default-paths = เลือกเส้นทางเริ่มต้น +show-all-folders = ฉันรู้ว่าฉันกำลังทำอะไรอยู่ +show-all-folders-subtitle = แสดงการตั้งค่าการเลือกเส้นทางเพิ่มเติม (ทำตามที่ฉันบอก...) +runners-folder = โฟลเดอร์ Runners +dxvks-folder = โฟลเดอร์ DXVKs +wine-prefix-folder = โฟลเดอร์ prefix ของ Wine +global-game-installation-folder = โฟลเดอร์การติดตั้งเวอร์ชันเกมสากล +chinese-game-installation-folder = โฟลเดอร์การติดตั้งเวอร์ชันเกมจีน +fps-unlocker-folder = โฟลเดอร์ FPS Unlocker +components-index = Index ส่วนประกอบ +patch-folder = โฟลเดอร์แพทช์ +temp-folder = โฟลเดอร์ชั่วคราว + +migrate = ย้าย + + +select-voice-packages = เลือกแพ็คเกจภาษาเสียง + + +download-components = ดาวน์โหลดส่วนประกอบ +download-dxvk = ดาวน์โหลด DXVK +apply-dxvk = ติดตั้ง DXVK + + +finish = สำเร็จ +finish-title = ทุกอย่างเสร็จแล้ว! +finish-message = ดาวน์โหลดส่วนประกอบพื้นฐานทั้งหมดแล้ว ตอนนี้คุณสามารถรีสตาร์ท Launcher และดาวน์โหลดเกมได้ ยินดีต้อนรับสู่ club ของเรา! diff --git a/assets/locales/th/game.ftl b/assets/locales/th/game.ftl new file mode 100644 index 0000000..f8f46ae --- /dev/null +++ b/assets/locales/th/game.ftl @@ -0,0 +1,7 @@ +game-sessions = เซสชันเกม + +active-sessions = เซสชันที่ใช้งานอยู่ +active-session-description = เซสชั่นเกมที่เลือกในปัจจุบัน อัปเดตหลังจากเปิดตัวเกมแต่ละครั้ง + +update-session = อัปเดตเซสชันโดยใช้ค่าตั้งค่า Wine ปัจจุบัน +delete-session = ลบเซสชัน diff --git a/assets/locales/th/gamescope.ftl b/assets/locales/th/gamescope.ftl new file mode 100644 index 0000000..6531a85 --- /dev/null +++ b/assets/locales/th/gamescope.ftl @@ -0,0 +1,16 @@ +game-resolution = ความละเอียดของเกม +gamescope-resolution = ความละเอียดของ Gamescope + +upscaling = การเพิ่มขนาดความละเอียด + +integer-scaling = มาตราส่วนจำนวนเต็ม +integer-scaling-description = เปลี่ยนแต่ละพิกเซลเป็นกลุ่มสี่เหลี่ยมจัตุรัสหรือสี่เหลี่ยมของจำนวนเต็มของพิกเซลสีเดียวกัน ป้องกันการสูญเสียความคมชัดเมื่อปรับขนาด Full HD เป็น 4K +gamescope-fsr-description = เทคนิคการขยายขนาดที่พัฒนาโดย AMD เพื่อคุณภาพการขยายขนาดที่ดีขึ้น +nis-description = เทคนิคการขยายขนาดโอเพ่นซอร์สที่พัฒนาโดย Nvidia เป็นทางเลือกข้ามผู้จำหน่ายและมีค่าใช้จ่ายต่ำแทนโซลูชัน DLSS ที่เป็นกรรมสิทธิ์ ซึ่งหมายความว่าใช้งานได้กับ AMD และ Intel GPU รวมถึง Nvidia GPU + +other-settings = การตั้งค่าอื่นๆ +framerate-limit = ขีดจำกัดเฟรมเรต +unfocused-framerate-limit = เฟรมเรทจำกัดขณะไม่ได้โฟกัส + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/th/general.ftl b/assets/locales/th/general.ftl new file mode 100644 index 0000000..6e6655a --- /dev/null +++ b/assets/locales/th/general.ftl @@ -0,0 +1,70 @@ +appearance = รูปร่าง +modern = โมเดิร์น +classic = คลาสสิค +update-background = อัพเดตภาพพื้นหลัง +update-background-description = ดาวน์โหลดภาพพื้นหลังสำหรับ launcher คุณสามารถปิดการใช้งานเพื่อใช้รูปภาพที่คุณกำหนดเองแทนได้ + +launcher-language = ภาษาของ launcher +launcher-language-description = ใช้หลังจากรีสตาร์ท launcher + +game-edition = ฉบับเกม +global = สากล +china = จีน + +game-environment = สภาพแวดล้อมของเกม +game-environment-description = รับคุณสมบัติเฉพาะ เช่น วิธีการชำระเงินอื่นๆ + +game-voiceovers = ภาษาพากย์เสียงเกม +game-voiceovers-description = ภาษาเสียงพากย์เกมที่ดาวน์โหลดได้ คุณสามารถเลือกในการตั้งค่าเกม +english = ภาษาอังกฤษ +japanese = ภาษาญี่ปุ่น +korean = ภาษาเกาหลี +chinese = ภาษาจีน + +migrate-installation = ย้ายการติดตั้งเกม +migrate-installation-description = เปิดหน้าต่างพิเศษที่คุณสามารถเปลี่ยนโฟลเดอร์การติดตั้งเกมของคุณได้ +repair-game = ซ่อมแซมการติดตั้งเกม + +status = สถานะ + +game-version = เวอร์ชันเกม +game-not-installed = ยังไม่ได้ติดตั้ง + +game-predownload-available = มีการอัปเดตเกมให้ดาวน์โหลดได้ล่วงหน้าแล้ว: {$old} -> {$new} +game-update-available = มีอัปเดตเวอร์ชันเกมใหม่: {$old} -> {$new} +game-outdated = เวอร์ชันเกมล้าสมัยเกินไปและไม่สามารถอัปเดตได้. เวอร์ชันล่าสุด: {$latest} + +player-patch-version = เวอร์ชั่นแพทช์ +player-patch-version-description = แพทช์หลักที่ให้คุณเล่นเกมบน Linux + +patch-not-available = ไม่พร้อมใช้งาน +patch-not-available-tooltip = ไม่สามารถเข้าถึงเซิร์ฟเวอร์แพทช์ได้ + +patch-outdated = แพทช์ล้าสมัย ({$current}) +patch-outdated-tooltip = แพทช์ล้าสมัยแล้ว: {$current} -> {$latest} + +patch-preparation = เตรียมการ +patch-preparation-tooltip = แพทช์อยู่ระหว่างการพัฒนา + +patch-testing-tooltip = มีแพทช์ทดสอบให้ใช้งาน +patch-not-applied-tooltip = แพทช์ยังไม่มีการติดตั้ง + +apply-main-patch = ติดตั้งแพทช์หลัก +apply-main-patch-description = การทดลอง. การปิดใช้งานจะทำให้คุณสามารถรันเกมได้โดยไม่ต้องใช้แพตช์ สิ่งนี้อาจไม่ทำงานหรือต้องมีการแก้ไขไฟล์ด้วยตนเอง ใใช้เฉพาะเมื่อคุณรู้ว่าคุณกำลังทำอะไรอยู่ + +disable-mhypbase = ปิดการใช้งาน mhypbase +disable-mhypbase-description = การทดลอง. หากเปิดใช้งาน launcher จะปิดใช้งาน mhypbase.dll ในระหว่างการติดตั้งแพตช์หลัก ซึ่งในปัจจุบันเทียบเท่ากับแพตช์ xlua ปรับปรุงประสิทธิภาพและลดการใช้งาน CPU + +ask-superuser-permissions = ขอสิทธิ์ผู้ใช้ขั้นสูง (superuser) +ask-superuser-permissions-description = Launcher จะใช้ไฟล์เหล่านี้เพื่ออัปเดตไฟล์โฮสต์ของคุณโดยอัตโนมัติ สิ่งนี้ไม่จำเป็นในรุ่น flatpak + +launcher-behavior = พฤติกรรม Launcher +launcher-behavior-description = หน้าต่าง Launcher ควรทำอย่างไรเมื่อเริ่มเกม + +wine-tools = เครื่องมือ Wine +command-line = Command line +registry-editor = Registry editor +explorer = Explorer +task-manager = Task manager +configuration = Configuration +debugger = Debugger diff --git a/assets/locales/th/main.ftl b/assets/locales/th/main.ftl new file mode 100644 index 0000000..fec17b0 --- /dev/null +++ b/assets/locales/th/main.ftl @@ -0,0 +1,76 @@ +custom = กำหนดเอง +none = ไม่ใช้ +default = ค่าเริ่มต้น +details = รายละเอียด +options = ตัวเลือก + +width = ความกว้าง +height = ความสูง + +# Menu items + +launcher-folder = โฟลเดอร์ Launcher +game-folder = โฟลเดอร์เกม +config-file = ไฟล์ Config +debug-file = ไฟล์ Debug +wish-url = เปิด URL การอธิษฐาน +about = เกี่ยวกับ + + +close = ปิด +hide = ซ่อน +nothing = ไม่ทำอะไร +save = บันทึก +continue = ดำเนินการต่อ +resume = ดำเนินการต่อ +exit = ออก +check = ตรวจสอบ +restart = เริ่มต้นใหม่ +agree = ตกลง + + +loading-data = กำลังโหลดข้อมูล +downloading-background-picture = กำลังดาวน์โหลดภาพพื้นหลัง +updating-components-index = กำลังอัปเดต index ส่วนประกอบ +loading-game-version = กำลังโหลดเวอร์ชั่นเกม +loading-patch-status = กำลังโหลดสถานะแพทช์ +loading-launcher-state = กำลังโหลดสถานะ launcher +loading-launcher-state--game = กำลังโหลดสถานะ launcher: กำลังตรวจสอบเวอร์ชันเกม +loading-launcher-state--voice = กำลังโหลดสถานะ launcher: กำลังตรวจสอบภาษาพากย์เสียง {$locale} +loading-launcher-state--patch = กำลังโหลดสถานะ launcher: กำลังตรวจสอบแพตช์ที่ติดตั้ง + + +checking-free-space = กำลังตรวจสอบพื้นที่ว่าง +downloading = กำลังดาวน์โหลด +updating-permissions = กำลังอัปเดตสิทธิ์ +unpacking = กำลังแกะ +verifying-files = กำลังตรวจสอบไฟล์ +repairing-files = กำลังซ่อมแซมไฟล์ +migrating-folders = กำลังย้ายโฟลเดอร์ +applying-hdiff = กำลังติดตั้งแพตช์ hdiff +removing-outdated = กำลังลบไฟล์ที่ล้าสมัย + + +components-index-updated = อัปเดตส่วนประกอบแล้ว + + +launch = เริ่มเกมส์ +migrate-folders = ย้ายโฟลเดอร์ +migrate-folders-tooltip = อัพเดตโครงสร้างโฟลเดอร์เกม +apply-patch = ติดตั้งแพทช์ +disable-telemetry = ปิดใช้งานการวัดและส่งข้อมูล +download-wine = ดาวน์โหลด Wine +create-prefix = สร้างการตั้งค่า Wine +update = อัปเดต +download = ดาวน์โหลด +predownload-update = ดาวน์โหลดล่วงหน้า {$version} อัปเดต ({$size}) + +kill-game-process = ฆ่ากระบวนการเกม + +main-window--patch-unavailable-tooltip = เซิร์ฟเวอร์แพตช์ไม่พร้อมใช้งานและ launcher ไม่สามารถตรวจสอบสถานะการแพตช์ของเกมได้ คุณสามารถรันเกมได้แต่ต้องยอมรับความเสี่ยงเอง +main-window--patch-outdated-tooltip = โแพตช์ล้าสมัยหรืออยู่ในสถานะเตรียมการ ดังนั้นจึงไม่สามารถใช้งานได้ โปรดกลับมาใหม่ในภายหลังเพื่อดูสถานะ +main-window--version-outdated-tooltip = เวอร์ชันล้าสมัยเกินไปและไม่สามารถอัปเดตได้ + +preferences = การตั้งค่า +general = ทั่วไป +enhancements = การปรับปรุง diff --git a/assets/locales/th/sandbox.ftl b/assets/locales/th/sandbox.ftl new file mode 100644 index 0000000..8889db5 --- /dev/null +++ b/assets/locales/th/sandbox.ftl @@ -0,0 +1,28 @@ +sandbox = แซนด์บ็อกซ์ +sandbox-description = รันเกมที่แยกออกจากระบบ เพื่อป้องกันไม่ให้เข้าถึงข้อมูลส่วนบุคคลของคุณ + +enable-sandboxing = เปิดใช้งานแซนด์บ็อกซ์ +enable-sandboxing-description = รันเกมในระบบไฟล์รูทของคุณแบบอ่านได้อย่างเดียว + +hide-home-directory = ซ่อนโฮมไดเร็กตอรี่ +hide-home-directory-description = ซ่อนโฟลเดอร์ /home, /var/home/$USER และ $HOME ของคุณจากเกม + +hostname = ชื่อโฮสต์ +additional-arguments = arguments เพิ่มเติม + +private-directories = ไดเรกทอรีส่วนตัว +private-directories-description = โฟลเดอร์เหล่านี้จะถูกแทนที่ด้วยระบบไฟล์เสมือนที่ว่างเปล่า (tmpfs) และไฟล์เหล่านั้นจะไม่สามารถเข้าถึงได้โดยเกมแซนด์บ็อกซ์ + +path = เส้นทาง + +shared-directories = ไดเรกทอรีใช้ร่วมกัน +shared-directories-description = ไดเร็กทอรีเหล่านี้จะเชื่อมโยงกับไดเร็กทอรีในระบบโฮสต์ของคุณ + +original-path = เส้นทางเดิม +new-path = เส้นทางใหม่ + +read-only = อ่านได้เท่านั้น +read-only-description = ห้ามเกมเขียนข้อมูลใดๆ ลงในไดเร็กทอรีนี้ + +symlinks = Symlinks +symlinks-description = สร้าง Symbolic Link จากตำแหน่งเดิมไปยังตำแหน่งใหม่ภายในแซนด์บ็อกซ์ของคุณ diff --git a/assets/locales/tr/gamescope.ftl b/assets/locales/tr/gamescope.ftl index 221969c..f19da2e 100644 --- a/assets/locales/tr/gamescope.ftl +++ b/assets/locales/tr/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = DLSS teknolojisine düşük maliyetli bir alternatif olarak Nv other-settings = Diğer ayarlar framerate-limit = Kare hızı limiti unfocused-framerate-limit = Odakta değilken kare hızı limiti + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/uk/gamescope.ftl b/assets/locales/uk/gamescope.ftl index 28a657b..b94a9a9 100644 --- a/assets/locales/uk/gamescope.ftl +++ b/assets/locales/uk/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = Відкрита техніка масштабування з other-settings = Інші налаштування framerate-limit = Обмеження кількості кадрів unfocused-framerate-limit = Обмеження кількості кадрів поза фокусом + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/vi/gamescope.ftl b/assets/locales/vi/gamescope.ftl index 6ced83c..2edf20b 100644 --- a/assets/locales/vi/gamescope.ftl +++ b/assets/locales/vi/gamescope.ftl @@ -11,3 +11,6 @@ nis-description = Một kỹ thuật nâng cấp mã nguồn mở do Nvidia phá other-settings = Cài đặt khác framerate-limit = Giới hạn tốc độ khung hình unfocused-framerate-limit = Giới hạn tốc độ khung hình khi không tập trung + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/locales/zh-cn/gamescope.ftl b/assets/locales/zh-cn/gamescope.ftl index 1c3f462..282801b 100644 --- a/assets/locales/zh-cn/gamescope.ftl +++ b/assets/locales/zh-cn/gamescope.ftl @@ -1,6 +1,11 @@ game-resolution = 游戏分辨率 gamescope-resolution = Gamescope 分辨率 + +integer-scaling = 整数倍数缩放 + other-settings = 其它设置 framerate-limit = 帧率限制 unfocused-framerate-limit = 切出游戏帧率限制 -integer-scaling = 整数倍数缩放 + +force-grab-cursor = Force grab cursor +force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game diff --git a/assets/resources.xml b/assets/resources.xml index 362d796..9beeedb 100644 --- a/assets/resources.xml +++ b/assets/resources.xml @@ -26,6 +26,7 @@ images/icons/list-add-symbolic.svg images/icons/view-refresh-symbolic.svg images/icons/applications-games-symbolic.svg + images/icons/applications-system-symbolic.svg images/icons/applications-graphics-symbolic.svg images/icons/go-next-symbolic.svg images/icons/dialog-information-symbolic.svg diff --git a/src/i18n.rs b/src/i18n.rs index 0f0cb7c..2d62374 100644 --- a/src/i18n.rs +++ b/src/i18n.rs @@ -27,7 +27,8 @@ pub const SUPPORTED_LANGUAGES: &[LanguageIdentifier] = &[ langid!("pl-pl"), langid!("vi-vn"), langid!("nl-nl"), - langid!("uk-ua") + langid!("uk-ua"), + langid!("th-th") ]; pub static mut LANG: LanguageIdentifier = langid!("en-us"); @@ -105,9 +106,7 @@ macro_rules! tr { use fluent_templates::Loader; #[allow(unused_unsafe)] - $crate::i18n::LOCALES - .lookup(unsafe { &$crate::i18n::LANG }, $id) - .expect(&format!("Failed to find a message with given id: {}", stringify!($id))) + $crate::i18n::LOCALES.lookup(unsafe { &$crate::i18n::LANG }, $id) } }; @@ -125,9 +124,7 @@ macro_rules! tr { )* #[allow(unused_unsafe)] - $crate::i18n::LOCALES - .lookup_complete(unsafe { &$crate::i18n::LANG }, $id, Some(&args)) - .expect(&format!("Failed to find a message with given id: {}", stringify!($id))) + $crate::i18n::LOCALES.lookup_complete(unsafe { &$crate::i18n::LANG }, $id, Some(&args)) } }; } diff --git a/src/main.rs b/src/main.rs index eb8b96d..525fcdf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -70,6 +70,36 @@ lazy_static::lazy_static! { /// /// Standard is `$HOME/.local/share/anime-game-launcher/.first-run` pub static ref FIRST_RUN_FILE: PathBuf = LAUNCHER_FOLDER.join(".first-run"); + + /// Global app's css + static ref GLOBAL_CSS: String = format!(" + progressbar > text {{ + margin-bottom: 4px; + }} + + window.classic-style {{ + background: url(\"file://{}\"); + background-repeat: no-repeat; + background-size: cover; + }} + + window.classic-style progressbar {{ + background-color: #00000020; + border-radius: 16px; + padding: 8px 16px; + }} + + window.classic-style progressbar:hover {{ + background-color: #00000060; + color: #ffffff; + transition-duration: 0.5s; + transition-timing-function: linear; + }} + + .round-bin {{ + border-radius: 24px; + }} + ", BACKGROUND_FILE.to_string_lossy()); } fn main() -> anyhow::Result<()> { @@ -105,22 +135,24 @@ fn main() -> anyhow::Result<()> { let mut no_verbose_tracing = false; let args = std::env::args().collect::>(); + let mut gtk_args = Vec::new(); // Parse arguments for i in 0..args.len() { - if args[i] == "--debug" { - force_debug = true; - } else if args[i] == "--run-game" { - run_game = true; - } else if args[i] == "--just-run-game" { - just_run_game = true; - } else if args[i] == "--no-verbose-tracing" { - no_verbose_tracing = true; - } else if args[i] == "--session" { - // Switch active session prior running the app - if let Some(session) = args.get(i + 1) { - Sessions::set_current(session.to_owned())?; - } + match args[i].as_str() { + "--debug" => force_debug = true, + "--run-game" => run_game = true, + "--just-run-game" => just_run_game = true, + "--no-verbose-tracing" => no_verbose_tracing = true, + + "--session" => { + // Switch active session prior running the app + if let Some(session) = args.get(i + 1) { + Sessions::set_current(session.to_owned())?; + } + }, + + arg => gtk_args.push(arg.to_string()) } } @@ -170,36 +202,6 @@ fn main() -> anyhow::Result<()> { gtk::glib::set_application_name("An Anime Game Launcher"); gtk::glib::set_program_name(Some("An Anime Game Launcher")); - // Set global css - relm4::set_global_css(&format!(" - progressbar > text {{ - margin-bottom: 4px; - }} - - window.classic-style {{ - background: url(\"file://{}\"); - background-repeat: no-repeat; - background-size: cover; - }} - - window.classic-style progressbar {{ - background-color: #00000020; - border-radius: 16px; - padding: 8px 16px; - }} - - window.classic-style progressbar:hover {{ - background-color: #00000060; - color: #ffffff; - transition-duration: 0.5s; - transition-timing-function: linear; - }} - - .round-bin {{ - border-radius: 24px; - }} - ", BACKGROUND_FILE.to_string_lossy())); - // Set UI language let lang = CONFIG.launcher.language.parse().expect("Wrong language format used in config"); @@ -210,7 +212,11 @@ fn main() -> anyhow::Result<()> { // Run FirstRun window if .first-run file persist if FIRST_RUN_FILE.exists() { // Create the app - let app = RelmApp::new(APP_ID); + let app = RelmApp::new(APP_ID) + .with_args(gtk_args); + + // Set global css + app.set_global_css(&GLOBAL_CSS); // Show first run window app.run::(()); @@ -240,7 +246,11 @@ fn main() -> anyhow::Result<()> { } // Create the app - let app = RelmApp::new(APP_ID); + let app = RelmApp::new(APP_ID) + .with_args(gtk_args); + + // Set global css + app.set_global_css(&GLOBAL_CSS); // Show main window app.run::(()); diff --git a/src/ui/about.rs b/src/ui/about.rs index e681af1..3df62ec 100644 --- a/src/ui/about.rs +++ b/src/ui/about.rs @@ -77,7 +77,9 @@ impl SimpleComponent for AboutDialog { "日本語 — @zozonteq https://github.com/zozonteq", "한국어 — @project-dy https://github.com/project-dy", "Indonesia — @yumekarisu https://github.com/yumekarisu", - "Tiếng Việt — Nguyễn Hữu Chánh https://github.com/Chanhnh" + "Tiếng Việt — Nguyễn Hữu Chánh https://github.com/Chanhnh", + "Українська — Іван Потієнко https://github.com/xxanqw", + "ไทย — @thegooglerider https://github.com/TheGoogleRider2" ].join("\n"), set_debug_info: &[ @@ -92,10 +94,28 @@ impl SimpleComponent for AboutDialog { set_release_notes_version: &APP_VERSION, set_release_notes: &[ + "

Added

", + + "
    ", + "
  • Bundle applications-system-symbolic icon to the app
  • ", + "
  • Added force grab cursor option to the gamescope settings
  • ", + "
  • Added Thai
  • ", + "
  • Added Ukrainian
  • ", + "
", + "

Changed

", "
    ", - "
  • Replaced FPS unlocker by a custom one
  • ", + "
  • Update wish url
  • ", + "
  • Updated dependencies
  • ", + "
  • Improved app args parsing
  • ", + "
  • Updated locales
  • ", + "
", + + "

Fixed

", + + "
    ", + "
  • Fixed GtkSwitch UI state representation
  • ", "
" ].join("\n"), @@ -113,11 +133,7 @@ impl SimpleComponent for AboutDialog { } } - fn init( - _init: Self::Init, - root: &Self::Root, - sender: ComponentSender, - ) -> ComponentParts { + fn init(_init: Self::Init, root: Self::Root, sender: ComponentSender) -> ComponentParts { tracing::info!("Initializing about dialog"); let model = Self { diff --git a/src/ui/first_run/default_paths.rs b/src/ui/first_run/default_paths.rs index 6885af2..3967da2 100644 --- a/src/ui/first_run/default_paths.rs +++ b/src/ui/first_run/default_paths.rs @@ -287,11 +287,7 @@ impl SimpleAsyncComponent for DefaultPathsApp { } } - async fn init( - init: Self::Init, - root: Self::Root, - _sender: AsyncComponentSender, - ) -> AsyncComponentParts { + async fn init(init: Self::Init, root: Self::Root, _sender: AsyncComponentSender) -> AsyncComponentParts { let model = Self { progress_bar: ProgressBar::builder() .launch(ProgressBarInit { diff --git a/src/ui/first_run/dependencies.rs b/src/ui/first_run/dependencies.rs index 0605581..e43883a 100644 --- a/src/ui/first_run/dependencies.rs +++ b/src/ui/first_run/dependencies.rs @@ -135,11 +135,7 @@ impl SimpleAsyncComponent for DependenciesApp { } } - async fn init( - _init: Self::Init, - root: Self::Root, - _sender: AsyncComponentSender, - ) -> AsyncComponentParts { + async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender) -> AsyncComponentParts { let distro = whatadistro::identify(); let model = Self { diff --git a/src/ui/first_run/download_components.rs b/src/ui/first_run/download_components.rs index 5e8168f..3ea61a2 100644 --- a/src/ui/first_run/download_components.rs +++ b/src/ui/first_run/download_components.rs @@ -264,11 +264,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp { } } - async fn init( - _init: Self::Init, - root: Self::Root, - sender: AsyncComponentSender, - ) -> AsyncComponentParts { + async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender) -> AsyncComponentParts { let model = Self { progress_bar: ProgressBar::builder() .launch(ProgressBarInit { diff --git a/src/ui/first_run/finish.rs b/src/ui/first_run/finish.rs index ea2163c..e69ab96 100644 --- a/src/ui/first_run/finish.rs +++ b/src/ui/first_run/finish.rs @@ -68,11 +68,7 @@ impl SimpleAsyncComponent for FinishApp { } } - async fn init( - _init: Self::Init, - root: Self::Root, - _sender: AsyncComponentSender, - ) -> AsyncComponentParts { + async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender) -> AsyncComponentParts { let model = Self; let widgets = view_output!(); diff --git a/src/ui/first_run/main.rs b/src/ui/first_run/main.rs index a34a5f9..089f32a 100644 --- a/src/ui/first_run/main.rs +++ b/src/ui/first_run/main.rs @@ -115,11 +115,7 @@ impl SimpleComponent for FirstRunApp { } } - fn init( - _parent: Self::Init, - root: &Self::Root, - sender: ComponentSender, - ) -> ComponentParts { + fn init(_parent: Self::Init, root: Self::Root, sender: ComponentSender) -> ComponentParts { tracing::info!("Initializing first run window"); let toast_overlay = adw::ToastOverlay::new(); diff --git a/src/ui/first_run/select_voiceovers.rs b/src/ui/first_run/select_voiceovers.rs index 4ea632b..b92aace 100644 --- a/src/ui/first_run/select_voiceovers.rs +++ b/src/ui/first_run/select_voiceovers.rs @@ -51,7 +51,7 @@ impl SimpleAsyncComponent for SelectVoiceoversApp { #[local_ref] add_suffix = english -> gtk::Switch { set_valign: gtk::Align::Center, - set_state: true + set_active: true } }, @@ -110,11 +110,7 @@ impl SimpleAsyncComponent for SelectVoiceoversApp { } } - async fn init( - _init: Self::Init, - root: Self::Root, - _sender: AsyncComponentSender, - ) -> AsyncComponentParts { + async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender) -> AsyncComponentParts { let model = Self { english: gtk::Switch::new(), japanese: gtk::Switch::new(), diff --git a/src/ui/first_run/welcome.rs b/src/ui/first_run/welcome.rs index 829df0b..6bfcd15 100644 --- a/src/ui/first_run/welcome.rs +++ b/src/ui/first_run/welcome.rs @@ -68,11 +68,7 @@ impl SimpleAsyncComponent for WelcomeApp { } } - async fn init( - _init: Self::Init, - root: Self::Root, - _sender: AsyncComponentSender, - ) -> AsyncComponentParts { + async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender) -> AsyncComponentParts { let model = Self; let widgets = view_output!(); diff --git a/src/ui/main/mod.rs b/src/ui/main/mod.rs index bfdab28..67965a3 100644 --- a/src/ui/main/mod.rs +++ b/src/ui/main/mod.rs @@ -625,11 +625,7 @@ impl SimpleComponent for App { } } - fn init( - _init: Self::Init, - root: &Self::Root, - sender: ComponentSender, - ) -> ComponentParts { + fn init(_init: Self::Init, root: Self::Root, sender: ComponentSender) -> ComponentParts { tracing::info!("Initializing main window"); let model = App { @@ -763,7 +759,7 @@ impl SimpleComponent for App { let web_cache = String::from_utf8_lossy(&web_cache); // https://webstatic-sea.[ho-yo-ver-se].com/[ge-nsh-in]/event/e20190909gacha-v2/index.html?...... - if let Some(url) = web_cache.lines().rev().find(|line| line.contains("gacha-v2/index.html")) { + if let Some(url) = web_cache.lines().rev().find(|line| line.contains("gacha-v3/index.html")) { let url_begin_pos = url.find("https://").unwrap(); let url_end_pos = url_begin_pos + url[url_begin_pos..].find("\0\0\0\0").unwrap(); diff --git a/src/ui/migrate_installation.rs b/src/ui/migrate_installation.rs index 6f115e6..a31a98f 100644 --- a/src/ui/migrate_installation.rs +++ b/src/ui/migrate_installation.rs @@ -36,11 +36,7 @@ impl SimpleComponent for MigrateInstallationApp { } } - fn init( - _init: Self::Init, - root: &Self::Root, - _sender: ComponentSender, - ) -> ComponentParts { + fn init(_init: Self::Init, root: Self::Root, _sender: ComponentSender) -> ComponentParts { tracing::info!("Initializing migration window"); let model = Self { diff --git a/src/ui/preferences/enhancements/environment.rs b/src/ui/preferences/enhancements/environment.rs index f7d925b..4a0f6cc 100644 --- a/src/ui/preferences/enhancements/environment.rs +++ b/src/ui/preferences/enhancements/environment.rs @@ -71,91 +71,82 @@ impl SimpleAsyncComponent for EnvironmentPage { type Output = EnhancementsAppMsg; view! { - gtk::Box { - set_orientation: gtk::Orientation::Vertical, + adw::NavigationPage { + #[wrap(Some)] + set_child = >k::Box { + set_orientation: gtk::Orientation::Vertical, - adw::HeaderBar { - #[wrap(Some)] - set_title_widget = &adw::WindowTitle { - set_title: &tr!("environment") + adw::HeaderBar { + #[wrap(Some)] + set_title_widget = &adw::WindowTitle { + set_title: &tr!("environment") + } }, - pack_start = >k::Button { - set_icon_name: "go-previous-symbolic", + adw::PreferencesPage { + set_title: &tr!("environment"), + set_icon_name: Some("document-properties-symbolic"), - connect_clicked[sender] => move |_| { - sender.output(EnhancementsAppMsg::OpenMainPage).unwrap(); - } - } - }, + add = &adw::PreferencesGroup { + set_title: &tr!("game-command"), + set_description: Some(&tr!("game-command-description")), - adw::PreferencesPage { - set_title: &tr!("environment"), - set_icon_name: Some("document-properties-symbolic"), + adw::EntryRow { + set_title: "%command%", + set_text: CONFIG.game.command.as_ref().unwrap_or(&String::new()).trim(), - add = &adw::PreferencesGroup { - set_title: &tr!("game-command"), - set_description: Some(&tr!("game-command-description")), + connect_changed => |entry| { + if let Ok(mut config) = Config::get() { + let command = entry.text().trim().to_string(); - adw::EntryRow { - set_title: "%command%", - set_text: CONFIG.game.command.as_ref().unwrap_or(&String::new()).trim(), + config.game.command = if command.is_empty() { + None + } else { + Some(command) + }; - connect_changed => |entry| { - if let Ok(mut config) = Config::get() { - let command = entry.text().trim().to_string(); - - config.game.command = if command.is_empty() { - None - } else { - Some(command) - }; - - Config::update(config); + Config::update(config); + } } } - } - }, + }, - add = &adw::PreferencesGroup { - set_title: &tr!("new-variable"), + add = &adw::PreferencesGroup { + set_title: &tr!("new-variable"), - #[wrap(Some)] - set_header_suffix = >k::Button { - add_css_class: "flat", + #[wrap(Some)] + set_header_suffix = >k::Button { + add_css_class: "flat", - set_valign: gtk::Align::Center, + set_valign: gtk::Align::Center, - adw::ButtonContent { - set_icon_name: "list-add-symbolic", - set_label: &tr!("add") + adw::ButtonContent { + set_icon_name: "list-add-symbolic", + set_label: &tr!("add") + }, + + connect_clicked => EnvironmentPageMsg::Add }, - connect_clicked => EnvironmentPageMsg::Add + #[local_ref] + name_entry -> adw::EntryRow { + set_title: &tr!("name") + }, + + #[local_ref] + value_entry -> adw::EntryRow { + set_title: &tr!("value") + } }, #[local_ref] - name_entry -> adw::EntryRow { - set_title: &tr!("name") - }, - - #[local_ref] - value_entry -> adw::EntryRow { - set_title: &tr!("value") - } - }, - - #[local_ref] - add = variables -> adw::PreferencesGroup {} + add = variables -> adw::PreferencesGroup {} + } } } } - async fn init( - _init: Self::Init, - root: Self::Root, - sender: AsyncComponentSender, - ) -> AsyncComponentParts { + async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender) -> AsyncComponentParts { tracing::info!("Initializing environment settings"); let mut model = Self { diff --git a/src/ui/preferences/enhancements/game.rs b/src/ui/preferences/enhancements/game.rs index 081c655..cc262ae 100644 --- a/src/ui/preferences/enhancements/game.rs +++ b/src/ui/preferences/enhancements/game.rs @@ -74,11 +74,7 @@ impl AsyncFactoryComponent for GameSession { } } - async fn init_model( - init: Self::Init, - _index: &DynamicIndex, - _sender: AsyncFactorySender, - ) -> Self { + async fn init_model(init: Self::Init, _index: &DynamicIndex, _sender: AsyncFactorySender) -> Self { init } } @@ -105,57 +101,48 @@ impl SimpleAsyncComponent for GamePage { type Output = EnhancementsAppMsg; view! { - gtk::Box { - set_orientation: gtk::Orientation::Vertical, + adw::NavigationPage { + #[wrap(Some)] + set_child = >k::Box { + set_orientation: gtk::Orientation::Vertical, - adw::HeaderBar { - #[wrap(Some)] - set_title_widget = &adw::WindowTitle { - set_title: &tr!("game") + adw::HeaderBar { + #[wrap(Some)] + set_title_widget = &adw::WindowTitle { + set_title: &tr!("game") + } }, - pack_start = >k::Button { - set_icon_name: "go-previous-symbolic", + adw::PreferencesPage { + set_title: &tr!("game"), + set_icon_name: Some("applications-games-symbolic"), - connect_clicked[sender] => move |_| { - sender.output(EnhancementsAppMsg::OpenMainPage).unwrap(); - } - } - }, + add = &adw::PreferencesGroup { + set_title: &tr!("game-sessions"), - adw::PreferencesPage { - set_title: &tr!("game"), - set_icon_name: Some("applications-games-symbolic"), + #[local_ref] + session_name_entry -> adw::EntryRow { + set_title: &tr!("name"), - add = &adw::PreferencesGroup { - set_title: &tr!("game-sessions"), + add_suffix = >k::Button { + set_icon_name: "list-add-symbolic", + add_css_class: "flat", + + set_valign: gtk::Align::Center, + + connect_clicked => GamePageMsg::AddSession + } + } + }, #[local_ref] - session_name_entry -> adw::EntryRow { - set_title: &tr!("name"), - - add_suffix = >k::Button { - set_icon_name: "list-add-symbolic", - add_css_class: "flat", - - set_valign: gtk::Align::Center, - - connect_clicked => GamePageMsg::AddSession - } - } - }, - - #[local_ref] - add = sessions -> adw::PreferencesGroup {}, + add = sessions -> adw::PreferencesGroup {}, + } } } } - async fn init( - _init: Self::Init, - root: Self::Root, - sender: AsyncComponentSender, - ) -> AsyncComponentParts { + async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender) -> AsyncComponentParts { tracing::info!("Initializing game settings"); let mut model = Self { diff --git a/src/ui/preferences/enhancements/mod.rs b/src/ui/preferences/enhancements/mod.rs index 7a097d3..12b92ef 100644 --- a/src/ui/preferences/enhancements/mod.rs +++ b/src/ui/preferences/enhancements/mod.rs @@ -17,6 +17,8 @@ use anime_launcher_sdk::anime_game_core::installer::downloader::Downloader; use anime_launcher_sdk::discord_rpc::DiscordRpc; use anime_launcher_sdk::is_available; +use enum_ordinalize::Ordinalize; + pub mod game; pub mod sandbox; pub mod environment; @@ -232,12 +234,12 @@ impl SimpleAsyncComponent for EnhancementsApp { add_suffix = >k::Switch { set_valign: gtk::Align::Center, - set_state: CONFIG.game.wine.borderless, + set_active: CONFIG.game.wine.borderless, connect_state_notify => |switch| { if is_ready() { if let Ok(mut config) = Config::get() { - config.game.wine.borderless = switch.state(); + config.game.wine.borderless = switch.is_active(); Config::update(config); } @@ -277,12 +279,12 @@ impl SimpleAsyncComponent for EnhancementsApp { add_suffix = >k::Switch { set_valign: gtk::Align::Center, - set_state: CONFIG.game.wine.virtual_desktop.enabled, + set_active: CONFIG.game.wine.virtual_desktop.enabled, connect_state_notify => |switch| { if is_ready() { if let Ok(mut config) = Config::get() { - config.game.wine.virtual_desktop.enabled = switch.state(); + config.game.wine.virtual_desktop.enabled = switch.is_active(); Config::update(config); } @@ -298,12 +300,12 @@ impl SimpleAsyncComponent for EnhancementsApp { add_suffix = >k::Switch { set_valign: gtk::Align::Center, - set_state: CONFIG.game.wine.drives.drive_c, + set_active: CONFIG.game.wine.drives.drive_c, connect_state_notify => |switch| { if is_ready() { if let Ok(mut config) = Config::get() { - config.game.wine.drives.drive_c = switch.state(); + config.game.wine.drives.drive_c = switch.is_active(); Config::update(config); } @@ -343,12 +345,12 @@ impl SimpleAsyncComponent for EnhancementsApp { add_suffix = >k::Switch { set_valign: gtk::Align::Center, - set_state: CONFIG.game.wine.drives.game_folder.is_some(), + set_active: CONFIG.game.wine.drives.game_folder.is_some(), connect_state_notify[map_game_folder_row] => move |switch| { if is_ready() { if let Ok(mut config) = Config::get() { - if switch.state() { + if switch.is_active() { config.game.wine.drives.game_folder = Some(AllowedDrives::list()[map_game_folder_row.selected() as usize]); } else { config.game.wine.drives.game_folder = None; @@ -415,12 +417,12 @@ impl SimpleAsyncComponent for EnhancementsApp { add_suffix = >k::Switch { set_valign: gtk::Align::Center, - set_state: CONFIG.game.enhancements.fsr.enabled, + set_active: CONFIG.game.enhancements.fsr.enabled, connect_state_notify => |switch| { if is_ready() { if let Ok(mut config) = Config::get() { - config.game.enhancements.fsr.enabled = switch.state(); + config.game.enhancements.fsr.enabled = switch.is_active(); Config::update(config); } @@ -438,12 +440,12 @@ impl SimpleAsyncComponent for EnhancementsApp { add_suffix = >k::Switch { set_valign: gtk::Align::Center, - set_state: CONFIG.game.enhancements.gamemode, + set_active: CONFIG.game.enhancements.gamemode, connect_state_notify => |switch| { if is_ready() { if let Ok(mut config) = Config::get() { - config.game.enhancements.gamemode = switch.state(); + config.game.enhancements.gamemode = switch.is_active(); Config::update(config); } @@ -470,12 +472,12 @@ impl SimpleAsyncComponent for EnhancementsApp { add_suffix = >k::Switch { set_valign: gtk::Align::Center, - set_state: CONFIG.game.enhancements.gamescope.enabled, + set_active: CONFIG.game.enhancements.gamescope.enabled, connect_state_notify => |switch| { if is_ready() { if let Ok(mut config) = Config::get() { - config.game.enhancements.gamescope.enabled = switch.state(); + config.game.enhancements.gamescope.enabled = switch.is_active(); Config::update(config); } @@ -494,12 +496,12 @@ impl SimpleAsyncComponent for EnhancementsApp { add_suffix = >k::Switch { set_valign: gtk::Align::Center, - set_state: CONFIG.launcher.discord_rpc.enabled, + set_active: CONFIG.launcher.discord_rpc.enabled, connect_state_notify => |switch| { if is_ready() { if let Ok(mut config) = Config::get() { - config.launcher.discord_rpc.enabled = switch.state(); + config.launcher.discord_rpc.enabled = switch.is_active(); Config::update(config); } @@ -588,12 +590,12 @@ impl SimpleAsyncComponent for EnhancementsApp { add_suffix = >k::Switch { set_valign: gtk::Align::Center, - set_state: CONFIG.game.enhancements.fps_unlocker.enabled, + set_active: CONFIG.game.enhancements.fps_unlocker.enabled, connect_state_notify => |switch| { if is_ready() { if let Ok(mut config) = Config::get() { - config.game.enhancements.fps_unlocker.enabled = switch.state(); + config.game.enhancements.fps_unlocker.enabled = switch.is_active(); Config::update(config); } @@ -627,13 +629,13 @@ impl SimpleAsyncComponent for EnhancementsApp { }, #[local_ref] - game_page -> gtk::Box {}, + game_page -> adw::NavigationPage, #[local_ref] - sandbox_page -> gtk::Box {}, + sandbox_page -> adw::NavigationPage, #[local_ref] - environment_page -> gtk::Box {} + environment_page -> adw::NavigationPage, } async fn init( @@ -769,28 +771,28 @@ impl SimpleAsyncComponent for EnhancementsApp { PREFERENCES_WINDOW.as_ref() .unwrap_unchecked() .widget() - .close_subpage(); + .pop_subpage(); } EnhancementsAppMsg::OpenGameSettingsPage => unsafe { PREFERENCES_WINDOW.as_ref() .unwrap_unchecked() .widget() - .present_subpage(self.game_page.widget()); + .push_subpage(self.game_page.widget()); } EnhancementsAppMsg::OpenSandboxSettingsPage => unsafe { PREFERENCES_WINDOW.as_ref() .unwrap_unchecked() .widget() - .present_subpage(self.sandbox_page.widget()); + .push_subpage(self.sandbox_page.widget()); } EnhancementsAppMsg::OpenEnvironmentSettingsPage => unsafe { PREFERENCES_WINDOW.as_ref() .unwrap_unchecked() .widget() - .present_subpage(self.environment_page.widget()); + .push_subpage(self.environment_page.widget()); } EnhancementsAppMsg::Toast { title, description } => { diff --git a/src/ui/preferences/enhancements/sandbox.rs b/src/ui/preferences/enhancements/sandbox.rs index 8aa3b7f..9c84b92 100644 --- a/src/ui/preferences/enhancements/sandbox.rs +++ b/src/ui/preferences/enhancements/sandbox.rs @@ -98,235 +98,226 @@ impl SimpleAsyncComponent for SandboxPage { type Output = EnhancementsAppMsg; view! { - gtk::Box { - set_orientation: gtk::Orientation::Vertical, - - adw::HeaderBar { - #[wrap(Some)] - set_title_widget = &adw::WindowTitle { - set_title: &tr!("sandbox") - }, - - pack_start = >k::Button { - set_icon_name: "go-previous-symbolic", - - connect_clicked[sender] => move |_| { - sender.output(EnhancementsAppMsg::OpenMainPage).unwrap(); - } - } - }, - - adw::PreferencesPage { - set_title: &tr!("sandbox"), - set_icon_name: Some("folder-symbolic"), - - set_sensitive: is_available("bwrap"), - - add = &adw::PreferencesGroup { - set_title: &tr!("sandbox"), - set_description: Some(&tr!("sandbox-description")), - - adw::ActionRow { - set_title: &tr!("enable-sandboxing"), - set_subtitle: &tr!("enable-sandboxing-description"), - - add_suffix = >k::Switch { - set_valign: gtk::Align::Center, - - set_state: CONFIG.sandbox.enabled, - - connect_state_notify => |switch| { - if is_ready() { - if let Ok(mut config) = Config::get() { - config.sandbox.enabled = switch.state(); - - Config::update(config); - } - } - } - } - }, - - adw::ActionRow { - set_title: &tr!("hide-home-directory"), - set_subtitle: &tr!("hide-home-directory-description"), - - add_suffix = >k::Switch { - set_valign: gtk::Align::Center, - - set_state: CONFIG.sandbox.isolate_home, - - connect_state_notify => |switch| { - if is_ready() { - if let Ok(mut config) = Config::get() { - config.sandbox.isolate_home = switch.state(); - - Config::update(config); - } - } - } - } - }, - - adw::EntryRow { - set_title: &tr!("hostname"), - set_text: CONFIG.sandbox.hostname.as_ref().unwrap_or(&String::new()).trim(), - - connect_changed => |entry| { - if let Ok(mut config) = Config::get() { - let command = entry.text().trim().to_string(); - - config.sandbox.hostname = if command.is_empty() { - None - } else { - Some(command) - }; - - Config::update(config); - } - } - }, - - adw::EntryRow { - set_title: &tr!("additional-arguments"), - set_text: CONFIG.sandbox.args.as_ref().unwrap_or(&String::new()).trim(), - - connect_changed => |entry| { - if let Ok(mut config) = Config::get() { - let command = entry.text().trim().to_string(); - - config.sandbox.args = if command.is_empty() { - None - } else { - Some(command) - }; - - Config::update(config); - } - }, - - add_suffix = >k::Button { - set_icon_name: "dialog-information-symbolic", - add_css_class: "flat", - - set_valign: gtk::Align::Center, - - connect_clicked[sender] => move |_| { - if let Err(err) = open::that("https://man.archlinux.org/man/bwrap.1") { - sender.output(EnhancementsAppMsg::Toast { - title: tr!("documentation-url-open-failed"), - description: Some(err.to_string()) - }).unwrap(); - } - } - } - } - }, - - add = &adw::PreferencesGroup { - set_title: &tr!("private-directories"), - set_description: Some(&tr!("private-directories-description")), - - #[local_ref] - private_path_entry -> adw::EntryRow { - set_title: &tr!("path"), - - add_suffix = >k::Button { - set_icon_name: "list-add-symbolic", - add_css_class: "flat", - - set_valign: gtk::Align::Center, - - connect_clicked => SandboxPageMsg::AddPrivate - } - } - }, - - #[local_ref] - add = private_paths -> adw::PreferencesGroup {}, - - add = &adw::PreferencesGroup { - set_title: &tr!("shared-directories"), - set_description: Some(&tr!("shared-directories-description")), + adw::NavigationPage { + #[wrap(Some)] + set_child = >k::Box { + set_orientation: gtk::Orientation::Vertical, + adw::HeaderBar { #[wrap(Some)] - set_header_suffix = >k::Button { - add_css_class: "flat", + set_title_widget = &adw::WindowTitle { + set_title: &tr!("sandbox") + } + }, - set_valign: gtk::Align::Center, + adw::PreferencesPage { + set_title: &tr!("sandbox"), + set_icon_name: Some("folder-symbolic"), - adw::ButtonContent { - set_icon_name: "list-add-symbolic", - set_label: &tr!("add") + set_sensitive: is_available("bwrap"), + + add = &adw::PreferencesGroup { + set_title: &tr!("sandbox"), + set_description: Some(&tr!("sandbox-description")), + + adw::ActionRow { + set_title: &tr!("enable-sandboxing"), + set_subtitle: &tr!("enable-sandboxing-description"), + + add_suffix = >k::Switch { + set_valign: gtk::Align::Center, + + set_active: CONFIG.sandbox.enabled, + + connect_state_notify => |switch| { + if is_ready() { + if let Ok(mut config) = Config::get() { + config.sandbox.enabled = switch.is_active(); + + Config::update(config); + } + } + } + } }, - connect_clicked => SandboxPageMsg::AddShared + adw::ActionRow { + set_title: &tr!("hide-home-directory"), + set_subtitle: &tr!("hide-home-directory-description"), + + add_suffix = >k::Switch { + set_valign: gtk::Align::Center, + + set_active: CONFIG.sandbox.isolate_home, + + connect_state_notify => |switch| { + if is_ready() { + if let Ok(mut config) = Config::get() { + config.sandbox.isolate_home = switch.is_active(); + + Config::update(config); + } + } + } + } + }, + + adw::EntryRow { + set_title: &tr!("hostname"), + set_text: CONFIG.sandbox.hostname.as_ref().unwrap_or(&String::new()).trim(), + + connect_changed => |entry| { + if let Ok(mut config) = Config::get() { + let command = entry.text().trim().to_string(); + + config.sandbox.hostname = if command.is_empty() { + None + } else { + Some(command) + }; + + Config::update(config); + } + } + }, + + adw::EntryRow { + set_title: &tr!("additional-arguments"), + set_text: CONFIG.sandbox.args.as_ref().unwrap_or(&String::new()).trim(), + + connect_changed => |entry| { + if let Ok(mut config) = Config::get() { + let command = entry.text().trim().to_string(); + + config.sandbox.args = if command.is_empty() { + None + } else { + Some(command) + }; + + Config::update(config); + } + }, + + add_suffix = >k::Button { + set_icon_name: "dialog-information-symbolic", + add_css_class: "flat", + + set_valign: gtk::Align::Center, + + connect_clicked[sender] => move |_| { + if let Err(err) = open::that("https://man.archlinux.org/man/bwrap.1") { + sender.output(EnhancementsAppMsg::Toast { + title: tr!("documentation-url-open-failed"), + description: Some(err.to_string()) + }).unwrap(); + } + } + } + } }, - #[local_ref] - shared_path_from_entry -> adw::EntryRow { - set_title: &tr!("original-path") - }, - - #[local_ref] - shared_path_to_entry -> adw::EntryRow { - set_title: &tr!("new-path") - }, - - adw::ActionRow { - set_title: &tr!("read-only"), - set_subtitle: &tr!("read-only-description"), + add = &adw::PreferencesGroup { + set_title: &tr!("private-directories"), + set_description: Some(&tr!("private-directories-description")), #[local_ref] - add_suffix = read_only_switch -> gtk::Switch { - set_valign: gtk::Align::Center + private_path_entry -> adw::EntryRow { + set_title: &tr!("path"), + + add_suffix = >k::Button { + set_icon_name: "list-add-symbolic", + add_css_class: "flat", + + set_valign: gtk::Align::Center, + + connect_clicked => SandboxPageMsg::AddPrivate + } } - } - }, + }, - #[local_ref] - add = shared_paths -> adw::PreferencesGroup {}, + #[local_ref] + add = private_paths -> adw::PreferencesGroup {}, - add = &adw::PreferencesGroup { - set_title: &tr!("symlinks"), - set_description: Some(&tr!("symlinks-description")), + add = &adw::PreferencesGroup { + set_title: &tr!("shared-directories"), + set_description: Some(&tr!("shared-directories-description")), - #[wrap(Some)] - set_header_suffix = >k::Button { - add_css_class: "flat", + #[wrap(Some)] + set_header_suffix = >k::Button { + add_css_class: "flat", - set_valign: gtk::Align::Center, + set_valign: gtk::Align::Center, - adw::ButtonContent { - set_icon_name: "list-add-symbolic", - set_label: &tr!("add") + adw::ButtonContent { + set_icon_name: "list-add-symbolic", + set_label: &tr!("add") + }, + + connect_clicked => SandboxPageMsg::AddShared }, - connect_clicked => SandboxPageMsg::AddSymlink + #[local_ref] + shared_path_from_entry -> adw::EntryRow { + set_title: &tr!("original-path") + }, + + #[local_ref] + shared_path_to_entry -> adw::EntryRow { + set_title: &tr!("new-path") + }, + + adw::ActionRow { + set_title: &tr!("read-only"), + set_subtitle: &tr!("read-only-description"), + + #[local_ref] + add_suffix = read_only_switch -> gtk::Switch { + set_valign: gtk::Align::Center + } + } }, #[local_ref] - symlink_path_from_entry -> adw::EntryRow { - set_title: &tr!("original-path") + add = shared_paths -> adw::PreferencesGroup {}, + + add = &adw::PreferencesGroup { + set_title: &tr!("symlinks"), + set_description: Some(&tr!("symlinks-description")), + + #[wrap(Some)] + set_header_suffix = >k::Button { + add_css_class: "flat", + + set_valign: gtk::Align::Center, + + adw::ButtonContent { + set_icon_name: "list-add-symbolic", + set_label: &tr!("add") + }, + + connect_clicked => SandboxPageMsg::AddSymlink + }, + + #[local_ref] + symlink_path_from_entry -> adw::EntryRow { + set_title: &tr!("original-path") + }, + + #[local_ref] + symlink_path_to_entry -> adw::EntryRow { + set_title: &tr!("new-path") + } }, #[local_ref] - symlink_path_to_entry -> adw::EntryRow { - set_title: &tr!("new-path") - } - }, - - #[local_ref] - add = symlink_paths -> adw::PreferencesGroup {} + add = symlink_paths -> adw::PreferencesGroup {} + } } } } - async fn init( - _init: Self::Init, - root: Self::Root, - sender: AsyncComponentSender, - ) -> AsyncComponentParts { + async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender) -> AsyncComponentParts { tracing::info!("Initializing sandbox settings"); let mut model = Self { diff --git a/src/ui/preferences/gamescope.rs b/src/ui/preferences/gamescope.rs index 8a4163b..eeecb39 100644 --- a/src/ui/preferences/gamescope.rs +++ b/src/ui/preferences/gamescope.rs @@ -6,6 +6,8 @@ use anime_launcher_sdk::genshin::config::Config; use anime_launcher_sdk::config::schema_blanks::prelude::*; +use enum_ordinalize::Ordinalize; + use crate::*; pub struct GamescopeApp; @@ -128,13 +130,13 @@ impl SimpleAsyncComponent for GamescopeApp { add_suffix = >k::Switch { set_valign: gtk::Align::Center, - set_state: CONFIG.game.enhancements.gamescope.integer_scaling, + set_active: CONFIG.game.enhancements.gamescope.integer_scaling, connect_state_notify => |switch| { if is_ready() { if let Ok(mut config) = Config::get() { - config.game.enhancements.gamescope.integer_scaling = switch.state(); - + config.game.enhancements.gamescope.integer_scaling = switch.is_active(); + Config::update(config); } } @@ -148,13 +150,13 @@ impl SimpleAsyncComponent for GamescopeApp { add_suffix = >k::Switch { set_valign: gtk::Align::Center, - set_state: CONFIG.game.enhancements.gamescope.fsr, + set_active: CONFIG.game.enhancements.gamescope.fsr, connect_state_notify => |switch| { if is_ready() { if let Ok(mut config) = Config::get() { - config.game.enhancements.gamescope.fsr = switch.state(); - + config.game.enhancements.gamescope.fsr = switch.is_active(); + Config::update(config); } } @@ -168,13 +170,13 @@ impl SimpleAsyncComponent for GamescopeApp { add_suffix = >k::Switch { set_valign: gtk::Align::Center, - set_state: CONFIG.game.enhancements.gamescope.nis, + set_active: CONFIG.game.enhancements.gamescope.nis, connect_state_notify => |switch| { if is_ready() { if let Ok(mut config) = Config::get() { - config.game.enhancements.gamescope.nis = switch.state(); - + config.game.enhancements.gamescope.nis = switch.is_active(); + Config::update(config); } } @@ -250,17 +252,33 @@ impl SimpleAsyncComponent for GamescopeApp { } } } + }, + + adw::ActionRow { + set_title: &tr!("force-grab-cursor"), + set_subtitle: &tr!("force-grab-cursor-description"), + + add_suffix = >k::Switch { + set_valign: gtk::Align::Center, + set_active: CONFIG.game.enhancements.gamescope.force_grab_cursor, + + connect_state_notify => |switch| { + if is_ready() { + if let Ok(mut config) = Config::get() { + config.game.enhancements.gamescope.force_grab_cursor = switch.is_active(); + + Config::update(config); + } + } + } + } } } } } } - async fn init( - _init: Self::Init, - root: Self::Root, - _sender: AsyncComponentSender, - ) -> AsyncComponentParts { + async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender) -> AsyncComponentParts { tracing::info!("Initializing gamescope settings"); let model = Self; diff --git a/src/ui/preferences/general/components.rs b/src/ui/preferences/general/components.rs index bf8dfff..7eb7c26 100644 --- a/src/ui/preferences/general/components.rs +++ b/src/ui/preferences/general/components.rs @@ -49,202 +49,193 @@ impl SimpleAsyncComponent for ComponentsPage { type Output = GeneralAppMsg; view! { - gtk::Box { - set_orientation: gtk::Orientation::Vertical, + adw::NavigationPage { + #[wrap(Some)] + set_child = >k::Box { + set_orientation: gtk::Orientation::Vertical, - adw::HeaderBar { - #[wrap(Some)] - set_title_widget = &adw::WindowTitle { - set_title: &tr!("components") + adw::HeaderBar { + #[wrap(Some)] + set_title_widget = &adw::WindowTitle { + set_title: &tr!("components") + } }, - pack_start = >k::Button { - set_icon_name: "go-previous-symbolic", + adw::PreferencesPage { + add = &adw::PreferencesGroup { + set_title: &tr!("wine-version"), - connect_clicked[sender] => move |_| { - sender.output(GeneralAppMsg::OpenMainPage).unwrap(); - } + adw::ComboRow { + set_title: &tr!("selected-version"), + + #[watch] + #[block_signal(wine_selected_notify)] + set_model: Some(>k::StringList::new(&model.downloaded_wine_versions.iter().map(|(version, _)| version.title.as_str()).collect::>())), + + #[watch] + #[block_signal(wine_selected_notify)] + set_selected: model.selected_wine_version, + + #[watch] + set_activatable: !model.selecting_wine_version, + + connect_selected_notify[sender] => move |row| { + if is_ready() { + sender.input(ComponentsPageMsg::SelectWine(row.selected() as usize)); + } + } @wine_selected_notify, + + add_suffix = >k::Spinner { + set_spinning: true, + + #[watch] + set_visible: model.selecting_wine_version + } + }, + + adw::ActionRow { + set_title: &tr!("recommended-only"), + set_subtitle: &tr!("wine-recommended-description"), + + add_suffix = >k::Switch { + set_valign: gtk::Align::Center, + + #[block_signal(wine_recommended_notify)] + set_active: true, + + connect_state_notify[sender] => move |switch| { + if is_ready() { + sender.input(ComponentsPageMsg::WineRecommendedOnly(switch.is_active())); + } + } @wine_recommended_notify + } + } + }, + + add = &adw::PreferencesGroup { + add = model.wine_components.widget(), + }, + + add = &adw::PreferencesGroup { + set_title: &tr!("wine-options"), + + adw::ActionRow { + set_title: &tr!("wine-use-shared-libraries"), + set_subtitle: &tr!("wine-use-shared-libraries-description"), + + add_suffix = >k::Switch { + set_valign: gtk::Align::Center, + + #[block_signal(wine_shared_libraries_notify)] + set_active: CONFIG.game.wine.shared_libraries.wine, + + connect_state_notify => |switch| { + if is_ready() { + if let Ok(mut config) = Config::get() { + config.game.wine.shared_libraries.wine = switch.is_active(); + + Config::update(config); + } + } + } @wine_shared_libraries_notify + } + }, + + adw::ActionRow { + set_title: &tr!("gstreamer-use-shared-libraries"), + set_subtitle: &tr!("gstreamer-use-shared-libraries-description"), + + add_suffix = >k::Switch { + set_valign: gtk::Align::Center, + + #[block_signal(gstreamer_shared_libraries_notify)] + set_active: CONFIG.game.wine.shared_libraries.gstreamer, + + connect_state_notify => |switch| { + if is_ready() { + if let Ok(mut config) = Config::get() { + config.game.wine.shared_libraries.gstreamer = switch.is_active(); + + Config::update(config); + } + } + } @gstreamer_shared_libraries_notify + } + } + }, + + add = &adw::PreferencesGroup { + set_title: &tr!("dxvk-version"), + + #[watch] + set_description: Some(&if !model.allow_dxvk_selection { + tr!("dxvk-selection-disabled") + } else { + String::new() + }), + + #[watch] + set_sensitive: model.allow_dxvk_selection, + + adw::ComboRow { + set_title: &tr!("selected-version"), + + #[watch] + #[block_signal(dxvk_selected_notify)] + set_model: Some(>k::StringList::new(&model.downloaded_dxvk_versions.iter().map(|version| version.name.as_str()).collect::>())), + + #[watch] + #[block_signal(dxvk_selected_notify)] + set_selected: model.selected_dxvk_version, + + #[watch] + set_activatable: !model.selecting_dxvk_version, + + connect_selected_notify[sender] => move |row| { + if is_ready() { + sender.input(ComponentsPageMsg::SelectDxvk(row.selected() as usize)); + } + } @dxvk_selected_notify, + + add_suffix = >k::Spinner { + set_spinning: true, + + #[watch] + set_visible: model.selecting_dxvk_version + } + }, + + adw::ActionRow { + set_title: &tr!("recommended-only"), + set_subtitle: &tr!("dxvk-recommended-description"), + + add_suffix = >k::Switch { + set_valign: gtk::Align::Center, + + #[block_signal(dxvk_recommended_notify)] + set_active: true, + + connect_state_notify[sender] => move |switch| { + if is_ready() { + sender.input(ComponentsPageMsg::DxvkRecommendedOnly(switch.is_active())); + } + } @dxvk_recommended_notify + } + } + }, + + add = &adw::PreferencesGroup { + #[watch] + set_sensitive: model.allow_dxvk_selection, + + add = model.dxvk_components.widget(), + }, } - }, - - adw::PreferencesPage { - add = &adw::PreferencesGroup { - set_title: &tr!("wine-version"), - - adw::ComboRow { - set_title: &tr!("selected-version"), - - #[watch] - #[block_signal(wine_selected_notify)] - set_model: Some(>k::StringList::new(&model.downloaded_wine_versions.iter().map(|(version, _)| version.title.as_str()).collect::>())), - - #[watch] - #[block_signal(wine_selected_notify)] - set_selected: model.selected_wine_version, - - #[watch] - set_activatable: !model.selecting_wine_version, - - connect_selected_notify[sender] => move |row| { - if is_ready() { - sender.input(ComponentsPageMsg::SelectWine(row.selected() as usize)); - } - } @wine_selected_notify, - - add_suffix = >k::Spinner { - set_spinning: true, - - #[watch] - set_visible: model.selecting_wine_version - } - }, - - adw::ActionRow { - set_title: &tr!("recommended-only"), - set_subtitle: &tr!("wine-recommended-description"), - - add_suffix = >k::Switch { - set_valign: gtk::Align::Center, - - #[block_signal(wine_recommended_notify)] - set_state: true, - - connect_state_notify[sender] => move |switch| { - if is_ready() { - sender.input(ComponentsPageMsg::WineRecommendedOnly(switch.state())); - } - } @wine_recommended_notify - } - } - }, - - add = &adw::PreferencesGroup { - add = model.wine_components.widget(), - }, - - add = &adw::PreferencesGroup { - set_title: &tr!("wine-options"), - - adw::ActionRow { - set_title: &tr!("wine-use-shared-libraries"), - set_subtitle: &tr!("wine-use-shared-libraries-description"), - - add_suffix = >k::Switch { - set_valign: gtk::Align::Center, - - #[block_signal(wine_shared_libraries_notify)] - set_state: CONFIG.game.wine.shared_libraries.wine, - - connect_state_notify => |switch| { - if is_ready() { - if let Ok(mut config) = Config::get() { - config.game.wine.shared_libraries.wine = switch.state(); - - Config::update(config); - } - } - } @wine_shared_libraries_notify - } - }, - - adw::ActionRow { - set_title: &tr!("gstreamer-use-shared-libraries"), - set_subtitle: &tr!("gstreamer-use-shared-libraries-description"), - - add_suffix = >k::Switch { - set_valign: gtk::Align::Center, - - #[block_signal(gstreamer_shared_libraries_notify)] - set_state: CONFIG.game.wine.shared_libraries.gstreamer, - - connect_state_notify => |switch| { - if is_ready() { - if let Ok(mut config) = Config::get() { - config.game.wine.shared_libraries.gstreamer = switch.state(); - - Config::update(config); - } - } - } @gstreamer_shared_libraries_notify - } - } - }, - - add = &adw::PreferencesGroup { - set_title: &tr!("dxvk-version"), - - #[watch] - set_description: Some(&if !model.allow_dxvk_selection { - tr!("dxvk-selection-disabled") - } else { - String::new() - }), - - #[watch] - set_sensitive: model.allow_dxvk_selection, - - adw::ComboRow { - set_title: &tr!("selected-version"), - - #[watch] - #[block_signal(dxvk_selected_notify)] - set_model: Some(>k::StringList::new(&model.downloaded_dxvk_versions.iter().map(|version| version.name.as_str()).collect::>())), - - #[watch] - #[block_signal(dxvk_selected_notify)] - set_selected: model.selected_dxvk_version, - - #[watch] - set_activatable: !model.selecting_dxvk_version, - - connect_selected_notify[sender] => move |row| { - if is_ready() { - sender.input(ComponentsPageMsg::SelectDxvk(row.selected() as usize)); - } - } @dxvk_selected_notify, - - add_suffix = >k::Spinner { - set_spinning: true, - - #[watch] - set_visible: model.selecting_dxvk_version - } - }, - - adw::ActionRow { - set_title: &tr!("recommended-only"), - set_subtitle: &tr!("dxvk-recommended-description"), - - add_suffix = >k::Switch { - set_valign: gtk::Align::Center, - - #[block_signal(dxvk_recommended_notify)] - set_state: true, - - connect_state_notify[sender] => move |switch| { - if is_ready() { - sender.input(ComponentsPageMsg::DxvkRecommendedOnly(switch.state())); - } - } @dxvk_recommended_notify - } - } - }, - - add = &adw::PreferencesGroup { - #[watch] - set_sensitive: model.allow_dxvk_selection, - - add = model.dxvk_components.widget(), - }, } } } - async fn init( - _init: Self::Init, - root: Self::Root, - sender: AsyncComponentSender, - ) -> AsyncComponentParts { + async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender) -> AsyncComponentParts { tracing::info!("Initializing general settings -> components page"); let model = Self { diff --git a/src/ui/preferences/general/mod.rs b/src/ui/preferences/general/mod.rs index 1300115..c092a75 100644 --- a/src/ui/preferences/general/mod.rs +++ b/src/ui/preferences/general/mod.rs @@ -232,7 +232,7 @@ impl SimpleAsyncComponent for GeneralApp { connect_state_notify => |switch| { #[allow(unused_must_use)] - if switch.state() { + if switch.is_active() { std::fs::remove_file(KEEP_BACKGROUND_FILE.as_path()); } else { std::fs::write(KEEP_BACKGROUND_FILE.as_path(), ""); @@ -528,7 +528,7 @@ impl SimpleAsyncComponent for GeneralApp { }, #[local_ref] - components_page -> gtk::Box {} + components_page -> adw::NavigationPage, } async fn init( @@ -664,14 +664,14 @@ impl SimpleAsyncComponent for GeneralApp { PREFERENCES_WINDOW.as_ref() .unwrap_unchecked() .widget() - .close_subpage(); + .pop_subpage(); } GeneralAppMsg::OpenComponentsPage => unsafe { PREFERENCES_WINDOW.as_ref() .unwrap_unchecked() .widget() - .present_subpage(self.components_page.widget()); + .push_subpage(self.components_page.widget()); } #[allow(unused_must_use)] diff --git a/src/ui/preferences/main.rs b/src/ui/preferences/main.rs index f065666..d5004e2 100644 --- a/src/ui/preferences/main.rs +++ b/src/ui/preferences/main.rs @@ -68,11 +68,7 @@ impl SimpleAsyncComponent for PreferencesApp { } } - async fn init( - parent: Self::Init, - root: Self::Root, - sender: AsyncComponentSender, - ) -> AsyncComponentParts { + async fn init(parent: Self::Init, root: Self::Root, sender: AsyncComponentSender) -> AsyncComponentParts { tracing::info!("Initializing preferences window"); let model = Self {