diff --git a/src/base/theme/basic.rs b/src/base/theme/basic.rs index 6dfcd2e5..8a0c94e5 100644 --- a/src/base/theme/basic.rs +++ b/src/base/theme/basic.rs @@ -14,17 +14,19 @@ impl PackageTrait for Basic { impl ThemeTrait for Basic { fn after_prepare_body(&self, page: &mut Page) { - page.set_favicon(Some(Favicon::new().with_icon("/base/favicon.ico"))) - .set_assets(AssetsOp::AddStyleSheet( - StyleSheet::from("/base/css/normalize.min.css") - .with_version("8.0.1") - .with_weight(-90), - )) - .set_assets(AssetsOp::AddBaseAssets) - .set_assets(AssetsOp::AddStyleSheet( - StyleSheet::from("/base/css/basic.css") - .with_version("0.0.1") - .with_weight(-90), - )); + page.set_assets(AssetsOp::SetFavicon( + Some(Favicon::new().with_icon("/base/favicon.ico")), + )) + .set_assets(AssetsOp::AddStyleSheet( + StyleSheet::from("/base/css/normalize.min.css") + .with_version("8.0.1") + .with_weight(-90), + )) + .set_assets(AssetsOp::AddBaseAssets) + .set_assets(AssetsOp::AddStyleSheet( + StyleSheet::from("/base/css/basic.css") + .with_version("0.0.1") + .with_weight(-90), + )); } } diff --git a/src/base/theme/chassis.rs b/src/base/theme/chassis.rs index 62a5fb76..94353e42 100644 --- a/src/base/theme/chassis.rs +++ b/src/base/theme/chassis.rs @@ -14,17 +14,19 @@ impl PackageTrait for Chassis { impl ThemeTrait for Chassis { fn after_prepare_body(&self, page: &mut Page) { - page.set_favicon(Some(Favicon::new().with_icon("/base/favicon.ico"))) - .set_assets(AssetsOp::AddStyleSheet( - StyleSheet::from("/base/css/normalize.min.css") - .with_version("8.0.1") - .with_weight(-90), - )) - .set_assets(AssetsOp::AddBaseAssets) - .set_assets(AssetsOp::AddStyleSheet( - StyleSheet::from("/base/css/chassis.css") - .with_version("0.0.1") - .with_weight(-90), - )); + page.set_assets(AssetsOp::SetFavicon( + Some(Favicon::new().with_icon("/base/favicon.ico")), + )) + .set_assets(AssetsOp::AddStyleSheet( + StyleSheet::from("/base/css/normalize.min.css") + .with_version("8.0.1") + .with_weight(-90), + )) + .set_assets(AssetsOp::AddBaseAssets) + .set_assets(AssetsOp::AddStyleSheet( + StyleSheet::from("/base/css/chassis.css") + .with_version("0.0.1") + .with_weight(-90), + )); } } diff --git a/src/base/theme/inception.rs b/src/base/theme/inception.rs index 9577c594..4d493c02 100644 --- a/src/base/theme/inception.rs +++ b/src/base/theme/inception.rs @@ -14,17 +14,19 @@ impl PackageTrait for Inception { impl ThemeTrait for Inception { fn after_prepare_body(&self, page: &mut Page) { - page.set_favicon(Some(Favicon::new().with_icon("/base/favicon.ico"))) - .set_assets(AssetsOp::AddStyleSheet( - StyleSheet::from("/base/css/normalize.min.css") - .with_version("8.0.1") - .with_weight(-90), - )) - .set_assets(AssetsOp::AddBaseAssets) - .set_assets(AssetsOp::AddStyleSheet( - StyleSheet::from("/base/css/inception.css") - .with_version("0.0.1") - .with_weight(-90), - )); + page.set_assets(AssetsOp::SetFavicon( + Some(Favicon::new().with_icon("/base/favicon.ico")), + )) + .set_assets(AssetsOp::AddStyleSheet( + StyleSheet::from("/base/css/normalize.min.css") + .with_version("8.0.1") + .with_weight(-90), + )) + .set_assets(AssetsOp::AddBaseAssets) + .set_assets(AssetsOp::AddStyleSheet( + StyleSheet::from("/base/css/inception.css") + .with_version("0.0.1") + .with_weight(-90), + )); } } diff --git a/src/core/component/context.rs b/src/core/component/context.rs index 277c20a3..32183ec8 100644 --- a/src/core/component/context.rs +++ b/src/core/component/context.rs @@ -4,7 +4,7 @@ use crate::core::component::AnyOp; use crate::core::theme::all::{theme_by_short_name, THEME_DEFAULT}; use crate::core::theme::{ComponentsInRegions, ThemeRef}; use crate::html::{html, Markup}; -use crate::html::{Assets, JavaScript, StyleSheet}; +use crate::html::{Assets, Favicon, JavaScript, StyleSheet}; use crate::locale::{LanguageIdentifier, LANGID_DEFAULT}; use crate::service::HttpRequest; use crate::util::TypeInfo; @@ -19,6 +19,9 @@ pub enum AssetsOp { LangId(&'static LanguageIdentifier), Theme(&'static str), Layout(&'static str), + // Favicon. + SetFavicon(Option), + SetFaviconIfNone(Favicon), // Stylesheets. AddStyleSheet(StyleSheet), RemoveStyleSheet(&'static str), @@ -52,6 +55,7 @@ pub struct Context { langid : &'static LanguageIdentifier, theme : ThemeRef, layout : &'static str, + favicon : Option, stylesheet: Assets, javascript: Assets, regions : ComponentsInRegions, @@ -67,6 +71,7 @@ impl Context { langid : &LANGID_DEFAULT, theme : *THEME_DEFAULT, layout : "default", + favicon : None, stylesheet: Assets::::new(), javascript: Assets::::new(), regions : ComponentsInRegions::default(), @@ -75,7 +80,6 @@ impl Context { } } - #[rustfmt::skip] pub fn set_assets(&mut self, op: AssetsOp) -> &mut Self { match op { AssetsOp::LangId(langid) => { @@ -87,16 +91,33 @@ impl Context { AssetsOp::Layout(layout) => { self.layout = layout; } - + // Favicon. + AssetsOp::SetFavicon(favicon) => { + self.favicon = favicon; + } + AssetsOp::SetFaviconIfNone(icon) => { + if self.favicon.is_none() { + self.favicon = Some(icon); + } + } // Stylesheets. - AssetsOp::AddStyleSheet(css) => { self.stylesheet.add(css); } - AssetsOp::RemoveStyleSheet(path) => { self.stylesheet.remove(path); } + AssetsOp::AddStyleSheet(css) => { + self.stylesheet.add(css); + } + AssetsOp::RemoveStyleSheet(path) => { + self.stylesheet.remove(path); + } // JavaScripts. - AssetsOp::AddJavaScript(js) => { self.javascript.add(js); } - AssetsOp::RemoveJavaScript(path) => { self.javascript.remove(path); } - + AssetsOp::AddJavaScript(js) => { + self.javascript.add(js); + } + AssetsOp::RemoveJavaScript(path) => { + self.javascript.remove(path); + } // Add assets to properly use base components. - AssetsOp::AddBaseAssets => { add_base_assets(self); } + AssetsOp::AddBaseAssets => { + add_base_assets(self); + } } self } @@ -144,6 +165,9 @@ impl Context { pub(crate) fn prepare_assets(&mut self) -> Markup { html! { + @if let Some(favicon) = &self.favicon { + (favicon.prepare()) + } (self.stylesheet.prepare()) (self.javascript.prepare()) } diff --git a/src/core/theme/definition.rs b/src/core/theme/definition.rs index e3f3a733..8d7a3911 100644 --- a/src/core/theme/definition.rs +++ b/src/core/theme/definition.rs @@ -1,5 +1,5 @@ use crate::base::component::*; -use crate::core::component::{ComponentBase, ComponentTrait}; +use crate::core::component::{AssetsOp, ComponentBase, ComponentTrait}; use crate::core::package::PackageTrait; use crate::html::{html, Favicon, PrepareMarkup}; use crate::locale::L10n; @@ -70,9 +70,9 @@ pub trait ThemeTrait: PackageTrait + Send + Sync { } fn after_prepare_body(&self, page: &mut Page) { - if page.favicon().is_none() { - page.set_favicon(Some(Favicon::new().with_icon("/base/favicon.ico"))); - } + page.set_assets(AssetsOp::SetFaviconIfNone( + Favicon::new().with_icon("/base/favicon.ico"), + )); } fn prepare_head(&self, page: &mut Page) -> PrepareMarkup { @@ -101,10 +101,6 @@ pub trait ThemeTrait: PackageTrait + Send + Sync { meta property=(property) content=(content) {} } - @if let Some(favicon) = page.favicon() { - (favicon.prepare()) - } - (page.context().prepare_assets()) } }) diff --git a/src/html.rs b/src/html.rs index 163ebf4f..fbe75750 100644 --- a/src/html.rs +++ b/src/html.rs @@ -4,13 +4,11 @@ mod maud; pub use maud::{html, html_private, Markup, PreEscaped, DOCTYPE}; mod assets; +pub use assets::favicon::Favicon; pub use assets::javascript::JavaScript; pub use assets::stylesheet::{StyleSheet, TargetMedia}; pub(crate) use assets::Assets; -mod favicon; -pub use favicon::Favicon; - mod opt_id; pub use opt_id::OptionId; diff --git a/src/html/assets.rs b/src/html/assets.rs index 7a89937f..4c8f27ce 100644 --- a/src/html/assets.rs +++ b/src/html/assets.rs @@ -1,3 +1,4 @@ +pub mod favicon; pub mod javascript; pub mod stylesheet; diff --git a/src/html/favicon.rs b/src/html/assets/favicon.rs similarity index 100% rename from src/html/favicon.rs rename to src/html/assets/favicon.rs diff --git a/src/response/page.rs b/src/response/page.rs index 7de5d373..c3e268b5 100644 --- a/src/response/page.rs +++ b/src/response/page.rs @@ -7,7 +7,7 @@ use crate::base::action; use crate::core::component::{AnyComponent, AnyOp, ComponentTrait}; use crate::core::component::{AssetsOp, Context}; use crate::fn_builder; -use crate::html::{html, Favicon, Markup, DOCTYPE}; +use crate::html::{html, Markup, DOCTYPE}; use crate::html::{ClassesOp, OptionClasses, OptionId, OptionTranslated}; use crate::locale::L10n; use crate::service::HttpRequest; @@ -20,7 +20,6 @@ pub struct Page { description : OptionTranslated, metadata : Vec<(&'static str, &'static str)>, properties : Vec<(&'static str, &'static str)>, - favicon : Option, context : Context, body_id : OptionId, body_classes: OptionClasses, @@ -35,7 +34,6 @@ impl Page { description : OptionTranslated::default(), metadata : Vec::default(), properties : Vec::default(), - favicon : None, context : Context::new(request), body_id : OptionId::default(), body_classes: OptionClasses::default(), @@ -69,12 +67,6 @@ impl Page { self } - #[fn_builder] - pub fn set_favicon(&mut self, favicon: Option) -> &mut Self { - self.favicon = favicon; - self - } - #[fn_builder] pub fn set_assets(&mut self, op: AssetsOp) -> &mut Self { self.context.set_assets(op); @@ -145,10 +137,6 @@ impl Page { &self.properties } - pub fn favicon(&self) -> &Option { - &self.favicon - } - pub fn context(&mut self) -> &mut Context { &mut self.context }