diff --git a/editor/src/messages/layout/utility_types/widgets/button_widgets.rs b/editor/src/messages/layout/utility_types/widgets/button_widgets.rs index 5931bb39b9..69282351fb 100644 --- a/editor/src/messages/layout/utility_types/widgets/button_widgets.rs +++ b/editor/src/messages/layout/utility_types/widgets/button_widgets.rs @@ -1,7 +1,6 @@ use crate::messages::input_mapper::utility_types::misc::ActionKeys; use crate::messages::layout::utility_types::layout_widget::WidgetCallback; use crate::messages::layout::utility_types::widget_prelude::SubLayout; -use crate::messages::layout::utility_types::widget_prelude::WidgetLayout; use crate::messages::portfolio::document::node_graph::FrontendGraphDataType; use graphite_proc_macros::WidgetBuilder; diff --git a/editor/src/messages/layout/utility_types/widgets/input_widgets.rs b/editor/src/messages/layout/utility_types/widgets/input_widgets.rs index 161644d17c..6841c7be07 100644 --- a/editor/src/messages/layout/utility_types/widgets/input_widgets.rs +++ b/editor/src/messages/layout/utility_types/widgets/input_widgets.rs @@ -12,6 +12,9 @@ use serde::{Deserialize, Serialize}; #[derive(Clone, Derivative, Serialize, Deserialize, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq)] pub struct CheckboxInput { + #[widget_builder(constructor)] + pub entries: CheckboxInputEntries, + #[widget_builder(constructor)] pub checked: bool, @@ -33,6 +36,7 @@ pub struct CheckboxInput { impl Default for CheckboxInput { fn default() -> Self { Self { + entries: Vec::new(), checked: false, disabled: false, icon: "Checkmark".into(), @@ -43,6 +47,31 @@ impl Default for CheckboxInput { } } +pub type CheckboxInputEntries = Vec>; + +#[derive(Clone, Serialize, Deserialize, Derivative, Default, WidgetBuilder, specta::Type)] +#[derivative(Debug, PartialEq)] +#[widget_builder(not_widget_holder)] +pub struct CheckboxEntryData { + pub value: String, + + #[widget_builder(constructor)] + pub label: String, + + pub icon: String, + + pub shortcut: Vec, + + pub disabled: bool, + + pub checked: bool, + + // Callbacks + #[serde(skip)] + #[derivative(Debug = "ignore", PartialEq = "ignore")] + pub on_update: WidgetCallback<()>, +} + #[derive(Clone, Derivative, Serialize, Deserialize, WidgetBuilder, specta::Type)] #[derivative(Debug, PartialEq, Default)] pub struct ColorInput { diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index c632a12cb4..b7b2fb417e 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -7,6 +7,7 @@ use crate::messages::frontend::utility_types::FileType; use crate::messages::input_mapper::utility_types::macros::action_keys; use crate::messages::layout::utility_types::layout_widget::{Layout, LayoutGroup, Widget, WidgetCallback, WidgetHolder, WidgetLayout}; use crate::messages::layout::utility_types::misc::LayoutTarget; +use crate::messages::layout::utility_types::widget_prelude::{CheckboxEntryData, CheckboxInput}; use crate::messages::layout::utility_types::widgets::button_widgets::{IconButton, PopoverButton}; use crate::messages::layout::utility_types::widgets::input_widgets::{ DropdownEntryData, DropdownInput, NumberInput, NumberInputIncrementBehavior, NumberInputMode, OptionalInput, RadioEntryData, RadioInput, @@ -1561,33 +1562,33 @@ impl DocumentMessageHandler { on_update: WidgetCallback::new(|optional_input: &OptionalInput| DocumentMessage::SetSnapping { snap: optional_input.checked }.into()), ..Default::default() })), - // this isn't working, why? WidgetHolder::new(Widget::PopoverButton(PopoverButton { header: "Snapping".into(), - text: "Select the vector to snap to.".into(), // TODO: check whether this is an apt description + text: "Select the vector to snap to.".into(), options_widget: vec![LayoutGroup::Row { - widgets: vec![WidgetHolder::new(Widget::DropdownInput(DropdownInput { + widgets: vec![WidgetHolder::new(Widget::CheckboxInput(CheckboxInput { entries: vec![vec![ - DropdownEntryData { + CheckboxEntryData { + // TODO: perform the requisite operations instead of NoOp + checked: self.snapping_enabled, label: SnappingOptions::BoundingBoxes.to_string(), on_update: WidgetCallback::new(|_| { - info!("Bouding boxes"); + info!("Bounding Boxes"); + // Message::Tool(ToolMessage) Message::NoOp }), - ..DropdownEntryData::default() + ..CheckboxInput::default() }, - DropdownEntryData { + CheckboxEntryData { + checked: self.snapping_enabled, label: SnappingOptions::Nodes.to_string(), on_update: WidgetCallback::new(|_| { info!("Nodes"); Message::NoOp }), - ..DropdownEntryData::default() + ..CheckboxInput::default() }, ]], - selected_index: Some(0_u32), - draw_icon: false, - interactive: true, ..Default::default() }))], }], diff --git a/frontend/src/components/widgets/WidgetRow.svelte b/frontend/src/components/widgets/WidgetRow.svelte index 9fb0613699..410939c0bd 100644 --- a/frontend/src/components/widgets/WidgetRow.svelte +++ b/frontend/src/components/widgets/WidgetRow.svelte @@ -141,8 +141,8 @@ {#if popoverButton} {popoverButton.header} - {#if popoverButton.optionsWidget} - + {#if popoverButton.optionsWidget} + {:else} {popoverButton.text} {/if} diff --git a/frontend/src/components/widgets/buttons/PopoverButton.svelte b/frontend/src/components/widgets/buttons/PopoverButton.svelte index 13a3ea16c0..b4057df69b 100644 --- a/frontend/src/components/widgets/buttons/PopoverButton.svelte +++ b/frontend/src/components/widgets/buttons/PopoverButton.svelte @@ -21,7 +21,6 @@ onClick()} icon={icon || "DropdownArrow"} size={16} {tooltip} data-floating-menu-spawner /> - (open = detail)} type="Popover" direction="Bottom">