email-client

A gtk4 Email Client
git clone git://archive.git.mtrnord.blog/erooster-mail/email-client.git
Log | Files | Refs | LICENSE

commit 0811cefca0af60456f082f3fcbd49734bc4e1d7a
parent 7a6cc84448327a6f5510200cfc5ae13825c11d34
Author: MTRNord <mtrnord1@gmail.com>
Date:   Tue, 21 Feb 2023 02:38:15 +0100

Move main_view to extra component and change about dialog to use relm4 features

Diffstat:
MCargo.lock | 108++++++++++++++++++++++++++++++++++++++++---------------------------------------
MCargo.toml | 8++++----
Msrc/main.rs | 142+++++--------------------------------------------------------------------------
Asrc/main_view.rs | 162+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/main_view/about_dialog.rs | 45+++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 275 insertions(+), 190 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -199,9 +199,9 @@ dependencies = [ [[package]] name = "cairo-rs" -version = "0.16.7" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3125b15ec28b84c238f6f476c6034016a5f6cc0221cb514ca46c532139fc97d" +checksum = "a8af54f5d48af1226928adc1f57edd22f5df1349e7da1fc96ae15cf43db0e871" dependencies = [ "bitflags", "cairo-sys-rs", @@ -213,9 +213,9 @@ dependencies = [ [[package]] name = "cairo-sys-rs" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c48f4af05fabdcfa9658178e1326efa061853f040ce7d72e33af6885196f421" +checksum = "f55382a01d30e5e53f185eee269124f5e21ab526595b872751278dfbb463594e" dependencies = [ "glib-sys", "libc", @@ -631,22 +631,23 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.16.7" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3578c60dee9d029ad86593ed88cb40f35c1b83360e12498d055022385dd9a05" +checksum = "b023fbe0c6b407bd3d9805d107d9800da3829dc5a676653210f1d5f16d7f59bf" dependencies = [ "bitflags", "gdk-pixbuf-sys", "gio", "glib", "libc", + "once_cell", ] [[package]] name = "gdk-pixbuf-sys" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3092cf797a5f1210479ea38070d9ae8a5b8e9f8f1be9f32f4643c529c7d70016" +checksum = "7b41bd2b44ed49d99277d3925652a163038bd5ed943ec9809338ffb2f4391e3b" dependencies = [ "gio-sys", "glib-sys", @@ -657,9 +658,9 @@ dependencies = [ [[package]] name = "gdk4" -version = "0.5.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2181330ebf9d091f8ea7fed6877f7adc92114128592e1fdaeb1da28e0d01e9" +checksum = "6e4887e17b6926db51f1e538d871a8b1f5ceb5dfa3bd0034dc42ec355b390d8f" dependencies = [ "bitflags", "cairo-rs", @@ -673,9 +674,9 @@ dependencies = [ [[package]] name = "gdk4-sys" -version = "0.5.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de55cb49432901fe2b3534177fa06844665b9b0911d85d8601a8d8b88b7791db" +checksum = "f4993c019bf03d18137c00ddafb2b23e73f7cbb45ae244f52af2542a3f4a9452" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -736,9 +737,9 @@ dependencies = [ [[package]] name = "gio" -version = "0.16.7" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a1c84b4534a290a29160ef5c6eff2a9c95833111472e824fc5cb78b513dd092" +checksum = "1981edf8679d2f2c8ec3120015867f45aa0a1c2d5e3e129ca2f7dda174d3d2a9" dependencies = [ "bitflags", "futures-channel", @@ -756,9 +757,9 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9b693b8e39d042a95547fc258a7b07349b1f0b48f4b2fa3108ba3c51c0b5229" +checksum = "b5d3076ecb86c8c3a672c9843d6232b3a344fb81d304d0ba1ac64b23343efa46" dependencies = [ "glib-sys", "gobject-sys", @@ -769,9 +770,9 @@ dependencies = [ [[package]] name = "glib" -version = "0.16.7" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd4df61a866ed7259d6189b8bcb1464989a77f1d85d25d002279bbe9dd38b2f" +checksum = "91b429154ec5943185aeeaf79e646297567b6a056965f1e89da2657a0e23255b" dependencies = [ "bitflags", "futures-channel", @@ -784,6 +785,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", + "memchr", "once_cell", "smallvec", "thiserror", @@ -797,9 +799,9 @@ checksum = "8f8480c9ba9cc06aa8d5baf446037f8dc237bee127e9b62080c4db7e293d8ea0" [[package]] name = "glib-macros" -version = "0.16.3" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e084807350b01348b6d9dbabb724d1a0bb987f47a2c85de200e98e12e30733bf" +checksum = "9bc80ac951300ca288dd9ab3863743c37a608fb0e5ca12863495640ec6b781ab" dependencies = [ "anyhow", "heck 0.4.1", @@ -812,9 +814,9 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61a4f46316d06bfa33a7ac22df6f0524c8be58e3db2d9ca99ccb1f357b62a65" +checksum = "9ddcb73fa8236277bedadaaadb76aef49c85d66340f83bece244f46c2d4f0e01" dependencies = [ "libc", "system-deps", @@ -828,9 +830,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "gobject-sys" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3520bb9c07ae2a12c7f2fbb24d4efc11231c8146a86956413fb1a79bb760a0f1" +checksum = "9a0155d388840c77d61b033b66ef4f9bc7f4133d83df83572d6b4fb234a3be7d" dependencies = [ "glib-sys", "libc", @@ -839,9 +841,9 @@ dependencies = [ [[package]] name = "graphene-rs" -version = "0.16.3" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ecb4d347e6d09820df3bdfd89a74a8eec07753a06bb92a3aac3ad31d04447b" +checksum = "21cf11565bb0e4dfc2f99d4775b6c329f0d40a2cff9c0066214d31a0e1b46256" dependencies = [ "glib", "graphene-sys", @@ -850,9 +852,9 @@ dependencies = [ [[package]] name = "graphene-sys" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9aa82337d3972b4eafdea71e607c23f47be6f27f749aab613f1ad8ddbe6dcd6" +checksum = "cf80a4849a8d9565410a8fec6fc3678e9c617f4ac7be182ca55ab75016e07af9" dependencies = [ "glib-sys", "libc", @@ -862,9 +864,9 @@ dependencies = [ [[package]] name = "gsk4" -version = "0.5.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591239f5c52ca803b222124ac9c47f230cd180cee9b114c4d672e4a94b74f491" +checksum = "432f981e4ea9f0739a5731d8a649acb794a3a729d2254e559ce7d613b17caf95" dependencies = [ "bitflags", "cairo-rs", @@ -878,9 +880,9 @@ dependencies = [ [[package]] name = "gsk4-sys" -version = "0.5.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "195a63f0be42529f98c3eb3bae0decfd0428ba2cc683b3e20ced88f340904ec5" +checksum = "096cb59175b0915ebf69c05a45263c0c989bd8537b8f2169912d0de644ba6a76" dependencies = [ "cairo-sys-rs", "gdk4-sys", @@ -894,9 +896,9 @@ dependencies = [ [[package]] name = "gtk4" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd89dba65def483a233dc4fdd3f3dab01576e3d83f80f6c9303ebe421661855e" +checksum = "73421200ad9c3919d0720779b345b05d31a6ce9998e74fc27012f12580822e46" dependencies = [ "bitflags", "cairo-rs", @@ -917,9 +919,9 @@ dependencies = [ [[package]] name = "gtk4-macros" -version = "0.5.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832687a415d9d8bc11fe9c17dda1bf13ee262c41b995dd4df1d1cce33cead405" +checksum = "db4676c4f90d8b010e88cb4558f61f47d76d6f6b8e6f6b89e62640f443907f61" dependencies = [ "anyhow", "proc-macro-crate", @@ -931,9 +933,9 @@ dependencies = [ [[package]] name = "gtk4-sys" -version = "0.5.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e370564e3fdacff7cffc99f7366b6a4689feb44e819d3ccee598a9a215b71605" +checksum = "e13cf3bc9559f71963c957eb639060b643e1276ae47b892ef6091d5bc15c3e1b" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -1400,13 +1402,14 @@ dependencies = [ [[package]] name = "notify-rust" -version = "4.7.1" +version = "4.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260208751689b605138bb55ab6af43ad75f628619a7e0b818d63bf6629e59467" +checksum = "2bfa211d18e360f08e36c364308f394b5eb23a6629150690e109a916dc6f610e" dependencies = [ "dbus", "image", "lazy_static", + "log", "mac-notification-sys", "tauri-winrt-notification", ] @@ -1504,9 +1507,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pango" -version = "0.16.5" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdff66b271861037b89d028656184059e03b0b6ccb36003820be19f7200b1e94" +checksum = "243c048be90312220fb3bd578176eed8290568274a93c95040289d39349384bc" dependencies = [ "bitflags", "gio", @@ -1518,9 +1521,9 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e134909a9a293e04d2cc31928aa95679c5e4df954d0b85483159bd20d8f047f" +checksum = "4293d0f0b5525eb5c24734d30b0ed02cd02aa734f216883f376b54de49625de8" dependencies = [ "glib-sys", "gobject-sys", @@ -1811,9 +1814,9 @@ checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] name = "relm4" -version = "0.5.0" +version = "0.6.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67d336a752868ac036d994ff051a02dc8c1b53173980e5fce16dfb580f458d95" +checksum = "d4f9d809af9a847705ceb586c24f3d0c1032c81dd37b55d304e893a12631d62a" dependencies = [ "async-trait", "flume", @@ -1828,11 +1831,10 @@ dependencies = [ [[package]] name = "relm4-components" -version = "0.5.0" +version = "0.6.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5903c6260efa42847589a938429eaf6925d0cf9b07776895cba0f768bb5b4c8f" +checksum = "e8fb418dd994637f7f055fabb146ace2cb8d58e5128b0e1344b09cbabc11fe6f" dependencies = [ - "log", "once_cell", "relm4", "tracker", @@ -1840,9 +1842,9 @@ dependencies = [ [[package]] name = "relm4-macros" -version = "0.5.0" +version = "0.6.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf49f6588ecac70fd6163110ed7e294195cc5c9c82efb7b3150b9ca87486a72" +checksum = "25c11642516610c5b688b1284964d87cad7d2338c3c0ec94434bed6a895f27b9" dependencies = [ "proc-macro2", "quote", @@ -2004,9 +2006,9 @@ checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg", ] diff --git a/Cargo.toml b/Cargo.toml @@ -6,10 +6,10 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -gtk = { version = "0.5", package = "gtk4", features = ["v4_8"] } -relm4 = "0.5.0" -relm4-macros = "0.5.0" -relm4-components = "0.5.0" +gtk = { version = "0.6", package = "gtk4", features = ["v4_8"] } +relm4 = "0.6.0-alpha.1" +relm4-macros = "0.6.0-alpha.1" +relm4-components = "0.6.0-alpha.1" tracing-subscriber = "0.3.16" tracing = "0.1.37" tokio = { version = "1.25.0", features = ["full"] } diff --git a/src/main.rs b/src/main.rs @@ -1,32 +1,16 @@ -use folder_view::MailboxesView; use gtk::{gdk::Display, gio, prelude::*, Application}; -use relm4::actions::{RelmAction, RelmActionGroup}; +use main_view::MainView; use relm4::prelude::*; use std::convert::identity; -use crate::folder_view::{FolderInit, MailboxInit, MailboxesInit}; - #[rustfmt::skip] mod config; mod folder_view; - -pub fn show_about_dialog(window: &gtk::ApplicationWindow) { - gtk::show_about_dialog( - Some(window), - &[ - ("authors", &vec![String::from("MTRNord")]), - ("website-label", &"Github repository"), - ("website", &"https://github.com/erooster-mail/email-client"), - ("comments", &"A Rust GTK4 email client"), - ("copyright", &"Licensed AGPL-v3.0-or-later license"), - ("program-name", &"Email Client"), - ], - ); -} +mod main_view; struct App { - mailboxes: Controller<MailboxesView>, + main_view: Controller<MainView>, } #[derive(Debug)] @@ -45,87 +29,7 @@ impl Component for App { set_title: Some("Email"), set_default_size: (1280, 720), - gtk::Box { - set_orientation: gtk::Orientation::Vertical, - set_halign: gtk::Align::Fill, - set_valign: gtk::Align::Fill, - - gtk::Box { - set_halign: gtk::Align::Fill, - set_valign: gtk::Align::Baseline, - - gtk::Button { - set_margin_all: 8, - set_label: "Sync" - }, - - gtk::Button { - set_margin_all: 8, - set_label: "Write" - }, - - gtk::MenuButton { - set_margin_all: 8, - set_halign: gtk::Align::End, - set_hexpand: true, - set_icon_name: "settings-symbolic", - #[wrap(Some)] - set_popover = &gtk::PopoverMenu::from_model(Some(&settings_menu)) {}, - } - }, - - gtk::Separator {}, - - gtk::Box { - set_orientation: gtk::Orientation::Horizontal, - set_halign: gtk::Align::Fill, - set_valign: gtk::Align::Fill, - set_vexpand: true, - set_hexpand: true, - - gtk::Paned { - set_position: 200, - set_shrink_start_child: false, - set_hexpand: true, - #[wrap(Some)] - set_start_child = model.mailboxes.widget(), - - #[wrap(Some)] - set_end_child = &gtk::Paned { - set_orientation: gtk::Orientation::Vertical, - set_halign: gtk::Align::Fill, - set_valign: gtk::Align::Fill, - set_shrink_start_child: false, - set_position: 300, - - #[wrap(Some)] - set_start_child = &gtk::ScrolledWindow { - set_hscrollbar_policy: gtk::PolicyType::Never, - - }, - #[wrap(Some)] - set_end_child = &gtk::Box { - add_css_class: "main", - set_margin_all: 8, - set_halign: gtk::Align::Start, - set_valign: gtk::Align::Start, - set_spacing: 8, - - gtk::Label { - set_label: "test2" - } - } - } - }, - } - }, - } - } - - // Settingsmenu - menu! { - settings_menu: { - "About" => AboutAction, + model.main_view.widget(), } } @@ -134,37 +38,12 @@ impl Component for App { root: &Self::Root, sender: ComponentSender<Self>, ) -> ComponentParts<Self> { - let mailboxes = MailboxesView::builder() - .launch(MailboxesInit { - mailboxes: vec![MailboxInit { - icon_name: String::from("mail-symbolic"), - mailbox_name: String::from("dont@dox.myself"), - folders: vec![FolderInit { - icon_name: String::from("inbox-symbolic"), - folder_name: String::from("Inbox"), - depth: 1, - }], - }], - }) - .forward(sender.input_sender(), identity); - let model = App { mailboxes }; - let widgets = view_output!(); - - let group = RelmActionGroup::<WindowActionGroup>::new(); - let weak_main_window = widgets.main_window.downgrade(); - let action: RelmAction<AboutAction> = { - RelmAction::new_stateless(move |_| { - let main_window = weak_main_window.upgrade().unwrap(); - show_about_dialog(&main_window); - }) + let model = App { + main_view: MainView::builder() + .launch(()) + .forward(sender.input_sender(), identity), }; - group.add_action(&action); - - let actions = group.into_action_group(); - widgets - .main_window - .insert_action_group("win", Some(&actions)); - + let widgets = view_output!(); ComponentParts { model, widgets } } } @@ -207,6 +86,3 @@ fn load_css() { ); } } - -relm4::new_action_group!(WindowActionGroup, "win"); -relm4::new_stateless_action!(AboutAction, WindowActionGroup, "about"); diff --git a/src/main_view.rs b/src/main_view.rs @@ -0,0 +1,162 @@ +use crate::folder_view::{FolderInit, MailboxInit, MailboxesInit, MailboxesView}; +use gtk::prelude::*; +use relm4::actions::{RelmAction, RelmActionGroup}; +use relm4::prelude::*; +use std::convert::identity; + +use self::about_dialog::AboutWindow; + +mod about_dialog; + +pub struct MainView { + mailboxes: Controller<MailboxesView>, + about_view: Controller<AboutWindow>, +} + +#[derive(Debug)] +pub enum Msg {} + +#[relm4::component(pub)] +impl Component for MainView { + type Init = (); + type Input = (); + type Output = (); + type CommandOutput = Msg; + + view! { + #[root] + main_window = gtk::Box { + set_orientation: gtk::Orientation::Vertical, + set_halign: gtk::Align::Fill, + set_valign: gtk::Align::Fill, + + gtk::Box { + set_halign: gtk::Align::Fill, + set_valign: gtk::Align::Baseline, + + gtk::Button { + set_margin_all: 8, + set_label: "Sync" + }, + + gtk::Button { + set_margin_all: 8, + set_label: "Write" + }, + + gtk::MenuButton { + set_margin_all: 8, + set_halign: gtk::Align::End, + set_hexpand: true, + set_icon_name: "settings-symbolic", + #[wrap(Some)] + set_popover = &gtk::PopoverMenu::from_model(Some(&settings_menu)) {}, + } + }, + + gtk::Separator {}, + + gtk::Box { + set_orientation: gtk::Orientation::Horizontal, + set_halign: gtk::Align::Fill, + set_valign: gtk::Align::Fill, + set_vexpand: true, + set_hexpand: true, + + gtk::Paned { + set_position: 200, + set_shrink_start_child: false, + set_shrink_end_child: false, + set_hexpand: true, + #[wrap(Some)] + set_start_child = model.mailboxes.widget(), + + #[wrap(Some)] + set_end_child = &gtk::Paned { + set_orientation: gtk::Orientation::Vertical, + set_halign: gtk::Align::Fill, + set_valign: gtk::Align::Fill, + set_shrink_start_child: false, + set_shrink_end_child: false, + set_position: 300, + + #[wrap(Some)] + set_start_child = &gtk::ScrolledWindow { + set_hscrollbar_policy: gtk::PolicyType::Never, + + }, + #[wrap(Some)] + set_end_child = &gtk::Box { + add_css_class: "main", + set_margin_all: 8, + set_halign: gtk::Align::Start, + set_valign: gtk::Align::Start, + set_spacing: 8, + + gtk::Label { + set_label: "test2" + } + } + } + }, + } + } + } + + // Settingsmenu + menu! { + settings_menu: { + "About" => AboutAction, + } + } + + fn init( + _: Self::Init, + root: &Self::Root, + sender: ComponentSender<Self>, + ) -> ComponentParts<Self> { + let mailboxes = MailboxesView::builder() + .launch(MailboxesInit { + mailboxes: vec![MailboxInit { + icon_name: String::from("mail-symbolic"), + mailbox_name: String::from("dont@dox.myself"), + folders: vec![FolderInit { + icon_name: String::from("inbox-symbolic"), + folder_name: String::from("Inbox"), + depth: 1, + }], + }], + }) + .forward(sender.input_sender(), identity); + + let about_view = AboutWindow::builder() + .transient_for(root) + .launch(()) + .detach(); + + let model = MainView { + mailboxes, + about_view, + }; + let widgets = view_output!(); + + let group = RelmActionGroup::<WindowActionGroup>::new(); + let action: RelmAction<AboutAction> = { + let sender = model.about_view.sender().clone(); + RelmAction::new_stateless(move |_| { + sender.send(()).unwrap(); + }) + }; + group.add_action(&action); + + let actions = group.into_action_group(); + widgets + .main_window + .insert_action_group("win", Some(&actions)); + + ComponentParts { model, widgets } + } +} + +relm4::new_action_group!(WindowActionGroup, "win"); +relm4::new_stateless_action!(AboutAction, WindowActionGroup, "about"); diff --git a/src/main_view/about_dialog.rs b/src/main_view/about_dialog.rs @@ -0,0 +1,45 @@ +use crate::config::{APP_ID, VERSION}; +use gtk::prelude::GtkWindowExt; +use relm4::*; + +pub struct AboutWindow {} + +impl SimpleComponent for AboutWindow { + type Init = (); + type Widgets = gtk::AboutDialog; + type Input = (); + type Output = (); + type Root = gtk::AboutDialog; + + fn init_root() -> Self::Root { + gtk::AboutDialog::builder() + .logo_icon_name(APP_ID) + .license_type(gtk::License::Agpl30) + .version(VERSION) + .modal(true) + .authors(vec!["MTRNord"]) + .artists(vec!["MTRNord"]) + .comments("A Rust GTK4 email client") + .website_label("Github repository") + .website("https://github.com/erooster-mail/email-client") + .copyright("Licensed AGPL-v3.0-or-later license") + .program_name("Email Client") + .build() + } + + fn init( + _: Self::Init, + root: &Self::Root, + _sender: ComponentSender<Self>, + ) -> ComponentParts<Self> { + let model = Self {}; + + let widgets = root.clone(); + + ComponentParts { model, widgets } + } + + fn update_view(&self, dialog: &mut Self::Widgets, _sender: ComponentSender<Self>) { + dialog.present(); + } +}