✏️ [pagetop] Mejor uso de traits en módulos/temas

This commit is contained in:
Manuel Cillero 2023-02-03 14:31:18 +01:00
parent 9372edb526
commit ce4a97b18f
4 changed files with 13 additions and 22 deletions

View file

@ -83,7 +83,7 @@ fn add_to_enabled(list: &mut Vec<ModuleStaticRef>, module: ModuleStaticRef) {
pub fn register_themes() {
for m in ENABLED_MODULES.read().unwrap().iter() {
theme::all::register_theme(m.handle(), m.theme());
theme::all::register_theme(m.theme());
}
}

View file

@ -1,4 +1,4 @@
mod definition;
pub use definition::{BaseTheme, ThemeStaticRef, ThemeTrait};
pub use definition::{ThemeStaticRef, ThemeTrait};
pub(crate) mod all;

View file

@ -1,31 +1,32 @@
use super::ThemeStaticRef;
use crate::util::Handle;
use crate::{trace, LazyStatic};
use std::sync::RwLock;
// Temas registrados.
static THEMES: LazyStatic<RwLock<Vec<(Handle, ThemeStaticRef)>>> =
static THEMES: LazyStatic<RwLock<Vec<ThemeStaticRef>>> =
LazyStatic::new(|| RwLock::new(Vec::new()));
pub fn register_theme(handle: Handle, theme: Option<ThemeStaticRef>) {
pub fn register_theme(theme: Option<ThemeStaticRef>) {
if let Some(theme) = theme {
let handle = theme.handle();
let mut registered_themes = THEMES.write().unwrap();
if !registered_themes.iter().any(|t| t.0 == handle) {
if !registered_themes.iter().any(|t| t.handle() == handle) {
trace::debug!("Registering theme \"{}\"", theme.single_name());
registered_themes.push((handle, theme));
registered_themes.push(theme);
}
}
}
pub fn theme_by_single_name(single_name: &str) -> Option<ThemeStaticRef> {
let single_name = single_name.to_lowercase();
match THEMES
.write()
.read()
.unwrap()
.iter()
.find(|t| t.1.single_name().to_lowercase() == single_name.to_lowercase())
.find(|t| t.single_name().to_lowercase() == single_name)
{
Some((_, theme)) => Some(*theme),
Some(theme) => Some(*theme),
_ => None,
}
}

View file

@ -1,18 +1,14 @@
use crate::base::component::{Container, Html};
use crate::core::component::{ComponentTrait, RenderContext};
use crate::core::module::ModuleTrait;
use crate::html::{html, Favicon, Markup};
use crate::response::page::Page;
use crate::util::single_type_name;
use crate::{concat_string, config};
pub type ThemeStaticRef = &'static dyn ThemeTrait;
pub trait BaseTheme {
fn single_name(&self) -> &'static str;
}
/// Los temas deben implementar este "trait".
pub trait ThemeTrait: BaseTheme + Send + Sync {
pub trait ThemeTrait: ModuleTrait + Send + Sync {
#[allow(unused_variables)]
fn before_render_page(&self, page: &mut Page) {
if page.favicon().is_none() {
@ -139,9 +135,3 @@ pub trait ThemeTrait: BaseTheme + Send + Sync {
}))
}
}
impl<T: ?Sized + ThemeTrait> BaseTheme for T {
fn single_name(&self) -> &'static str {
single_type_name::<Self>()
}
}