From 56357c4697e64c8781b38fd4b63a45952c1ce30d Mon Sep 17 00:00:00 2001 From: doryan Date: Fri, 9 Aug 2024 15:07:32 +0400 Subject: [PATCH 01/97] feat(handler): remove custom event handlers --- .../event_handlers/button_event_handlers.rs | 28 ------------------- src/controller/event_handlers/mod.rs | 2 -- .../event_handlers/switch_event_handlers.rs | 16 ----------- 3 files changed, 46 deletions(-) delete mode 100644 src/controller/event_handlers/button_event_handlers.rs delete mode 100644 src/controller/event_handlers/mod.rs delete mode 100644 src/controller/event_handlers/switch_event_handlers.rs diff --git a/src/controller/event_handlers/button_event_handlers.rs b/src/controller/event_handlers/button_event_handlers.rs deleted file mode 100644 index 5f1db6c..0000000 --- a/src/controller/event_handlers/button_event_handlers.rs +++ /dev/null @@ -1,28 +0,0 @@ -use crate::{gtk::prelude::*, model::models::*}; - -impl EventHandler -where - F: Fn(&C) + FnOnce(&C) + FnMut(&C), -{ - pub fn new(component: C, callback: F) -> Self { - Self { - component, - callback, - } - } -} - -pub trait BtnEventHandler { - fn on_click(self); -} - -impl BtnEventHandler for EventHandler -where - F: Fn(&C) + FnOnce(&C) + FnMut(&C) + 'static, - C: ButtonExt + WidgetExt, -{ - fn on_click(self) { - self.component - .connect_clicked(move |button| (self.callback)(button)); - } -} diff --git a/src/controller/event_handlers/mod.rs b/src/controller/event_handlers/mod.rs deleted file mode 100644 index 00540aa..0000000 --- a/src/controller/event_handlers/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod button_event_handlers; -pub mod switch_event_handlers; \ No newline at end of file diff --git a/src/controller/event_handlers/switch_event_handlers.rs b/src/controller/event_handlers/switch_event_handlers.rs deleted file mode 100644 index 9d01073..0000000 --- a/src/controller/event_handlers/switch_event_handlers.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{gtk::prelude::*, model::models::*, view::components::switch::SwitchExt}; - -pub trait SwEventHandler { - fn on_toggle(self); -} - -impl SwEventHandler for EventHandler -where - F: Fn(&C) + FnOnce(&C) + FnMut(&C) + 'static, - C: SwitchExt + WidgetExt, -{ - fn on_toggle(self) { - self.component - .connect_state_notify(move |switch| (self.callback)(switch)); - } -} From be14fae2e4364e496e8405cec39945f677168d09 Mon Sep 17 00:00:00 2001 From: doryan Date: Fri, 9 Aug 2024 15:07:58 +0400 Subject: [PATCH 02/97] feat(state): remove state controller function --- src/controller/controller.rs | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/controller/controller.rs diff --git a/src/controller/controller.rs b/src/controller/controller.rs deleted file mode 100644 index d6fbe05..0000000 --- a/src/controller/controller.rs +++ /dev/null @@ -1,10 +0,0 @@ -use gtk::*; -use gtk4 as gtk; - -pub fn state_controller(switch: &Switch, label: &Label) { - if switch.state() { - label.set_label("Режим: проверка"); - } else { - label.set_label("Режим: кодирование"); - } -} From e46e83f72373d73f35dee2fbd7f9338d5cd2bb26 Mon Sep 17 00:00:00 2001 From: doryan Date: Fri, 9 Aug 2024 15:10:40 +0400 Subject: [PATCH 03/97] feat(mod): remove state controller and custom event handlers modules --- src/controller/mod.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/controller/mod.rs b/src/controller/mod.rs index 5a6e4b4..8c84ac9 100644 --- a/src/controller/mod.rs +++ b/src/controller/mod.rs @@ -1,4 +1,2 @@ -pub mod controller; -pub mod view_utils; pub mod model_utils; -pub mod event_handlers; \ No newline at end of file +pub mod view_utils; From f3ae716ed43358bfdc6675b889a5ab78a59ab4f5 Mon Sep 17 00:00:00 2001 From: doryan Date: Fri, 9 Aug 2024 15:12:00 +0400 Subject: [PATCH 04/97] feat(crate): update gtk and adw crates Updated gtk to 0.9.0 and adw to 0.7.0 --- Cargo.lock | 174 +++++++++++++++++++---------------------------------- Cargo.toml | 4 +- 2 files changed, 64 insertions(+), 114 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 562fed5..9bd309c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,12 +17,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "anyhow" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" - [[package]] name = "autocfg" version = "1.2.0" @@ -46,9 +40,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] name = "bitvec" @@ -64,9 +58,9 @@ dependencies = [ [[package]] name = "cairo-rs" -version = "0.19.4" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ac2a4d0e69036cf0062976f6efcba1aaee3e448594e6514bb2ddf87acce562" +checksum = "797fd5a634dcb0ad0d7d583df794deb0a236d88e759cd34b7da20198c6c9d145" dependencies = [ "bitflags", "cairo-sys-rs", @@ -77,9 +71,9 @@ dependencies = [ [[package]] name = "cairo-sys-rs" -version = "0.19.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3bb3119664efbd78b5e6c93957447944f16bdbced84c17a9f41c7829b81e64" +checksum = "428290f914b9b86089f60f5d8a9f6e440508e1bcff23b25afd51502b0a2da88f" dependencies = [ "glib-sys", "libc", @@ -170,7 +164,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn", ] [[package]] @@ -195,9 +189,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.19.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6a23f8a0b5090494fd04924662d463f8386cc678dd3915015a838c1a3679b92" +checksum = "28bb53ecb56857c683c9ec859908e076dd3969c7d67598bd8b1ce095d211304a" dependencies = [ "gdk-pixbuf-sys", "gio", @@ -207,9 +201,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf-sys" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcbd04c1b2c4834cc008b4828bc917d062483b88d26effde6342e5622028f96" +checksum = "9f6681a0c1330d1d3968bec1529f7172d62819ef0bdbb0d18022320654158b03" dependencies = [ "gio-sys", "glib-sys", @@ -220,9 +214,9 @@ dependencies = [ [[package]] name = "gdk4" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9100b25604183f2fd97f55ef087fae96ab4934d7215118a35303e422688e6e4b" +checksum = "4b7d7237c1487ed4b300aac7744efcbf1319e12d60d7afcd6f505414bd5b5dea" dependencies = [ "cairo-rs", "gdk-pixbuf", @@ -235,9 +229,9 @@ dependencies = [ [[package]] name = "gdk4-sys" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0b76874c40bb8d1c7d03a7231e23ac75fa577a456cd53af32ec17ec8f121626" +checksum = "a67576c8ec012156d7f680e201a807b4432a77babb3157e0555e990ab6bcd878" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -258,9 +252,9 @@ checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "gio" -version = "0.19.4" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f91a0518c2ec539f099d3f945ab2d6a83ec372a9ef40a21906343b191182845" +checksum = "398e3da68749fdc32783cbf7521ec3f65c9cf946db8c7774f8460af49e52c6e2" dependencies = [ "futures-channel", "futures-core", @@ -276,9 +270,9 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf8e1d9219bb294636753d307b030c1e8a032062cba74f493c431a5c8b81ce4" +checksum = "e4feb96b31c32730ea3e1e89aecd2e4e37ecb1c473ad8f685e3430a159419f63" dependencies = [ "glib-sys", "gobject-sys", @@ -289,9 +283,9 @@ dependencies = [ [[package]] name = "glib" -version = "0.19.4" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1407b2ce171e654720be10d57d4054d3ff2f10a13d5b37e6819b41439832f7" +checksum = "fee90a615ce05be7a32932cfb8adf2c4bbb4700e80d37713c981fb24c0c56238" dependencies = [ "bitflags", "futures-channel", @@ -311,22 +305,22 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.19.4" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8bba315e8ce8aa59631545358450f4962557e89b5f7db7442e7153b47037f71" +checksum = "4da558d8177c0c8c54368818b508a4244e1286fce2858cef4e547023f0cfa5ef" dependencies = [ "heck", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.58", + "syn", ] [[package]] name = "glib-sys" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630f097773d7c7a0bb3258df4e8157b47dc98bbfa0e60ad9ab56174813feced4" +checksum = "4958c26e5a01c9af00dea669a97369eccbec29a8e6d125c24ea2d85ee7467b60" dependencies = [ "libc", "system-deps", @@ -334,9 +328,9 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85e2b1080b9418dd0c58b498da3a5c826030343e0ef07bde6a955d28de54979" +checksum = "c6908864f5ffff15b56df7e90346863904f49b949337ed0456b9287af61903b8" dependencies = [ "glib-sys", "libc", @@ -345,9 +339,9 @@ dependencies = [ [[package]] name = "graphene-rs" -version = "0.19.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e4d388e96c5f29e2b2f67045d229ddf826d0a8d6d282f94ed3b34452222c91" +checksum = "630e940ad5824f90221d6579043a9cd1f8bec86b4a17faaf7827d58eb16e8c1f" dependencies = [ "glib", "graphene-sys", @@ -356,9 +350,9 @@ dependencies = [ [[package]] name = "graphene-sys" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "236ed66cc9b18d8adf233716f75de803d0bf6fc806f60d14d948974a12e240d0" +checksum = "6fb8fade7b754982f47ebbed241fd2680816fdd4598321784da10b9e1168836a" dependencies = [ "glib-sys", "libc", @@ -368,9 +362,9 @@ dependencies = [ [[package]] name = "gsk4" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65036fc8f99579e8cb37b12487969b707ab23ec8ab953682ff347cbd15d396e" +checksum = "1f3cf2091e1af185b347b3450817d93dea6fe435df7abd4c2cd7fb5bcb4cfda8" dependencies = [ "cairo-rs", "gdk4", @@ -383,9 +377,9 @@ dependencies = [ [[package]] name = "gsk4-sys" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd24c814379f9c3199dc53e52253ee8d0f657eae389ab282c330505289d24738" +checksum = "6aa69614a26d8760c186c3690f1b0fbb917572ca23ef83137445770ceddf8cde" dependencies = [ "cairo-sys-rs", "gdk4-sys", @@ -399,9 +393,9 @@ dependencies = [ [[package]] name = "gtk4" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa82753b8c26277e4af1446c70e35b19aad4fb794a7b143859e7eeb9a4025d83" +checksum = "eaffc6c743c9160514cc9b67eace364e5dc5798369fa809cdb04e035c21c5c5d" dependencies = [ "cairo-rs", "field-offset", @@ -420,23 +414,21 @@ dependencies = [ [[package]] name = "gtk4-macros" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40300bf071d2fcd4c94eacc09e84ec6fe73129d2ceb635cf7e55b026b5443567" +checksum = "188211f546ce5801f6d0245c37b6249143a2cb4fa040e54829ca1e76796e9f09" dependencies = [ - "anyhow", "proc-macro-crate", - "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] name = "gtk4-sys" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0db1b104138f087ccdc81d2c332de5dd049b89de3d384437cc1093b17cd2da18" +checksum = "1114a207af8ada02cf4658a76692f4190f06f093380d5be07e3ca8b43aa7c666" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -485,11 +477,10 @@ dependencies = [ [[package]] name = "libadwaita" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91b4990248b9e1ec5e72094a2ccaea70ec3809f88f6fd52192f2af306b87c5d9" +checksum = "2ff9c222b5c783729de45185f07b2fec2d43a7f9c63961e777d3667e20443878" dependencies = [ - "gdk-pixbuf", "gdk4", "gio", "glib", @@ -501,9 +492,9 @@ dependencies = [ [[package]] name = "libadwaita-sys" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a748e4e92be1265cd9e93d569c0b5dfc7814107985aa6743d670ab281ea1a8" +checksum = "1c44d8bdbad31d6639e1f20cc9c1424f1a8e02d751fc28d44659bf743fb9eca6" dependencies = [ "gdk4-sys", "gio-sys", @@ -523,9 +514,9 @@ checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memoffset" @@ -556,9 +547,9 @@ dependencies = [ [[package]] name = "pango" -version = "0.19.3" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1264d13deb823cc652f26cfe59afb1ec4b9db2a5bd27c41b738c879cc1bfaa1" +checksum = "54768854025df6903061d0084fd9702a253ddfd60db7d9b751d43b76689a7f0a" dependencies = [ "gio", "glib", @@ -568,9 +559,9 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52ef6a881c19fbfe3b1484df5cad411acaaba29dbec843941c3110d19f340ea" +checksum = "b07cc57d10cee4ec661f718a6902cee18c2f4cfae08e87e5a390525946913390" dependencies = [ "glib-sys", "gobject-sys", @@ -605,35 +596,11 @@ dependencies = [ "toml_edit 0.21.1", ] -[[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", -] - [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -691,7 +658,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn", ] [[package]] @@ -720,20 +687,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ "proc-macro2", "quote", @@ -742,9 +698,9 @@ dependencies = [ [[package]] name = "system-deps" -version = "6.2.2" +version = "7.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +checksum = "6c81f13d9a334a6c242465140bd262fae382b752ff2011c4f7419919a9c97922" dependencies = [ "cfg-expr", "heck", @@ -782,7 +738,7 @@ checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn", ] [[package]] @@ -804,7 +760,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn", ] [[package]] @@ -864,12 +820,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - [[package]] name = "windows-sys" version = "0.52.0" diff --git a/Cargo.toml b/Cargo.toml index 2e4796e..ea4a3f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,8 +6,8 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -adw = { version = "0.6.0", package = "libadwaita", features = ["v1_4"] } +adw = { version = "0.7.0", package = "libadwaita", features = ["v1_4"] } bitvec = "1.0.1" -gtk4 = "0.8.1" +gtk4 = "0.9.0" tokio = { version = "1.39.2", features = ["rt", "time", "rt-multi-thread", "macros", "sync"] } From da3cb520466204e60a1c9db7c7e1a30792209ebc Mon Sep 17 00:00:00 2001 From: doryan Date: Fri, 9 Aug 2024 15:13:04 +0400 Subject: [PATCH 05/97] refactor: rename view.rs to ui.rs --- src/main.rs | 2 +- src/view/mod.rs | 2 +- src/view/{view.rs => ui.rs} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename src/view/{view.rs => ui.rs} (100%) diff --git a/src/main.rs b/src/main.rs index 87baea7..d6ae69e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,7 @@ mod model; mod view; use controller::*; -use view::view::*; +use view::ui::*; #[tokio::main] async fn main() { diff --git a/src/view/mod.rs b/src/view/mod.rs index 6fb0ee1..eb09977 100644 --- a/src/view/mod.rs +++ b/src/view/mod.rs @@ -2,4 +2,4 @@ pub mod components; pub mod pages; pub mod properties; pub mod styles; -pub mod view; +pub mod ui; diff --git a/src/view/view.rs b/src/view/ui.rs similarity index 100% rename from src/view/view.rs rename to src/view/ui.rs From 6fbe74e851b59bc422ea324a23e71c4384c79868 Mon Sep 17 00:00:00 2001 From: doryan Date: Fri, 9 Aug 2024 15:13:45 +0400 Subject: [PATCH 06/97] feat(switch): remove swtich component export --- src/view/components/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/view/components/mod.rs b/src/view/components/mod.rs index 468eb32..331e707 100644 --- a/src/view/components/mod.rs +++ b/src/view/components/mod.rs @@ -1,7 +1,6 @@ pub mod info_bar; pub mod input; pub mod pages; -pub mod switch; pub mod tabs; pub mod wrapper; From 377c74369c23bfb6b4120227fa37311c6228422d Mon Sep 17 00:00:00 2001 From: doryan Date: Fri, 9 Aug 2024 15:14:05 +0400 Subject: [PATCH 07/97] feat(import): remove redundant import --- src/view/components/pages.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/view/components/pages.rs b/src/view/components/pages.rs index b8a31b3..65e94fb 100644 --- a/src/view/components/pages.rs +++ b/src/view/components/pages.rs @@ -1,4 +1,4 @@ -use gtk4::{self as gtk, prelude::WidgetExt, Align}; +use gtk4::{self as gtk, prelude::WidgetExt}; #[allow(unused)] use gtk::{ From 45617aa59d7de10386c8b0b99e8fd0f5d75ad37f Mon Sep 17 00:00:00 2001 From: doryan Date: Fri, 9 Aug 2024 17:35:52 +0400 Subject: [PATCH 08/97] fix(id): rename application id Application id has been renamed from "com.github.gtk-rs.examples.basic" to "com.laboratory-work" --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index d6ae69e..dccf6d5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,7 +12,7 @@ use view::ui::*; #[tokio::main] async fn main() { let app: adw::Application = adw::Application::builder() - .application_id("com.github.gtk-rs.examples.basic") + .application_id("com.laboratory-work") .build(); app.connect_activate(ui); From 2e7ede2dac89e2d0736dcbdd2a215e20b5481494 Mon Sep 17 00:00:00 2001 From: doryan Date: Fri, 9 Aug 2024 17:51:07 +0400 Subject: [PATCH 09/97] fix(power): change math power method The exponentiation method has been changed because, in this case, the calculation doesn't need to be raised to a power number using the .powf() method. --- src/controller/model_utils/signal_reducer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controller/model_utils/signal_reducer.rs b/src/controller/model_utils/signal_reducer.rs index b497899..be5604b 100644 --- a/src/controller/model_utils/signal_reducer.rs +++ b/src/controller/model_utils/signal_reducer.rs @@ -9,7 +9,7 @@ pub fn reactive_resistance_of_capacitor(Cm: f64, L: f64, f: f64) -> f64 { #[allow(non_snake_case)] pub fn full_resistance_of_capacitor(Xc: f64, Rs: f64, Rm: f64, L: f64) -> f64 { - (Xc.powf(2f64) + (Rs + Rm * L).powf(2f64)).sqrt() + (Xc.powi(2) + (Rs + Rm * L).powi(2)).sqrt() } #[allow(non_snake_case)] From 1aad9bafca8a9beb22793e462e0d8e2e74f78e86 Mon Sep 17 00:00:00 2001 From: doryan Date: Fri, 9 Aug 2024 18:55:18 +0400 Subject: [PATCH 10/97] feat(switch): remove switch component --- src/view/components/switch.rs | 150 ---------------------------------- 1 file changed, 150 deletions(-) delete mode 100644 src/view/components/switch.rs diff --git a/src/view/components/switch.rs b/src/view/components/switch.rs deleted file mode 100644 index 8efb58c..0000000 --- a/src/view/components/switch.rs +++ /dev/null @@ -1,150 +0,0 @@ -use gtk4 as gtk; - -use gtk::{*, prelude::*}; - -use glib::{ - signal::{connect_raw, SignalHandlerId}, - translate::*, -}; - -use std::boxed::Box as Box_; - -mod sealed { - pub trait Sealed {} - impl> Sealed for T {} -} - -pub trait SwitchExt: IsA + sealed::Sealed + 'static { - #[doc(alias = "gtk_switch_get_active")] - #[doc(alias = "get_active")] - fn is_active(&self) -> bool { - unsafe { from_glib(ffi::gtk_switch_get_active(self.as_ref().to_glib_none().0)) } - } - - #[doc(alias = "gtk_switch_get_state")] - #[doc(alias = "get_state")] - fn state(&self) -> bool { - unsafe { from_glib(ffi::gtk_switch_get_state(self.as_ref().to_glib_none().0)) } - } - - #[doc(alias = "gtk_switch_set_active")] - fn set_active(&self, is_active: bool) { - unsafe { - ffi::gtk_switch_set_active(self.as_ref().to_glib_none().0, is_active.into_glib()); - } - } - - #[doc(alias = "gtk_switch_set_state")] - fn set_state(&self, state: bool) { - unsafe { - ffi::gtk_switch_set_state(self.as_ref().to_glib_none().0, state.into_glib()); - } - } - - #[doc(alias = "activate")] - fn connect_activate(&self, f: F) -> SignalHandlerId { - unsafe extern "C" fn activate_trampoline, F: Fn(&P) + 'static>( - this: *mut ffi::GtkSwitch, - f: glib::ffi::gpointer, - ) { - let f: &F = &*(f as *const F); - f(Switch::from_glib_borrow(this).unsafe_cast_ref()) - } - unsafe { - let f: Box_ = Box_::new(f); - connect_raw( - self.as_ptr() as *mut _, - b"activate\0".as_ptr() as *const _, - Some(std::mem::transmute::<_, unsafe extern "C" fn()>( - activate_trampoline:: as *const (), - )), - Box_::into_raw(f), - ) - } - } - - fn emit_activate(&self) { - self.emit_by_name::<()>("activate", &[]); - } - - #[doc(alias = "state-set")] - fn connect_state_set glib::Propagation + 'static>( - &self, - f: F, - ) -> SignalHandlerId { - unsafe extern "C" fn state_set_trampoline< - P: IsA, - F: Fn(&P, bool) -> glib::Propagation + 'static, - >( - this: *mut ffi::GtkSwitch, - state: glib::ffi::gboolean, - f: glib::ffi::gpointer, - ) -> glib::ffi::gboolean { - let f: &F = &*(f as *const F); - f( - Switch::from_glib_borrow(this).unsafe_cast_ref(), - from_glib(state), - ) - .into_glib() - } - unsafe { - let f: Box_ = Box_::new(f); - connect_raw( - self.as_ptr() as *mut _, - b"state-set\0".as_ptr() as *const _, - Some(std::mem::transmute::<_, unsafe extern "C" fn()>( - state_set_trampoline:: as *const (), - )), - Box_::into_raw(f), - ) - } - } - - #[doc(alias = "active")] - fn connect_active_notify(&self, f: F) -> SignalHandlerId { - unsafe extern "C" fn notify_active_trampoline, F: Fn(&P) + 'static>( - this: *mut ffi::GtkSwitch, - _param_spec: glib::ffi::gpointer, - f: glib::ffi::gpointer, - ) { - let f: &F = &*(f as *const F); - f(Switch::from_glib_borrow(this).unsafe_cast_ref()) - } - unsafe { - let f: Box_ = Box_::new(f); - connect_raw( - self.as_ptr() as *mut _, - b"notify::active\0".as_ptr() as *const _, - Some(std::mem::transmute::<_, unsafe extern "C" fn()>( - notify_active_trampoline:: as *const (), - )), - Box_::into_raw(f), - ) - } - } - - #[doc(alias = "state")] - fn connect_state_notify(&self, f: F) -> SignalHandlerId { - unsafe extern "C" fn notify_state_trampoline, F: Fn(&P) + 'static>( - this: *mut ffi::GtkSwitch, - _param_spec: glib::ffi::gpointer, - f: glib::ffi::gpointer, - ) { - let f: &F = &*(f as *const F); - f(Switch::from_glib_borrow(this).unsafe_cast_ref()) - } - unsafe { - let f: Box_ = Box_::new(f); - connect_raw( - self.as_ptr() as *mut _, - b"notify::state\0".as_ptr() as *const _, - Some(std::mem::transmute::<_, unsafe extern "C" fn()>( - notify_state_trampoline:: as *const (), - )), - Box_::into_raw(f), - ) - } - } -} - -impl> SwitchExt for O {} \ No newline at end of file From 631db86420f59d238a4cc61dcfb69ae83099be84 Mon Sep 17 00:00:00 2001 From: doryan Date: Fri, 9 Aug 2024 18:56:25 +0400 Subject: [PATCH 11/97] fix(function): change function signature --- src/view/components/pages.rs | 4 ++-- src/view/components/tabs.rs | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/view/components/pages.rs b/src/view/components/pages.rs index 65e94fb..326d64d 100644 --- a/src/view/components/pages.rs +++ b/src/view/components/pages.rs @@ -25,8 +25,8 @@ impl Product for Pages { } } - fn get(self) -> Box { - self.wrapper + fn get(&self) -> &Box { + &self.wrapper } } diff --git a/src/view/components/tabs.rs b/src/view/components/tabs.rs index 024bca0..c133c0c 100644 --- a/src/view/components/tabs.rs +++ b/src/view/components/tabs.rs @@ -21,8 +21,8 @@ impl Product for Tabs { TabsBuilder { tabs: Vec::new() } } - fn get(self) -> Notebook { - self.tabs_wrapper + fn get(&self) -> &Notebook { + &self.tabs_wrapper } } @@ -58,4 +58,3 @@ impl TabsBuilder { self.tabs.push((tab_label, item.1)); } } - From 7d2049b59d88741f325cf2b5682529938aa52f63 Mon Sep 17 00:00:00 2001 From: doryan Date: Fri, 9 Aug 2024 20:51:28 +0400 Subject: [PATCH 12/97] feat(cheatsheet): remove list of position errors --- .../model_utils/hamming_code_seven_four.rs | 15 ------ src/model/builder_traits.rs | 3 +- src/model/mod.rs | 13 +++-- src/model/models.rs | 51 +++++++++---------- 4 files changed, 35 insertions(+), 47 deletions(-) diff --git a/src/controller/model_utils/hamming_code_seven_four.rs b/src/controller/model_utils/hamming_code_seven_four.rs index 1cc0d92..55b4b88 100644 --- a/src/controller/model_utils/hamming_code_seven_four.rs +++ b/src/controller/model_utils/hamming_code_seven_four.rs @@ -5,21 +5,6 @@ use crate::{ model::models::*, }; -/// **Синдромы** -/// -/// ошибочная позиция 1 false true true. -/// -/// ошибочная позиция 2 false false true. -/// -/// ошибочная позиция 3 true false true. -/// -/// ошибочная позиция 4 false true false. -/// -/// ошибочная позиция 5 true true false. -/// -/// ошибочная позиция 6 true false false. -/// -/// ошибочная позиция 7 false false false. pub fn hamming(raw_input: String, mode: HammingMode) -> Result { let length_of_code: usize = mode.clone() as usize; diff --git a/src/model/builder_traits.rs b/src/model/builder_traits.rs index cac9a74..b6822d3 100644 --- a/src/model/builder_traits.rs +++ b/src/model/builder_traits.rs @@ -1,9 +1,10 @@ pub trait Product { fn builder() -> B; - fn get(self) -> T; + fn get(&self) -> &T; } +#[allow(dead_code)] pub trait Builder { fn build(&self, build_arg: P) -> T; diff --git a/src/model/mod.rs b/src/model/mod.rs index 8530639..f31cdd3 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -2,14 +2,19 @@ pub mod builder_traits; pub mod models; use crate::gtk::glib; + use glib::Object; glib::wrapper! { - pub struct ResultValue(ObjectSubclass); + pub struct Frequency(ObjectSubclass); } -impl ResultValue { - pub fn new(val: f64) -> Self { - Object::builder().property("value", val).build() +impl Frequency { + pub fn new(frequency: f64) -> Self { + Object::builder().property("frequency", frequency).build() + } + + pub fn default() -> Self { + Object::new() } } diff --git a/src/model/models.rs b/src/model/models.rs index ad4708f..b46ec0d 100644 --- a/src/model/models.rs +++ b/src/model/models.rs @@ -2,10 +2,11 @@ use std::cell::Cell; use crate::gtk; -use glib::Properties; -use gtk::glib; -use gtk::prelude::*; -use gtk::subclass::prelude::*; +use gtk::{ + glib::{self, Properties}, + prelude::*, + subclass::prelude::*, +}; #[repr(usize)] #[derive(Clone)] @@ -14,33 +15,29 @@ pub enum HammingMode { Decrypt = 7, } -pub struct EventHandler { - pub(crate) component: C, - pub(crate) callback: F, -} - -#[derive(Default, Copy, Clone)] -pub struct SignalReduce(pub f64, pub f64, pub f64, pub f64, pub f64, pub f64); - -impl SignalReduce { - pub fn new() -> Self { - Self(0.0, 0.0, 0.0, 0.0, 0.0, 0.0) - } +#[allow(dead_code)] +#[derive(Default, Copy, Clone, Debug)] +pub struct SignalReduce { + pub length: f64, + pub wire_resistance: f64, + pub wire_capacity: f64, + pub source_voltage: f64, + pub source_resistance: f64, + pub frequency: f64, } #[derive(Properties, Default)] -#[properties(wrapper_type = super::ResultValue)] -pub struct ResultValue { +#[properties(wrapper_type = super::Frequency)] +pub struct Frequency { #[property(get, set)] - value: Cell, -} - -// The central trait for subclassing a GObject -#[glib::object_subclass] -impl ObjectSubclass for ResultValue { - const NAME: &'static str = "MyGtkAppCustomButton"; - type Type = super::ResultValue; + frequency: Cell, } #[glib::derived_properties] -impl ObjectImpl for ResultValue {} +impl ObjectImpl for Frequency {} + +#[glib::object_subclass] +impl ObjectSubclass for Frequency { + const NAME: &'static str = "FrequencyValue"; + type Type = super::Frequency; +} From 94f050f8caa239a375b64d0d99c674c79d20786b Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 00:34:45 +0400 Subject: [PATCH 13/97] feat(error): add custom error handling aliases --- src/model/mod.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/model/mod.rs b/src/model/mod.rs index f31cdd3..825575e 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -5,6 +5,9 @@ use crate::gtk::glib; use glib::Object; +pub type Result = core::result::Result; +pub type Error = std::boxed::Box; + glib::wrapper! { pub struct Frequency(ObjectSubclass); } From 6682a669584cae97c06c7912a67473e9429a2197 Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 00:36:27 +0400 Subject: [PATCH 14/97] fix(table): move table of syndromes into global static variable --- .../model_utils/hamming_code_seven_four.rs | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/controller/model_utils/hamming_code_seven_four.rs b/src/controller/model_utils/hamming_code_seven_four.rs index 55b4b88..0efdc97 100644 --- a/src/controller/model_utils/hamming_code_seven_four.rs +++ b/src/controller/model_utils/hamming_code_seven_four.rs @@ -5,6 +5,17 @@ use crate::{ model::models::*, }; +static SYNDROMES: LazyLock> = LazyLock::new(|| { + HashMap::from([ + (1, (false, true, true)), + (2, (false, false, true)), + (3, (true, false, true)), + (4, (false, true, false)), + (5, (true, true, false)), + (6, (true, false, false)), + (7, (false, false, false)), + ]) +}); pub fn hamming(raw_input: String, mode: HammingMode) -> Result { let length_of_code: usize = mode.clone() as usize; @@ -51,15 +62,6 @@ pub fn hamming_encrypt_data(data: &Vec, result_string: &mut String, length_o pub fn hamming_decrypt_data(data: &Vec, result_string: &mut String, length_of_code: usize) { let mut general_length: usize = length_of_code; - let syndromes: HashMap = HashMap::from([ - (1, (false, true, true)), - (2, (false, false, true)), - (3, (true, false, true)), - (4, (false, true, false)), - (5, (true, true, false)), - (6, (true, false, false)), - (7, (false, false, false)), - ]); let mut errors: String = String::new(); From bf7f542df07b2ee0c940be6c43b20af9687facaf Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 00:38:42 +0400 Subject: [PATCH 15/97] fix(empty string): boolean logic mistake --- src/controller/view_utils/input_utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controller/view_utils/input_utils.rs b/src/controller/view_utils/input_utils.rs index f28ef1a..6e58f48 100644 --- a/src/controller/view_utils/input_utils.rs +++ b/src/controller/view_utils/input_utils.rs @@ -9,7 +9,7 @@ const ASCII_ZERO_CHAR_POSITION: u8 = 48; pub fn processing_input(input: &String) -> String { input .split_ascii_whitespace() - .filter(|&x| x.is_empty()) + .filter(|&x| !x.is_empty()) .fold(String::new(), |c: String, n: &str| c + n) } From 2ce75224fa08ba8336ba11cd16ca2a55345d5eeb Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 00:39:11 +0400 Subject: [PATCH 16/97] feat(fn): edit function signature --- src/controller/view_utils/input_utils.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/controller/view_utils/input_utils.rs b/src/controller/view_utils/input_utils.rs index 6e58f48..921ff42 100644 --- a/src/controller/view_utils/input_utils.rs +++ b/src/controller/view_utils/input_utils.rs @@ -6,8 +6,9 @@ use std::ops::Deref; const ASCII_ZERO_CHAR_POSITION: u8 = 48; -pub fn processing_input(input: &String) -> String { +pub fn processing_input(input: impl Into) -> String { input + .into() .split_ascii_whitespace() .filter(|&x| !x.is_empty()) .fold(String::new(), |c: String, n: &str| c + n) @@ -20,8 +21,9 @@ pub fn from_vec_bits_to_string(raw_data: &[u8]) -> String { .collect() } -pub fn from_string_to_vec_bits(raw_data: String) -> Vec { +pub fn from_string_to_vec_bits(raw_data: impl Into) -> Vec { raw_data + .into() .as_bits::() .iter() .step_by(8) From 656e75ff356bf349c0d9fa9ce292335dc52b4883 Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 00:42:59 +0400 Subject: [PATCH 17/97] refactor: rewrite "dirty" code into normal --- src/view/pages/hamming_code.rs | 165 ++++++++++++++------------------- 1 file changed, 71 insertions(+), 94 deletions(-) diff --git a/src/view/pages/hamming_code.rs b/src/view/pages/hamming_code.rs index ea87ebd..ab0d3fa 100644 --- a/src/view/pages/hamming_code.rs +++ b/src/view/pages/hamming_code.rs @@ -1,60 +1,32 @@ use gtk4 as gtk; use crate::{ - controller::{ - controller::*, - event_handlers::{button_event_handlers::*, switch_event_handlers::*}, - view_utils::{hamming_code_input_utils::*, input_utils::*}, + model::builder_traits::Product, + view::{ + components::{info_bar::InfoBar, input::Input, wrapper::*}, + properties::*, }, - model::models::*, - view::{components::wrapper::*, properties::*}, + view_utils::{hamming_code_input_utils::start_hamming_algorithm, input_utils::clearing}, }; -use gtk::{prelude::*, *}; +use gtk::{glib::clone, prelude::*, *}; pub fn hamming_code_page(wrapper: &Box) { - // input + let info_bar = InfoBar::get_instance(); - let hamming_text_view_input_label = Label::builder() - .halign(Align::Start) - .set_margin(MarginData::MultipleMargin((10, 5, 0, 0))) - .label(String::from("Поле ввода для кода:")) - .build(); + let input_code = Input::builder() + .label("Поле ввода для кода:") + .margins(MarginData::EqualsMargin(6)) + .align(Alignment::new(Align::Start, Align::Start)) + .build(true, WrapMode::Word, 64); - let hamming_text_view_input = TextView::builder() - .monospace(true) - .set_text_view_margin(MarginData::EqualsMargin(6)) - .wrap_mode(WrapMode::Word) - .build(); + let output_code = Input::builder() + .label("Результат:") + .margins(MarginData::EqualsMargin(6)) + .align(Alignment::new(Align::Start, Align::Start)) + .build(true, WrapMode::Word, 64); - let hamming_text_view_input_frame = Frame::builder() - .child(&hamming_text_view_input) - .height_request(64) - .set_margin(MarginData::MultipleMargin((0, 5, 0, 5))) - .build(); - - // output - - let hamming_text_view_output_label = Label::builder() - .halign(Align::Start) - .set_margin(MarginData::MultipleMargin((10, 5, 0, 0))) - .label(String::from("Результат:")) - .build(); - - let hamming_text_view_output = TextView::builder() - .monospace(true) - .editable(false) - .set_text_view_margin(MarginData::EqualsMargin(6)) - .wrap_mode(WrapMode::Word) - .build(); - - let hamming_text_view_output_frame = Frame::builder() - .child(&hamming_text_view_output) - .height_request(64) - .set_margin(MarginData::MultipleMargin((0, 5, 0, 5))) - .build(); - - // interactive panel + output_code.get_input().set_editable(false); let clear_input_button = Button::builder() .set_align(Alignment::new(Align::Fill, Align::Fill)) @@ -70,67 +42,72 @@ pub fn hamming_code_page(wrapper: &Box) { let crypt_mode_label = Label::builder().label("Режим: кодирование").build(); - // references for binding actions - - let clear_input_button_to_handle = clear_input_button.clone(); - - let crypt_mode_label_to_handle = crypt_mode_label.clone(); - let crypt_mode_switch_to_handle = crypt_mode_switch.clone(); - - let text_view_input_for_parse = hamming_text_view_input.clone(); - let text_view_output_for_output = hamming_text_view_output.clone(); - - let text_view_input_for_clearing = hamming_text_view_input.clone(); - let text_view_output_for_clearing = hamming_text_view_output.clone(); - - // actions - - EventHandler::new(clear_input_button_to_handle, move |_| { - clearing( - &text_view_input_for_clearing, - &text_view_output_for_clearing, - ); - }) - .on_click(); - - EventHandler::new(hamming_crypt_button.clone(), move |_button: &Button| { - start_hamming_algorithm( - &text_view_input_for_parse, - &text_view_output_for_output, - crypt_mode_switch_to_handle.state(), - ) - }) - .on_click(); - - EventHandler::new(crypt_mode_switch.clone(), move |s: &Switch| { - state_controller(s, &crypt_mode_label_to_handle); - }) - .on_toggle(); - - // wrappers - let crypt_mode_wrapper = Wrapper::col_builder() .set_align(Alignment::new(Align::Fill, Align::Center)) .hexpand(true) .spacing(10) .build(); - let interactive_components_wrapper = Wrapper::col_builder() + let action_components_wrapper = Wrapper::col_builder() .set_align(Alignment::new(Align::Fill, Align::Fill)) .set_margin(MarginData::MultipleMargin((0, 5, 0, 5))) .spacing(10) .build(); + crypt_mode_switch.connect_state_set(clone!( + #[strong] + crypt_mode_label, + move |_, toggled| { + if toggled { + crypt_mode_label.set_label("Режим: проверка"); + } else { + crypt_mode_label.set_label("Режим: кодирование"); + } + glib::Propagation::Proceed + } + )); + + clear_input_button.connect_clicked(clone!( + #[strong] + input_code, + #[strong] + output_code, + move |_| { + clearing(input_code.get_input(), output_code.get_input()); + } + )); + + hamming_crypt_button.connect_clicked(clone!( + #[strong] + input_code, + #[strong] + output_code, + #[strong] + crypt_mode_switch, + #[strong] + info_bar, + move |_| { + let result = start_hamming_algorithm(input_code.get_input(), crypt_mode_switch.state()); + match result { + Ok(result) => { + output_code.get_input().buffer().set_text(result.trim_end()); + } + Err(reject) => { + info_bar.set_text_label(Some(&*format!("{reject}"))); + info_bar.show_infobar(5); + } + } + } + )); + crypt_mode_wrapper.append(&crypt_mode_switch); crypt_mode_wrapper.append(&crypt_mode_label); - interactive_components_wrapper.append(&clear_input_button); - interactive_components_wrapper.append(&crypt_mode_wrapper); - interactive_components_wrapper.append(&hamming_crypt_button); + action_components_wrapper.append(&clear_input_button); + action_components_wrapper.append(&crypt_mode_wrapper); + action_components_wrapper.append(&hamming_crypt_button); - wrapper.append(&hamming_text_view_input_label); - wrapper.append(&hamming_text_view_input_frame); - wrapper.append(&interactive_components_wrapper); - wrapper.append(&hamming_text_view_output_label); - wrapper.append(&hamming_text_view_output_frame); + wrapper.append(input_code.get()); + wrapper.append(&action_components_wrapper); + wrapper.append(output_code.get()); } From e97b1b281dc4176bf81fc2ceca79b9f564980b7b Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 00:46:18 +0400 Subject: [PATCH 18/97] fix(fn): rewrite code with using a custom type of Error --- .../view_utils/signal_reduce_input_utils.rs | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/src/controller/view_utils/signal_reduce_input_utils.rs b/src/controller/view_utils/signal_reduce_input_utils.rs index 92537f5..fd138ab 100644 --- a/src/controller/view_utils/signal_reduce_input_utils.rs +++ b/src/controller/view_utils/signal_reduce_input_utils.rs @@ -1,28 +1,31 @@ use gtk4 as gtk; -use std::{num::ParseFloatError, str::FromStr}; +use std::str::FromStr; use gtk::{ prelude::{TextBufferExt, TextViewExt}, TextBuffer, }; -use crate::{model::models::SignalReduce, view::components::input::Input}; +use crate::{ + model::{models::SignalReduce, Error, Result}, + view::components::input::Input, +}; -pub fn get_error_message(error_instance: ParseFloatError) -> Option<&'static str> { - match error_instance.to_string().as_str() { +pub fn get_error_message(error: Error) -> Option<&'static str> { + match error.to_string().as_str() { "cannot parse float from empty string" => Some("Вы не ввели данные в поле/-я"), "invalid float literal" => Some("Вы ввели не корректные данные в поле/-я"), _ => None, } } -pub fn parse_fields(all_inputs: Vec) -> Result { - let mut values: [f64; 6] = [0f64; 6]; +pub fn parse_fields(all_inputs: Vec) -> Result { + let mut values: [f64; 6] = [0.0; 6]; for (i, input) in all_inputs.iter().enumerate() { let input_text_buffer: TextBuffer = input.clone().get_input().buffer(); - let try_extract_value = f64::from_str( + let extracted_value = f64::from_str( input_text_buffer .text( &input_text_buffer.start_iter(), @@ -31,14 +34,16 @@ pub fn parse_fields(all_inputs: Vec) -> Result values[i] = value, - Err(error) => return Err(error), - } + )?; + values[i] = extracted_value; } - Ok(SignalReduce( - values[0], values[1], values[2], values[3], values[4], values[5], - )) + Ok(SignalReduce { + length: values[0], + wire_resistance: values[1], + wire_capacity: values[2], + source_resistance: values[3], + source_voltage: values[4], + frequency: values[5], + }) } From cd6403fb32d9ca245fa5c9046cdc1bf85fedb227 Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 00:47:01 +0400 Subject: [PATCH 19/97] fix(component): component usage --- src/view/ui.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/view/ui.rs b/src/view/ui.rs index 1cdb992..27041dd 100644 --- a/src/view/ui.rs +++ b/src/view/ui.rs @@ -44,13 +44,12 @@ pub fn ui(application: &adw::Application) { ("Код Хэмминга", "Код Хэмминга", &hamming_code), ("Затухание сигнала", "Затухание сигнала", &signal_reducing), ]) - .build(5) - .get(); + .build(5); let application_box = Box::new(Orientation::Vertical, 0); - application_box.append(info_bar.clone().get()); - application_box.append(&pages); + application_box.append(info_bar.get()); + application_box.append(pages.get()); let window = ApplicationWindow::builder() .title("Комплексная программа для лаб. работ") From e9dbcb272ed9663f6e002232ea9912871b9b647b Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 00:50:52 +0400 Subject: [PATCH 20/97] fix(fn): use &str in the function arguments instead of &String and refactor function code with use &str --- .../view_utils/hamming_code_input_utils.rs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/controller/view_utils/hamming_code_input_utils.rs b/src/controller/view_utils/hamming_code_input_utils.rs index 03e7f69..2113fd0 100644 --- a/src/controller/view_utils/hamming_code_input_utils.rs +++ b/src/controller/view_utils/hamming_code_input_utils.rs @@ -23,19 +23,13 @@ pub fn start_hamming_algorithm(input: &TextView, output: &TextView, mode: bool) Ok(res) => output.buffer().set_text(res.trim_end()), Err(rej) => output.buffer().set_text(rej.as_str()), } + hamming(parsed_input, operation) } -pub fn check_correct_binary_code( - input: &String, - prepared_input: &String, - l: usize, -) -> (bool, bool) { - let first_condition: bool = input - .as_str() - .chars() - .all(|c| c == '1' || c == '0' || c == ' '); +pub fn check_correct_binary_code(input: &str, prepared_input: &str, l: usize) -> (bool, bool) { + let first_condition: bool = prepared_input.len() % l == 0; - let second_condition: bool = prepared_input.len() % l == 0; + let second_condition: bool = input.chars().all(|c| c == '1' || c == '0' || c == ' '); (first_condition, second_condition) } From ef3158e732a43658a0df2783dd8efed397c7faef Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 00:52:53 +0400 Subject: [PATCH 21/97] feat(imports): update imports --- .../model_utils/hamming_code_seven_four.rs | 3 ++- .../view_utils/hamming_code_input_utils.rs | 5 ++++- src/view/pages/signal_reducing.rs | 12 ++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/controller/model_utils/hamming_code_seven_four.rs b/src/controller/model_utils/hamming_code_seven_four.rs index 0efdc97..8aaf8a9 100644 --- a/src/controller/model_utils/hamming_code_seven_four.rs +++ b/src/controller/model_utils/hamming_code_seven_four.rs @@ -1,8 +1,9 @@ use std::collections::HashMap; +use std::sync::LazyLock; use crate::{ controller::view_utils::{hamming_code_input_utils::*, input_utils::*}, - model::models::*, + model::{models::*, Result}, }; static SYNDROMES: LazyLock> = LazyLock::new(|| { diff --git a/src/controller/view_utils/hamming_code_input_utils.rs b/src/controller/view_utils/hamming_code_input_utils.rs index 2113fd0..163ef5e 100644 --- a/src/controller/view_utils/hamming_code_input_utils.rs +++ b/src/controller/view_utils/hamming_code_input_utils.rs @@ -1,6 +1,9 @@ use gtk4 as gtk; -use crate::{model::models::*, model_utils::hamming_code_seven_four::*}; +use crate::{ + model::{models::*, Result}, + model_utils::hamming_code_seven_four::*, +}; use gtk::{prelude::*, *}; pub fn start_hamming_algorithm(input: &TextView, output: &TextView, mode: bool) { diff --git a/src/view/pages/signal_reducing.rs b/src/view/pages/signal_reducing.rs index d4bcabc..5c0c900 100644 --- a/src/view/pages/signal_reducing.rs +++ b/src/view/pages/signal_reducing.rs @@ -1,12 +1,8 @@ -use std::{cell::Cell, rc::Rc}; +use std::cell::Cell; +use std::rc::Rc; use crate::{ - event_handlers::button_event_handlers::BtnEventHandler, - model::{ - builder_traits::Product, - models::{EventHandler, SignalReduce}, - ResultValue, - }, + model::{builder_traits::Product, models::SignalReduce, Frequency}, model_utils::signal_reducer::{ coef_of_signal_reduce, full_resistance_of_capacitor, reactive_resistance_of_capacitor, voltage_from_signal_source, @@ -19,7 +15,7 @@ use crate::{ }; use gtk::{ - prelude::{BoxExt, Cast, CastNone, GridExt, ListItemExt}, + prelude::{BoxExt, ButtonExt, Cast, CastNone, GridExt, ListItemExt, ListModelExt}, Align, WrapMode, *, }; use gtk4 as gtk; From 2dc02ce79ea45d936ad0808e9a2c833964d9711d Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 01:04:34 +0400 Subject: [PATCH 22/97] fix(event): use builtin event handler instead custom --- src/view/components/info_bar.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/view/components/info_bar.rs b/src/view/components/info_bar.rs index 803365b..28ef0a8 100644 --- a/src/view/components/info_bar.rs +++ b/src/view/components/info_bar.rs @@ -110,10 +110,9 @@ impl InfoBarBuilder { let info_bar_to_close = info_bar.clone(); - EventHandler::new(info_bar_close_btn.clone(), move |_| { + info_bar_close_btn.connect_clicked(move |_| { info_bar_to_close.set_reveal_child(false); - }) - .on_click(); + }); &INFO_BAR_INSTANCE } From 09801147b9296b984f618e27379a47beba606b5d Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 01:05:36 +0400 Subject: [PATCH 23/97] fix(method): change trait method signature --- src/view/components/info_bar.rs | 4 ++-- src/view/components/input.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/view/components/info_bar.rs b/src/view/components/info_bar.rs index 28ef0a8..e0048d8 100644 --- a/src/view/components/info_bar.rs +++ b/src/view/components/info_bar.rs @@ -130,7 +130,7 @@ impl InfoBarBuilder { } } -impl Product for InfoBar { +impl Product for InfoBar { fn builder() -> InfoBarBuilder { InfoBarBuilder { label: Label::builder(), @@ -139,7 +139,7 @@ impl Product for InfoBar { } } - fn get(self) -> &'static Revealer { + fn get(&self) -> &'static Revealer { &INFO_BAR_INSTANCE.instance } } diff --git a/src/view/components/input.rs b/src/view/components/input.rs index 76a115a..fa1fc67 100644 --- a/src/view/components/input.rs +++ b/src/view/components/input.rs @@ -29,8 +29,8 @@ impl Product for Input { } } - fn get(self) -> Box { - self.component + fn get(&self) -> &Box { + &self.component } } From 2c331c4ed7333d10d59835e3c97047d4fbcf9aa6 Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 01:08:41 +0400 Subject: [PATCH 24/97] feat(component): add input_label and input_frame fields and methods for them --- src/view/components/input.rs | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/view/components/input.rs b/src/view/components/input.rs index fa1fc67..01935fd 100644 --- a/src/view/components/input.rs +++ b/src/view/components/input.rs @@ -5,10 +5,12 @@ use gtk::{prelude::*, *}; pub type InputLabel = String; -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct Input { component: Box, input: TextView, + input_label: Label, + input_frame: Frame, } pub struct InputBuilder { @@ -35,25 +37,33 @@ impl Product for Input { } impl Input { - pub fn get_input(self) -> TextView { - self.input + pub fn get_input(&self) -> &TextView { + &self.input + } + + pub fn get_frame(&self) -> &Frame { + &self.input_frame + } + + pub fn get_label(&self) -> &Label { + &self.input_label } } impl InputBuilder { - pub fn set_label(mut self, label: &str) -> Self { - self.label = String::from(label); + pub fn label(mut self, label: &str) -> Self { + self.label = label.into(); self } - pub fn set_align(mut self, align: Alignment) -> Self { + pub fn align(mut self, align: Alignment) -> Self { self.align = align; self } - pub fn set_margins(mut self, margin: MarginData) -> Self { + pub fn margins(mut self, margin: MarginData) -> Self { self.margins = margin; self @@ -62,7 +72,7 @@ impl InputBuilder { pub fn build(self, monospace: bool, wrap_mode: WrapMode, input_height: i32) -> Input { let input_component = Box::new(Orientation::Vertical, 0); - let input_label = Label::builder() + let text_view_label = Label::builder() .halign(self.align.horizontal) .valign(self.align.vertical) .set_margin(self.margins) @@ -81,12 +91,14 @@ impl InputBuilder { .set_margin(MarginData::MultipleMargin((0, 5, 0, 5))) .build(); - input_component.append(&input_label); + input_component.append(&text_view_label); input_component.append(&text_view_input_frame); Input { component: input_component, - input: text_view_input, + input: text_view_input.clone(), + input_frame: text_view_input_frame.clone(), + input_label: text_view_label.clone(), } } } From cad9823c83f049aa1b962f24d651538b8725630a Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 01:09:35 +0400 Subject: [PATCH 25/97] refactor: rewrite fn signature and remove match --- src/controller/view_utils/hamming_code_input_utils.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/controller/view_utils/hamming_code_input_utils.rs b/src/controller/view_utils/hamming_code_input_utils.rs index 163ef5e..18aeee7 100644 --- a/src/controller/view_utils/hamming_code_input_utils.rs +++ b/src/controller/view_utils/hamming_code_input_utils.rs @@ -6,7 +6,7 @@ use crate::{ }; use gtk::{prelude::*, *}; -pub fn start_hamming_algorithm(input: &TextView, output: &TextView, mode: bool) { +pub fn start_hamming_algorithm(input: &TextView, state: bool) -> Result { let (iter_start, iter_end) = input.buffer().bounds(); let parsed_input: String = input .buffer() @@ -16,16 +16,12 @@ pub fn start_hamming_algorithm(input: &TextView, output: &TextView, mode: bool) .parse() .unwrap(); - let operation = if mode { + let operation = if !state { HammingMode::Encrypt } else { HammingMode::Decrypt }; - match hamming(parsed_input, operation) { - Ok(res) => output.buffer().set_text(res.trim_end()), - Err(rej) => output.buffer().set_text(rej.as_str()), - } hamming(parsed_input, operation) } From 5a8a4b00ce54d572a3468708afbdf60301ccfcde Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 01:10:43 +0400 Subject: [PATCH 26/97] refactor: rewrite function logic with use custom Error type --- .../model_utils/hamming_code_seven_four.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/controller/model_utils/hamming_code_seven_four.rs b/src/controller/model_utils/hamming_code_seven_four.rs index 8aaf8a9..a53a4c6 100644 --- a/src/controller/model_utils/hamming_code_seven_four.rs +++ b/src/controller/model_utils/hamming_code_seven_four.rs @@ -18,27 +18,25 @@ static SYNDROMES: LazyLock> = LazyLock::new(| ]) }); -pub fn hamming(raw_input: String, mode: HammingMode) -> Result { +pub fn hamming(raw_input: String, mode: HammingMode) -> Result { let length_of_code: usize = mode.clone() as usize; let prepared_input: String = processing_input(&raw_input); - let (fc, sc): (bool, bool) = + let (first_condition, second_condition): (bool, bool) = check_correct_binary_code(&raw_input, &prepared_input, length_of_code); - if !fc || !sc { - Err("Ошибка. Проверьте корректность ввода.".to_string()) + if raw_input.is_empty() { + Err("Введите код.".into()) + } else if !first_condition || !second_condition { + Err("Проверьте корректность ввода.".into()) } else { - let mut data: String = String::new(); - let prepared_data: Vec = from_string_to_vec_bits(prepared_input); match mode { - HammingMode::Encrypt => hamming_encrypt_data(&prepared_data, &mut data, length_of_code), - HammingMode::Decrypt => hamming_decrypt_data(&prepared_data, &mut data, length_of_code), + HammingMode::Encrypt => Ok(hamming_encrypt_data(&prepared_data, length_of_code)), + HammingMode::Decrypt => Ok(hamming_decrypt_data(&prepared_data, length_of_code)), } - - Ok(data) } } From 78d52388f790903cb33b7fc77d29112fa7ca4437 Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 01:13:00 +0400 Subject: [PATCH 27/97] refactor: edit function signatures and rewrite a few code sections --- .../model_utils/hamming_code_seven_four.rs | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/controller/model_utils/hamming_code_seven_four.rs b/src/controller/model_utils/hamming_code_seven_four.rs index a53a4c6..59c4c53 100644 --- a/src/controller/model_utils/hamming_code_seven_four.rs +++ b/src/controller/model_utils/hamming_code_seven_four.rs @@ -40,8 +40,9 @@ pub fn hamming(raw_input: String, mode: HammingMode) -> Result { } } -pub fn hamming_encrypt_data(data: &Vec, result_string: &mut String, length_of_code: usize) { +pub fn hamming_encrypt_data(data: &[u8], length_of_code: usize) -> String { let mut i: usize = length_of_code; + let mut result = String::new(); while i <= data.len() { let data_bits: &[u8] = &data[i - length_of_code..i]; @@ -50,17 +51,23 @@ pub fn hamming_encrypt_data(data: &Vec, result_string: &mut String, length_o data_bits[0] ^ data_bits[2] ^ data_bits[3], data_bits[1] ^ data_bits[2] ^ data_bits[3], ); - result_string.push_str(&*format!( - "{check_bit_1}{}{check_bit_2}{}{check_bit_3}{}{} ", - data_bits[0], data_bits[1], data_bits[2], data_bits[3] - )); + + result.push_str( + format!( + "{check_bit_1}{}{check_bit_2}{}{check_bit_3}{}{} ", + data_bits[0], data_bits[1], data_bits[2], data_bits[3] + ) + .as_str(), + ); i += length_of_code; } + + result } -pub fn hamming_decrypt_data(data: &Vec, result_string: &mut String, length_of_code: usize) { +pub fn hamming_decrypt_data(data: &[u8], length_of_code: usize) -> String { let mut general_length: usize = length_of_code; - + let mut result = String::new(); let mut errors: String = String::new(); @@ -77,7 +84,7 @@ pub fn hamming_decrypt_data(data: &Vec, result_string: &mut String, length_o general_length += length_of_code; continue; } else { - let error_position: &usize = syndromes + let error_position: &usize = SYNDROMES .iter() .find(move |&(&_error_position, &error)| error == checked_bits) .unwrap() @@ -113,11 +120,11 @@ pub fn hamming_decrypt_data(data: &Vec, result_string: &mut String, length_o if !data.is_empty() { if errors.is_empty() { - result_string.push_str("Все коды корректны."); + result.push_str("Все коды корректны."); } else { - result_string.push_str(errors.as_str()); + result.push_str(errors.as_str()); } - } else { - result_string.push_str("Введите код для проверки.") } + + result } From 01f61e4286a06bb5d5fd18a9695d0ff6450de41d Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 01:14:26 +0400 Subject: [PATCH 28/97] feat(imports): update imports --- src/view/components/info_bar.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/view/components/info_bar.rs b/src/view/components/info_bar.rs index e0048d8..4b1e4fd 100644 --- a/src/view/components/info_bar.rs +++ b/src/view/components/info_bar.rs @@ -4,14 +4,11 @@ use std::{collections::VecDeque, sync::LazyLock}; use gtk::{ builders::{BoxBuilder, ButtonBuilder, LabelBuilder}, - prelude::{BoxExt, ObjectExt, WidgetExt}, + prelude::{BoxExt, ButtonExt, ObjectExt, WidgetExt}, Box, Button, Label, Revealer, RevealerTransitionType, }; -use crate::{ - event_handlers::button_event_handlers::BtnEventHandler, - model::{builder_traits::Product, models::EventHandler}, -}; +use crate::model::builder_traits::Product; use tokio::{ task::{spawn, JoinHandle}, From 0d2987a9686b168ba20de76f53422ff301fb1132 Mon Sep 17 00:00:00 2001 From: doryan Date: Sat, 10 Aug 2024 01:19:29 +0400 Subject: [PATCH 29/97] feat(section): add testing section --- src/view/pages/signal_reducing.rs | 101 +++++++++++++++--------------- 1 file changed, 50 insertions(+), 51 deletions(-) diff --git a/src/view/pages/signal_reducing.rs b/src/view/pages/signal_reducing.rs index 5c0c900..c7c9cd2 100644 --- a/src/view/pages/signal_reducing.rs +++ b/src/view/pages/signal_reducing.rs @@ -23,8 +23,6 @@ use gtk4 as gtk; pub fn signal_reducing_page(wrapper: &Box) { let values = Rc::new(Cell::new(SignalReduce::default())); - let last_query: Vec = Vec::new(); - let info_bar = InfoBar::get_instance(); let (input_height, monospace, input_wrapping): (i32, bool, WrapMode) = @@ -40,22 +38,15 @@ pub fn signal_reducing_page(wrapper: &Box) { vertical: Align::Fill, }; - let input_labels: [&str; 6] = [ - "l, м:", - "Rм, Ом:", - "Cм, пФ:", - "Vи, мВ", - "Rи, Ом:", - "f, мГц:", - ]; + let input_labels: [&str; 6] = ["l, м:", "Rм, Ом", "Cм, пФ:", "Rи, Ом:", "Vи, мВ", "f, мГц:"]; let all_inputs: Vec = input_labels .iter() .map(move |label| { Input::builder() - .set_label(label) - .set_margins(MarginData::EqualsMargin(5)) - .set_align(input_label_alignment) + .label(label) + .margins(MarginData::EqualsMargin(6)) + .align(input_label_alignment) .build(monospace, input_wrapping, input_height) }) .collect(); @@ -68,7 +59,7 @@ pub fn signal_reducing_page(wrapper: &Box) { } input_block.attach( - &elem.clone().get(), + elem.clone().get(), (id as i32) - (3 * row_position), row_position, 1, @@ -78,16 +69,24 @@ pub fn signal_reducing_page(wrapper: &Box) { let calculate_button = Button::builder().label("Расчитать").build(); - let result_table_headers_labels: [&str; 4] = ["f, МГц", "Xc, пФ", "Vп, мВ", "ζ"]; + let result_table_headers_labels: [&str; 4] = ["f, МГц", "Xc, Ом", "Vп, мВ", "ζ"]; - let model = gio::ListStore::new::(); + let model = gio::ListStore::new::(); + let model_for_events = model.clone(); - let cloned_model = model.clone(); + for number in (0..=100).step_by(5) { + if number == 0 { + model.append(&Frequency::new(1.0)); + } else if (number >= 70 && number % 10 == 0) || (number < 70 && number % 5 == 0) { + model.append(&Frequency::new(number as f64)); + } + } - let selection_model = SingleSelection::new(Some(model)); + let selection_model = NoSelection::new(Some(model)); let result_table = ColumnView::builder() .reorderable(true) + .show_row_separators(true) .model(&selection_model) .build(); @@ -108,7 +107,7 @@ pub fn signal_reducing_page(wrapper: &Box) { .downcast_ref::() .expect("Needs to be ListItem") .item() - .and_downcast::() + .and_downcast::() .expect("The item has to be an `IntegerObject`."); let cell_label = list_item @@ -118,38 +117,42 @@ pub fn signal_reducing_page(wrapper: &Box) { .and_downcast::