feat: add important site info to its dialog

This commit is contained in:
Bnyro 2023-08-07 17:24:17 +02:00
parent a0720eddcd
commit 355a3da2fa
1 changed files with 70 additions and 3 deletions

View File

@ -1,14 +1,18 @@
use crate::components::loading_indicator::LoadingIndicator; use crate::{components::loading_indicator::LoadingIndicator, util::get_web_image_msg};
use gtk::prelude::*; use gtk::prelude::*;
use lemmy_api_common::site::GetSiteResponse; use lemmy_api_common::site::GetSiteResponse;
use relm4::prelude::*; use relm4::prelude::*;
use relm4_components::web_image::WebImage;
use crate::api; use crate::api;
use crate::util::markdown_to_pango_markup;
pub struct SiteInfo { pub struct SiteInfo {
visible: bool, visible: bool,
loading: bool, loading: bool,
site_info: GetSiteResponse, site_info: GetSiteResponse,
admin_list: String,
banner: Controller<WebImage>,
} }
#[derive(Debug)] #[derive(Debug)]
@ -35,17 +39,68 @@ impl SimpleComponent for SiteInfo {
gtk::Inhibit(false) gtk::Inhibit(false)
}, },
gtk::Box { gtk::ScrolledWindow {
set_size_request: (700, 400),
match model.loading { match model.loading {
true => gtk::Box { true => gtk::Box {
#[template] #[template]
LoadingIndicator, LoadingIndicator,
} }
false => gtk::Box { false => gtk::Box {
set_orientation: gtk::Orientation::Vertical,
set_spacing: 5,
set_margin_all: 15,
gtk::Label {
set_text: &format!("{} v{}", model.site_info.site_view.site.name, model.site_info.version),
set_wrap: true,
},
#[local_ref]
banner -> gtk::Box {
#[watch]
set_visible: model.site_info.site_view.site.banner.is_some(),
set_height_request: 300,
},
gtk::Label {
#[watch]
set_label: &markdown_to_pango_markup(model.site_info.site_view.site.description.clone().unwrap_or("".to_string())),
set_use_markup: true,
#[watch]
set_visible: model.site_info.site_view.site.description.is_some(),
set_wrap: true,
},
gtk::Label {
set_margin_top: 10,
#[watch]
set_label: &markdown_to_pango_markup(model.site_info.site_view.site.sidebar.clone().unwrap_or("".to_string())),
set_use_markup: true,
#[watch]
set_visible: model.site_info.site_view.site.description.is_some(),
set_wrap: true,
},
gtk::Label {
set_margin_top: 10,
#[watch]
set_text: &format!("{} users, {} posts, {} communities, {} comments",
model.site_info.site_view.counts.users, model.site_info.site_view.counts.posts,
model.site_info.site_view.counts.communities, model.site_info.site_view.counts.comments),
set_wrap: true,
},
gtk::Label {
set_margin_top: 5,
#[watch]
set_text: &format!("Admins: {}", model.admin_list),
set_wrap: true,
}
} }
} }
}, }
} }
} }
@ -54,11 +109,15 @@ impl SimpleComponent for SiteInfo {
root: &Self::Root, root: &Self::Root,
sender: ComponentSender<Self>, sender: ComponentSender<Self>,
) -> ComponentParts<Self> { ) -> ComponentParts<Self> {
let banner = WebImage::builder().launch("".to_string()).detach();
let model = Self { let model = Self {
visible: false, visible: false,
loading: true, loading: true,
site_info: api::site::default_site_info(), site_info: api::site::default_site_info(),
admin_list: String::from(""),
banner,
}; };
let banner = model.banner.widget();
let widgets = view_output!(); let widgets = view_output!();
ComponentParts { model, widgets } ComponentParts { model, widgets }
} }
@ -79,7 +138,15 @@ impl SimpleComponent for SiteInfo {
}); });
} }
SiteInfoInput::Update(site_info) => { SiteInfoInput::Update(site_info) => {
let banner_url = site_info.site_view.site.banner.clone();
self.admin_list = site_info
.admins
.iter()
.map(|admin| admin.person.name.clone())
.collect::<Vec<String>>()
.join(", ");
self.site_info = site_info; self.site_info = site_info;
self.banner.emit(get_web_image_msg(banner_url));
self.loading = false; self.loading = false;
} }
SiteInfoInput::Hide => { SiteInfoInput::Hide => {