Add components to theme-less regions

This commit is contained in:
Manuel Cillero 2023-07-22 01:47:43 +02:00
parent 025dcd9b17
commit 84bd5f631a
7 changed files with 56 additions and 41 deletions

View file

@ -53,18 +53,14 @@ impl PackComponents {
pack pack
} }
pub(crate) fn merge(one: Option<&PackComponents>, other: Option<&PackComponents>) -> Self { pub(crate) fn merge(packs: &[Option<&PackComponents>]) -> Self {
if let Some(one) = one { let mut pack = PackComponents::default();
let mut components = one.0.clone(); for p in packs {
if let Some(other) = other { if let Some(p) = p {
components.append(&mut other.0.clone()); pack.0.append(&mut p.0.clone());
} }
PackComponents(components)
} else if let Some(other) = other {
PackComponents(other.0.clone())
} else {
PackComponents::default()
} }
pack
} }
// PackComponents BUILDER. // PackComponents BUILDER.

View file

@ -27,8 +27,8 @@ pub fn register_modules(app: ModuleRef) {
// List of modules to enable. // List of modules to enable.
let mut list: Vec<ModuleRef> = Vec::new(); let mut list: Vec<ModuleRef> = Vec::new();
// Enable basic theme. // Enable default theme.
add_to_enabled(&mut list, &crate::core::theme::Basic); add_to_enabled(&mut list, &crate::core::theme::DefaultTheme);
// Enable application modules. // Enable application modules.
add_to_enabled(&mut list, app); add_to_enabled(&mut list, app);

View file

@ -2,10 +2,10 @@ mod definition;
pub use definition::{ThemeRef, ThemeTrait}; pub use definition::{ThemeRef, ThemeTrait};
mod regions; mod regions;
pub use regions::add_component_to;
pub(crate) use regions::ComponentsRegions; pub(crate) use regions::ComponentsRegions;
pub use regions::{add_component_in, Region};
mod basic; mod default;
pub(crate) use basic::Basic; pub use default::DefaultTheme;
pub(crate) mod all; pub(crate) mod all;

View file

@ -13,7 +13,7 @@ pub static THEMES: LazyStatic<RwLock<Vec<ThemeRef>>> = LazyStatic::new(|| RwLock
pub static THEME: LazyStatic<ThemeRef> = pub static THEME: LazyStatic<ThemeRef> =
LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) { LazyStatic::new(|| match theme_by_single_name(&config::SETTINGS.app.theme) {
Some(theme) => theme, Some(theme) => theme,
None => &crate::core::theme::Basic, None => &crate::core::theme::DefaultTheme,
}); });
// THEME BY NAME *********************************************************************************** // THEME BY NAME ***********************************************************************************

View file

