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:
| M | Cargo.lock | | | 108 | ++++++++++++++++++++++++++++++++++++++++--------------------------------------- |
| M | Cargo.toml | | | 8 | ++++---- |
| M | src/main.rs | | | 142 | +++++-------------------------------------------------------------------------- |
| A | src/main_view.rs | | | 162 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/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: >k::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 = >k::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 = >k::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 = >k::ScrolledWindow {
- set_hscrollbar_policy: gtk::PolicyType::Never,
-
- },
- #[wrap(Some)]
- set_end_child = >k::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 = >k::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 = >k::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 = >k::ScrolledWindow {
+ set_hscrollbar_policy: gtk::PolicyType::Never,
+
+ },
+ #[wrap(Some)]
+ set_end_child = >k::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();
+ }
+}