mirror of https://github.com/wayvr-org/wayvr.git
Allow the checkbox to be themed (#462)
This commit is contained in:
parent
b89ae4726c
commit
ee4bb5ca29
|
|
@ -356,6 +356,8 @@ _Translated by key_
|
||||||
|
|
||||||
`box_size`: **float** (default: 24)
|
`box_size`: **float** (default: 24)
|
||||||
|
|
||||||
|
`color_checked`: #FFAABB | #FFAABBCC
|
||||||
|
|
||||||
`value`: **string**
|
`value`: **string**
|
||||||
|
|
||||||
_optional value that will be sent with internal events_
|
_optional value that will be sent with internal events_
|
||||||
|
|
|
||||||
|
|
@ -428,29 +428,19 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul
|
||||||
style.overflow.y = taffy::Overflow::Hidden;
|
style.overflow.y = taffy::Overflow::Hidden;
|
||||||
|
|
||||||
// update colors to default ones if they are not specified
|
// update colors to default ones if they are not specified
|
||||||
let color = if let Some(color) = params.color {
|
let color = params.color.unwrap_or(theme.button_color);
|
||||||
color
|
|
||||||
} else {
|
|
||||||
theme.button_color
|
|
||||||
};
|
|
||||||
|
|
||||||
let border_color = if let Some(border_color) = params.border_color {
|
let border_color = params
|
||||||
border_color
|
.border_color
|
||||||
} else {
|
.unwrap_or_else(|| Color::new(color.r, color.g, color.b, color.a + 0.25));
|
||||||
Color::new(color.r, color.g, color.b, color.a + 0.25)
|
|
||||||
};
|
|
||||||
|
|
||||||
let hover_color = if let Some(hover_color) = params.hover_color {
|
let hover_color = params
|
||||||
hover_color
|
.hover_color
|
||||||
} else {
|
.unwrap_or_else(|| Color::new(color.r + 0.25, color.g + 0.25, color.g + 0.25, color.a + 0.15));
|
||||||
Color::new(color.r + 0.25, color.g + 0.25, color.g + 0.25, color.a + 0.15)
|
|
||||||
};
|
|
||||||
|
|
||||||
let hover_border_color = if let Some(hover_border_color) = params.hover_border_color {
|
let hover_border_color = params
|
||||||
hover_border_color
|
.hover_border_color
|
||||||
} else {
|
.unwrap_or_else(|| Color::new(color.r + 0.5, color.g + 0.5, color.g + 0.5, color.a + 0.5));
|
||||||
Color::new(color.r + 0.5, color.g + 0.5, color.g + 0.5, color.a + 0.5)
|
|
||||||
};
|
|
||||||
|
|
||||||
let gradient_intensity = theme.gradient_intensity;
|
let gradient_intensity = theme.gradient_intensity;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ use crate::{
|
||||||
pub struct Params {
|
pub struct Params {
|
||||||
pub text: Translation,
|
pub text: Translation,
|
||||||
pub style: taffy::Style,
|
pub style: taffy::Style,
|
||||||
|
pub color_checked: Option<Color>,
|
||||||
pub box_size: f32,
|
pub box_size: f32,
|
||||||
pub checked: bool,
|
pub checked: bool,
|
||||||
pub radio_group: Option<Rc<ComponentRadioGroup>>,
|
pub radio_group: Option<Rc<ComponentRadioGroup>>,
|
||||||
|
|
@ -43,6 +44,7 @@ impl Default for Params {
|
||||||
Self {
|
Self {
|
||||||
text: Translation::from_raw_text(""),
|
text: Translation::from_raw_text(""),
|
||||||
style: Default::default(),
|
style: Default::default(),
|
||||||
|
color_checked: None,
|
||||||
box_size: 24.0,
|
box_size: 24.0,
|
||||||
checked: false,
|
checked: false,
|
||||||
radio_group: None,
|
radio_group: None,
|
||||||
|
|
@ -84,6 +86,8 @@ struct Data {
|
||||||
id_label: WidgetID, // Label, parent of container
|
id_label: WidgetID, // Label, parent of container
|
||||||
value: Option<Rc<str>>, // arbitrary value assigned to the element
|
value: Option<Rc<str>>, // arbitrary value assigned to the element
|
||||||
radio_group: Option<Weak<ComponentRadioGroup>>,
|
radio_group: Option<Weak<ComponentRadioGroup>>,
|
||||||
|
|
||||||
|
color_checked: Color,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ComponentCheckbox {
|
pub struct ComponentCheckbox {
|
||||||
|
|
@ -92,6 +96,8 @@ pub struct ComponentCheckbox {
|
||||||
state: Rc<RefCell<State>>,
|
state: Rc<RefCell<State>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const COLOR_UNCHECKED: Color = Color::new(0.0, 0.0, 0.0, 0.0);
|
||||||
|
|
||||||
impl ComponentTrait for ComponentCheckbox {
|
impl ComponentTrait for ComponentCheckbox {
|
||||||
fn base(&self) -> &ComponentBase {
|
fn base(&self) -> &ComponentBase {
|
||||||
&self.base
|
&self.base
|
||||||
|
|
@ -106,12 +112,9 @@ impl ComponentTrait for ComponentCheckbox {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const COLOR_CHECKED: Color = Color::new(0.1, 0.5, 1.0, 1.0);
|
|
||||||
const COLOR_UNCHECKED: Color = Color::new(0.1, 0.5, 1.0, 0.0);
|
|
||||||
|
|
||||||
fn set_box_checked(widgets: &layout::WidgetMap, data: &Data, checked: bool) {
|
fn set_box_checked(widgets: &layout::WidgetMap, data: &Data, checked: bool) {
|
||||||
widgets.call(data.id_inner_box, |rect: &mut WidgetRectangle| {
|
widgets.call(data.id_inner_box, |rect: &mut WidgetRectangle| {
|
||||||
rect.params.color = if checked { COLOR_CHECKED } else { COLOR_UNCHECKED }
|
rect.params.color = if checked { data.color_checked } else { COLOR_UNCHECKED }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -315,6 +318,7 @@ fn register_event_mouse_release(
|
||||||
|
|
||||||
pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Result<(WidgetPair, Rc<ComponentCheckbox>)> {
|
pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Result<(WidgetPair, Rc<ComponentCheckbox>)> {
|
||||||
let mut style = params.style;
|
let mut style = params.style;
|
||||||
|
let theme = &ess.layout.state.theme;
|
||||||
|
|
||||||
// force-override style
|
// force-override style
|
||||||
style.flex_wrap = taffy::FlexWrap::NoWrap;
|
style.flex_wrap = taffy::FlexWrap::NoWrap;
|
||||||
|
|
@ -343,6 +347,8 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul
|
||||||
(WLength::Units(5.0), WLength::Units(8.0))
|
(WLength::Units(5.0), WLength::Units(8.0))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let color_checked = params.color_checked.unwrap_or(theme.accent_color);
|
||||||
|
|
||||||
let (root, _) = ess.layout.add_child(
|
let (root, _) = ess.layout.add_child(
|
||||||
ess.parent,
|
ess.parent,
|
||||||
WidgetRectangle::create(WidgetRectangleParams {
|
WidgetRectangle::create(WidgetRectangleParams {
|
||||||
|
|
@ -383,7 +389,7 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul
|
||||||
outer_box.id,
|
outer_box.id,
|
||||||
WidgetRectangle::create(WidgetRectangleParams {
|
WidgetRectangle::create(WidgetRectangleParams {
|
||||||
round: round_5,
|
round: round_5,
|
||||||
color: if params.checked { COLOR_CHECKED } else { COLOR_UNCHECKED },
|
color: if params.checked { color_checked } else { COLOR_UNCHECKED },
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}),
|
}),
|
||||||
taffy::Style {
|
taffy::Style {
|
||||||
|
|
@ -413,6 +419,7 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul
|
||||||
id_label: label.id,
|
id_label: label.id,
|
||||||
value: params.value,
|
value: params.value,
|
||||||
radio_group: params.radio_group.as_ref().map(Rc::downgrade),
|
radio_group: params.radio_group.as_ref().map(Rc::downgrade),
|
||||||
|
color_checked,
|
||||||
});
|
});
|
||||||
|
|
||||||
let state = Rc::new(RefCell::new(State {
|
let state = Rc::new(RefCell::new(State {
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,7 @@ pub fn parse_component_checkbox(
|
||||||
radio_group,
|
radio_group,
|
||||||
value: component_value,
|
value: component_value,
|
||||||
tooltip: tooltip.get_info(),
|
tooltip: tooltip.get_info(),
|
||||||
|
color_checked: None,
|
||||||
},
|
},
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue