diff --git a/editor/src/messages/portfolio/document/node_graph/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_properties.rs index 2369dc7847..711568230b 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_properties.rs @@ -1951,35 +1951,35 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte } } - let new_gradient1 = gradient.clone(); - let new_gradient2 = gradient.clone(); + let gradient_for_closure = gradient.clone(); - let entries = vec![ - RadioEntryData::new("Linear") - .label("Linear") - .on_update(update_value( - move |_| { - let mut new_gradient = new_gradient1.clone(); - new_gradient.gradient_type = GradientType::Linear; - TaggedValue::Fill(Fill::Gradient(new_gradient)) - }, - node_id, - FillInput::::INDEX, - )) - .on_commit(commit_value), - RadioEntryData::new("Radial") - .label("Radial") - .on_update(update_value( - move |_| { - let mut new_gradient = new_gradient2.clone(); - new_gradient.gradient_type = GradientType::Radial; - TaggedValue::Fill(Fill::Gradient(new_gradient)) - }, - node_id, - FillInput::::INDEX, - )) - .on_commit(commit_value), - ]; + let entries = [GradientType::Linear, GradientType::Radial] + .iter() + .map(|&grad_type| { + let gradient = gradient_for_closure.clone(); + RadioEntryData::new(format!("{:?}", grad_type)) + .label(format!("{:?}", grad_type)) + .on_update(move |_| { + let mut new_gradient = gradient.clone(); + new_gradient.gradient_type = grad_type; + Message::Batched { + messages: Box::new([ + NodeGraphMessage::SetInputValue { + node_id, + input_index: FillInput::::INDEX, + value: TaggedValue::Fill(Fill::Gradient(new_gradient)), + } + .into(), + GradientToolMessage::UpdateOptions { + options: GradientOptionsUpdate::Type(grad_type), + } + .into(), + ]), + } + }) + .on_commit(commit_value) + }) + .collect(); row.extend_from_slice(&[ Separator::new(SeparatorType::Unrelated).widget_instance(), diff --git a/editor/src/messages/prelude.rs b/editor/src/messages/prelude.rs index f64cbf0ee9..36209087e4 100644 --- a/editor/src/messages/prelude.rs +++ b/editor/src/messages/prelude.rs @@ -41,7 +41,7 @@ pub use crate::messages::tool::tool_messages::brush_tool::{BrushToolMessage, Bru pub use crate::messages::tool::tool_messages::eyedropper_tool::{EyedropperToolMessage, EyedropperToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::fill_tool::{FillToolMessage, FillToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::freehand_tool::{FreehandToolMessage, FreehandToolMessageDiscriminant}; -pub use crate::messages::tool::tool_messages::gradient_tool::{GradientToolMessage, GradientToolMessageDiscriminant}; +pub use crate::messages::tool::tool_messages::gradient_tool::{GradientOptionsUpdate, GradientToolMessage, GradientToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::navigate_tool::{NavigateToolMessage, NavigateToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::path_tool::{PathToolMessage, PathToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::pen_tool::{PenToolMessage, PenToolMessageDiscriminant}; diff --git a/editor/src/messages/tool/tool_messages/gradient_tool.rs b/editor/src/messages/tool/tool_messages/gradient_tool.rs index fa5b3f38a4..b8d230cd45 100644 --- a/editor/src/messages/tool/tool_messages/gradient_tool.rs +++ b/editor/src/messages/tool/tool_messages/gradient_tool.rs @@ -63,17 +63,48 @@ impl<'a> MessageHandler> for Grad match options { GradientOptionsUpdate::Type(gradient_type) => { self.options.gradient_type = gradient_type; - // Update the selected gradient if it exists + let selected_layers: Vec<_> = context + .document + .network_interface + .selected_nodes() + .selected_visible_layers(&context.document.network_interface) + .collect(); + + let mut transaction_started = false; + for layer in selected_layers { + if NodeGraphLayer::is_raster_layer(layer, &mut context.document.network_interface) { + continue; + } + + if let Some(mut gradient) = get_gradient(layer, &context.document.network_interface) { + if gradient.gradient_type != gradient_type { + if !transaction_started { + responses.add(DocumentMessage::StartTransaction); + transaction_started = true; + } + gradient.gradient_type = gradient_type; + responses.add(GraphOperationMessage::FillSet { + layer, + fill: Fill::Gradient(gradient), + }); + } + } + } + + if transaction_started { + responses.add(DocumentMessage::AddTransaction); + } if let Some(selected_gradient) = &mut self.data.selected_gradient { - // Check if the current layer is a raster layer if let Some(layer) = selected_gradient.layer { - if NodeGraphLayer::is_raster_layer(layer, &mut context.document.network_interface) { - return; // Don't proceed if it's a raster layer + if !NodeGraphLayer::is_raster_layer(layer, &mut context.document.network_interface) { + selected_gradient.gradient.gradient_type = gradient_type; } - selected_gradient.gradient.gradient_type = gradient_type; - selected_gradient.render_gradient(responses); } } + responses.add(ToolMessage::UpdateHints); + responses.add(PropertiesPanelMessage::Refresh); + responses.add(ToolMessage::UpdateCursor); + responses.add(ToolMessage::RefreshToolOptions); } } } @@ -104,7 +135,7 @@ impl LayoutHolder for GradientTool { .into() }), ]) - .selected_index(Some((self.selected_gradient().unwrap_or(self.options.gradient_type) == GradientType::Radial) as u32)) + .selected_index(Some((self.options.gradient_type == GradientType::Radial) as u32)) .widget_instance(); Layout(vec![LayoutGroup::Row { widgets: vec![gradient_type] }])