Skip to content

Commit ac74bd9

Browse files
committed
Allow the Stroke node to receive "Dash Lengths" values from the node graph
1 parent 0298f9a commit ac74bd9

File tree

3 files changed

+30
-7
lines changed

3 files changed

+30
-7
lines changed

editor/src/messages/portfolio/document/graph_operation/utility_types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ impl<'a> ModifyInputsContext<'a> {
388388
self.set_input_with_refresh(input_connector, NodeInput::value(TaggedValue::F64(stroke.join_miter_limit), false), false);
389389
let input_connector = InputConnector::node(stroke_node_id, graphene_std::vector::stroke::PaintOrderInput::INDEX);
390390
self.set_input_with_refresh(input_connector, NodeInput::value(TaggedValue::PaintOrder(stroke.paint_order), false), false);
391-
let input_connector = InputConnector::node(stroke_node_id, graphene_std::vector::stroke::DashLengthsInput::INDEX);
391+
let input_connector = InputConnector::node(stroke_node_id, graphene_std::vector::stroke::DashLengthsInput::<Vec<f64>>::INDEX);
392392
self.set_input_with_refresh(input_connector, NodeInput::value(TaggedValue::VecF64(stroke.dash_lengths), false), true);
393393
let input_connector = InputConnector::node(stroke_node_id, graphene_std::vector::stroke::DashOffsetInput::INDEX);
394394
self.set_input_with_refresh(input_connector, NodeInput::value(TaggedValue::F64(stroke.dash_offset), false), true);

editor/src/messages/portfolio/document/node_graph/node_properties.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1849,7 +1849,7 @@ pub fn stroke_properties(node_id: NodeId, context: &mut NodePropertiesContext) -
18491849
_ => &StrokeJoin::Miter,
18501850
};
18511851

1852-
let dash_lengths_val = match &document_node.inputs[DashLengthsInput::INDEX].as_value() {
1852+
let dash_lengths_val = match &document_node.inputs[DashLengthsInput::<Vec<f64>>::INDEX].as_value() {
18531853
Some(TaggedValue::VecF64(x)) => x,
18541854
_ => &vec![],
18551855
};
@@ -1877,7 +1877,10 @@ pub fn stroke_properties(node_id: NodeId, context: &mut NodePropertiesContext) -
18771877
.for_socket(ParameterWidgetsInfo::new(node_id, PaintOrderInput::INDEX, true, context))
18781878
.property_row();
18791879
let disabled_number_input = NumberInput::default().unit(" px").disabled(has_dash_lengths);
1880-
let dash_lengths = array_of_number_widget(ParameterWidgetsInfo::new(node_id, DashLengthsInput::INDEX, true, context), TextInput::default().centered(true));
1880+
let dash_lengths = array_of_number_widget(
1881+
ParameterWidgetsInfo::new(node_id, DashLengthsInput::<Vec<f64>>::INDEX, true, context),
1882+
TextInput::default().centered(true),
1883+
);
18811884
let number_input = disabled_number_input;
18821885
let dash_offset = number_widget(ParameterWidgetsInfo::new(node_id, DashOffsetInput::INDEX, true, context), number_input);
18831886

node-graph/gcore/src/vector/vector_nodes.rs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,31 @@ async fn fill<F: Into<Fill> + 'n + Send, V: VectorTableIterMut + 'n + Send>(
146146
content
147147
}
148148

149+
trait IntoF64Vec {
150+
fn into_vec(self) -> Vec<f64>;
151+
}
152+
impl IntoF64Vec for f64 {
153+
fn into_vec(self) -> Vec<f64> {
154+
vec![self]
155+
}
156+
}
157+
impl IntoF64Vec for Vec<f64> {
158+
fn into_vec(self) -> Vec<f64> {
159+
self
160+
}
161+
}
162+
impl IntoF64Vec for String {
163+
fn into_vec(self) -> Vec<f64> {
164+
self.split(&[',', ' ']).filter(|s| !s.is_empty()).filter_map(|s| s.parse::<f64>().ok()).collect()
165+
}
166+
}
167+
149168
/// Applies a stroke style to the vector content, giving an appearance to the area within the outline of the geometry.
150169
#[node_macro::node(category("Vector: Style"), path(graphene_core::vector), properties("stroke_properties"))]
151-
async fn stroke<V>(
170+
async fn stroke<V, L: IntoF64Vec>(
152171
_: impl Ctx,
153172
/// The content with vector paths to apply the stroke style to.
154-
#[implementations(Table<Vector>, Table<Graphic>)]
173+
#[implementations(Table<Vector>, Table<Vector>, Table<Vector>, Table<Graphic>, Table<Graphic>, Table<Graphic>)]
155174
mut content: Table<V>,
156175
/// The stroke color.
157176
#[default(Color::BLACK)]
@@ -173,7 +192,8 @@ async fn stroke<V>(
173192
/// <https://svgwg.org/svg2-draft/painting.html#PaintOrderProperty>
174193
paint_order: PaintOrder,
175194
/// The stroke dash lengths. Each length forms a distance in a pattern where the first length is a dash, the second is a gap, and so on. If the list is an odd length, the pattern repeats with solid-gap roles reversed.
176-
dash_lengths: Vec<f64>,
195+
#[implementations(Vec<f64>, f64, String, Vec<f64>, f64, String)]
196+
dash_lengths: L,
177197
/// The phase offset distance from the starting point of the dash pattern.
178198
#[unit(" px")]
179199
dash_offset: f64,
@@ -184,7 +204,7 @@ where
184204
let stroke = Stroke {
185205
color: color.into(),
186206
weight,
187-
dash_lengths,
207+
dash_lengths: dash_lengths.into_vec(),
188208
dash_offset,
189209
cap,
190210
join,

0 commit comments

Comments
 (0)