use serde::{Deserialize, Serialize};
use crate::extras::icon::Icon;
use crate::node::{ActionId, Common, IntoNode, Node};
use crate::text::Line;
use serde_json::Value as Json;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ButtonVariant {
Primary,
#[default]
Secondary,
Ghost,
Danger,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Button {
#[serde(flatten)]
pub common: Common,
pub label: Line,
pub action: ActionId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub value: Option<Json>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub variant: Option<ButtonVariant>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub icon: Option<Icon>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub disabled: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub confirm: Option<String>,
}
impl Button {
#[must_use]
pub fn new(label: impl Into<Line>, action: impl Into<ActionId>) -> Self {
Self {
common: Common::new(),
label: label.into(),
action: action.into(),
value: None,
variant: None,
icon: None,
disabled: None,
confirm: None,
}
}
#[must_use]
pub fn value(mut self, value: impl Into<Json>) -> Self {
self.value = Some(value.into());
self
}
#[must_use]
pub fn variant(mut self, variant: ButtonVariant) -> Self {
self.variant = Some(variant);
self
}
#[must_use]
pub fn icon(mut self, icon: Icon) -> Self {
self.icon = Some(icon);
self
}
#[must_use]
pub fn disabled(mut self, disabled: bool) -> Self {
self.disabled = Some(disabled);
self
}
#[must_use]
pub fn confirm(mut self, confirm: impl Into<String>) -> Self {
self.confirm = Some(confirm.into());
self
}
}
impl IntoNode for Button {}
impl From<Button> for Node {
fn from(b: Button) -> Self {
Node::Button(b)
}
}