Replace Fill node's "Use Gradient"/"Use Solid" buttons with toggle (#1220)

* Replace Fill node's Use Gradient\Solid Color with radio selector

* Code Review Round 1

* Code Review Final Round ?
This commit is contained in:
Rottie
2023-05-17 11:05:48 -07:00
committed by Keavon Chambers
parent 2a47ac1e85
commit d76bd36447
@@ -310,17 +310,42 @@ fn line_join_widget(document_node: &DocumentNode, node_id: u64, index: usize, na
LayoutGroup::Row { widgets } LayoutGroup::Row { widgets }
} }
fn gradient_type_widget(document_node: &DocumentNode, node_id: u64, index: usize, name: &str, blank_assist: bool) -> LayoutGroup { fn fill_type_widget(document_node: &DocumentNode, node_id: u64, index: usize) -> LayoutGroup {
let mut widgets = start_widgets(document_node, node_id, index, name, FrontendGraphDataType::General, blank_assist); let mut widgets = start_widgets(document_node, node_id, index, "Fill Type", FrontendGraphDataType::General, true);
if let &NodeInput::Value {
tagged_value: TaggedValue::FillType(fill_type),
exposed: false,
} = &document_node.inputs[index]
{
let entries = vec![
RadioEntryData::new("Solid").on_update(update_value(move |_| TaggedValue::FillType(FillType::Solid), node_id, index)),
RadioEntryData::new("Gradient").on_update(update_value(move |_| TaggedValue::FillType(FillType::Gradient), node_id, index)),
];
widgets.extend_from_slice(&[
WidgetHolder::unrelated_separator(),
RadioInput::new(entries)
.selected_index(match fill_type {
FillType::None | FillType::Solid => 0,
FillType::Gradient => 1,
})
.widget_holder(),
]);
}
LayoutGroup::Row { widgets }
}
fn gradient_type_widget(document_node: &DocumentNode, node_id: u64, index: usize) -> LayoutGroup {
let mut widgets = start_widgets(document_node, node_id, index, "Gradient Type", FrontendGraphDataType::General, true);
if let &NodeInput::Value { if let &NodeInput::Value {
tagged_value: TaggedValue::GradientType(gradient_type), tagged_value: TaggedValue::GradientType(gradient_type),
exposed: false, exposed: false,
} = &document_node.inputs[index] } = &document_node.inputs[index]
{ {
let entries = [("Linear", GradientType::Linear), ("Radial", GradientType::Radial)] let entries = vec![
.into_iter() RadioEntryData::new("Linear").on_update(update_value(move |_| TaggedValue::GradientType(GradientType::Linear), node_id, index)),
.map(|(name, val)| RadioEntryData::new(name).on_update(update_value(move |_| TaggedValue::GradientType(val), node_id, index))) RadioEntryData::new("Radial").on_update(update_value(move |_| TaggedValue::GradientType(GradientType::Radial), node_id, index)),
.collect(); ];
widgets.extend_from_slice(&[WidgetHolder::unrelated_separator(), RadioInput::new(entries).selected_index(gradient_type as u32).widget_holder()]); widgets.extend_from_slice(&[WidgetHolder::unrelated_separator(), RadioInput::new(entries).selected_index(gradient_type as u32).widget_holder()]);
} }
@@ -1541,6 +1566,7 @@ pub fn stroke_properties(document_node: &DocumentNode, node_id: NodeId, _context
] ]
} }
/// Fill Node Widgets LayoutGroup
pub fn fill_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec<LayoutGroup> { pub fn fill_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec<LayoutGroup> {
let fill_type_index = 1; let fill_type_index = 1;
let solid_color_index = 2; let solid_color_index = 2;
@@ -1560,40 +1586,21 @@ pub fn fill_properties(document_node: &DocumentNode, node_id: NodeId, _context:
let mut widgets = Vec::new(); let mut widgets = Vec::new();
let gradient = fill_type == Some(graphene_core::vector::style::FillType::Gradient); let gradient = fill_type == Some(graphene_core::vector::style::FillType::Gradient);
let solid = fill_type == Some(graphene_core::vector::style::FillType::Solid); let solid = fill_type == Some(graphene_core::vector::style::FillType::Solid);
let empty = fill_type == Some(graphene_core::vector::style::FillType::None);
if fill_type.is_none() || solid || empty { let fill_type_switch = fill_type_widget(document_node, node_id, fill_type_index);
widgets.push(fill_type_switch);
if fill_type.is_none() || solid {
let solid_color = color_widget(document_node, node_id, solid_color_index, "Color", ColorInput::default(), true); let solid_color = color_widget(document_node, node_id, solid_color_index, "Color", ColorInput::default(), true);
widgets.push(solid_color); widgets.push(solid_color);
} }
if fill_type.is_none() || gradient { if fill_type.is_none() || gradient {
let gradient_type = gradient_type_widget(document_node, node_id, gradient_type_index, "Gradient Type", true); let gradient_type_switch = gradient_type_widget(document_node, node_id, gradient_type_index);
widgets.push(gradient_type); widgets.push(gradient_type_switch);
gradient_positions(&mut widgets, document_node, "Gradient Positions", node_id, positions_index); gradient_positions(&mut widgets, document_node, "Gradient Positions", node_id, positions_index);
} }
if gradient || solid || empty {
let new_fill_type = if gradient { FillType::Solid } else { FillType::Gradient };
let switch_button = TextButton::new(if gradient { "Use Solid Color" } else { "Use Gradient" })
.tooltip(if gradient {
"Change this fill from a gradient to a solid color, keeping the 0% stop color"
} else {
"Change this fill from a solid color to a gradient"
})
.on_update(update_value(move |_| TaggedValue::FillType(new_fill_type), node_id, fill_type_index));
widgets.push(LayoutGroup::Row {
widgets: {
let mut widgets = Vec::new();
widgets.push(TextLabel::new("").widget_holder());
add_blank_assist(&mut widgets);
widgets.push(WidgetHolder::unrelated_separator());
widgets.push(switch_button.widget_holder());
widgets
},
});
}
widgets widgets
} }