Add new helper trait for components' classes

This commit is contained in:
Manuel Cillero 2023-11-19 00:20:38 +01:00
parent ed495121dd
commit 04286f1875
18 changed files with 294 additions and 341 deletions

View file

@ -84,162 +84,96 @@ impl ThemeTrait for Bootsier {
fn before_prepare_component(&self, component: &mut dyn ComponentTrait, _cx: &mut Context) { fn before_prepare_component(&self, component: &mut dyn ComponentTrait, _cx: &mut Context) {
match component.handle() { match component.handle() {
COMPONENT_BASE_ICON => { COMPONENT_BASE_ICON => {
if let Some(icon) = component_as_mut::<Icon>(component) { if let Some(i) = component_as_mut::<Icon>(component) {
match icon.font_size() { match i.font_size() {
FontSize::ExtraLarge => { FontSize::ExtraLarge => {
icon.alter_classes( i.replace_classes(i.font_size().to_string(), "fs-1");
ClassesOp::Replace(icon.font_size().to_string()),
"fs-1",
);
} }
FontSize::XxLarge => { FontSize::XxLarge => {
icon.alter_classes( i.replace_classes(i.font_size().to_string(), "fs-2");
ClassesOp::Replace(icon.font_size().to_string()),
"fs-2",
);
} }
FontSize::XLarge => { FontSize::XLarge => {
icon.alter_classes( i.replace_classes(i.font_size().to_string(), "fs-3");
ClassesOp::Replace(icon.font_size().to_string()),
"fs-3",
);
} }
FontSize::Large => { FontSize::Large => {
icon.alter_classes( i.replace_classes(i.font_size().to_string(), "fs-4");
ClassesOp::Replace(icon.font_size().to_string()),
"fs-4",
);
} }
FontSize::Medium => { FontSize::Medium => {
icon.alter_classes( i.replace_classes(i.font_size().to_string(), "fs-5");
ClassesOp::Replace(icon.font_size().to_string()),
"fs-5",
);
} }
_ => {} _ => {}
}; };
} }
} }
COMPONENT_BASE_BUTTON => { COMPONENT_BASE_BUTTON => {
if let Some(button) = component_as_mut::<Button>(component) { if let Some(b) = component_as_mut::<Button>(component) {
match button.font_size() { match b.font_size() {
FontSize::ExtraLarge => { FontSize::ExtraLarge => {
button.alter_classes( b.replace_classes(b.font_size().to_string(), "fs-1");
ClassesOp::Replace(button.font_size().to_string()),
"fs-1",
);
} }
FontSize::XxLarge => { FontSize::XxLarge => {
button.alter_classes( b.replace_classes(b.font_size().to_string(), "fs-2");
ClassesOp::Replace(button.font_size().to_string()),
"fs-2",
);
} }
FontSize::XLarge => { FontSize::XLarge => {
button.alter_classes( b.replace_classes(b.font_size().to_string(), "fs-3");
ClassesOp::Replace(button.font_size().to_string()),
"fs-3",
);
} }
FontSize::Large => { FontSize::Large => {
button.alter_classes( b.replace_classes(b.font_size().to_string(), "fs-4");
ClassesOp::Replace(button.font_size().to_string()),
"fs-4",
);
} }
FontSize::Medium => { FontSize::Medium => {
button.alter_classes( b.replace_classes(b.font_size().to_string(), "fs-5");
ClassesOp::Replace(button.font_size().to_string()),
"fs-5",
);
} }
_ => {} _ => {}
}; };
match button.button_type() { match b.button_type() {
ButtonType::Link => { ButtonType::Link => {
button.alter_classes( b.replace_classes(b.button_type().to_string(), "btn btn-link");
ClassesOp::Replace(button.button_type().to_string()),
"btn btn-link",
);
} }
ButtonType::Primary => { ButtonType::Primary => {
button.alter_classes( b.replace_classes(b.button_type().to_string(), "btn btn-primary");
ClassesOp::Replace(button.button_type().to_string()),
"btn btn-primary",
);
} }
}; };
} }
} }
COMPONENT_BASE_HEADING => { COMPONENT_BASE_HEADING => {
if let Some(heading) = component_as_mut::<Heading>(component) { if let Some(h) = component_as_mut::<Heading>(component) {
match heading.display() { match h.display() {
HeadingDisplay::ExtraLarge => { HeadingDisplay::ExtraLarge => {
heading.alter_classes( h.replace_classes(h.display().to_string(), "display-1");
ClassesOp::Replace(heading.display().to_string()),
"display-1",
);
} }
HeadingDisplay::XxLarge => { HeadingDisplay::XxLarge => {
heading.alter_classes( h.replace_classes(h.display().to_string(), "display-2");
ClassesOp::Replace(heading.display().to_string()),
"display-2",
);
} }
HeadingDisplay::XLarge => { HeadingDisplay::XLarge => {
heading.alter_classes( h.replace_classes(h.display().to_string(), "display-3");
ClassesOp::Replace(heading.display().to_string()),
"display-3",
);
} }
HeadingDisplay::Large => { HeadingDisplay::Large => {
heading.alter_classes( h.replace_classes(h.display().to_string(), "display-4");
ClassesOp::Replace(heading.display().to_string()),
"display-4",
);
} }
HeadingDisplay::Medium => { HeadingDisplay::Medium => {
heading.alter_classes( h.replace_classes(h.display().to_string(), "display-5");
ClassesOp::Replace(heading.display().to_string()),
"display-5",
);
} }
_ => {} _ => {}
}; };
} }
} }
COMPONENT_BASE_PARAGRAPH => { COMPONENT_BASE_PARAGRAPH => {
if let Some(paragraph) = component_as_mut::<Paragraph>(component) { if let Some(p) = component_as_mut::<Paragraph>(component) {
match paragraph.font_size() { match p.font_size() {
FontSize::ExtraLarge => { FontSize::ExtraLarge => {
paragraph.alter_classes( p.replace_classes(p.font_size().to_string(), "fs-1");
ClassesOp::Replace(paragraph.font_size().to_string()),
"fs-1",
);
} }
FontSize::XxLarge => { FontSize::XxLarge => {
paragraph.alter_classes( p.replace_classes(p.font_size().to_string(), "fs-2");
ClassesOp::Replace(paragraph.font_size().to_string()),
"fs-2",
);
} }
FontSize::XLarge => { FontSize::XLarge => {
paragraph.alter_classes( p.replace_classes(p.font_size().to_string(), "fs-3");
ClassesOp::Replace(paragraph.font_size().to_string()),
"fs-3",
);
} }
FontSize::Large => { FontSize::Large => {
paragraph.alter_classes( p.replace_classes(p.font_size().to_string(), "fs-4");
ClassesOp::Replace(paragraph.font_size().to_string()),
"fs-4",
);
} }
FontSize::Medium => { FontSize::Medium => {
paragraph.alter_classes( p.replace_classes(p.font_size().to_string(), "fs-5");
ClassesOp::Replace(paragraph.font_size().to_string()),
"fs-5",
);
} }
_ => {} _ => {}
}; };

View file

@ -33,137 +33,85 @@ impl ThemeTrait for Bulmix {
fn before_prepare_component(&self, component: &mut dyn ComponentTrait, _cx: &mut Context) { fn before_prepare_component(&self, component: &mut dyn ComponentTrait, _cx: &mut Context) {
match component.handle() { match component.handle() {
COMPONENT_BASE_ICON => { COMPONENT_BASE_ICON => {
if let Some(icon) = component_as_mut::<Icon>(component) { if let Some(i) = component_as_mut::<Icon>(component) {
match icon.font_size() { match i.font_size() {
FontSize::ExtraLarge => { FontSize::ExtraLarge => {
icon.alter_classes( i.replace_classes(i.font_size().to_string(), "is-size-1");
ClassesOp::Replace(icon.font_size().to_string()),
"is-size-1",
);
} }
FontSize::XxLarge => { FontSize::XxLarge => {
icon.alter_classes( i.replace_classes(i.font_size().to_string(), "is-size-2");
ClassesOp::Replace(icon.font_size().to_string()),
"is-size-2",
);
} }
FontSize::XLarge => { FontSize::XLarge => {
icon.alter_classes( i.replace_classes(i.font_size().to_string(), "is-size-3");
ClassesOp::Replace(icon.font_size().to_string()),
"is-size-3",
);
} }
FontSize::Large => { FontSize::Large => {
icon.alter_classes( i.replace_classes(i.font_size().to_string(), "is-size-4");
ClassesOp::Replace(icon.font_size().to_string()),
"is-size-4",
);
} }
FontSize::Medium => { FontSize::Medium => {
icon.alter_classes( i.replace_classes(i.font_size().to_string(), "is-size-5");
ClassesOp::Replace(icon.font_size().to_string()),
"is-size-5",
);
} }
_ => {} _ => {}
}; };
} }
} }
COMPONENT_BASE_BUTTON => { COMPONENT_BASE_BUTTON => {
if let Some(button) = component_as_mut::<Button>(component) { if let Some(b) = component_as_mut::<Button>(component) {
match button.font_size() { match b.font_size() {
FontSize::ExtraLarge => { FontSize::ExtraLarge => {
button.alter_classes( b.replace_classes(b.font_size().to_string(), "is-size-1");
ClassesOp::Replace(button.font_size().to_string()),
"is-size-1",
);
} }
FontSize::XxLarge => { FontSize::XxLarge => {
button.alter_classes( b.replace_classes(b.font_size().to_string(), "is-size-2");
ClassesOp::Replace(button.font_size().to_string()),
"is-size-2",
);
} }
FontSize::XLarge => { FontSize::XLarge => {
button.alter_classes( b.replace_classes(b.font_size().to_string(), "is-size-3");
ClassesOp::Replace(button.font_size().to_string()),
"is-size-3",
);
} }
FontSize::Large => { FontSize::Large => {
button.alter_classes( b.replace_classes(b.font_size().to_string(), "is-size-4");
ClassesOp::Replace(button.font_size().to_string()),
"is-size-4",
);
} }
FontSize::Medium => { FontSize::Medium => {
button.alter_classes( b.replace_classes(b.font_size().to_string(), "is-size-5");
ClassesOp::Replace(button.font_size().to_string()),
"is-size-5",
);
} }
_ => {} _ => {}
}; };
match button.button_type() { match b.button_type() {
ButtonType::Link => { ButtonType::Link => {
button.alter_classes( b.replace_classes(b.button_type().to_string(), "button is-text");
ClassesOp::Replace(button.button_type().to_string()),
"button is-text",
);
} }
ButtonType::Primary => { ButtonType::Primary => {
button.alter_classes( b.replace_classes(b.button_type().to_string(), "button is-primary");
ClassesOp::Replace(button.button_type().to_string()),
"button is-primary",
);
} }
}; };
} }
} }
COMPONENT_BASE_HEADING => { COMPONENT_BASE_HEADING => {
if let Some(heading) = component_as_mut::<Heading>(component) { if let Some(h) = component_as_mut::<Heading>(component) {
match heading.display() { match h.display() {
HeadingDisplay::Subtitle => heading.alter_classes( HeadingDisplay::Subtitle => {
ClassesOp::Replace(heading.display().to_string()), h.replace_classes(h.display().to_string(), "subtitle")
"subtitle", }
), _ => h.add_classes("title"),
_ => heading.alter_classes(ClassesOp::Add, "title"),
}; };
} }
} }
COMPONENT_BASE_PARAGRAPH => { COMPONENT_BASE_PARAGRAPH => {
if let Some(paragraph) = component_as_mut::<Paragraph>(component) { if let Some(p) = component_as_mut::<Paragraph>(component) {
paragraph.alter_classes(ClassesOp::Add, "block"); p.add_classes("block");
match paragraph.font_size() { match p.font_size() {
FontSize::ExtraLarge => { FontSize::ExtraLarge => {
paragraph.alter_classes( p.replace_classes(p.font_size().to_string(), "is-size-1");
ClassesOp::Replace(paragraph.font_size().to_string()),
"is-size-1",
);
} }
FontSize::XxLarge => { FontSize::XxLarge => {
paragraph.alter_classes( p.replace_classes(p.font_size().to_string(), "is-size-2");
ClassesOp::Replace(paragraph.font_size().to_string()),
"is-size-2",
);
} }
FontSize::XLarge => { FontSize::XLarge => {
paragraph.alter_classes( p.replace_classes(p.font_size().to_string(), "is-size-3");
ClassesOp::Replace(paragraph.font_size().to_string()),
"is-size-3",
);
} }
FontSize::Large => { FontSize::Large => {
paragraph.alter_classes( p.replace_classes(p.font_size().to_string(), "is-size-4");
ClassesOp::Replace(paragraph.font_size().to_string()),
"is-size-4",
);
} }
FontSize::Medium => { FontSize::Medium => {
paragraph.alter_classes( p.replace_classes(p.font_size().to_string(), "is-size-5");
ClassesOp::Replace(paragraph.font_size().to_string()),
"is-size-5",
);
} }
_ => {} _ => {}
}; };
@ -180,12 +128,10 @@ impl ThemeTrait for Bulmix {
) -> Option<Markup> { ) -> Option<Markup> {
match component.handle() { match component.handle() {
COMPONENT_BASE_ICON => { COMPONENT_BASE_ICON => {
if let Some(icon) = component_as_ref::<Icon>(component) { if let Some(i) = component_as_ref::<Icon>(component) {
return match icon.icon_name().get() { return match i.icon_name().get() {
None => None, None => None,
_ => { _ => Some(html! { span class="icon" { i class=[i.classes().get()] {} } }),
Some(html! { span class="icon" { i class=[icon.classes().get()] {} } })
}
}; };
} }
None None

View file

@ -31,7 +31,7 @@ impl ComponentTrait for Block {
} }
fn setup_before_prepare(&mut self, _cx: &mut Context) { fn setup_before_prepare(&mut self, _cx: &mut Context) {
self.classes.alter_value(ClassesOp::AddFirst, "pt-block"); self.prepend_classes("pt-block");
} }
fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup {
@ -51,6 +51,17 @@ impl ComponentTrait for Block {
} }
} }
impl ComponentClasses for Block {
fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
fn classes(&self) -> &OptionClasses {
&self.classes
}
}
impl Block { impl Block {
// Block BUILDER. // Block BUILDER.
@ -72,12 +83,6 @@ impl Block {
self self
} }
#[fn_builder]
pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
#[fn_builder] #[fn_builder]
pub fn alter_title(&mut self, title: L10n) -> &mut Self { pub fn alter_title(&mut self, title: L10n) -> &mut Self {
self.title.alter_value(title); self.title.alter_value(title);
@ -98,10 +103,6 @@ impl Block {
// Block GETTERS. // Block GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn title(&self) -> &OptionTranslated { pub fn title(&self) -> &OptionTranslated {
&self.title &self.title
} }

View file

@ -63,9 +63,8 @@ impl ComponentTrait for Button {
} }
fn setup_before_prepare(&mut self, _cx: &mut Context) { fn setup_before_prepare(&mut self, _cx: &mut Context) {
self.classes.alter_value( self.prepend_classes(
ClassesOp::AddFirst, [self.button_type().to_string(), self.font_size().to_string()].join(" "),
[self.button_type.to_string(), self.font_size.to_string()].join(" "),
); );
} }
@ -93,6 +92,17 @@ impl ComponentTrait for Button {
} }
} }
impl ComponentClasses for Button {
fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
fn classes(&self) -> &OptionClasses {
&self.classes
}
}
impl Button { impl Button {
pub fn link(href: impl Into<String>, html: L10n) -> Self { pub fn link(href: impl Into<String>, html: L10n) -> Self {
Button::default() Button::default()
@ -128,12 +138,6 @@ impl Button {
self self
} }
#[fn_builder]
pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
#[fn_builder] #[fn_builder]
pub fn alter_type(&mut self, button_type: ButtonType) -> &mut Self { pub fn alter_type(&mut self, button_type: ButtonType) -> &mut Self {
self.button_type = button_type; self.button_type = button_type;
@ -178,10 +182,6 @@ impl Button {
// Button GETTERS. // Button GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn button_type(&self) -> &ButtonType { pub fn button_type(&self) -> &ButtonType {
&self.button_type &self.button_type
} }

View file

@ -35,8 +35,7 @@ impl ComponentTrait for Container {
} }
fn setup_before_prepare(&mut self, cx: &mut Context) { fn setup_before_prepare(&mut self, cx: &mut Context) {
self.classes.alter_value( self.prepend_classes(
ClassesOp::AddFirst,
[ [
self.direction.to_string(), self.direction.to_string(),
self.wrap_align.to_string(), self.wrap_align.to_string(),
@ -63,6 +62,17 @@ impl ComponentTrait for Container {
} }
} }
impl ComponentClasses for Container {
fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
fn classes(&self) -> &OptionClasses {
&self.classes
}
}
impl Container { impl Container {
// Container BUILDER. // Container BUILDER.
@ -84,12 +94,6 @@ impl Container {
self self
} }
#[fn_builder]
pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
#[rustfmt::skip] #[rustfmt::skip]
pub fn add_item(mut self, item: flex::Item) -> Self { pub fn add_item(mut self, item: flex::Item) -> Self {
self.items.alter_value(ArcTypedOp::Add(ArcTypedComponent::new(item))); self.items.alter_value(ArcTypedOp::Add(ArcTypedComponent::new(item)));
@ -134,10 +138,6 @@ impl Container {
// Container GETTERS. // Container GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn items(&self) -> &TypedComponents<flex::Item> { pub fn items(&self) -> &TypedComponents<flex::Item> {
&self.items &self.items
} }

View file

@ -35,10 +35,8 @@ impl ComponentTrait for Item {
(self.renderable.check)(cx) (self.renderable.check)(cx)
} }
#[rustfmt::skip]
fn setup_before_prepare(&mut self, _cx: &mut Context) { fn setup_before_prepare(&mut self, _cx: &mut Context) {
self.item_classes.alter_value( self.prepend_classes(
ClassesOp::AddFirst,
[ [
"pt-flex__item".to_owned(), "pt-flex__item".to_owned(),
self.item_grow.to_string(), self.item_grow.to_string(),
@ -49,7 +47,8 @@ impl ComponentTrait for Item {
] ]
.join(" "), .join(" "),
); );
self.inner_classes.alter_value(ClassesOp::AddFirst, "pt-flex__item-inner"); self.inner_classes
.alter_value(ClassesOp::Prepend, "pt-flex__item-inner");
} }
fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup {
@ -58,7 +57,7 @@ impl ComponentTrait for Item {
_ => Some(concat_string!("order: ", self.weight().to_string(), ";")), _ => Some(concat_string!("order: ", self.weight().to_string(), ";")),
}; };
PrepareMarkup::With(html! { PrepareMarkup::With(html! {
div id=[self.id()] class=[self.item_classes().get()] style=[order] { div id=[self.id()] class=[self.classes().get()] style=[order] {
div class=[self.inner_classes().get()] { div class=[self.inner_classes().get()] {
(self.components().render(cx)) (self.components().render(cx))
} }
@ -67,6 +66,17 @@ impl ComponentTrait for Item {
} }
} }
impl ComponentClasses for Item {
fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.item_classes.alter_value(op, classes);
self
}
fn classes(&self) -> &OptionClasses {
&self.item_classes
}
}
impl Item { impl Item {
// Item BUILDER. // Item BUILDER.
@ -88,12 +98,6 @@ impl Item {
self self
} }
#[fn_builder]
pub fn alter_item_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.item_classes.alter_value(op, classes);
self
}
#[fn_builder] #[fn_builder]
pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.inner_classes.alter_value(op, classes); self.inner_classes.alter_value(op, classes);
@ -144,10 +148,6 @@ impl Item {
// Item GETTERS. // Item GETTERS.
pub fn item_classes(&self) -> &OptionClasses {
&self.item_classes
}
pub fn inner_classes(&self) -> &OptionClasses { pub fn inner_classes(&self) -> &OptionClasses {
&self.inner_classes &self.inner_classes
} }

View file

@ -48,9 +48,9 @@ impl ComponentTrait for Button {
(self.renderable.check)(cx) (self.renderable.check)(cx)
} }
#[rustfmt::skip]
fn setup_before_prepare(&mut self, _cx: &mut Context) { fn setup_before_prepare(&mut self, _cx: &mut Context) {
self.classes.alter_value( self.prepend_classes(
ClassesOp::AddFirst,
concat_string!("btn btn-primary form-", self.button_type.to_string()), concat_string!("btn btn-primary form-", self.button_type.to_string()),
); );
} }
@ -73,6 +73,17 @@ impl ComponentTrait for Button {
} }
} }
impl ComponentClasses for Button {
fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
fn classes(&self) -> &OptionClasses {
&self.classes
}
}
impl Button { impl Button {
pub fn with(value: L10n) -> Self { pub fn with(value: L10n) -> Self {
Button::default().with_value(value) Button::default().with_value(value)
@ -104,12 +115,6 @@ impl Button {
self self
} }
#[fn_builder]
pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
#[fn_builder] #[fn_builder]
pub fn alter_name(&mut self, name: &str) -> &mut Self { pub fn alter_name(&mut self, name: &str) -> &mut Self {
self.name.alter_value(name); self.name.alter_value(name);
@ -148,10 +153,6 @@ impl Button {
// Button GETTERS. // Button GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn button_type(&self) -> &ButtonType { pub fn button_type(&self) -> &ButtonType {
&self.button_type &self.button_type
} }

View file

@ -68,6 +68,17 @@ impl ComponentTrait for Date {
} }
} }
impl ComponentClasses for Date {
fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
fn classes(&self) -> &OptionClasses {
&self.classes
}
}
impl Date { impl Date {
// Date BUILDER. // Date BUILDER.
@ -83,12 +94,6 @@ impl Date {
self self
} }
#[fn_builder]
pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
#[fn_builder] #[fn_builder]
pub fn alter_name(&mut self, name: &str) -> &mut Self { pub fn alter_name(&mut self, name: &str) -> &mut Self {
self.name.alter_value(name); self.name.alter_value(name);
@ -172,10 +177,6 @@ impl Date {
// Date GETTERS. // Date GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn name(&self) -> &OptionString { pub fn name(&self) -> &OptionString {
&self.name &self.name
} }

View file

@ -61,6 +61,17 @@ impl ComponentTrait for Form {
} }
} }
impl ComponentClasses for Form {
fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
fn classes(&self) -> &OptionClasses {
&self.classes
}
}
impl Form { impl Form {
// Form BUILDER. // Form BUILDER.
@ -82,12 +93,6 @@ impl Form {
self self
} }
#[fn_builder]
pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
#[fn_builder] #[fn_builder]
pub fn alter_action(&mut self, action: &str) -> &mut Self { pub fn alter_action(&mut self, action: &str) -> &mut Self {
self.action.alter_value(action); self.action.alter_value(action);
@ -126,10 +131,6 @@ impl Form {
// Form GETTERS. // Form GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn action(&self) -> &OptionString { pub fn action(&self) -> &OptionString {
&self.action &self.action
} }

View file

@ -98,6 +98,17 @@ impl ComponentTrait for Input {
} }
} }
impl ComponentClasses for Input {
fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
fn classes(&self) -> &OptionClasses {
&self.classes
}
}
impl Input { impl Input {
pub fn textfield() -> Self { pub fn textfield() -> Self {
Input::default() Input::default()
@ -162,18 +173,12 @@ impl Input {
self self
} }
#[fn_builder]
pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
#[fn_builder] #[fn_builder]
pub fn alter_name(&mut self, name: &str) -> &mut Self { pub fn alter_name(&mut self, name: &str) -> &mut Self {
if let Some(previous) = self.name.get() { if let Some(previous) = self.name.get() {
self.alter_classes(ClassesOp::Remove, concat_string!("form-item-", previous)); self.remove_classes(concat_string!("form-item-", previous));
} }
self.alter_classes(ClassesOp::Add, concat_string!("form-item-", name)); self.add_classes(concat_string!("form-item-", name));
self.name.alter_value(name); self.name.alter_value(name);
self self
} }
@ -273,10 +278,6 @@ impl Input {
// Input GETTERS. // Input GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn input_type(&self) -> &InputType { pub fn input_type(&self) -> &InputType {
&self.input_type &self.input_type
} }

View file

@ -71,7 +71,7 @@ impl ComponentTrait for Heading {
#[rustfmt::skip] #[rustfmt::skip]
fn setup_before_prepare(&mut self, _cx: &mut Context) { fn setup_before_prepare(&mut self, _cx: &mut Context) {
self.classes.alter_value(ClassesOp::Add, self.display().to_string()); self.add_classes(self.display().to_string());
} }
fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup {
@ -89,6 +89,17 @@ impl ComponentTrait for Heading {
} }
} }
impl ComponentClasses for Heading {
fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
fn classes(&self) -> &OptionClasses {
&self.classes
}
}
impl Heading { impl Heading {
pub fn h1(text: L10n) -> Self { pub fn h1(text: L10n) -> Self {
Heading::default() Heading::default()
@ -146,12 +157,6 @@ impl Heading {
self self
} }
#[fn_builder]
pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
#[fn_builder] #[fn_builder]
pub fn alter_heading_type(&mut self, heading_type: HeadingType) -> &mut Self { pub fn alter_heading_type(&mut self, heading_type: HeadingType) -> &mut Self {
self.heading_type = heading_type; self.heading_type = heading_type;
@ -172,10 +177,6 @@ impl Heading {
// Paragraph GETTERS. // Paragraph GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn heading_type(&self) -> &HeadingType { pub fn heading_type(&self) -> &HeadingType {
&self.heading_type &self.heading_type
} }

View file

@ -25,11 +25,11 @@ impl ComponentTrait for Icon {
(self.renderable.check)(cx) (self.renderable.check)(cx)
} }
#[rustfmt::skip]
fn setup_before_prepare(&mut self, cx: &mut Context) { fn setup_before_prepare(&mut self, cx: &mut Context) {
if let Some(icon_name) = self.icon_name.get() { if let Some(icon_name) = self.icon_name.get() {
self.classes.alter_value( self.prepend_classes(
ClassesOp::AddFirst, concat_string!("bi-", icon_name, " ", self.font_size().to_string()),
concat_string!("bi-", icon_name, " ", self.font_size.to_string()),
); );
cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, true); cx.set_param::<bool>(PARAM_BASE_INCLUDE_ICONS, true);
} }
@ -43,6 +43,17 @@ impl ComponentTrait for Icon {
} }
} }
impl ComponentClasses for Icon {
fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
fn classes(&self) -> &OptionClasses {
&self.classes
}
}
impl Icon { impl Icon {
pub fn with(icon_name: impl Into<String>) -> Self { pub fn with(icon_name: impl Into<String>) -> Self {
Icon::default().with_icon_name(icon_name) Icon::default().with_icon_name(icon_name)
@ -62,12 +73,6 @@ impl Icon {
self self
} }
#[fn_builder]
pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
#[fn_builder] #[fn_builder]
pub fn alter_icon_name(&mut self, name: impl Into<String>) -> &mut Self { pub fn alter_icon_name(&mut self, name: impl Into<String>) -> &mut Self {
self.icon_name.alter_value(name); self.icon_name.alter_value(name);
@ -82,10 +87,6 @@ impl Icon {
// Icon GETTERS. // Icon GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn icon_name(&self) -> &OptionString { pub fn icon_name(&self) -> &OptionString {
&self.icon_name &self.icon_name
} }

View file

@ -62,6 +62,17 @@ impl ComponentTrait for Image {
} }
} }
impl ComponentClasses for Image {
fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
fn classes(&self) -> &OptionClasses {
&self.classes
}
}
impl Image { impl Image {
pub fn with(source: &str) -> Self { pub fn with(source: &str) -> Self {
Image::default() Image::default()
@ -102,12 +113,6 @@ impl Image {
self self
} }
#[fn_builder]
pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
#[fn_builder] #[fn_builder]
pub fn alter_source(&mut self, source: &str) -> &mut Self { pub fn alter_source(&mut self, source: &str) -> &mut Self {
self.source.alter_value(source); self.source.alter_value(source);
@ -122,10 +127,6 @@ impl Image {
// Image GETTERS. // Image GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn source(&self) -> &OptionString { pub fn source(&self) -> &OptionString {
&self.source &self.source
} }

View file

@ -30,9 +30,8 @@ impl ComponentTrait for Paragraph {
(self.renderable.check)(cx) (self.renderable.check)(cx)
} }
#[rustfmt::skip]
fn setup_before_prepare(&mut self, _cx: &mut Context) { fn setup_before_prepare(&mut self, _cx: &mut Context) {
self.classes.alter_value(ClassesOp::AddFirst, self.font_size.to_string()); self.prepend_classes(self.font_size().to_string());
} }
fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup { fn prepare_component(&self, cx: &mut Context) -> PrepareMarkup {
@ -47,6 +46,17 @@ impl ComponentTrait for Paragraph {
} }
} }
impl ComponentClasses for Paragraph {
fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
fn classes(&self) -> &OptionClasses {
&self.classes
}
}
impl Paragraph { impl Paragraph {
pub fn with(component: impl ComponentTrait) -> Self { pub fn with(component: impl ComponentTrait) -> Self {
Paragraph::default().add_component(component) Paragraph::default().add_component(component)
@ -76,12 +86,6 @@ impl Paragraph {
self self
} }
#[fn_builder]
pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
#[fn_builder] #[fn_builder]
pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self { pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self {
self.font_size = font_size; self.font_size = font_size;
@ -108,10 +112,6 @@ impl Paragraph {
// Paragraph GETTERS. // Paragraph GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn font_size(&self) -> &FontSize { pub fn font_size(&self) -> &FontSize {
&self.font_size &self.font_size
} }

View file

@ -83,6 +83,17 @@ impl ComponentTrait for Wrapper {
} }
} }
impl ComponentClasses for Wrapper {
fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
fn classes(&self) -> &OptionClasses {
&self.classes
}
}
impl Wrapper { impl Wrapper {
pub fn header() -> Self { pub fn header() -> Self {
let mut c = Wrapper::default() let mut c = Wrapper::default()
@ -136,12 +147,6 @@ impl Wrapper {
self self
} }
#[fn_builder]
pub fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.classes.alter_value(op, classes);
self
}
#[fn_builder] #[fn_builder]
pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self { pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.inner_classes.alter_value(op, classes); self.inner_classes.alter_value(op, classes);
@ -168,10 +173,6 @@ impl Wrapper {
// Wrapper GETTERS. // Wrapper GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn inner_classes(&self) -> &OptionClasses { pub fn inner_classes(&self) -> &OptionClasses {
&self.inner_classes &self.inner_classes
} }

View file

@ -8,6 +8,9 @@ pub use renderable::{FnIsRenderable, Renderable};
mod definition; mod definition;
pub use definition::{component_as_mut, component_as_ref, ComponentBase, ComponentTrait}; pub use definition::{component_as_mut, component_as_ref, ComponentBase, ComponentTrait};
mod classes;
pub use classes::{ComponentClasses, ComponentClassesOp};
mod arc_any; mod arc_any;
pub use arc_any::AnyComponents; pub use arc_any::AnyComponents;
pub use arc_any::{ArcAnyComponent, ArcAnyOp}; pub use arc_any::{ArcAnyComponent, ArcAnyOp};

View file

@ -0,0 +1,60 @@
use crate::html::{ClassesOp, OptionClasses};
pub trait ComponentClassesOp {
fn with_classes(self, op: ClassesOp, classes: impl Into<String>) -> Self;
fn add_classes(&mut self, classes: impl Into<String>) -> &mut Self;
fn prepend_classes(&mut self, classes: impl Into<String>) -> &mut Self;
fn remove_classes(&mut self, classes: impl Into<String>) -> &mut Self;
fn replace_classes(&mut self, rep: impl Into<String>, classes: impl Into<String>) -> &mut Self;
fn toggle_classes(&mut self, classes: impl Into<String>) -> &mut Self;
fn set_classes(&mut self, classes: impl Into<String>) -> &mut Self;
}
pub trait ComponentClasses: ComponentClassesOp {
fn alter_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self;
fn classes(&self) -> &OptionClasses;
}
impl<C: ComponentClasses> ComponentClassesOp for C {
fn with_classes(mut self, op: ClassesOp, classes: impl Into<String>) -> Self {
self.alter_classes(op, classes);
self
}
fn add_classes(&mut self, classes: impl Into<String>) -> &mut Self {
self.alter_classes(ClassesOp::Add, classes);
self
}
fn prepend_classes(&mut self, classes: impl Into<String>) -> &mut Self {
self.alter_classes(ClassesOp::Prepend, classes);
self
}
fn remove_classes(&mut self, classes: impl Into<String>) -> &mut Self {
self.alter_classes(ClassesOp::Remove, classes);
self
}
fn replace_classes(&mut self, rep: impl Into<String>, classes: impl Into<String>) -> &mut Self {
self.alter_classes(ClassesOp::Replace(rep.into()), classes);
self
}
fn toggle_classes(&mut self, classes: impl Into<String>) -> &mut Self {
self.alter_classes(ClassesOp::Toggle, classes);
self
}
fn set_classes(&mut self, classes: impl Into<String>) -> &mut Self {
self.alter_classes(ClassesOp::Set, classes);
self
}
}

View file

@ -13,11 +13,11 @@ use crate::{fn_builder, SmartDefault};
pub enum ClassesOp { pub enum ClassesOp {
Add, Add,
AddFirst, Prepend,
Remove, Remove,
Replace(String), Replace(String),
Toggle, Toggle,
Clear, Set,
} }
#[derive(SmartDefault)] #[derive(SmartDefault)]
@ -25,7 +25,7 @@ pub struct OptionClasses(Vec<String>);
impl OptionClasses { impl OptionClasses {
pub fn new(classes: impl Into<String>) -> Self { pub fn new(classes: impl Into<String>) -> Self {
OptionClasses::default().with_value(ClassesOp::AddFirst, classes) OptionClasses::default().with_value(ClassesOp::Prepend, classes)
} }
// OptionClasses BUILDER. // OptionClasses BUILDER.
@ -39,7 +39,7 @@ impl OptionClasses {
ClassesOp::Add => { ClassesOp::Add => {
self.add(&classes, self.0.len()); self.add(&classes, self.0.len());
} }
ClassesOp::AddFirst => { ClassesOp::Prepend => {
self.add(&classes, 0); self.add(&classes, 0);
} }
ClassesOp::Remove => { ClassesOp::Remove => {
@ -71,8 +71,9 @@ impl OptionClasses {
} }
} }
} }
ClassesOp::Clear => { ClassesOp::Set => {
self.0.clear(); self.0.clear();
self.add(&classes, 0);
} }
} }
self self