1use serde::{Deserialize, Serialize};
4
5use crate::node::{ActionId, Common, IntoNode, Key, Node};
6use crate::text::Line;
7
8#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub struct Toggle {
12 #[serde(flatten)]
14 pub common: Common,
15 pub label: Line,
17 pub value: bool,
19 #[serde(default, skip_serializing_if = "Option::is_none")]
21 pub disabled: Option<bool>,
22 #[serde(default, skip_serializing_if = "Option::is_none")]
24 pub on_change: Option<ActionId>,
25}
26
27impl Toggle {
28 #[must_use]
30 pub fn new(key: impl Into<Key>, label: impl Into<Line>, value: bool) -> Self {
31 let mut common = Common::new();
32 common.key = Some(key.into());
33 Self {
34 common,
35 label: label.into(),
36 value,
37 disabled: None,
38 on_change: None,
39 }
40 }
41
42 #[must_use]
44 pub fn disabled(mut self, disabled: bool) -> Self {
45 self.disabled = Some(disabled);
46 self
47 }
48
49 #[must_use]
51 pub fn on_change(mut self, action: impl Into<ActionId>) -> Self {
52 self.on_change = Some(action.into());
53 self
54 }
55}
56
57impl IntoNode for Toggle {}
58impl From<Toggle> for Node {
59 fn from(t: Toggle) -> Self {
60 Node::Toggle(t)
61 }
62}