From 850c8476c8d118b11407b1442e229007c85d5e28 Mon Sep 17 00:00:00 2001 From: PancakeTAS Date: Wed, 23 Jul 2025 18:11:44 +0200 Subject: [PATCH] remove most of the ui major rewrite incoming :/ --- ui/Cargo.lock | 434 ++++++-------------- ui/Cargo.toml | 19 +- ui/resources/com.cali666.lsfg-vk-ui.desktop | 13 - ui/resources/icons/lsfg-vk.png | Bin 91746 -> 0 bytes ui/resources/ui.ui | 347 ---------------- ui/src/app_state.rs | 293 ------------- ui/src/config.rs | 141 ------- ui/src/settings_window.rs | 155 ------- ui/src/utils.rs | 59 --- 9 files changed, 124 insertions(+), 1337 deletions(-) delete mode 100644 ui/resources/com.cali666.lsfg-vk-ui.desktop delete mode 100644 ui/resources/icons/lsfg-vk.png delete mode 100644 ui/resources/ui.ui delete mode 100644 ui/src/app_state.rs delete mode 100644 ui/src/config.rs delete mode 100644 ui/src/settings_window.rs delete mode 100644 ui/src/utils.rs diff --git a/ui/Cargo.lock b/ui/Cargo.lock index fb3b967..537d499 100644 --- a/ui/Cargo.lock +++ b/ui/Cargo.lock @@ -2,12 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" - [[package]] name = "autocfg" version = "1.5.0" @@ -22,23 +16,21 @@ checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "cairo-rs" -version = "0.18.5" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +checksum = "f6466a563dea2e99f59f6ffbb749fd0bdf75764f5e6e93976b5e7bd73c4c9efb" dependencies = [ "bitflags", "cairo-sys-rs", "glib", "libc", - "once_cell", - "thiserror", ] [[package]] name = "cairo-sys-rs" -version = "0.18.2" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +checksum = "cab7e9f13c802625aad1ad2b4ae3989f4ce9339ff388f335a6f109f9338705e2" dependencies = [ "glib-sys", "libc", @@ -47,50 +39,14 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.15.8" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +checksum = "0d0390889d58f934f01cd49736275b4c2da15bcfc328c78ff2349907e6cabf22" dependencies = [ "smallvec", "target-lexicon", ] -[[package]] -name = "cfg-if" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" - -[[package]] -name = "directories" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -147,7 +103,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -172,22 +128,21 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.18.5" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +checksum = "688dc7eaf551dbac1f5b11d000d089c3db29feb25562455f47c1a2080cc60bda" dependencies = [ "gdk-pixbuf-sys", "gio", "glib", "libc", - "once_cell", ] [[package]] name = "gdk-pixbuf-sys" -version = "0.18.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +checksum = "5af1823d3d1cb72616873ba0a593bd440eb92da700fdfb047505a21ee3ec3e10" dependencies = [ "gio-sys", "glib-sys", @@ -198,9 +153,9 @@ dependencies = [ [[package]] name = "gdk4" -version = "0.7.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edb019ad581f8ecf8ea8e4baa6df7c483a95b5a59be3140be6a9c3b0c632af6" +checksum = "0a67b064d2f35e649232455c7724f56f977555d2608c43300eabc530eaa4e359" dependencies = [ "cairo-rs", "gdk-pixbuf", @@ -213,9 +168,9 @@ dependencies = [ [[package]] name = "gdk4-sys" -version = "0.7.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbab43f332a3cf1df9974da690b5bb0e26720ed09a228178ce52175372dcfef0" +checksum = "2edbda0d879eb85317bdb49a3da591ed70a804a10776e358ef416be38c6db2c5" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -228,22 +183,11 @@ dependencies = [ "system-deps", ] -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - [[package]] name = "gio" -version = "0.18.4" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +checksum = "273d64c833fbbf7cd86c4cdced893c5d3f2f5d6aeb30fd0c30d172456ce8be2e" dependencies = [ "futures-channel", "futures-core", @@ -252,30 +196,28 @@ dependencies = [ "gio-sys", "glib", "libc", - "once_cell", "pin-project-lite", "smallvec", - "thiserror", ] [[package]] name = "gio-sys" -version = "0.18.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +checksum = "2c8130f5810a839d74afc3a929c34a700bf194972bb034f2ecfe639682dd13cc" dependencies = [ "glib-sys", "gobject-sys", "libc", "system-deps", - "winapi", + "windows-sys", ] [[package]] name = "glib" -version = "0.18.5" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +checksum = "690e8bcf8a819b5911d6ae79879226191d01253a4f602748072603defd5b9553" dependencies = [ "bitflags", "futures-channel", @@ -289,30 +231,36 @@ dependencies = [ "gobject-sys", "libc", "memchr", - "once_cell", "smallvec", - "thiserror", +] + +[[package]] +name = "glib-build-tools" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86aebe63bb050d4918cb1d629880cb35fcba7ccda6f6fc0ec1beffdaa1b9d5c3" +dependencies = [ + "gio", ] [[package]] name = "glib-macros" -version = "0.18.5" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +checksum = "e772291ebea14c28eb11bb75741f62f4a4894f25e60ce80100797b6b010ef0f9" dependencies = [ - "heck 0.4.1", - "proc-macro-crate 2.0.2", - "proc-macro-error", + "heck", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] name = "glib-sys" -version = "0.18.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +checksum = "4b2be4c74454fb4a6bd3328320737d0fa3d6939e2d570f5d846da00cb222f6a0" dependencies = [ "libc", "system-deps", @@ -320,9 +268,9 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.18.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +checksum = "ab318a786f9abd49d388013b9161fa0ef8218ea6118ee7111c95e62186f7d31f" dependencies = [ "glib-sys", "libc", @@ -331,9 +279,9 @@ dependencies = [ [[package]] name = "graphene-rs" -version = "0.18.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2228cda1505613a7a956cca69076892cfbda84fc2b7a62b94a41a272c0c401" +checksum = "0487f78e8a772ec89020458fbabadd1332bc1e3236ca1c63ef1d61afd4e5f2cc" dependencies = [ "glib", "graphene-sys", @@ -342,9 +290,9 @@ dependencies = [ [[package]] name = "graphene-sys" -version = "0.18.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4144cee8fc8788f2a9b73dc5f1d4e1189d1f95305c4cb7bd9c1af1cfa31f59" +checksum = "270cefb6b270fcb2ef9708c3a35c0e25c2e831dac28d75c4f87e5ad3540c9543" dependencies = [ "glib-sys", "libc", @@ -354,9 +302,9 @@ dependencies = [ [[package]] name = "gsk4" -version = "0.7.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d958e351d2f210309b32d081c832d7de0aca0b077aa10d88336c6379bd01f7e" +checksum = "d5dbe33ceed6fc20def67c03d36e532f5a4a569ae437ae015a7146094f31e10c" dependencies = [ "cairo-rs", "gdk4", @@ -369,9 +317,9 @@ dependencies = [ [[package]] name = "gsk4-sys" -version = "0.7.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12bd9e3effea989f020e8f1ff3fa3b8c63ba93d43b899c11a118868853a56d55" +checksum = "8d76011d55dd19fde16ffdedee08877ae6ec942818cfa7bc08a91259bc0b9fc9" dependencies = [ "cairo-sys-rs", "gdk4-sys", @@ -385,9 +333,9 @@ dependencies = [ [[package]] name = "gtk4" -version = "0.7.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeb51aa3e9728575a053e1f43543cd9992ac2477e1b186ad824fd4adfb70842" +checksum = "938d68ad43080ad5ee710c30d467c1bc022ee5947856f593855691d726305b3e" dependencies = [ "cairo-rs", "field-offset", @@ -406,23 +354,21 @@ dependencies = [ [[package]] name = "gtk4-macros" -version = "0.7.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d57ec49cf9b657f69a05bca8027cff0a8dfd0c49e812be026fc7311f2163832f" +checksum = "0912d2068695633002b92c5966edc108b2e4f54b58c509d1eeddd4cbceb7315c" dependencies = [ - "anyhow", - "proc-macro-crate 1.3.1", - "proc-macro-error", + "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] name = "gtk4-sys" -version = "0.7.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54d8c4aa23638ce9faa2caf7e2a27d4a1295af2155c8e8d28c4d4eeca7a65eb8" +checksum = "a923bdcf00e46723801162de24432cbce38a6810e0178a2d0b6dd4ecc26a1c74" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -443,12 +389,6 @@ version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -467,11 +407,10 @@ dependencies = [ [[package]] name = "libadwaita" -version = "0.5.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fe7e70c06507ed10a16cda707f358fbe60fe0dc237498f78c686ade92fd979c" +checksum = "4df6715d1257bd8c093295b77a276ed129d73543b10304fec5829ced5d5b7c41" dependencies = [ - "gdk-pixbuf", "gdk4", "gio", "glib", @@ -483,9 +422,9 @@ dependencies = [ [[package]] name = "libadwaita-sys" -version = "0.5.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e10aaa38de1d53374f90deeb4535209adc40cc5dba37f9704724169bceec69a" +checksum = "fdf8950090cc180250cdb1ff859a39748feeda7a53a9f28ead3a17a14cc37ae2" dependencies = [ "gdk4-sys", "gio-sys", @@ -503,28 +442,6 @@ version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" -[[package]] -name = "libredox" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4488594b9328dee448adb906d8b126d9b7deb7cf5c22161ee591610bb1be83c0" -dependencies = [ - "bitflags", - "libc", -] - -[[package]] -name = "lsfg-vk-ui" -version = "0.1.3" -dependencies = [ - "directories", - "dirs", - "gtk4", - "libadwaita", - "serde", - "toml", -] - [[package]] name = "memchr" version = "2.7.5" @@ -540,36 +457,23 @@ dependencies = [ "autocfg", ] -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - [[package]] name = "pango" -version = "0.18.3" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +checksum = "2d4803f086c4f49163c31ac14db162112a22401c116435080e4be8678c507d61" dependencies = [ "gio", "glib", "libc", - "once_cell", "pango-sys", ] [[package]] name = "pango-sys" -version = "0.18.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +checksum = "66872b3cfd328ad6d1a4f89ebd5357119bd4c592a4ddbb8f6bc2386f8ce7b898" dependencies = [ "glib-sys", "gobject-sys", @@ -597,46 +501,11 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro-crate" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" -dependencies = [ - "toml_datetime", - "toml_edit 0.20.2", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", + "toml_edit", ] [[package]] @@ -657,17 +526,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom", - "libredox", - "thiserror", -] - [[package]] name = "rustc_version" version = "0.4.1" @@ -700,7 +558,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -724,17 +582,6 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.104" @@ -748,12 +595,12 @@ dependencies = [ [[package]] name = "system-deps" -version = "6.2.2" +version = "7.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +checksum = "e4be53aa0cba896d2dc615bd42bbc130acdcffa239e0a2d965ea5b3b2a86ffdb" dependencies = [ "cfg-expr", - "heck 0.5.0", + "heck", "pkg-config", "toml", "version-compare", @@ -761,67 +608,36 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.16" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] +checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" [[package]] name = "toml" -version = "0.8.2" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.20.2", + "toml_edit", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", @@ -830,6 +646,15 @@ dependencies = [ "winnow", ] +[[package]] +name = "ui" +version = "0.1.0" +dependencies = [ + "glib-build-tools", + "gtk4", + "libadwaita", +] + [[package]] name = "unicode-ident" version = "1.0.18" @@ -842,58 +667,25 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.5" +version = "0.53.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", + "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", @@ -902,51 +694,57 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.5.40" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] diff --git a/ui/Cargo.toml b/ui/Cargo.toml index 3524dea..9684e1e 100644 --- a/ui/Cargo.toml +++ b/ui/Cargo.toml @@ -1,14 +1,11 @@ [package] -name = "lsfg-vk-ui" -version = "0.1.3" -edition = "2021" -authors = ["Cali666"] -description = "Lossless Scaling Frame Generation Configuration Tool" +name = "ui" +version = "0.1.0" +edition = "2024" [dependencies] -libadwaita = "0.5" -gtk = { version = "0.7", package = "gtk4" } -directories = "5.0" -serde = { version = "1.0", features = ["derive"] } -toml = "0.8" -dirs = "5.0" +gtk = { version = "0.10.0", package = "gtk4" } +adw = { version = "0.8.0", package = "libadwaita" } + +[build-dependencies] +glib-build-tools = "0.21.0" diff --git a/ui/resources/com.cali666.lsfg-vk-ui.desktop b/ui/resources/com.cali666.lsfg-vk-ui.desktop deleted file mode 100644 index 640a161..0000000 --- a/ui/resources/com.cali666.lsfg-vk-ui.desktop +++ /dev/null @@ -1,13 +0,0 @@ -[Desktop Entry] -Version=1.0 -Type=Application -Name=LSFG-VK UI -Comment=Lossless Scaling Frame Generation Configuration Tool -Exec=lsfg-vk-ui %U -Icon=com.cali666.lsfg-vk-ui -Terminal=false -Categories=Game;Settings; -Keywords=lossless;scaling;frame;generation;gaming;graphics;configuration; -StartupNotify=true -StartupWMClass=com.cali666.lsfg-vk-ui -MimeType=application/x-lsfg-profile; diff --git a/ui/resources/icons/lsfg-vk.png b/ui/resources/icons/lsfg-vk.png deleted file mode 100644 index 1c67ee2a50503f34b7bd6afbed09a3f0e4cb1f9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91746 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%0DRY{s%5jc~Z{Pg8 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
T$^`GHzq(O>E5~*5Ax;sS?4u~jFw@hXmOtor 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 - - - - Lossless Scaling Frame Generation - 800 - 600 - true - - - - - - - Lossless Scaling Frame Generation - - - - - - Settings - settings-icon-button - - - - - - - - horizontal - - - - never - automatic - - - vertical - 0 - sidebar-content - - - LSFG Profiles - 0.0 - 12 - 12 - 6 - title-1 - - - - - browse - navigation-sidebar - - - - - - Create New Profile - 12 - 12 - 12 - suggested-action - - - - - - - - - - vertical - true - true - - - center - - - - - true - true - - - - settings_page - Settings - - - never - - - vertical - 48 - 48 - 32 - 32 - 32 - - - - - Frame Generation - true - 8 - 8 - - - true - - - horizontal - 16 - center - 12 - 12 - 8 - 8 - - - Multiplier - start - true - 0 - - - - - - - - off - 2 - 3 - 4 - - - - 0 - - - - - - - - - true - - - horizontal - 16 - center - 12 - 12 - 8 - 8 - - - Flow Scale - start - true - 0 - - - - - 0.7 - number - - - - - - - - - true - - - horizontal - 16 - center - 12 - 12 - 8 - 8 - - - Performance Mode - start - true - 0 - - - - - true - compact - - - - - - - - - - - - - Misc - true - 8 - 8 - - - true - - - horizontal - 16 - center - 12 - 12 - 8 - 8 - - - HDR Mode - start - true - 0 - - - - - true - compact - - - - - - - - - true - - - horizontal - 16 - center - 12 - 12 - 8 - 8 - - - Experimental Present Mode - start - true - 0 - - - - - - - - vsync - mailbox - immediate - - - - 0 - - - - - - - - - - - - - - - - - - about_page - About - - - vertical - center - center - 24 - - - LSFG-VK UI - title-1 - - - - - Lossless Scaling Frame Generation Configuration Tool - title-4 - true - 50 - - - - - Made by Cali666 • 2025 - dim-label - 24 - - - - - For more information refer to the lsfg-vk wiki - https://github.com/PancakeTAS/lsfg-vk/wiki - 12 - - - - - - - - - - - - - - - - diff --git a/ui/src/app_state.rs b/ui/src/app_state.rs deleted file mode 100644 index 552da38..0000000 --- a/ui/src/app_state.rs +++ /dev/null @@ -1,293 +0,0 @@ -use gtk::prelude::*; -use gtk::{glib, MessageDialog}; -use libadwaita::ApplicationWindow; -use std::cell::RefCell; -use std::rc::Rc; - -use crate::config::{Config, save_config}; -use crate::utils::round_to_2_decimals; - -#[allow(dead_code)] -pub struct AppState { - pub config: Config, - pub selected_profile_index: Option, - // Store references to the UI widgets for easy access and updates - pub main_window: ApplicationWindow, - pub sidebar_list_box: gtk::ListBox, - pub multiplier_dropdown: gtk::DropDown, - pub flow_scale_entry: gtk::Entry, - pub performance_mode_switch: gtk::Switch, - pub hdr_mode_switch: gtk::Switch, - pub experimental_present_mode_dropdown: gtk::DropDown, - pub save_button: gtk::Button, - pub main_settings_box: gtk::Box, - pub main_stack: gtk::Stack, - // Store SignalHandlerIds to block/unblock signals - pub multiplier_dropdown_handler_id: Option, - pub flow_scale_entry_handler_id: Option, - pub performance_mode_switch_handler_id: Option, - pub hdr_mode_switch_handler_id: Option, - pub experimental_present_mode_dropdown_handler_id: Option, -} - -impl AppState { - // Saves the current configuration to the TOML file - pub fn save_current_config(&self) { - if let Err(e) = save_config(&self.config) { - eprintln!("Failed to save config: {}", e); - // In a real app, you'd show a user-friendly error dialog here - } - } - - // Updates the main window UI with data from the currently selected profile - pub fn update_main_window_from_profile(&self) { - if let Some(index) = self.selected_profile_index { - if let Some(profile) = self.config.game.get(index) { - // Temporarily block signals to prevent re-entrancy - let _guard_mult = self.multiplier_dropdown_handler_id.as_ref().map(|id| self.multiplier_dropdown.block_signal(id)); - let _guard_flow = self.flow_scale_entry_handler_id.as_ref().map(|id| self.flow_scale_entry.block_signal(id)); - let _guard_perf = self.performance_mode_switch_handler_id.as_ref().map(|id| self.performance_mode_switch.block_signal(id)); - let _guard_hdr = self.hdr_mode_switch_handler_id.as_ref().map(|id| self.hdr_mode_switch.block_signal(id)); - let _guard_exp = self.experimental_present_mode_dropdown_handler_id.as_ref().map(|id| self.experimental_present_mode_dropdown.block_signal(id)); - - // Update Multiplier Dropdown - let multiplier_str = match profile.multiplier { - 1 => "off".to_string(), - _ => profile.multiplier.to_string(), - }; - if let Some(pos) = self.multiplier_dropdown.model().and_then(|model| { - let list_model = model.downcast_ref::()?; - (0..list_model.n_items()).find(|&i| list_model.string(i).map_or(false, |s| s.as_str() == multiplier_str)) - }) { - self.multiplier_dropdown.set_selected(pos); - } - - // Update Flow Scale Entry (round to avoid floating point display issues) - let rounded_flow_scale = round_to_2_decimals(profile.flow_scale); - self.flow_scale_entry.set_text(&format!("{:.2}", rounded_flow_scale)); - - // Update Performance Mode Switch - self.performance_mode_switch.set_active(profile.performance_mode); - - // Update HDR Mode Switch - self.hdr_mode_switch.set_active(profile.hdr_mode); - - // Update Experimental Present Mode Dropdown - if let Some(pos) = self.experimental_present_mode_dropdown.model().and_then(|model| { - let list_model = model.downcast_ref::()?; - (0..list_model.n_items()).find(|&i| list_model.string(i).map_or(false, |s| s.as_str() == profile.experimental_present_mode)) - }) { - self.experimental_present_mode_dropdown.set_selected(pos); - } - // Signal handlers are unblocked automatically when _guard_X go out of scope - - // Switch to the settings page - self.main_stack.set_visible_child_name("settings_page"); - - } - } else { - // Clear or disable main window elements if no profile is selected - self.multiplier_dropdown.set_selected(0); // Default to 'off' or first item - self.flow_scale_entry.set_text(""); - self.performance_mode_switch.set_active(false); - self.hdr_mode_switch.set_active(false); - self.experimental_present_mode_dropdown.set_selected(0); // Default to first item - - // Switch to the about page - self.main_stack.set_visible_child_name("about_page"); - } - } - - // Populates sidebar with optional app_state for button handlers - pub fn populate_sidebar_with_handlers(&self, app_state: Option>>) { - // Clear existing rows - while let Some(child) = self.sidebar_list_box.first_child() { - self.sidebar_list_box.remove(&child); - } - - let mut row_to_select: Option = None; - - for (i, profile) in self.config.game.iter().enumerate() { - let row = gtk::ListBoxRow::new(); - - // Create a horizontal box to hold the profile name and buttons - let row_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .spacing(8) - .margin_start(12) - .margin_end(12) - .margin_top(8) - .margin_bottom(8) - .build(); - - // Profile name label - let label = gtk::Label::builder() - .label(&profile.exe) - .halign(gtk::Align::Start) - .hexpand(true) - .build(); - - // Edit button - let edit_button = gtk::Button::builder() - .label("🖊") - .css_classes(["flat", "circular"]) - .tooltip_text("Edit profile name") - .build(); - - // Remove button - let remove_button = gtk::Button::builder() - .label("𐄂") - .css_classes(["flat", "circular", "destructive-action"]) - .tooltip_text("Remove profile") - .build(); - - // Add all elements to the row box - row_box.append(&label); - row_box.append(&edit_button); - row_box.append(&remove_button); - - // Connect button handlers if app_state is available - if let Some(app_state_ref) = &app_state { - // Edit button handler - let app_state_clone = app_state_ref.clone(); - let profile_index = i; - edit_button.connect_clicked(move |_| { - let state = app_state_clone.borrow(); - let main_window = &state.main_window; - - // Create edit dialog - let dialog = MessageDialog::new( - Some(main_window), - gtk::DialogFlags::MODAL, - gtk::MessageType::Question, - gtk::ButtonsType::None, - "Edit profile name:", - ); - dialog.set_title(Some("Edit Profile")); - - let entry = gtk::Entry::builder() - .placeholder_text("Profile Name") - .text(&state.config.game[profile_index].exe) - .margin_top(12) - .margin_bottom(12) - .margin_start(12) - .margin_end(12) - .build(); - - dialog.content_area().append(&entry); - dialog.add_button("Cancel", gtk::ResponseType::Cancel); - dialog.add_button("Save", gtk::ResponseType::Other(1)); - dialog.set_default_response(gtk::ResponseType::Other(1)); - - // Allow pressing Enter in the entry to trigger the "Save" button - let dialog_clone = dialog.clone(); - entry.connect_activate(move |_| { - dialog_clone.response(gtk::ResponseType::Other(1)); - }); - - let app_state_clone_dialog = app_state_clone.clone(); - let entry_clone = entry.clone(); - dialog.connect_response(move |d, response| { - if response == gtk::ResponseType::Other(1) { - let new_name = entry_clone.text().to_string(); - if !new_name.is_empty() { - let mut state = app_state_clone_dialog.borrow_mut(); - - // Check if profile with this name already exists (excluding current) - if state.config.game.iter().enumerate().any(|(idx, p)| idx != profile_index && p.exe == new_name) { - let error_dialog = MessageDialog::new( - Some(d), - gtk::DialogFlags::MODAL, - gtk::MessageType::Error, - gtk::ButtonsType::Ok, - "A profile with this name already exists", - ); - error_dialog.set_title(Some("Error")); - error_dialog.connect_response(move |d, _| { d.close(); }); - error_dialog.present(); - return; - } - - // Update profile name - state.config.game[profile_index].exe = new_name; - state.save_current_config(); - state.populate_sidebar_with_handlers(Some(app_state_clone_dialog.clone())); - } - } - d.close(); - }); - dialog.present(); - }); - - // Remove button handler - let app_state_clone = app_state_ref.clone(); - let profile_index = i; - remove_button.connect_clicked(move |_| { - let state = app_state_clone.borrow(); - let main_window = &state.main_window; - let profile_name = &state.config.game[profile_index].exe; - - // Create confirmation dialog - let dialog = MessageDialog::new( - Some(main_window), - gtk::DialogFlags::MODAL, - gtk::MessageType::Warning, - gtk::ButtonsType::None, - &format!("Are you sure you want to remove the profile '{}'?", profile_name), - ); - dialog.set_title(Some("Remove Profile")); - dialog.add_button("Cancel", gtk::ResponseType::Cancel); - dialog.add_button("Remove", gtk::ResponseType::Other(1)); - dialog.set_default_response(gtk::ResponseType::Cancel); - - let app_state_clone_dialog = app_state_clone.clone(); - dialog.connect_response(move |d, response| { - if response == gtk::ResponseType::Other(1) { - let mut state = app_state_clone_dialog.borrow_mut(); - - // Remove the profile - state.config.game.remove(profile_index); - - // Update selected index if needed - if let Some(selected) = state.selected_profile_index { - if selected == profile_index { - // If we removed the selected profile, select the first available or none - state.selected_profile_index = if state.config.game.is_empty() { None } else { Some(0) }; - } else if selected > profile_index { - // Adjust index if we removed a profile before the selected one - state.selected_profile_index = Some(selected - 1); - } - } - - state.save_current_config(); - state.populate_sidebar_with_handlers(Some(app_state_clone_dialog.clone())); - drop(state); - - // Update main window - app_state_clone_dialog.borrow().update_main_window_from_profile(); - } - d.close(); - }); - dialog.present(); - }); - } - - row.set_child(Some(&row_box)); - self.sidebar_list_box.append(&row); - - // Mark the row to be selected later - if self.selected_profile_index == Some(i) { - row_to_select = Some(row.clone()); // Clone the row to store it - } - } - - // Perform selection in a separate idle callback - if let Some(row) = row_to_select { - let list_box_clone = self.sidebar_list_box.clone(); - glib::idle_add_local(move || { - list_box_clone.select_row(Some(&row)); - glib::ControlFlow::Break - }); - } - } -} diff --git a/ui/src/config.rs b/ui/src/config.rs deleted file mode 100644 index 7fdde70..0000000 --- a/ui/src/config.rs +++ /dev/null @@ -1,141 +0,0 @@ -use serde::{Deserialize, Serialize}; -use std::{fs, io}; -use std::path::PathBuf; -use toml; -use dirs; - -use crate::utils::round_to_2_decimals; // Import from utils module - -// --- Configuration Data Structures --- - -#[derive(Debug, Default, Serialize, Deserialize, Clone)] -pub struct Config { - pub version: u32, // Made public to be accessible from main.rs - #[serde(flatten)] // Flatten this struct into the parent, controlling order - pub ordered_global: OrderedGlobalConfig, - #[serde(default)] - pub game: Vec, -} - -// Helper struct to control the serialization order of global config -#[derive(Debug, Default, Serialize, Deserialize, Clone)] -pub struct OrderedGlobalConfig { - #[serde(default, skip_serializing_if = "Option::is_none")] // Only serialize if Some - pub global: Option, -} - -#[derive(Debug, Default, Serialize, Deserialize, Clone)] -pub struct GlobalConfig { - #[serde(default, skip_serializing_if = "Option::is_none")] // Only serialize if Some - pub dll: Option, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(default)] -pub struct GameProfile { - pub exe: String, - pub multiplier: u32, - #[serde(serialize_with = "serialize_flow_scale", deserialize_with = "deserialize_flow_scale")] - pub flow_scale: f32, - pub performance_mode: bool, - pub hdr_mode: bool, - pub experimental_present_mode: String, -} - -// Default values for a new game profile -impl Default for GameProfile { - fn default() -> Self { - GameProfile { - exe: String::new(), - multiplier: 1, // Default to "off" (1) - flow_scale: round_to_2_decimals(0.7), - performance_mode: true, - hdr_mode: false, - experimental_present_mode: "vsync".to_string(), - } - } -} - -// Custom serde functions to ensure flow_scale is always rounded -fn serialize_flow_scale(value: &f32, serializer: S) -> Result -where - S: serde::Serializer, -{ - // Force to 2 decimal places and serialize as a precise decimal - let rounded = round_to_2_decimals(*value); - let formatted = format!("{:.2}", rounded); - let precise_value: f64 = formatted.parse().unwrap_or(*value as f64); - serializer.serialize_f64(precise_value) -} - -fn deserialize_flow_scale<'de, D>(deserializer: D) -> Result -where - D: serde::Deserializer<'de>, -{ - use serde::Deserialize; - let value = f64::deserialize(deserializer)?; - Ok(round_to_2_decimals(value as f32)) -} - -// --- Configuration File Handling Functions --- - -pub fn get_config_path() -> Result { - let config_dir = dirs::config_dir() - .ok_or_else(|| io::Error::new(io::ErrorKind::NotFound, "Could not find config directory"))? - .join("lsfg-vk"); - - fs::create_dir_all(&config_dir)?; // Ensure directory exists - println!("Config directory: {:?}", config_dir); - Ok(config_dir.join("conf.toml")) -} - - -pub fn load_config() -> Result { - let config_path = get_config_path()?; - println!("Attempting to load config from: {:?}", config_path); - if config_path.exists() { - let contents = fs::read_to_string(&config_path)?; - println!("Successfully read config contents ({} bytes).", contents.len()); - // Load configuration with default values when the format is invalid - let mut config: Config = toml::from_str(&contents).unwrap_or_else(|_| Config::default()); - - // Old way to load config - // let mut config: Config = toml::from_str(&contents).map_err(|e| { - // io::Error::new( - // io::ErrorKind::InvalidData, - // format!("Failed to parse TOML: {}", e), - // ) - // })?; - - - // Clean up any floating point precision issues in existing configs - let mut needs_save = false; - for profile in &mut config.game { - let original = profile.flow_scale; - profile.flow_scale = round_to_2_decimals(profile.flow_scale); - if (original - profile.flow_scale).abs() > f32::EPSILON { - needs_save = true; - } - } - - // Save the cleaned config if we made changes - if needs_save { - let _ = save_config(&config); - } - - Ok(config) - } else { - println!("Config file not found at {:?}, creating default.", config_path); - Ok(Config { version: 1, ordered_global: OrderedGlobalConfig { global: None }, game: Vec::new() }) - } -} - -pub fn save_config(config: &Config) -> Result<(), io::Error> { - let config_path = get_config_path()?; - println!("Attempting to save config to: {:?}", config_path); - let toml_string = toml::to_string_pretty(config) - .map_err(|e| io::Error::new(io::ErrorKind::Other, format!("Failed to serialize TOML: {}", e)))?; - fs::write(&config_path, toml_string)?; - println!("Successfully saved config."); - Ok(()) -} diff --git a/ui/src/settings_window.rs b/ui/src/settings_window.rs deleted file mode 100644 index 73417e7..0000000 --- a/ui/src/settings_window.rs +++ /dev/null @@ -1,155 +0,0 @@ -use gtk::prelude::*; -use gtk::{glib, Label, Switch, Entry, Box, Orientation}; -use libadwaita::prelude::*; -use libadwaita::{ApplicationWindow, PreferencesGroup, PreferencesPage, PreferencesWindow, ActionRow}; -use std::rc::Rc; -use std::cell::RefCell; - -use crate::app_state::AppState; - -pub fn create_settings_window(parent: &ApplicationWindow, app_state: Rc>) -> PreferencesWindow { - let settings_window = PreferencesWindow::builder() - .title("Settings") - .transient_for(parent) - .modal(true) - .search_enabled(false) - .default_width(450) // Set default width - .default_height(300) // Set default height - .build(); - - let page = PreferencesPage::builder() - .title("General") - .icon_name("preferences-system-symbolic") - .build(); - - let group = PreferencesGroup::builder() - .title("Global Settings") - .build(); - - // --- Custom DLL Toggle and Path (Programmatically created) --- - let custom_dll_switch = Switch::builder() - .halign(gtk::Align::End) - .valign(gtk::Align::Center) - .build(); - - let custom_dll_path_entry = Entry::builder() - .placeholder_text("/path/to/Lossless.dll") - .hexpand(true) - .build(); - - let custom_dll_row = ActionRow::builder() - .title("Custom Path to Lossless.dll") - .build(); - custom_dll_row.add_suffix(&custom_dll_switch); - custom_dll_row.set_activatable_widget(Some(&custom_dll_switch)); - - let custom_dll_box = Box::builder() - .orientation(Orientation::Vertical) - .spacing(6) - .margin_top(6) - .margin_bottom(6) - .build(); - custom_dll_box.append(&custom_dll_row); - custom_dll_box.append(&custom_dll_path_entry); - - group.add(&custom_dll_box); // Add the box directly to the group - - // Initial state setup for Custom DLL - let current_dll_path = app_state.borrow().config.ordered_global.global.as_ref() - .and_then(|g| g.dll.clone()); - - if let Some(path) = current_dll_path { - custom_dll_switch.set_active(true); - custom_dll_path_entry.set_text(&path); - custom_dll_path_entry.set_visible(true); - } else { - custom_dll_switch.set_active(false); - custom_dll_path_entry.set_visible(false); - } - - // Connect switch to show/hide entry and update config - let app_state_clone_switch = app_state.clone(); - let custom_dll_path_entry_clone = custom_dll_path_entry.clone(); - custom_dll_switch.connect_state_set(move |_sw, active| { - custom_dll_path_entry_clone.set_visible(active); - let mut state = app_state_clone_switch.borrow_mut(); - if active { - // If activating, ensure global config exists and set DLL path - let current_path = custom_dll_path_entry_clone.text().to_string(); - state.config.ordered_global.global.get_or_insert_with(Default::default).dll = Some(current_path); - } else { - // If deactivating, set DLL path to None - if let Some(global_config) = state.config.ordered_global.global.as_mut() { - global_config.dll = None; - } - } - glib::Propagation::Proceed - }); - - // Connect entry to update config - let app_state_clone_entry = app_state.clone(); - let custom_dll_switch_clone = custom_dll_switch.clone(); - custom_dll_path_entry.connect_changed(move |entry| { - let mut state = app_state_clone_entry.borrow_mut(); - if custom_dll_switch_clone.is_active() { - let path = entry.text().to_string(); - if !path.is_empty() { - state.config.ordered_global.global.get_or_insert_with(Default::default).dll = Some(path); - } else { - // If path is cleared, set dll to None - if let Some(global_config) = state.config.ordered_global.global.as_mut() { - global_config.dll = None; - } - } - } - }); - - // Save button for settings - let save_settings_button = gtk::Button::builder() - .label("Save Global Settings") - .halign(gtk::Align::End) - .margin_end(12) - .margin_bottom(12) - .margin_top(12) - .build(); - - // Create a box to hold the feedback label - let feedback_container_box = Box::builder() - .orientation(Orientation::Vertical) - .halign(gtk::Align::End) - .margin_end(12) - .margin_bottom(12) - .build(); - - group.add(&save_settings_button); // Add button first - group.add(&feedback_container_box); // Then add the container for feedback - - let app_state_clone_save = app_state.clone(); - let feedback_container_box_clone = feedback_container_box.clone(); // Clone for the closure - save_settings_button.connect_clicked(move |_| { - let state = app_state_clone_save.borrow_mut(); // Removed 'mut' - state.save_current_config(); - - let feedback_label = Label::new(Some("Saved!")); - feedback_label.set_halign(gtk::Align::End); - feedback_label.set_margin_end(12); - feedback_label.set_margin_bottom(12); - - // Append to the dedicated feedback container box - feedback_container_box_clone.append(&feedback_label); - - glib::timeout_add_local(std::time::Duration::new(2, 0), { - let feedback_label_clone = feedback_label.clone(); // Clone for the timeout - let feedback_container_box_clone_for_remove = feedback_container_box_clone.clone(); // Clone for the timeout - move || { - feedback_container_box_clone_for_remove.remove(&feedback_label_clone); - glib::ControlFlow::Break - } - }); - }); - - page.add(&group); - settings_window.add(&page); - - settings_window -} diff --git a/ui/src/utils.rs b/ui/src/utils.rs deleted file mode 100644 index 7fe2612..0000000 --- a/ui/src/utils.rs +++ /dev/null @@ -1,59 +0,0 @@ -use std::process::Command; -use std::io::{BufReader, BufRead}; - -pub fn round_to_2_decimals(value: f32) -> f32 { - // Use string formatting to get exactly 2 decimal places and then parse back - // This avoids floating point precision issues - format!("{:.2}", value).parse().unwrap_or(value) -} - -/// Executes a bash command to find running processes that use Vulkan -/// and are owned by the current user. -/// Returns a vector of process names. -pub fn get_vulkan_processes() -> Vec { - let mut processes = Vec::new(); - let command_str = r#" - for pid in /proc/[0-9]*; do - owner=$(stat -c %U "$pid" 2>/dev/null) - if [[ "$owner" == "$USER" ]]; then - if grep -qi 'vulkan' "$pid/maps" 2>/dev/null; then - procname=$(cat "$pid/comm" 2>/dev/null) - if [[ -n "$procname" ]]; then - printf "%s\n" "$procname" # Only print the process name - fi - fi - fi - done - "#; - - // Execute the bash command - let output = Command::new("bash") - .arg("-c") - .arg(command_str) - .output(); - - match output { - Ok(output) => { - if output.status.success() { - // Read stdout line by line - let reader = BufReader::new(output.stdout.as_slice()); - for line in reader.lines() { - if let Ok(proc_name) = line { - let trimmed_name = proc_name.trim().to_string(); - if !trimmed_name.is_empty() { - processes.push(trimmed_name); - } - } - } - } else { - // Print stderr if the command failed - eprintln!("Command failed with error: {}", String::from_utf8_lossy(&output.stderr)); - } - }, - Err(e) => { - // Print error if the command could not be executed - eprintln!("Failed to execute command: {}", e); - } - } - processes -}