feat: add important site info to its dialog
This commit is contained in:
parent
a0720eddcd
commit
355a3da2fa
|
@ -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 => {
|
||||||
|
|
Loading…
Reference in New Issue