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

View file

@ -31,7 +31,7 @@ impl ComponentTrait for Block {
}
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 {
@ -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 {
// Block BUILDER.
@ -72,12 +83,6 @@ impl Block {
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]
pub fn alter_title(&mut self, title: L10n) -> &mut Self {
self.title.alter_value(title);
@ -98,10 +103,6 @@ impl Block {
// Block GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn title(&self) -> &OptionTranslated {
&self.title
}

View file

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

View file

@ -35,8 +35,7 @@ impl ComponentTrait for Container {
}
fn setup_before_prepare(&mut self, cx: &mut Context) {
self.classes.alter_value(
ClassesOp::AddFirst,
self.prepend_classes(
[
self.direction.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 {
// Container BUILDER.
@ -84,12 +94,6 @@ impl Container {
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]
pub fn add_item(mut self, item: flex::Item) -> Self {
self.items.alter_value(ArcTypedOp::Add(ArcTypedComponent::new(item)));
@ -134,10 +138,6 @@ impl Container {
// Container GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn items(&self) -> &TypedComponents<flex::Item> {
&self.items
}

View file

@ -35,10 +35,8 @@ impl ComponentTrait for Item {
(self.renderable.check)(cx)
}
#[rustfmt::skip]
fn setup_before_prepare(&mut self, _cx: &mut Context) {
self.item_classes.alter_value(
ClassesOp::AddFirst,
self.prepend_classes(
[
"pt-flex__item".to_owned(),
self.item_grow.to_string(),
@ -49,7 +47,8 @@ impl ComponentTrait for Item {
]
.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 {
@ -58,7 +57,7 @@ impl ComponentTrait for Item {
_ => Some(concat_string!("order: ", self.weight().to_string(), ";")),
};
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()] {
(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 {
// Item BUILDER.
@ -88,12 +98,6 @@ impl Item {
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]
pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.inner_classes.alter_value(op, classes);
@ -144,10 +148,6 @@ impl Item {
// Item GETTERS.
pub fn item_classes(&self) -> &OptionClasses {
&self.item_classes
}
pub fn inner_classes(&self) -> &OptionClasses {
&self.inner_classes
}

View file

@ -48,9 +48,9 @@ impl ComponentTrait for Button {
(self.renderable.check)(cx)
}
#[rustfmt::skip]
fn setup_before_prepare(&mut self, _cx: &mut Context) {
self.classes.alter_value(
ClassesOp::AddFirst,
self.prepend_classes(
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 {
pub fn with(value: L10n) -> Self {
Button::default().with_value(value)
@ -104,12 +115,6 @@ impl Button {
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]
pub fn alter_name(&mut self, name: &str) -> &mut Self {
self.name.alter_value(name);
@ -148,10 +153,6 @@ impl Button {
// Button GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn button_type(&self) -> &ButtonType {
&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 {
// Date BUILDER.
@ -83,12 +94,6 @@ impl Date {
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]
pub fn alter_name(&mut self, name: &str) -> &mut Self {
self.name.alter_value(name);
@ -172,10 +177,6 @@ impl Date {
// Date GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn name(&self) -> &OptionString {
&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 {
// Form BUILDER.
@ -82,12 +93,6 @@ impl Form {
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]
pub fn alter_action(&mut self, action: &str) -> &mut Self {
self.action.alter_value(action);
@ -126,10 +131,6 @@ impl Form {
// Form GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn action(&self) -> &OptionString {
&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 {
pub fn textfield() -> Self {
Input::default()
@ -162,18 +173,12 @@ impl Input {
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]
pub fn alter_name(&mut self, name: &str) -> &mut Self {
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
}
@ -273,10 +278,6 @@ impl Input {
// Input GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn input_type(&self) -> &InputType {
&self.input_type
}

View file

@ -71,7 +71,7 @@ impl ComponentTrait for Heading {
#[rustfmt::skip]
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 {
@ -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 {
pub fn h1(text: L10n) -> Self {
Heading::default()
@ -146,12 +157,6 @@ impl Heading {
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]
pub fn alter_heading_type(&mut self, heading_type: HeadingType) -> &mut Self {
self.heading_type = heading_type;
@ -172,10 +177,6 @@ impl Heading {
// Paragraph GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn heading_type(&self) -> &HeadingType {
&self.heading_type
}

View file

@ -25,11 +25,11 @@ impl ComponentTrait for Icon {
(self.renderable.check)(cx)
}
#[rustfmt::skip]
fn setup_before_prepare(&mut self, cx: &mut Context) {
if let Some(icon_name) = self.icon_name.get() {
self.classes.alter_value(
ClassesOp::AddFirst,
concat_string!("bi-", icon_name, " ", self.font_size.to_string()),
self.prepend_classes(
concat_string!("bi-", icon_name, " ", self.font_size().to_string()),
);
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 {
pub fn with(icon_name: impl Into<String>) -> Self {
Icon::default().with_icon_name(icon_name)
@ -62,12 +73,6 @@ impl Icon {
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]
pub fn alter_icon_name(&mut self, name: impl Into<String>) -> &mut Self {
self.icon_name.alter_value(name);
@ -82,10 +87,6 @@ impl Icon {
// Icon GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn icon_name(&self) -> &OptionString {
&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 {
pub fn with(source: &str) -> Self {
Image::default()
@ -102,12 +113,6 @@ impl Image {
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]
pub fn alter_source(&mut self, source: &str) -> &mut Self {
self.source.alter_value(source);
@ -122,10 +127,6 @@ impl Image {
// Image GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn source(&self) -> &OptionString {
&self.source
}

View file

@ -30,9 +30,8 @@ impl ComponentTrait for Paragraph {
(self.renderable.check)(cx)
}
#[rustfmt::skip]
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 {
@ -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 {
pub fn with(component: impl ComponentTrait) -> Self {
Paragraph::default().add_component(component)
@ -76,12 +86,6 @@ impl Paragraph {
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]
pub fn alter_font_size(&mut self, font_size: FontSize) -> &mut Self {
self.font_size = font_size;
@ -108,10 +112,6 @@ impl Paragraph {
// Paragraph GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn font_size(&self) -> &FontSize {
&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 {
pub fn header() -> Self {
let mut c = Wrapper::default()
@ -136,12 +147,6 @@ impl Wrapper {
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]
pub fn alter_inner_classes(&mut self, op: ClassesOp, classes: impl Into<String>) -> &mut Self {
self.inner_classes.alter_value(op, classes);
@ -168,10 +173,6 @@ impl Wrapper {
// Wrapper GETTERS.
pub fn classes(&self) -> &OptionClasses {
&self.classes
}
pub fn inner_classes(&self) -> &OptionClasses {
&self.inner_classes
}

View file

@ -8,6 +8,9 @@ pub use renderable::{FnIsRenderable, Renderable};
mod definition;
pub use definition::{component_as_mut, component_as_ref, ComponentBase, ComponentTrait};
mod classes;
pub use classes::{ComponentClasses, ComponentClassesOp};
mod arc_any;
pub use arc_any::AnyComponents;
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 {
Add,
AddFirst,
Prepend,
Remove,
Replace(String),
Toggle,
Clear,
Set,
}
#[derive(SmartDefault)]
@ -25,7 +25,7 @@ pub struct OptionClasses(Vec<String>);
impl OptionClasses {
pub fn new(classes: impl Into<String>) -> Self {
OptionClasses::default().with_value(ClassesOp::AddFirst, classes)
OptionClasses::default().with_value(ClassesOp::Prepend, classes)
}
// OptionClasses BUILDER.
@ -39,7 +39,7 @@ impl OptionClasses {
ClassesOp::Add => {
self.add(&classes, self.0.len());
}
ClassesOp::AddFirst => {
ClassesOp::Prepend => {
self.add(&classes, 0);
}
ClassesOp::Remove => {
@ -71,8 +71,9 @@ impl OptionClasses {
}
}
}
ClassesOp::Clear => {
ClassesOp::Set => {
self.0.clear();
self.add(&classes, 0);
}
}
self