use serde::{Deserialize, Serialize};
use crate::node::{ActionId, Common, IntoNode, Key, Node};
use crate::text::Line;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Toggle {
#[serde(flatten)]
pub common: Common,
pub label: Line,
pub value: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub disabled: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub on_change: Option<ActionId>,
}
impl Toggle {
#[must_use]
pub fn new(key: impl Into<Key>, label: impl Into<Line>, value: bool) -> Self {
let mut common = Common::new();
common.key = Some(key.into());
Self {
common,
label: label.into(),
value,
disabled: None,
on_change: None,
}
}
#[must_use]
pub fn disabled(mut self, disabled: bool) -> Self {
self.disabled = Some(disabled);
self
}
#[must_use]
pub fn on_change(mut self, action: impl Into<ActionId>) -> Self {
self.on_change = Some(action.into());
self
}
}
impl IntoNode for Toggle {}
impl From<Toggle> for Node {
fn from(t: Toggle) -> Self {
Node::Toggle(t)
}
}