diff --git a/Cargo.lock b/Cargo.lock index 61af5f9..9e7d88d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.0.5" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" +checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" dependencies = [ "memchr", ] @@ -40,7 +40,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.37", ] [[package]] @@ -89,7 +89,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.33", + "syn 2.0.37", "which", ] @@ -128,9 +128,9 @@ checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "bytes" @@ -140,9 +140,9 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cairo-rs" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d859b656775a6b1dd078d3e5924884e6ea88aa649a7fdde03d5b2ec56ffcc10b" +checksum = "1c0466dfa8c0ee78deef390c274ad756801e0a6dbb86c5ef0924a298c5761c4d" dependencies = [ "bitflags 2.4.0", "cairo-sys-rs", @@ -154,9 +154,9 @@ dependencies = [ [[package]] name = "cairo-sys-rs" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd4d115132e01c0165e3bf5f56aedee8980b0b96ede4eb000b693c05a8adb8ff" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" dependencies = [ "glib-sys", "libc", @@ -263,7 +263,7 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.37", ] [[package]] @@ -459,7 +459,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.37", ] [[package]] @@ -520,9 +520,9 @@ dependencies = [ [[package]] name = "gdk4" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6982d9815ed6ac95b0467b189e81f29dea26d08a732926ec113e65744ed3f96c" +checksum = "7edb019ad581f8ecf8ea8e4baa6df7c483a95b5a59be3140be6a9c3b0c632af6" dependencies = [ "cairo-rs", "gdk-pixbuf", @@ -591,9 +591,9 @@ checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "gio" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7884cba6b1c5db1607d970cadf44b14a43913d42bc68766eea6a5e2fe0891524" +checksum = "57052f84e8e5999b258e8adf8f5f2af0ac69033864936b8b6838321db2f759b1" dependencies = [ "futures-channel", "futures-core", @@ -638,9 +638,9 @@ dependencies = [ [[package]] name = "glib" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331156127e8166dd815cf8d2db3a5beb492610c716c03ee6db4f2d07092af0a7" +checksum = "1c316afb01ce8067c5eaab1fc4f2cd47dc21ce7b6296358605e2ffab23ccbd19" dependencies = [ "bitflags 2.4.0", "futures-channel", @@ -661,16 +661,16 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "179643c50bf28d20d2f6eacd2531a88f2f5d9747dd0b86b8af1e8bb5dd0de3c0" +checksum = "f8da903822b136d42360518653fcf154455defc437d3e7a81475bf9a95ff1e47" dependencies = [ "heck", "proc-macro-crate", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.37", ] [[package]] @@ -725,9 +725,9 @@ dependencies = [ [[package]] name = "gsk4" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc25855255120f294d874acd6eaf4fbed7ce1cdc550e2d8415ea57fafbe816d5" +checksum = "0d958e351d2f210309b32d081c832d7de0aca0b077aa10d88336c6379bd01f7e" dependencies = [ "cairo-rs", "gdk4", @@ -740,9 +740,9 @@ dependencies = [ [[package]] name = "gsk4-sys" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ecf3a63bf1223d68f80f72cc896c4d8c80482fbce1c9a12c66d3de7290ee46" +checksum = "12bd9e3effea989f020e8f1ff3fa3b8c63ba93d43b899c11a118868853a56d55" dependencies = [ "cairo-sys-rs", "gdk4-sys", @@ -756,9 +756,9 @@ dependencies = [ [[package]] name = "gtk4" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3b095b26f2a2df70be1805d3590eeb9d7a05ecb5be9649b82defc72dc56228c" +checksum = "5aeb51aa3e9728575a053e1f43543cd9992ac2477e1b186ad824fd4adfb70842" dependencies = [ "cairo-rs", "field-offset", @@ -791,9 +791,9 @@ dependencies = [ [[package]] name = "gtk4-sys" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0bdde87c50317b4f355bcbb4a9c2c414ece1b7c824fb4ad4ba8f3bdb2c6603" +checksum = "54d8c4aa23638ce9faa2caf7e2a27d4a1295af2155c8e8d28c4d4eeca7a65eb8" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -847,9 +847,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] name = "home" @@ -1005,9 +1005,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libadwaita" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06444f4ca05a60693da6e9e2b591bd40a298e65a118a8d5e830771718b3e0253" +checksum = "2fe7e70c06507ed10a16cda707f358fbe60fe0dc237498f78c686ade92fd979c" dependencies = [ "gdk-pixbuf", "gdk4", @@ -1021,9 +1021,9 @@ dependencies = [ [[package]] name = "libadwaita-sys" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021cfe3d1fcfa82411765a791f7e9b32f35dd98ce88d2e3fa10e7320f5cc8ce7" +checksum = "5e10aaa38de1d53374f90deeb4535209adc40cc5dba37f9704724169bceec69a" dependencies = [ "gdk4-sys", "gio-sys", @@ -1352,7 +1352,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.37", ] [[package]] @@ -1439,7 +1439,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.37", ] [[package]] @@ -1482,7 +1482,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.33", + "syn 2.0.37", ] [[package]] @@ -1607,9 +1607,9 @@ checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "relm4" -version = "0.7.0-alpha.1" +version = "0.7.0-beta.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d307673e36bb450a4823d500d661f53e1622a685b330149c193b791687146b3f" +checksum = "0f324ac78fb652034ff63c392b3aabad02b4a04cd802e73555e0bff07a21e08b" dependencies = [ "async-trait", "flume", @@ -1625,9 +1625,9 @@ dependencies = [ [[package]] name = "relm4-components" -version = "0.7.0-alpha.1" +version = "0.7.0-beta.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfffa2b1c9e0f2c9a35602ebe9d55358728a3dd1a7e10ed1f2df0216e6b04634" +checksum = "5b28bfc632d7e26eea6481c52f4ef3f718155fe5bf962504c2a283620b38df0a" dependencies = [ "once_cell", "relm4", @@ -1636,13 +1636,13 @@ dependencies = [ [[package]] name = "relm4-macros" -version = "0.7.0-alpha.1" +version = "0.7.0-beta.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1892cdfb2df6c8bbe5a84451d3979125255e31437c0bfd14c81bde93ff0cf6" +checksum = "7cdf60cdb41e28131b6c0d830db742dc2b9ea311ef319f08cfac28567ec1d938" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.37", ] [[package]] @@ -1705,9 +1705,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.13" +version = "0.38.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7db8590df6dfcd144d22afd1b83b36c21a18d7cbc1dc4bb5295a8712e9eb662" +checksum = "747c788e9ce8e92b12cd485c49ddf90723550b654b32508f979b71a7b1ecda4f" dependencies = [ "bitflags 2.4.0", "errno", @@ -1762,9 +1762,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" [[package]] name = "serde" @@ -1783,14 +1783,14 @@ checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.37", ] [[package]] name = "serde_json" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc66a619ed80bf7a0f6b17dd063a84b88f6dea1813737cf469aef1d081142c2" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" dependencies = [ "itoa", "ryu", @@ -1841,9 +1841,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "socket2" @@ -1922,9 +1922,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.33" +version = "2.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9caece70c63bfba29ec2fed841a09851b14a235c60010fa4de58089b6c025668" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" dependencies = [ "proc-macro2", "quote", @@ -1986,7 +1986,7 @@ checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.37", ] [[package]] @@ -2032,9 +2032,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" dependencies = [ "bytes", "futures-core", @@ -2104,7 +2104,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.37", ] [[package]] @@ -2133,7 +2133,7 @@ checksum = "ca029746fbe0efda3298205de77bf759d7fef23ac97902641e0b49a623b0455f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.37", ] [[package]] @@ -2244,7 +2244,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.37", "wasm-bindgen-shared", ] @@ -2278,7 +2278,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.33", + "syn 2.0.37", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/Cargo.toml b/Cargo.toml index 066524d..0283528 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,8 +15,8 @@ gtk4 = { version = "0.7.2", features = [ "v4_10", ] } lazy_static = "1.4.0" -libadwaita = { version = "0.5.2", features = [ - "v1_3" +libadwaita = { version = "0.5.3", features = [ + "v1_4" ] } libmonado-rs = { git = "https://github.com/technobaboo/libmonado-rs", version = "0.1.0" } libusb = "0.3.0" @@ -25,7 +25,7 @@ nix = { version = "0.26.4", features = [ ] } phf = "0.11.2" phf_macros = "0.11.2" -relm4 = { version = "0.7.0-alpha.1", features = [ +relm4 = { version = "0.7.0-beta.1", features = [ "libadwaita" ] } relm4-components = "0.7.0-alpha.1" diff --git a/src/ui/app.rs b/src/ui/app.rs index 381d6c4..bdd2a81 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -73,6 +73,8 @@ pub struct App { #[tracker::do_not_track] debug_view: Controller, #[tracker::do_not_track] + split_view: Option, + #[tracker::do_not_track] about_dialog: Controller, #[tracker::do_not_track] build_window: Controller, @@ -258,21 +260,23 @@ impl SimpleComponent for App { adw::ApplicationWindow { set_title: Some(APP_NAME), set_default_size: (win_size[0], win_size[1]), + set_width_request: 390, gtk::Box { set_orientation: gtk::Orientation::Vertical, set_hexpand: true, set_vexpand: true, - gtk::Box { - set_orientation: gtk::Orientation::Horizontal, + #[name = "split_view"] + adw::OverlaySplitView { set_hexpand: true, set_vexpand: true, - model.main_view.widget(), - gtk::Separator { - set_orientation: gtk::Orientation::Vertical, - #[track = "model.changed(App::enable_debug_view())"] - set_visible: model.enable_debug_view, - }, - model.debug_view.widget(), + set_content: Some(model.main_view.widget()), + set_sidebar: Some(model.debug_view.widget()), + set_sidebar_position: gtk::PackType::End, + set_show_sidebar: model.config.debug_view_enabled, + set_sidebar_width_fraction: 1.0, + // stupid way to make sidebar hexpand + set_max_sidebar_width: 999999.9, + set_pin_sidebar: true, } }, connect_close_request[sender] => move |win| { @@ -365,9 +369,7 @@ impl SimpleComponent for App { self.set_enable_debug_view(val); self.config.debug_view_enabled = val; self.config.save(); - self.debug_view - .sender() - .emit(DebugViewMsg::EnableDebugViewChanged(val)); + self.split_view.clone().unwrap().set_show_sidebar(val); self.main_view .sender() .emit(MainViewMsg::EnableDebugViewChanged(val)); @@ -623,7 +625,7 @@ impl SimpleComponent for App { }); } - let model = App { + let mut model = App { application: init.application, app_win: root.clone(), inhibit_id: None, @@ -642,13 +644,12 @@ impl SimpleComponent for App { MainViewOutMsg::SaveProfile(p) => Msg::SaveProfile(p), MainViewOutMsg::OpenLibsurviveSetup => Msg::OpenLibsurviveSetup, }), - debug_view: DebugView::builder() - .launch(DebugViewInit { - enable_debug_view: config.debug_view_enabled, - }) - .forward(sender.input_sender(), |message| match message { + debug_view: DebugView::builder().launch(DebugViewInit {}).forward( + sender.input_sender(), + |message| match message { _ => Msg::ClockTicking, - }), + }, + ), about_dialog: AboutDialog::builder() .transient_for(root) .launch(()) @@ -663,6 +664,7 @@ impl SimpleComponent for App { .transient_for(root) .launch(()) .detach(), + split_view: None, setcap_confirm_dialog, enable_debug_view: config.debug_view_enabled, config, @@ -743,6 +745,8 @@ impl SimpleComponent for App { }); } + model.split_view = Some(widgets.split_view.clone()); + ComponentParts { model, widgets } } } diff --git a/src/ui/debug_view.rs b/src/ui/debug_view.rs index 9c78168..9ac0eb8 100644 --- a/src/ui/debug_view.rs +++ b/src/ui/debug_view.rs @@ -16,7 +16,6 @@ pub enum SearchDirection { pub enum DebugViewMsg { LogUpdated(Vec), ClearLog, - EnableDebugViewChanged(bool), FilterLog(SearchDirection), LogLevelChanged(LogLevel), } @@ -45,13 +44,9 @@ pub struct DebugView { search_mark: Option, #[tracker::do_not_track] log_level: LogLevel, - - enable_debug_view: bool, } -pub struct DebugViewInit { - pub enable_debug_view: bool, -} +pub struct DebugViewInit {} #[relm4::component(pub)] impl SimpleComponent for DebugView { @@ -64,34 +59,23 @@ impl SimpleComponent for DebugView { set_orientation: gtk::Orientation::Vertical, set_hexpand: true, set_vexpand: true, - #[track = "model.changed(DebugView::enable_debug_view())"] - set_visible: model.enable_debug_view, - gtk::WindowHandle { + adw::HeaderBar { set_hexpand: true, set_vexpand: false, - adw::HeaderBar { - #[wrap(Some)] - set_title_widget: title_label = >k::Label { - set_label: "Debug View", - add_css_class: "title", - }, - pack_end: search_toggle = >k::ToggleButton { - set_icon_name: "edit-find-symbolic", - set_tooltip_text: Some("Filter Log"), - }, - pack_start: log_level_dropdown = >k::DropDown::from_strings( - LogLevel::iter() - .map(|lvl| lvl.to_string()) - .collect::>() - .iter() - .map(|s| s.as_str()) - .collect::>() - .as_slice() - ), + add_css_class: "flat", + #[wrap(Some)] + set_title_widget: title_label = &adw::WindowTitle { + set_title: "Debug View", }, + pack_end: search_toggle = >k::ToggleButton { + set_icon_name: "edit-find-symbolic", + set_tooltip_text: Some("Filter Log"), + }, + pack_start: &log_level_dropdown, }, #[name(searchbar)] gtk::SearchBar { + set_margin_start: 1, set_hexpand: true, #[chain(flags(gtk::glib::BindingFlags::BIDIRECTIONAL).build())] bind_property: ("search-mode-enabled", &search_toggle, "active"), @@ -131,8 +115,10 @@ impl SimpleComponent for DebugView { gtk::ScrolledWindow { set_hexpand: true, set_vexpand: true, + add_css_class: "undershoot-top", #[name(textview)] sourceview5::View { + set_margin_start: 1, set_hexpand: true, set_vexpand: true, set_editable: false, @@ -227,21 +213,21 @@ impl SimpleComponent for DebugView { self.log = vec![]; self.textbuf.set_text(""); } - Self::Input::EnableDebugViewChanged(val) => self.set_enable_debug_view(val), } } fn init( - init: Self::Init, + _init: Self::Init, root: &Self::Root, sender: ComponentSender, ) -> ComponentParts { let textbuf = sourceview5::Buffer::builder() .highlight_syntax(false) .build(); - match &sourceview5::StyleSchemeManager::new().scheme("Adwaita-dark") { - Some(scheme) => textbuf.set_style_scheme(Some(scheme)), - None => {} + if let Some(scheme) = &sourceview5::StyleSchemeManager::new().scheme("Adwaita-dark") { + textbuf.set_style_scheme(Some(scheme)); + } else { + println!("gtksourceview style scheme not found") } let search_settings = sourceview5::SearchSettings::builder() .wrap_around(true) @@ -251,12 +237,36 @@ impl SimpleComponent for DebugView { .buffer(&textbuf) .settings(&search_settings) .build(); + + let log_level_dropdown = gtk::DropDown::from_strings( + LogLevel::iter() + .map(|lvl| lvl.to_string()) + .collect::>() + .iter() + .map(|s| s.as_str()) + .collect::>() + .as_slice(), + ); + if let Some(btn) = log_level_dropdown.first_child() { + btn.add_css_class("flat"); + } + { + withclones![sender]; + log_level_dropdown.connect_selected_notify(move |dd| { + sender.input(Self::Input::LogLevelChanged( + *LogLevel::iter() + .as_slice() + .get(dd.selected() as usize) + .unwrap(), + )); + }); + } + let mut model = Self { tracker: 0, log: vec![], textbuf, textview: None, - enable_debug_view: init.enable_debug_view, searchbar: None, search_entry: None, dropdown: None, @@ -271,23 +281,9 @@ impl SimpleComponent for DebugView { model.searchbar = Some(widgets.searchbar.clone()); model.search_entry = Some(widgets.search_entry.clone()); model.textview = Some(widgets.textview.clone()); - model.dropdown = Some(widgets.log_level_dropdown.clone()); + model.dropdown = Some(log_level_dropdown.clone()); model.scrolledwin = Some(widgets.scrolledwin.clone()); - { - withclones![sender]; - widgets - .log_level_dropdown - .connect_selected_notify(move |dd| { - sender.input(Self::Input::LogLevelChanged( - *LogLevel::iter() - .as_slice() - .get(dd.selected() as usize) - .unwrap(), - )); - }); - } - ComponentParts { model, widgets } } } diff --git a/src/ui/devices_box.rs b/src/ui/devices_box.rs index 7a33e3e..7acdf12 100644 --- a/src/ui/devices_box.rs +++ b/src/ui/devices_box.rs @@ -7,14 +7,14 @@ use crate::{ xr_devices::{XRDevice, XRDeviceType}, }; use adw::prelude::*; -use relm4::{factory::FactoryVecDeque, prelude::*, Sender}; +use relm4::{factory::AsyncFactoryVecDeque, prelude::*, Sender}; #[tracker::track] pub struct DevicesBox { devices: Vec, #[tracker::do_not_track] - device_rows: FactoryVecDeque, + device_rows: AsyncFactoryVecDeque, } #[derive(Debug)] @@ -53,10 +53,8 @@ impl SimpleComponent for DevicesBox { set_hexpand: true, set_vexpand: false, set_spacing: 12, - set_margin_top: 12, #[track = "model.changed(Self::devices())"] set_visible: !model.devices.is_empty(), - append: &devices_listbox, } } @@ -190,16 +188,12 @@ impl SimpleComponent for DevicesBox { let devices_listbox = gtk::ListBox::builder() .css_classes(["boxed-list"]) .selection_mode(gtk::SelectionMode::None) - .margin_start(12) - .margin_end(12) - .margin_top(12) - .margin_bottom(12) .build(); let model = Self { tracker: 0, devices: vec![], - device_rows: FactoryVecDeque::new(devices_listbox.clone(), sender.input_sender()), + device_rows: AsyncFactoryVecDeque::new(devices_listbox.clone(), sender.input_sender()), }; let widgets = view_output!(); diff --git a/src/ui/factories/device_row_factory.rs b/src/ui/factories/device_row_factory.rs index 5187bea..e90dd09 100644 --- a/src/ui/factories/device_row_factory.rs +++ b/src/ui/factories/device_row_factory.rs @@ -1,5 +1,5 @@ use adw::prelude::*; -use relm4::prelude::*; +use relm4::{factory::AsyncFactoryComponent, prelude::*, AsyncFactorySender}; use crate::{ ui::devices_box::DevicesBoxMsg, @@ -72,13 +72,12 @@ impl DeviceRowModelInit { } } -#[relm4::factory(pub)] -impl FactoryComponent for DeviceRowModel { +#[relm4::factory(async pub)] +impl AsyncFactoryComponent for DeviceRowModel { type Init = DeviceRowModelInit; type Input = (); type Output = (); type CommandOutput = (); - type Widgets = DeviceRowModelWidgets; type ParentInput = DevicesBoxMsg; type ParentWidget = gtk::ListBox; @@ -95,10 +94,10 @@ impl FactoryComponent for DeviceRowModel { fn init_widgets( &mut self, - _index: &Self::Index, + _index: &DynamicIndex, root: &Self::Root, _returned_widget: &::ReturnedWidget, - _sender: FactorySender, + _sender: AsyncFactorySender, ) -> Self::Widgets { let widgets = view_output!(); @@ -113,7 +112,11 @@ impl FactoryComponent for DeviceRowModel { widgets } - fn init_model(init: Self::Init, _index: &Self::Index, _sender: FactorySender) -> Self { + async fn init_model( + init: Self::Init, + _index: &DynamicIndex, + _sender: AsyncFactorySender, + ) -> Self { Self { title: init.title.unwrap_or_default(), subtitle: init.subtitle.unwrap_or_default(), diff --git a/src/ui/factories/env_var_row_factory.rs b/src/ui/factories/env_var_row_factory.rs index 0104a25..b22b1a2 100644 --- a/src/ui/factories/env_var_row_factory.rs +++ b/src/ui/factories/env_var_row_factory.rs @@ -1,6 +1,6 @@ use crate::ui::profile_editor::ProfileEditorMsg; use adw::prelude::*; -use relm4::prelude::*; +use relm4::{factory::AsyncFactoryComponent, prelude::*, AsyncFactorySender}; #[derive(Debug)] pub struct EnvVarModel { @@ -25,13 +25,12 @@ pub enum EnvVarModelOutMsg { Delete(String), } -#[relm4::factory(pub)] -impl FactoryComponent for EnvVarModel { +#[relm4::factory(async pub)] +impl AsyncFactoryComponent for EnvVarModel { type Init = EnvVarModelInit; type Input = EnvVarModelMsg; type Output = EnvVarModelOutMsg; type CommandOutput = (); - type Widgets = EnvVarModelWidgets; type ParentInput = ProfileEditorMsg; type ParentWidget = adw::PreferencesGroup; @@ -55,7 +54,7 @@ impl FactoryComponent for EnvVarModel { } } - fn update(&mut self, message: Self::Input, sender: FactorySender) { + async fn update(&mut self, message: Self::Input, sender: AsyncFactorySender) { match message { Self::Input::Changed(val) => { self.value = val.clone(); @@ -76,7 +75,11 @@ impl FactoryComponent for EnvVarModel { }) } - fn init_model(init: Self::Init, _index: &Self::Index, _sender: FactorySender) -> Self { + async fn init_model( + init: Self::Init, + _index: &DynamicIndex, + _sender: AsyncFactorySender, + ) -> Self { Self { name: init.name, value: init.value, diff --git a/src/ui/factories/tracker_role_group_factory.rs b/src/ui/factories/tracker_role_group_factory.rs index 3eed25c..aa2ad75 100644 --- a/src/ui/factories/tracker_role_group_factory.rs +++ b/src/ui/factories/tracker_role_group_factory.rs @@ -5,7 +5,7 @@ use crate::{ withclones, }; use adw::prelude::*; -use relm4::prelude::*; +use relm4::{factory::AsyncFactoryComponent, prelude::*, AsyncFactorySender}; #[derive(Debug)] pub struct TrackerRoleModel { @@ -30,13 +30,12 @@ pub enum TrackerRoleModelOutMsg { Delete(usize), } -#[relm4::factory(pub)] -impl FactoryComponent for TrackerRoleModel { +#[relm4::factory(async pub)] +impl AsyncFactoryComponent for TrackerRoleModel { type Init = TrackerRoleModelInit; type Input = TrackerRoleModelMsg; type Output = TrackerRoleModelOutMsg; type CommandOutput = (); - type Widgets = TrackerRoleModelWidgets; type ParentInput = FbtConfigEditorMsg; type ParentWidget = adw::PreferencesPage; @@ -90,7 +89,7 @@ impl FactoryComponent for TrackerRoleModel { }) } - fn update(&mut self, message: Self::Input, sender: FactorySender) { + async fn update(&mut self, message: Self::Input, sender: AsyncFactorySender) { match message { Self::Input::Changed(r) => { self.tracker_role = r; @@ -100,7 +99,11 @@ impl FactoryComponent for TrackerRoleModel { } } - fn init_model(init: Self::Init, _index: &Self::Index, _sender: FactorySender) -> Self { + async fn init_model( + init: Self::Init, + _index: &DynamicIndex, + _sender: AsyncFactorySender, + ) -> Self { Self { index: init.index, tracker_role: init.tracker_role.unwrap_or_else(|| TrackerRole::default()), diff --git a/src/ui/fbt_config_editor.rs b/src/ui/fbt_config_editor.rs index 70e6e90..c1cc169 100644 --- a/src/ui/fbt_config_editor.rs +++ b/src/ui/fbt_config_editor.rs @@ -7,7 +7,10 @@ use crate::{ withclones, }; use adw::prelude::*; -use relm4::{factory::FactoryVecDeque, prelude::*}; +use relm4::{ + factory::{AsyncFactoryVecDeque, FactoryVecDeque}, + prelude::*, +}; #[tracker::track] pub struct FbtConfigEditor { @@ -17,7 +20,7 @@ pub struct FbtConfigEditor { win: Option, #[tracker::do_not_track] - tracker_role_groups: FactoryVecDeque, + tracker_role_groups: AsyncFactoryVecDeque, } #[derive(Debug)] @@ -137,7 +140,7 @@ impl SimpleComponent for FbtConfigEditor { win: None, tracker: 0, monado_config_v0: get_monado_config_v0(), - tracker_role_groups: FactoryVecDeque::new(page, sender.input_sender()), + tracker_role_groups: AsyncFactoryVecDeque::new(page, sender.input_sender()), }; model.populate_tracker_roles(); diff --git a/src/ui/install_wivrn_box.rs b/src/ui/install_wivrn_box.rs index cd2e030..33ec27f 100644 --- a/src/ui/install_wivrn_box.rs +++ b/src/ui/install_wivrn_box.rs @@ -70,7 +70,6 @@ impl SimpleComponent for InstallWivrnBox { gtk::Box { set_orientation: gtk::Orientation::Vertical, set_spacing: 12, - set_margin_all: 12, add_css_class: "card", add_css_class: "padded", #[track = "model.changed(Self::selected_profile())"] diff --git a/src/ui/main_view.rs b/src/ui/main_view.rs index fa317c6..aab990d 100644 --- a/src/ui/main_view.rs +++ b/src/ui/main_view.rs @@ -123,37 +123,36 @@ impl SimpleComponent for MainView { } view! { - gtk::Box { - set_orientation: gtk::Orientation::Vertical, + // TODO: refactor with adw.toolbarview + adw::ToolbarView { + set_top_bar_style: adw::ToolbarStyle::Flat, + set_bottom_bar_style: adw::ToolbarStyle::Flat, #[track = "model.changed(Self::enable_debug_view())"] set_hexpand: !model.enable_debug_view, set_vexpand: true, set_size_request: (360, 350), - gtk::WindowHandle { + add_top_bar: top_bar = &adw::HeaderBar { set_hexpand: true, set_vexpand: false, - adw::HeaderBar { - #[wrap(Some)] - set_title_widget: title_label = >k::Label { - set_label: APP_NAME, - add_css_class: "title", - }, - pack_end: menu_btn = >k::MenuButton { - set_icon_name: "open-menu-symbolic", - set_menu_model: Some(&app_menu), - }, - #[track = "model.changed(Self::enable_debug_view())"] - set_show_end_title_buttons: !model.enable_debug_view, + #[wrap(Some)] + set_title_widget: title_label = &adw::WindowTitle { + set_title: APP_NAME, }, + pack_end: menu_btn = >k::MenuButton { + set_icon_name: "open-menu-symbolic", + set_menu_model: Some(&app_menu), + }, + #[track = "model.changed(Self::enable_debug_view())"] + set_show_end_title_buttons: !model.enable_debug_view, }, - gtk::ScrolledWindow { + #[wrap(Some)] + set_content: content = >k::ScrolledWindow { set_hscrollbar_policy: gtk::PolicyType::Never, set_hexpand: true, set_vexpand: true, gtk::Box { - set_spacing: 6, - set_margin_top: 12, - set_margin_bottom: 12, + set_spacing: 12, + set_margin_all: 12, set_orientation: gtk::Orientation::Vertical, gtk::Box { set_halign: gtk::Align::Center, @@ -195,7 +194,6 @@ impl SimpleComponent for MainView { set_hexpand: true, set_vexpand: false, set_spacing: 12, - set_margin_all: 12, add_css_class: "card", add_css_class: "padded", #[track = "model.changed(Self::selected_profile())"] @@ -229,7 +227,6 @@ impl SimpleComponent for MainView { set_hexpand: true, set_vexpand: false, set_spacing: 12, - set_margin_all: 12, add_css_class: "card", add_css_class: "padded", #[track = "model.changed(Self::selected_profile())"] @@ -252,7 +249,6 @@ impl SimpleComponent for MainView { set_hexpand: true, set_vexpand: false, set_spacing: 12, - set_margin_all: 12, add_css_class: "card", add_css_class: "padded", #[track = "model.changed(Self::selected_profile())"] @@ -335,7 +331,6 @@ impl SimpleComponent for MainView { set_hexpand: true, set_vexpand: false, set_spacing: 12, - set_margin_all: 12, add_css_class: "card", add_css_class: "padded", #[track = "model.changed(Self::selected_profile())"] @@ -371,15 +366,10 @@ impl SimpleComponent for MainView { }, } }, - gtk::Separator { - set_orientation: gtk::Orientation::Horizontal, - set_hexpand: true, - }, - gtk::Box { + add_bottom_bar: bottom_bar = >k::Box { set_orientation: gtk::Orientation::Horizontal, set_spacing: 12, - add_css_class: "toolbar", - add_css_class: "view", + set_margin_all: 12, gtk::Box { set_orientation: gtk::Orientation::Horizontal, add_css_class: "linked", diff --git a/src/ui/profile_editor.rs b/src/ui/profile_editor.rs index 4723886..57fd93c 100644 --- a/src/ui/profile_editor.rs +++ b/src/ui/profile_editor.rs @@ -9,7 +9,7 @@ use crate::{ withclones, }; use adw::prelude::*; -use relm4::{factory::FactoryVecDeque, prelude::*}; +use relm4::{factory::AsyncFactoryVecDeque, prelude::*}; use std::{cell::RefCell, rc::Rc}; #[tracker::track] @@ -18,7 +18,7 @@ pub struct ProfileEditor { #[tracker::do_not_track] win: Option, #[tracker::do_not_track] - env_rows: FactoryVecDeque, + env_rows: AsyncFactoryVecDeque, } #[derive(Debug)] @@ -360,7 +360,7 @@ impl SimpleComponent for ProfileEditor { .env_rows .guard() .iter() - .position(|evr| evr.name == name); + .position(|evr| evr.unwrap().name == name); if let Some(p) = pos { self.env_rows.guard().remove(p); } @@ -415,7 +415,7 @@ impl SimpleComponent for ProfileEditor { let mut model = Self { profile, win: None, - env_rows: FactoryVecDeque::new( + env_rows: AsyncFactoryVecDeque::new( adw::PreferencesGroup::builder() .title("Environment Variables") .description(env_var_descriptions_as_paragraph()) diff --git a/src/ui/steam_launch_options_box.rs b/src/ui/steam_launch_options_box.rs index 661021a..40c58c8 100644 --- a/src/ui/steam_launch_options_box.rs +++ b/src/ui/steam_launch_options_box.rs @@ -27,7 +27,6 @@ impl SimpleComponent for SteamLaunchOptionsBox { set_hexpand: true, set_vexpand: false, set_spacing: 12, - set_margin_all: 12, add_css_class: "card", add_css_class: "padded", #[track = "model.changed(Self::xrservice_active())"]