diff --git a/CHANGELOG.md b/CHANGELOG.md index 462ff9b..5465a23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,8 @@ Released on - Bookmarks are automatically loaded into the last auth form. - [Issue 289](https://github.com/veeso/termscp/issues/289): Use `uzers` instead of the dead package `users` which has several vulnerabilities - [Issue 290](https://github.com/veeso/termscp/issues/290): Password prompt was broken +- [Issue 298](https://github.com/veeso/termscp/issues/298): tuirealm 2.x + - Fixed some performance issues where sometimes the app froze for a couple of seconds, thanks to this . ## 0.15.0 diff --git a/Cargo.lock b/Cargo.lock index 31f0004..23cf278 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -93,7 +93,7 @@ dependencies = [ "argh_shared", "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -113,7 +113,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -331,9 +331,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.28" +version = "1.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" dependencies = [ "jobserver", "libc", @@ -378,13 +378,14 @@ dependencies = [ [[package]] name = "compact_str" -version = "0.7.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f" +checksum = "6050c3a16ddab2e412160b31f2c871015704239bca62f72f6e5f0be631d3f644" dependencies = [ "castaway", "cfg-if", "itoa", + "rustversion", "ryu", "static_assertions", ] @@ -447,6 +448,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -516,31 +527,15 @@ checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crossterm" -version = "0.25.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" -dependencies = [ - "bitflags 1.3.2", - "crossterm_winapi", - "libc", - "mio", - "parking_lot 0.12.3", - "signal-hook", - "signal-hook-mio", - "winapi", -] - -[[package]] -name = "crossterm" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" +checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ "bitflags 2.6.0", "crossterm_winapi", - "libc", - "mio", + "mio 1.0.2", "parking_lot 0.12.3", + "rustix", "signal-hook", "signal-hook-mio", "winapi", @@ -595,7 +590,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -619,7 +614,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.79", + "syn", ] [[package]] @@ -630,7 +625,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -652,9 +647,9 @@ dependencies = [ [[package]] name = "dbus-secret-service" -version = "4.0.2" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1caa0c241c01ad8d99a78d553567d38f873dd3ac16eca33a5370d650ab25584e" +checksum = "b42a16374481d92aed73ae45b1f120207d8e71d24fb89f357fadbd8f946fd84b" dependencies = [ "dbus", "futures-util", @@ -697,38 +692,38 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] name = "derive_builder" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd33f37ee6a119146a1781d3356a7c26028f83d779b2e04ecd45fdc75c76877b" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" dependencies = [ "derive_builder_macro", ] [[package]] name = "derive_builder_core" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7431fa049613920234f22c47fdc33e6cf3ee83067091ea4277a3f8c4587aae38" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] name = "derive_builder_macro" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4abae7035bf79b9877b779505d8cf3749285b80c43941eda66604841889451dc" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.79", + "syn", ] [[package]] @@ -818,7 +813,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -1050,7 +1045,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -1189,6 +1184,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + [[package]] name = "hex" version = "0.4.3" @@ -1502,6 +1503,16 @@ dependencies = [ "libc", ] +[[package]] +name = "instability" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b23a0c8dfe501baac4adf6ebbfa6eddf8f0c07f56b058cc1288017e32397846c" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "instant" version = "0.1.13" @@ -1536,15 +1547,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -1571,9 +1573,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -1608,13 +1610,13 @@ dependencies = [ [[package]] name = "keyring" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fa83d1ca02db069b5fbe94b23b584d588e989218310c9c15015bb5571ef1a94" +checksum = "bd3d701d3de5b9c4b0d9d077f8c2c66f0388d75e96932ebbb7cdff8713d7f7c6" dependencies = [ "byteorder", "dbus-secret-service", - "security-framework", + "security-framework 3.0.0", "windows-sys 0.59.0", ] @@ -1724,7 +1726,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.79", + "syn", ] [[package]] @@ -1881,7 +1883,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -1934,6 +1936,19 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi", + "libc", + "log", + "wasi", + "windows-sys 0.52.0", +] + [[package]] name = "native-tls" version = "0.2.12" @@ -1946,7 +1961,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "tempfile", ] @@ -1971,7 +1986,7 @@ dependencies = [ "kqueue", "libc", "log", - "mio", + "mio 0.8.11", "walkdir", "windows-sys 0.48.0", ] @@ -2196,7 +2211,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -2326,9 +2341,9 @@ checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" [[package]] name = "pathdiff" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361" [[package]] name = "pavao" @@ -2391,7 +2406,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -2422,7 +2437,7 @@ checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -2610,19 +2625,20 @@ dependencies = [ [[package]] name = "ratatui" -version = "0.26.3" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f44c9e68fd46eda15c646fbb85e1040b657a58cdc8c98db1d97a55930d991eef" +checksum = "fdef7f9be5c0122f890d58bdf4d964349ba6a6161f705907526d891efabba57d" dependencies = [ "bitflags 2.6.0", "cassowary", "compact_str", - "crossterm 0.27.0", - "itertools 0.12.1", + "crossterm", + "instability", + "itertools", "lru", "paste", - "stability", "strum", + "strum_macros", "unicode-segmentation", "unicode-truncate", "unicode-width 0.1.14", @@ -3044,7 +3060,7 @@ dependencies = [ "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] @@ -3057,7 +3073,7 @@ dependencies = [ "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] @@ -3137,9 +3153,9 @@ dependencies = [ [[package]] name = "scc" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836f1e0f4963ef5288b539b643b35e043e76a32d0f4e47e67febf69576527f50" +checksum = "553f8299af7450cda9a52d3a370199904e7a46b5ffd1bef187c4a6af3bb6db69" dependencies = [ "sdd", ] @@ -3171,9 +3187,9 @@ dependencies = [ [[package]] name = "sdd" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a7b59a5d9b0099720b417b6325d91a52cbf5b3dcb5041d864be53eefa58abc" +checksum = "49c1eeaf4b6a87c7479688c6d52b9f1153cedd3c489300564f932b065c6eab95" [[package]] name = "secrecy" @@ -3192,7 +3208,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d0283c0a4a22a0f1b0e4edca251aa20b92fc96eaa09b84bec052f9415e9d71" +dependencies = [ + "bitflags 2.6.0", + "core-foundation 0.10.0", "core-foundation-sys", "libc", "security-framework-sys", @@ -3279,7 +3308,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -3350,7 +3379,7 @@ checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -3411,7 +3440,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" dependencies = [ "libc", - "mio", + "mio 1.0.2", "signal-hook", ] @@ -3522,16 +3551,6 @@ dependencies = [ "wildmatch", ] -[[package]] -name = "stability" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" -dependencies = [ - "quote", - "syn 2.0.79", -] - [[package]] name = "static_assertions" version = "1.1.0" @@ -3563,7 +3582,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.79", + "syn", ] [[package]] @@ -3586,17 +3605,6 @@ dependencies = [ "thiserror", ] -[[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.79" @@ -3644,7 +3652,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -3783,7 +3791,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -3863,7 +3871,7 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio", + "mio 0.8.11", "pin-project-lite", "signal-hook-registry", "socket2", @@ -3879,7 +3887,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -4030,7 +4038,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -4048,54 +4056,40 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "tui" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccdd26cbd674007e649a272da4475fb666d3aa0ad0531da7136db6fab0e5bad1" -dependencies = [ - "bitflags 1.3.2", - "cassowary", - "crossterm 0.25.0", - "unicode-segmentation", - "unicode-width 0.1.14", -] - [[package]] name = "tui-realm-stdlib" -version = "1.3.2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50ad506e872692d85265328353d92f4f633dd5add7f73ebd93e8d0368a708447" +checksum = "78a24d06b8403c57b32a3d3fdac795adf4ef8610e5f9650a3629efc8a9d6c0bb" dependencies = [ "textwrap", "tuirealm", - "unicode-width 0.1.14", + "unicode-width 0.2.0", ] [[package]] name = "tuirealm" -version = "1.9.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c358c39cb9e1b45702ea46afc77d39589d720ca9cf5f1e11a3106342ea6a4e76" +checksum = "0d3865c9f0e84c07c991c24c853f095bb764859fa3806fe6e00b559f40f1253f" dependencies = [ "bitflags 2.6.0", - "crossterm 0.27.0", + "crossterm", "lazy-regex", "ratatui", "thiserror", - "tui", "tuirealm_derive", ] [[package]] name = "tuirealm_derive" -version = "1.0.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0adcdaf59881626555558eae08f8a53003c8a1961723b4d7a10c51599abbc81" +checksum = "caa8b0560f4245acc0bbe0e1d76e1f6a308145dd6e107befce4cf29e7fe32662" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] @@ -4167,7 +4161,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" dependencies = [ - "itertools 0.13.0", + "itertools", "unicode-segmentation", "unicode-width 0.1.14", ] @@ -4323,9 +4317,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -4334,24 +4328,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -4361,9 +4355,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4371,28 +4365,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -4544,7 +4538,7 @@ checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -4555,7 +4549,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -4566,7 +4560,7 @@ checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -4577,7 +4571,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] @@ -4830,7 +4824,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 6fb248b..12803ba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -77,8 +77,8 @@ tempfile = "^3" thiserror = "^1" tokio = { version = "=1.38.1", features = ["rt"] } toml = "^0.8" -tui-realm-stdlib = "^1.3" -tuirealm = "^1.9" +tui-realm-stdlib = "2" +tuirealm = "2" unicode-width = "^0.2" version-compare = "^0.2" whoami = "^1.5" diff --git a/src/config/serialization.rs b/src/config/serialization.rs index 12d4be4..fab0370 100644 --- a/src/config/serialization.rs +++ b/src/config/serialization.rs @@ -112,7 +112,7 @@ mod tests { use std::path::PathBuf; use pretty_assertions::assert_eq; - use tuirealm::tui::style::Color; + use tuirealm::ratatui::style::Color; use super::*; use crate::config::bookmarks::{Bookmark, KubeParams, S3Params, SmbParams, UserHosts}; diff --git a/src/config/themes.rs b/src/config/themes.rs index f9ecfa0..da82f3c 100644 --- a/src/config/themes.rs +++ b/src/config/themes.rs @@ -6,7 +6,7 @@ // ext use serde::de::Error as DeError; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use tuirealm::tui::style::Color; +use tuirealm::ratatui::style::Color; use crate::utils::fmt::fmt_color; use crate::utils::parser::parse_color; diff --git a/src/system/theme_provider.rs b/src/system/theme_provider.rs index 6dcbbec..b088553 100644 --- a/src/system/theme_provider.rs +++ b/src/system/theme_provider.rs @@ -143,7 +143,7 @@ impl ThemeProvider { mod test { use pretty_assertions::assert_eq; use tempfile::TempDir; - use tuirealm::tui::style::Color; + use tuirealm::ratatui::style::Color; use super::*; diff --git a/src/ui/activities/auth/mod.rs b/src/ui/activities/auth/mod.rs index 5fa25b7..8025649 100644 --- a/src/ui/activities/auth/mod.rs +++ b/src/ui/activities/auth/mod.rs @@ -17,7 +17,7 @@ use tuirealm::application::PollStrategy; use tuirealm::listener::EventListenerCfg; use tuirealm::{Application, NoUserEvent, Update}; -use super::{Activity, Context, ExitReason}; +use super::{Activity, Context, ExitReason, CROSSTERM_MAX_POLL}; use crate::config::themes::Theme; use crate::filetransfer::{FileTransferParams, FileTransferProtocol}; use crate::system::bookmarks_client::BookmarksClient; @@ -255,7 +255,7 @@ impl AuthActivity { AuthActivity { app: Application::init( EventListenerCfg::default() - .default_input_listener(ticks) + .crossterm_input_listener(ticks, CROSSTERM_MAX_POLL) .poll_timeout(ticks), ), context: None, diff --git a/src/ui/activities/auth/view.rs b/src/ui/activities/auth/view.rs index 5b8843e..32d3edb 100644 --- a/src/ui/activities/auth/view.rs +++ b/src/ui/activities/auth/view.rs @@ -7,8 +7,8 @@ use std::path::PathBuf; use std::str::FromStr; use tuirealm::props::Color; -use tuirealm::tui::layout::{Constraint, Direction, Layout}; -use tuirealm::tui::widgets::Clear; +use tuirealm::ratatui::layout::{Constraint, Direction, Layout}; +use tuirealm::ratatui::widgets::Clear; use tuirealm::{State, StateValue, Sub, SubClause, SubEventClause}; use super::{ @@ -140,7 +140,7 @@ impl AuthActivity { let mut ctx: Context = self.context.take().unwrap(); let _ = ctx.terminal().raw_mut().draw(|f| { // Check window size - let height: u16 = f.size().height; + let height: u16 = f.area().height; self.check_minimum_window_size(height); // Prepare chunks let body = Layout::default() @@ -152,7 +152,7 @@ impl AuthActivity { ] .as_ref(), ) - .split(f.size()); + .split(f.area()); // Footer self.app.view(&Id::HelpFooter, f, body[1]); let auth_form_len = 7 + self.max_input_mask_size(); @@ -214,43 +214,43 @@ impl AuthActivity { self.app.view(&Id::RecentsList, f, bookmark_chunks[1]); // Popups if self.app.mounted(&Id::ErrorPopup) { - let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::ErrorPopup, f, popup); } else if self.app.mounted(&Id::InfoPopup) { - let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::InfoPopup, f, popup); } else if self.app.mounted(&Id::WaitPopup) { - let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::WaitPopup, f, popup); } else if self.app.mounted(&Id::WindowSizeError) { - let popup = Popup(Size::Percentage(80), Size::Percentage(20)).draw_in(f.size()); + let popup = Popup(Size::Percentage(80), Size::Percentage(20)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::WindowSizeError, f, popup); } else if self.app.mounted(&Id::QuitPopup) { // make popup - let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); self.app.view(&Id::QuitPopup, f, popup); } else if self.app.mounted(&Id::DeleteBookmarkPopup) { // make popup - let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); self.app.view(&Id::DeleteBookmarkPopup, f, popup); } else if self.app.mounted(&Id::DeleteRecentPopup) { // make popup - let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); self.app.view(&Id::DeleteRecentPopup, f, popup); } else if self.app.mounted(&Id::NewVersionChangelog) { // make popup - let popup = Popup(Size::Percentage(90), Size::Percentage(85)).draw_in(f.size()); + let popup = Popup(Size::Percentage(90), Size::Percentage(85)).draw_in(f.area()); f.render_widget(Clear, popup); let popup_chunks = Layout::default() .direction(Direction::Vertical) @@ -266,12 +266,12 @@ impl AuthActivity { self.app.view(&Id::InstallUpdatePopup, f, popup_chunks[1]); } else if self.app.mounted(&Id::Keybindings) { // make popup - let popup = Popup(Size::Percentage(50), Size::Percentage(70)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Percentage(70)).draw_in(f.area()); f.render_widget(Clear, popup); self.app.view(&Id::Keybindings, f, popup); } else if self.app.mounted(&Id::BookmarkSavePassword) { // make popup - let popup = Popup(Size::Percentage(20), Size::Percentage(20)).draw_in(f.size()); + let popup = Popup(Size::Percentage(20), Size::Percentage(20)).draw_in(f.area()); f.render_widget(Clear, popup); let popup_chunks = Layout::default() .direction(Direction::Vertical) @@ -294,8 +294,8 @@ impl AuthActivity { fn render_host_bridge_input_mask( &mut self, - f: &mut tuirealm::tui::Frame<'_>, - area: tuirealm::tui::layout::Rect, + f: &mut tuirealm::ratatui::Frame<'_>, + area: tuirealm::ratatui::layout::Rect, ) { let protocol_and_mask_chunks = Layout::default() .constraints( @@ -372,8 +372,8 @@ impl AuthActivity { fn render_remote_input_mask( &mut self, - f: &mut tuirealm::tui::Frame<'_>, - area: tuirealm::tui::layout::Rect, + f: &mut tuirealm::ratatui::Frame<'_>, + area: tuirealm::ratatui::layout::Rect, ) { let protocol_and_mask_chunks = Layout::default() .constraints( @@ -2019,43 +2019,15 @@ impl AuthActivity { /// Returns a sub clause which requires that no popup is mounted in order to be satisfied fn no_popup_mounted_clause() -> SubClause { - SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::ErrorPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::InfoPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::Keybindings, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::DeleteBookmarkPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::DeleteRecentPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::InstallUpdatePopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::BookmarkSavePassword, - )))), - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::WaitPopup, - )))), - )), - )), - )), - )), - )), - )), + tuirealm::subclause_and_not!( + Id::ErrorPopup, + Id::InfoPopup, + Id::Keybindings, + Id::DeleteBookmarkPopup, + Id::DeleteRecentPopup, + Id::InstallUpdatePopup, + Id::BookmarkSavePassword, + Id::WaitPopup ) } } diff --git a/src/ui/activities/filetransfer/components/log.rs b/src/ui/activities/filetransfer/components/log.rs index 7d10d4a..320d70f 100644 --- a/src/ui/activities/filetransfer/components/log.rs +++ b/src/ui/activities/filetransfer/components/log.rs @@ -5,7 +5,7 @@ use tuirealm::command::{Cmd, CmdResult, Direction, Position}; use tuirealm::event::{Key, KeyEvent}; use tuirealm::props::{Alignment, AttrValue, Attribute, Borders, Color, Style, Table}; -use tuirealm::tui::widgets::{List as TuiList, ListDirection, ListItem, ListState}; +use tuirealm::ratatui::widgets::{List as TuiList, ListDirection, ListItem, ListState}; use tuirealm::{Component, Event, MockComponent, NoUserEvent, Props, State, StateValue}; use super::{Msg, UiMsg}; @@ -32,7 +32,7 @@ impl Log { } impl MockComponent for Log { - fn view(&mut self, frame: &mut tuirealm::Frame, area: tuirealm::tui::layout::Rect) { + fn view(&mut self, frame: &mut tuirealm::Frame, area: tuirealm::ratatui::layout::Rect) { let width: usize = area.width as usize - 4; let focus = self .props diff --git a/src/ui/activities/filetransfer/components/popups.rs b/src/ui/activities/filetransfer/components/popups.rs index 195c9c0..6e1776f 100644 --- a/src/ui/activities/filetransfer/components/popups.rs +++ b/src/ui/activities/filetransfer/components/popups.rs @@ -1036,7 +1036,7 @@ pub struct ProgressBarFull { } impl ProgressBarFull { - pub fn new>(prog: f64, label: S, title: S, color: Color) -> Self { + pub fn new>(prog: f64, label: S, title: S, color: Color) -> Self { Self { component: ProgressBar::default() .borders( @@ -1074,7 +1074,7 @@ pub struct ProgressBarPartial { } impl ProgressBarPartial { - pub fn new>(prog: f64, label: S, title: S, color: Color) -> Self { + pub fn new>(prog: f64, label: S, title: S, color: Color) -> Self { Self { component: ProgressBar::default() .borders( diff --git a/src/ui/activities/filetransfer/components/popups/chmod.rs b/src/ui/activities/filetransfer/components/popups/chmod.rs index 8bac148..b3710a8 100644 --- a/src/ui/activities/filetransfer/components/popups/chmod.rs +++ b/src/ui/activities/filetransfer/components/popups/chmod.rs @@ -3,7 +3,7 @@ use tui_realm_stdlib::Checkbox; use tuirealm::command::{Cmd, CmdResult, Direction}; use tuirealm::event::{Key, KeyEvent}; use tuirealm::props::{Alignment, AttrValue, Attribute, BorderSides, Borders, Color}; -use tuirealm::tui::layout::{Constraint, Direction as LayoutDirection, Layout}; +use tuirealm::ratatui::layout::{Constraint, Direction as LayoutDirection, Layout}; use tuirealm::{Component, Event, MockComponent, NoUserEvent, Props, State, StateValue}; use super::{Msg, TransferMsg, UiMsg}; @@ -186,7 +186,7 @@ impl MockComponent for ChmodPopup { State::One(StateValue::U32(self.get_mode().into())) } - fn view(&mut self, frame: &mut tuirealm::Frame, area: tuirealm::tui::layout::Rect) { + fn view(&mut self, frame: &mut tuirealm::Frame, area: tuirealm::ratatui::layout::Rect) { if self.props.get_or(Attribute::Display, AttrValue::Flag(true)) != AttrValue::Flag(true) { return; } diff --git a/src/ui/activities/filetransfer/components/popups/goto.rs b/src/ui/activities/filetransfer/components/popups/goto.rs index 8f218f3..9c91055 100644 --- a/src/ui/activities/filetransfer/components/popups/goto.rs +++ b/src/ui/activities/filetransfer/components/popups/goto.rs @@ -198,7 +198,7 @@ impl GotoPopup { } impl MockComponent for GotoPopup { - fn view(&mut self, frame: &mut tuirealm::Frame, area: tuirealm::tui::prelude::Rect) { + fn view(&mut self, frame: &mut tuirealm::Frame, area: tuirealm::ratatui::prelude::Rect) { self.input.view(frame, area); } diff --git a/src/ui/activities/filetransfer/components/transfer/file_list.rs b/src/ui/activities/filetransfer/components/transfer/file_list.rs index 8aa3390..cdd55cc 100644 --- a/src/ui/activities/filetransfer/components/transfer/file_list.rs +++ b/src/ui/activities/filetransfer/components/transfer/file_list.rs @@ -6,8 +6,8 @@ use tuirealm::command::{Cmd, CmdResult, Direction, Position}; use tuirealm::props::{ Alignment, AttrValue, Attribute, Borders, Color, Style, Table, TextModifiers, }; -use tuirealm::tui::text::{Line, Span}; -use tuirealm::tui::widgets::{List as TuiList, ListDirection, ListItem, ListState}; +use tuirealm::ratatui::text::{Line, Span}; +use tuirealm::ratatui::widgets::{List as TuiList, ListDirection, ListItem, ListState}; use tuirealm::{MockComponent, Props, State, StateValue}; pub const FILE_LIST_CMD_SELECT_ALL: &str = "A"; @@ -175,7 +175,7 @@ impl FileList { } impl MockComponent for FileList { - fn view(&mut self, frame: &mut tuirealm::Frame, area: tuirealm::tui::layout::Rect) { + fn view(&mut self, frame: &mut tuirealm::Frame, area: tuirealm::ratatui::layout::Rect) { let title = self .props .get_or( diff --git a/src/ui/activities/filetransfer/components/transfer/file_list_with_search.rs b/src/ui/activities/filetransfer/components/transfer/file_list_with_search.rs index ab00131..fd0b0cb 100644 --- a/src/ui/activities/filetransfer/components/transfer/file_list_with_search.rs +++ b/src/ui/activities/filetransfer/components/transfer/file_list_with_search.rs @@ -1,7 +1,7 @@ use tui_realm_stdlib::Input; use tuirealm::command::{Cmd, CmdResult}; use tuirealm::props::{Alignment, AttrValue, Attribute, Borders, Color, Table}; -use tuirealm::tui::layout::{Constraint, Direction, Layout}; +use tuirealm::ratatui::layout::{Constraint, Direction, Layout}; use tuirealm::{MockComponent, State}; use super::file_list::FileList; @@ -88,7 +88,7 @@ impl FileListWithSearch { } impl MockComponent for FileListWithSearch { - fn view(&mut self, frame: &mut tuirealm::Frame, area: tuirealm::tui::layout::Rect) { + fn view(&mut self, frame: &mut tuirealm::Frame, area: tuirealm::ratatui::layout::Rect) { // split the area in two let chunks = Layout::default() .direction(Direction::Vertical) diff --git a/src/ui/activities/filetransfer/mod.rs b/src/ui/activities/filetransfer/mod.rs index 0a96b00..b60d02a 100644 --- a/src/ui/activities/filetransfer/mod.rs +++ b/src/ui/activities/filetransfer/mod.rs @@ -28,7 +28,7 @@ use session::TransferPayload; use tempfile::TempDir; use tuirealm::{Application, EventListenerCfg, NoUserEvent}; -use super::{Activity, Context, ExitReason}; +use super::{Activity, Context, ExitReason, CROSSTERM_MAX_POLL}; use crate::config::themes::Theme; use crate::explorer::{FileExplorer, FileSorting}; use crate::filetransfer::{ @@ -256,7 +256,7 @@ impl FileTransferActivity { app: Application::init( EventListenerCfg::default() .poll_timeout(ticks) - .default_input_listener(ticks), + .crossterm_input_listener(ticks, CROSSTERM_MAX_POLL), ), redraw: true, host_bridge, diff --git a/src/ui/activities/filetransfer/view.rs b/src/ui/activities/filetransfer/view.rs index 4671f7b..33e8b20 100644 --- a/src/ui/activities/filetransfer/view.rs +++ b/src/ui/activities/filetransfer/view.rs @@ -7,8 +7,8 @@ use remotefs::fs::{File, UnixPex}; use tuirealm::event::{Key, KeyEvent, KeyModifiers}; use tuirealm::props::{PropPayload, PropValue, TextSpan}; -use tuirealm::tui::layout::{Constraint, Direction, Layout}; -use tuirealm::tui::widgets::Clear; +use tuirealm::ratatui::layout::{Constraint, Direction, Layout}; +use tuirealm::ratatui::widgets::Clear; use tuirealm::{AttrValue, Attribute, Sub, SubClause, SubEventClause}; use unicode_width::UnicodeWidthStr; @@ -106,7 +106,7 @@ impl FileTransferActivity { ] .as_ref(), ) - .split(f.size()); + .split(f.area()); // main chunks let main_chunks = Layout::default() .direction(Direction::Vertical) @@ -159,74 +159,74 @@ impl FileTransferActivity { if self.app.mounted(&Id::FatalPopup) { let popup = Popup( Size::Percentage(50), - self.calc_popup_height(Id::FatalPopup, f.size().width, f.size().height), + self.calc_popup_height(Id::FatalPopup, f.area().width, f.area().height), ) - .draw_in(f.size()); + .draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::FatalPopup, f, popup); } else if self.app.mounted(&Id::CopyPopup) { - let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::CopyPopup, f, popup); } else if self.app.mounted(&Id::ChmodPopup) { - let popup = Popup(Size::Percentage(50), Size::Unit(12)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Unit(12)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::ChmodPopup, f, popup); } else if self.app.mounted(&Id::FilterPopup) { - let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::FilterPopup, f, popup); } else if self.app.mounted(&Id::GotoPopup) { - let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::GotoPopup, f, popup); } else if self.app.mounted(&Id::MkdirPopup) { - let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::MkdirPopup, f, popup); } else if self.app.mounted(&Id::NewfilePopup) { - let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::NewfilePopup, f, popup); } else if self.app.mounted(&Id::OpenWithPopup) { - let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::OpenWithPopup, f, popup); } else if self.app.mounted(&Id::RenamePopup) { - let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::RenamePopup, f, popup); } else if self.app.mounted(&Id::SaveAsPopup) { - let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::SaveAsPopup, f, popup); } else if self.app.mounted(&Id::SymlinkPopup) { - let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::SymlinkPopup, f, popup); } else if self.app.mounted(&Id::ExecPopup) { - let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::ExecPopup, f, popup); } else if self.app.mounted(&Id::FileInfoPopup) { - let popup = Popup(Size::Percentage(50), Size::Percentage(50)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Percentage(50)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::FileInfoPopup, f, popup); } else if self.app.mounted(&Id::ProgressBarPartial) { - let popup = Popup(Size::Percentage(50), Size::Percentage(20)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Percentage(20)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup let popup_chunks = Layout::default() @@ -242,14 +242,14 @@ impl FileTransferActivity { self.app.view(&Id::ProgressBarFull, f, popup_chunks[0]); self.app.view(&Id::ProgressBarPartial, f, popup_chunks[1]); } else if self.app.mounted(&Id::DeletePopup) { - let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::DeletePopup, f, popup); } else if self.app.mounted(&Id::ReplacePopup) { // NOTE: handle extended / normal modes if self.is_radio_replace_extended() { - let popup = Popup(Size::Percentage(50), Size::Percentage(50)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Percentage(50)).draw_in(f.area()); f.render_widget(Clear, popup); let popup_chunks = Layout::default() .direction(Direction::Vertical) @@ -265,42 +265,42 @@ impl FileTransferActivity { .view(&Id::ReplacingFilesListPopup, f, popup_chunks[0]); self.app.view(&Id::ReplacePopup, f, popup_chunks[1]); } else { - let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::ReplacePopup, f, popup); } } else if self.app.mounted(&Id::DisconnectPopup) { - let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::DisconnectPopup, f, popup); } else if self.app.mounted(&Id::QuitPopup) { - let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::QuitPopup, f, popup); } else if self.app.mounted(&Id::WatchedPathsList) { - let popup = Popup(Size::Percentage(60), Size::Percentage(50)).draw_in(f.size()); + let popup = Popup(Size::Percentage(60), Size::Percentage(50)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::WatchedPathsList, f, popup); } else if self.app.mounted(&Id::WatcherPopup) { - let popup = Popup(Size::Percentage(60), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(60), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::WatcherPopup, f, popup); } else if self.app.mounted(&Id::SortingPopup) { - let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::SortingPopup, f, popup); } else if self.app.mounted(&Id::ErrorPopup) { let popup = Popup( Size::Percentage(50), - self.calc_popup_height(Id::ErrorPopup, f.size().width, f.size().height), + self.calc_popup_height(Id::ErrorPopup, f.area().width, f.area().height), ) - .draw_in(f.size()); + .draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::ErrorPopup, f, popup); @@ -313,17 +313,17 @@ impl FileTransferActivity { .unwrap_or(1) as u16; let popup = - Popup(Size::Percentage(50), Size::Unit(2 + wait_popup_lines)).draw_in(f.size()); + Popup(Size::Percentage(50), Size::Unit(2 + wait_popup_lines)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::WaitPopup, f, popup); } else if self.app.mounted(&Id::SyncBrowsingMkdirPopup) { - let popup = Popup(Size::Percentage(60), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(60), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::SyncBrowsingMkdirPopup, f, popup); } else if self.app.mounted(&Id::KeybindingsPopup) { - let popup = Popup(Size::Percentage(50), Size::Percentage(80)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Percentage(80)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::KeybindingsPopup, f, popup); @@ -1067,138 +1067,34 @@ impl FileTransferActivity { /// Returns a sub clause which requires that no popup is mounted in order to be satisfied fn no_popup_mounted_clause() -> SubClause { - SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::CopyPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::DeletePopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::DisconnectPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::ErrorPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::ExecPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::FatalPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::FileInfoPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::GotoPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::KeybindingsPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::MkdirPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::NewfilePopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::OpenWithPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::ProgressBarFull, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::ProgressBarPartial, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::ExplorerFind, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::QuitPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::RenamePopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::ReplacePopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::SaveAsPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::SortingPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::SyncBrowsingMkdirPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::SymlinkPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::WatcherPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::WatchedPathsList, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::ChmodPopup, - )))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::WaitPopup, - )))), - Box::new(SubClause::Not(Box::new(SubClause::IsMounted( - Id::FilterPopup, - )))), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), - )), + tuirealm::subclause_and_not!( + Id::CopyPopup, + Id::DeletePopup, + Id::DisconnectPopup, + Id::ErrorPopup, + Id::ExecPopup, + Id::FatalPopup, + Id::FileInfoPopup, + Id::GotoPopup, + Id::KeybindingsPopup, + Id::MkdirPopup, + Id::NewfilePopup, + Id::OpenWithPopup, + Id::ProgressBarFull, + Id::ProgressBarPartial, + Id::ExplorerFind, + Id::QuitPopup, + Id::RenamePopup, + Id::ReplacePopup, + Id::SaveAsPopup, + Id::SortingPopup, + Id::SyncBrowsingMkdirPopup, + Id::SymlinkPopup, + Id::WatcherPopup, + Id::WatchedPathsList, + Id::ChmodPopup, + Id::WaitPopup, + Id::FilterPopup ) } } diff --git a/src/ui/activities/mod.rs b/src/ui/activities/mod.rs index d8674e4..291caab 100644 --- a/src/ui/activities/mod.rs +++ b/src/ui/activities/mod.rs @@ -10,6 +10,8 @@ pub mod auth; pub mod filetransfer; pub mod setup; +const CROSSTERM_MAX_POLL: usize = 10; + // -- Exit reason pub enum ExitReason { diff --git a/src/ui/activities/setup/actions.rs b/src/ui/activities/setup/actions.rs index edf9f61..598b323 100644 --- a/src/ui/activities/setup/actions.rs +++ b/src/ui/activities/setup/actions.rs @@ -6,7 +6,7 @@ // Locals use std::env; -use tuirealm::tui::style::Color; +use tuirealm::ratatui::style::Color; use tuirealm::{State, StateValue}; use super::{Id, IdSsh, IdTheme, SetupActivity, ViewLayout}; diff --git a/src/ui/activities/setup/mod.rs b/src/ui/activities/setup/mod.rs index fc1d4df..996efab 100644 --- a/src/ui/activities/setup/mod.rs +++ b/src/ui/activities/setup/mod.rs @@ -19,7 +19,7 @@ use tuirealm::listener::EventListenerCfg; use tuirealm::props::Color; use tuirealm::{Application, NoUserEvent, Update}; -use super::{Activity, Context, ExitReason}; +use super::{Activity, Context, ExitReason, CROSSTERM_MAX_POLL}; use crate::config::themes::Theme; use crate::system::config_client::ConfigClient; use crate::system::theme_provider::ThemeProvider; @@ -262,7 +262,7 @@ impl SetupActivity { Self { app: Application::init( EventListenerCfg::default() - .default_input_listener(ticks) + .crossterm_input_listener(ticks, CROSSTERM_MAX_POLL) .poll_timeout(ticks), ), exit_reason: None, diff --git a/src/ui/activities/setup/view/mod.rs b/src/ui/activities/setup/view/mod.rs index 2cd56bb..99dbec3 100644 --- a/src/ui/activities/setup/view/mod.rs +++ b/src/ui/activities/setup/view/mod.rs @@ -8,7 +8,7 @@ pub mod ssh_keys; pub mod theme; use tuirealm::event::{Key, KeyEvent, KeyModifiers}; -use tuirealm::tui::widgets::Clear; +use tuirealm::ratatui::widgets::Clear; use tuirealm::{Frame, Sub, SubClause, SubEventClause}; use super::*; @@ -112,23 +112,23 @@ impl SetupActivity { pub(super) fn view_popups(&mut self, f: &mut Frame) { if self.app.mounted(&Id::Common(IdCommon::ErrorPopup)) { - let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); // make popup self.app.view(&Id::Common(IdCommon::ErrorPopup), f, popup); } else if self.app.mounted(&Id::Common(IdCommon::QuitPopup)) { // make popup - let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(40), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); self.app.view(&Id::Common(IdCommon::QuitPopup), f, popup); } else if self.app.mounted(&Id::Common(IdCommon::Keybindings)) { // make popup - let popup = Popup(Size::Percentage(50), Size::Percentage(70)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Percentage(70)).draw_in(f.area()); f.render_widget(Clear, popup); self.app.view(&Id::Common(IdCommon::Keybindings), f, popup); } else if self.app.mounted(&Id::Common(IdCommon::SavePopup)) { // make popup - let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); self.app.view(&Id::Common(IdCommon::SavePopup), f, popup); } @@ -235,33 +235,13 @@ impl SetupActivity { /// Returns a sub clause which requires that no popup is mounted in order to be satisfied fn no_popup_mounted_clause() -> SubClause { - SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted(Id::Common( - IdCommon::ErrorPopup, - ))))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted(Id::Common( - IdCommon::Keybindings, - ))))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted(Id::Common( - IdCommon::QuitPopup, - ))))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted(Id::Common( - IdCommon::SavePopup, - ))))), - Box::new(SubClause::And( - Box::new(SubClause::Not(Box::new(SubClause::IsMounted(Id::Ssh( - IdSsh::DelSshKeyPopup, - ))))), - Box::new(SubClause::Not(Box::new(SubClause::IsMounted(Id::Ssh( - IdSsh::SshHost, - ))))), - )), - )), - )), - )), + tuirealm::subclause_and_not!( + Id::Common(IdCommon::ErrorPopup), + Id::Common(IdCommon::Keybindings), + Id::Common(IdCommon::QuitPopup), + Id::Common(IdCommon::SavePopup), + Id::Ssh(IdSsh::DelSshKeyPopup), + Id::Ssh(IdSsh::SshHost) ) } } diff --git a/src/ui/activities/setup/view/setup.rs b/src/ui/activities/setup/view/setup.rs index 393acde..f601fe3 100644 --- a/src/ui/activities/setup/view/setup.rs +++ b/src/ui/activities/setup/view/setup.rs @@ -7,7 +7,7 @@ // Ext use std::path::PathBuf; -use tuirealm::tui::layout::{Constraint, Direction, Layout}; +use tuirealm::ratatui::layout::{Constraint, Direction, Layout}; use tuirealm::{State, StateValue}; use super::{ @@ -50,7 +50,7 @@ impl SetupActivity { ] .as_ref(), ) - .split(f.size()); + .split(f.area()); // Render common widget self.app.view(&Id::Common(IdCommon::Header), f, chunks[0]); self.app.view(&Id::Common(IdCommon::Footer), f, chunks[2]); diff --git a/src/ui/activities/setup/view/ssh_keys.rs b/src/ui/activities/setup/view/ssh_keys.rs index 14d1ee9..697ec59 100644 --- a/src/ui/activities/setup/view/ssh_keys.rs +++ b/src/ui/activities/setup/view/ssh_keys.rs @@ -5,8 +5,8 @@ // Locals // Ext -use tuirealm::tui::layout::{Constraint, Direction, Layout}; -use tuirealm::tui::widgets::Clear; +use tuirealm::ratatui::layout::{Constraint, Direction, Layout}; +use tuirealm::ratatui::widgets::Clear; use super::{components, Context, Id, IdCommon, IdSsh, SetupActivity, ViewLayout}; use crate::utils::ui::{Popup, Size}; @@ -37,7 +37,7 @@ impl SetupActivity { ] .as_ref(), ) - .split(f.size()); + .split(f.area()); // Render common widget self.app.view(&Id::Common(IdCommon::Header), f, chunks[0]); self.app.view(&Id::Common(IdCommon::Footer), f, chunks[2]); @@ -45,11 +45,11 @@ impl SetupActivity { // Popups self.view_popups(f); if self.app.mounted(&Id::Ssh(IdSsh::DelSshKeyPopup)) { - let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.size()); + let popup = Popup(Size::Percentage(30), Size::Unit(3)).draw_in(f.area()); f.render_widget(Clear, popup); self.app.view(&Id::Ssh(IdSsh::DelSshKeyPopup), f, popup); } else if self.app.mounted(&Id::Ssh(IdSsh::SshHost)) { - let popup = Popup(Size::Percentage(50), Size::Percentage(20)).draw_in(f.size()); + let popup = Popup(Size::Percentage(50), Size::Percentage(20)).draw_in(f.area()); f.render_widget(Clear, popup); let popup_chunks = Layout::default() .direction(Direction::Vertical) diff --git a/src/ui/activities/setup/view/theme.rs b/src/ui/activities/setup/view/theme.rs index 1ce403d..4b97673 100644 --- a/src/ui/activities/setup/view/theme.rs +++ b/src/ui/activities/setup/view/theme.rs @@ -5,7 +5,7 @@ // Locals // Ext -use tuirealm::tui::layout::{Constraint, Direction, Layout}; +use tuirealm::ratatui::layout::{Constraint, Direction, Layout}; use super::{components, Context, Id, IdCommon, IdTheme, SetupActivity, Theme, ViewLayout}; @@ -39,7 +39,7 @@ impl SetupActivity { ] .as_ref(), ) - .split(f.size()); + .split(f.area()); // Render common widget self.app.view(&Id::Common(IdCommon::Header), f, chunks[0]); self.app.view(&Id::Common(IdCommon::Footer), f, chunks[2]); diff --git a/src/ui/context.rs b/src/ui/context.rs index a9eb19c..1ee3ff5 100644 --- a/src/ui/context.rs +++ b/src/ui/context.rs @@ -3,7 +3,7 @@ //! `Context` is the module which provides all the functionalities related to the UI data holder, called Context // Locals -use tuirealm::terminal::TerminalBridge; +use tuirealm::terminal::{CrosstermTerminalAdapter, TerminalBridge}; use super::store::Store; use crate::filetransfer::{FileTransferParams, HostBridgeParams}; @@ -18,7 +18,7 @@ pub struct Context { bookmarks_client: Option, config_client: ConfigClient, pub(crate) store: Store, - pub(crate) terminal: TerminalBridge, + pub(crate) terminal: TerminalBridge, theme_provider: ThemeProvider, error: Option, } @@ -31,22 +31,19 @@ impl Context { theme_provider: ThemeProvider, error: Option, ) -> Context { - let mut ctx = Context { + let mut terminal = TerminalBridge::init_crossterm().expect("Could not initialize terminal"); + let _ = terminal.disable_mouse_capture(); + + Context { bookmarks_client, config_client, host_bridge_params: None, remote_params: None, store: Store::init(), - terminal: TerminalBridge::new().expect("Could not initialize terminal"), + terminal, theme_provider, error, - }; - - // Init terminal state - let _ = ctx.terminal.enable_raw_mode(); - let _ = ctx.terminal.enter_alternate_screen(); - - ctx + } } // -- getters @@ -91,7 +88,7 @@ impl Context { &mut self.theme_provider } - pub fn terminal(&mut self) -> &mut TerminalBridge { + pub fn terminal(&mut self) -> &mut TerminalBridge { &mut self.terminal } @@ -115,8 +112,8 @@ impl Context { impl Drop for Context { fn drop(&mut self) { - // Re-enable terminal stuff - let _ = self.terminal.disable_raw_mode(); - let _ = self.terminal.leave_alternate_screen(); + if let Err(err) = self.terminal.restore() { + error!("Could not restore terminal: {err}"); + } } } diff --git a/src/utils/fmt.rs b/src/utils/fmt.rs index 4bb555b..fb3528c 100644 --- a/src/utils/fmt.rs +++ b/src/utils/fmt.rs @@ -7,7 +7,7 @@ use std::time::{Duration, SystemTime}; use chrono::prelude::*; use remotefs::fs::UnixPexClass; -use tuirealm::tui::style::Color; +use tuirealm::ratatui::style::Color; use unicode_width::UnicodeWidthStr; /// Convert permissions bytes of permissions value into ls notation (e.g. rwx,-wx,--x) diff --git a/src/utils/parser.rs b/src/utils/parser.rs index cb81718..9f5d3ba 100644 --- a/src/utils/parser.rs +++ b/src/utils/parser.rs @@ -9,7 +9,7 @@ use std::str::FromStr; // Ext use bytesize::ByteSize; use lazy_regex::{Lazy, Regex}; -use tuirealm::tui::style::Color; +use tuirealm::ratatui::style::Color; use tuirealm::utils::parser as tuirealm_parser; #[cfg(smb)] diff --git a/src/utils/tty.rs b/src/utils/tty.rs index 03c1bbe..d6a03de 100644 --- a/src/utils/tty.rs +++ b/src/utils/tty.rs @@ -2,13 +2,16 @@ //! //! `Utils` implements utilities functions to work with layouts -use tuirealm::terminal::TerminalBridge; +use tuirealm::terminal::{TerminalAdapter, TerminalBridge}; /// Read a secret from tty with customisable prompt -pub fn read_secret_from_tty( - terminal_bridge: &mut TerminalBridge, +pub fn read_secret_from_tty( + terminal_bridge: &mut TerminalBridge, prompt: impl ToString, -) -> std::io::Result> { +) -> std::io::Result> +where + T: TerminalAdapter, +{ let _ = terminal_bridge.disable_raw_mode(); let _ = terminal_bridge.leave_alternate_screen(); let res = match rpassword::prompt_password(prompt) { diff --git a/src/utils/ui.rs b/src/utils/ui.rs index f92e43a..c21917b 100644 --- a/src/utils/ui.rs +++ b/src/utils/ui.rs @@ -2,7 +2,7 @@ //! //! `Utils` implements utilities functions to work with layouts -use tuirealm::tui::layout::{Constraint, Direction, Layout, Rect}; +use tuirealm::ratatui::layout::{Constraint, Direction, Layout, Rect}; /// Size type for UI renders #[derive(Debug, Copy, Clone, Eq, PartialEq)]