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:
parent
4cdfbb22e8
commit
a1a9abd6a2
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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};
|
||||||
|
|
|
||||||
|
|
@ -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] }])
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue