Fix the Gradient tool's linear/radial type toggle resetting the gradient color stops (#3499)

* fix : sync the linear/radial option in menu bar and property panal

* fix : fmt

* Promote vector meshes from experimental by removing it from preferences

* fix : change reverting bug

* chore : refactor

---------

Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
Jatin Bharti 2026-02-12 03:19:23 +05:30 committed by GitHub
parent 4cdfbb22e8
commit a1a9abd6a2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 65 additions and 34 deletions

View File

@ -1951,35 +1951,35 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte
} }
} }
let new_gradient1 = gradient.clone(); let gradient_for_closure = gradient.clone();
let new_gradient2 = gradient.clone();
let entries = vec![ let entries = [GradientType::Linear, GradientType::Radial]
RadioEntryData::new("Linear") .iter()
.label("Linear") .map(|&grad_type| {
.on_update(update_value( let gradient = gradient_for_closure.clone();
move |_| { let set_input_value = update_value(
let mut new_gradient = new_gradient1.clone(); move |_: &()| {
new_gradient.gradient_type = GradientType::Linear; let mut new_gradient = gradient.clone();
new_gradient.gradient_type = grad_type;
TaggedValue::Fill(Fill::Gradient(new_gradient)) TaggedValue::Fill(Fill::Gradient(new_gradient))
}, },
node_id, node_id,
FillInput::<Color>::INDEX, FillInput::<Color>::INDEX,
)) );
.on_commit(commit_value), RadioEntryData::new(format!("{:?}", grad_type))
RadioEntryData::new("Radial") .label(format!("{:?}", grad_type))
.label("Radial") .on_update(move |_| Message::Batched {
.on_update(update_value( messages: Box::new([
move |_| { set_input_value(&()),
let mut new_gradient = new_gradient2.clone(); GradientToolMessage::UpdateOptions {
new_gradient.gradient_type = GradientType::Radial; options: GradientOptionsUpdate::Type(grad_type),
TaggedValue::Fill(Fill::Gradient(new_gradient)) }
}, .into(),
node_id, ]),
FillInput::<Color>::INDEX, })
)) .on_commit(commit_value)
.on_commit(commit_value), })
]; .collect();
row.extend_from_slice(&[ row.extend_from_slice(&[
Separator::new(SeparatorStyle::Unrelated).widget_instance(), Separator::new(SeparatorStyle::Unrelated).widget_instance(),

View File

@ -40,7 +40,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::eyedropper_tool::{EyedropperToolMessage, EyedropperToolMessageDiscriminant};
pub use crate::messages::tool::tool_messages::fill_tool::{FillToolMessage, FillToolMessageDiscriminant}; 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::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::navigate_tool::{NavigateToolMessage, NavigateToolMessageDiscriminant};
pub use crate::messages::tool::tool_messages::path_tool::{PathToolMessage, PathToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::path_tool::{PathToolMessage, PathToolMessageDiscriminant};
pub use crate::messages::tool::tool_messages::pen_tool::{PenToolMessage, PenToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::pen_tool::{PenToolMessage, PenToolMessageDiscriminant};

View File

@ -63,18 +63,49 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionMessageContext<'a>> for Grad
match options { match options {
GradientOptionsUpdate::Type(gradient_type) => { GradientOptionsUpdate::Type(gradient_type) => {
self.options.gradient_type = gradient_type; self.options.gradient_type = gradient_type;
// Update the selected gradient if it exists let selected_layers: Vec<_> = context
if let Some(selected_gradient) = &mut self.data.selected_gradient { .document
// Check if the current layer is a raster layer .network_interface
if let Some(layer) = selected_gradient.layer { .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) { if NodeGraphLayer::is_raster_layer(layer, &mut context.document.network_interface) {
return; // Don't proceed if it's a raster layer 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 {
if let Some(layer) = selected_gradient.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() .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(); .widget_instance();
Layout(vec![LayoutGroup::Row { widgets: vec![gradient_type] }]) Layout(vec![LayoutGroup::Row { widgets: vec![gradient_type] }])