@ -6,19 +6,19 @@ use crate::response::page::Page;
use crate::service; use crate::service;
use crate::{create_handle, serve_static_files, static_files, Handle}; use crate::{create_handle, serve_static_files, static_files, Handle};
create_handle!(THEME_BASIC); create_handle!(THEME_DEFAULT);
static_files!(theme); static_files!(theme);
pub struct Basic; pub struct DefaultTheme;
impl ModuleTrait for Basic { impl ModuleTrait for DefaultTheme {
fn handle(&self) -> Handle { fn handle(&self) -> Handle {
THEME_BASIC THEME_DEFAULT
} }
fn theme(&self) -> Option<ThemeRef> { fn theme(&self) -> Option<ThemeRef> {
Some(&Basic) Some(&DefaultTheme)
} }
fn configure_service(&self, cfg: &mut service::web::ServiceConfig) { fn configure_service(&self, cfg: &mut service::web::ServiceConfig) {
@ -26,7 +26,7 @@ impl ModuleTrait for Basic {
} }
} }
impl ThemeTrait for Basic { impl ThemeTrait for DefaultTheme {
fn before_prepare_body(&self, page: &mut Page) { fn before_prepare_body(&self, page: &mut Page) {
page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico"))) page.alter_favicon(Some(Favicon::new().with_icon("/theme/favicon.ico")))
.alter_context(ContextOp::AddStyleSheet( .alter_context(ContextOp::AddStyleSheet(

View file

@ -1,12 +1,16 @@
use crate::core::component::{ComponentRef, PackComponents, PackOp}; use crate::core::component::{ComponentRef, PackComponents, PackOp};
use crate::LazyStatic; use crate::core::theme::ThemeRef;
use crate::{Handle, LazyStatic};
use std::collections::HashMap; use std::collections::HashMap;
use std::sync::RwLock; use std::sync::RwLock;
static THEME_REGIONS: LazyStatic<RwLock<HashMap<&'static str, ComponentsRegions>>> = static THEME_REGIONS: LazyStatic<RwLock<HashMap<Handle, ComponentsRegions>>> =
LazyStatic::new(|| RwLock::new(HashMap::new())); LazyStatic::new(|| RwLock::new(HashMap::new()));
static COMMON_REGIONS: LazyStatic<RwLock<ComponentsRegions>> =
LazyStatic::new(|| RwLock::new(ComponentsRegions::new()));
#[derive(Default)] #[derive(Default)]
pub struct ComponentsRegions(HashMap<&'static str, PackComponents>); pub struct ComponentsRegions(HashMap<&'static str, PackComponents>);
@ -15,7 +19,13 @@ impl ComponentsRegions {
ComponentsRegions::default() ComponentsRegions::default()
} }
pub fn add_to(&mut self, region: &'static str, cref: ComponentRef) { pub fn new_with(region: &'static str, cref: ComponentRef) -> Self {
let mut regions = ComponentsRegions::new();
regions.add_in(region, cref);
regions
}
pub fn add_in(&mut self, region: &'static str, cref: ComponentRef) {
if let Some(region) = self.0.get_mut(region) { if let Some(region) = self.0.get_mut(region) {
region.alter(PackOp::Add, cref); region.alter(PackOp::Add, cref);
} else { } else {
@ -23,24 +33,33 @@ impl ComponentsRegions {
} }
} }
pub fn get_extended_pack(&self, theme: &str, region: &str) -> PackComponents { pub fn get_pack(&self, theme: ThemeRef, region: &str) -> PackComponents {
if let Some(hm_theme) = THEME_REGIONS.read().unwrap().get(theme) { let common = COMMON_REGIONS.read().unwrap();
PackComponents::merge(self.0.get(region), hm_theme.0.get(region)) if let Some(hm) = THEME_REGIONS.read().unwrap().get(&theme.handle()) {
PackComponents::merge(&[common.0.get(region), self.0.get(region), hm.0.get(region)])
} else { } else {
PackComponents::merge(self.0.get(region), None) PackComponents::merge(&[common.0.get(region), self.0.get(region)])
} }
} }
} }
pub fn add_component_to(theme: &'static str, region: &'static str, cref: ComponentRef) { pub enum Region {
let mut hm = THEME_REGIONS.write().unwrap(); Named(&'static str),
if let Some(hm_theme) = hm.get_mut(theme) { OfTheme(ThemeRef, &'static str),
hm_theme.add_to(region, cref); }
pub fn add_component_in(region: Region, cref: ComponentRef) {
match region {
Region::Named(name) => {
COMMON_REGIONS.write().unwrap().add_in(name, cref);
}
Region::OfTheme(theme, region) => {
let mut regions = THEME_REGIONS.write().unwrap();
if let Some(hm) = regions.get_mut(&theme.handle()) {
hm.add_in(region, cref);
} else { } else {
hm.insert(theme, { regions.insert(theme.handle(), ComponentsRegions::new_with(region, cref));
let mut regions = ComponentsRegions::new(); }
regions.add_to(region, cref); }
regions
});
} }
} }

View file

@ -90,7 +90,7 @@ impl Page {
#[fn_builder] #[fn_builder]
pub fn alter_in(&mut self, region: &'static str, component: impl ComponentTrait) -> &mut Self { pub fn alter_in(&mut self, region: &'static str, component: impl ComponentTrait) -> &mut Self {
self.regions.add_to(region, ComponentRef::to(component)); self.regions.add_in(region, ComponentRef::to(component));
self self
} }
@ -173,7 +173,7 @@ impl Page {
pub fn prepare_region(&mut self, region: &str) -> Option<Markup> { pub fn prepare_region(&mut self, region: &str) -> Option<Markup> {
let render = self let render = self
.regions .regions
.get_extended_pack(self.context.theme().single_name(), region) .get_pack(self.context.theme(), region)
.prepare(self.context()); .prepare(self.context());
if render.is_empty() { if render.is_empty() {
None None