Skip to content

Commit bb5a6a2

Browse files
KeavonCopilot
andcommitted
Move [f64; 4] to Table<f64>
Co-authored-by: Copilot <copilot@github.com>
1 parent 9018e7f commit bb5a6a2

6 files changed

Lines changed: 32 additions & 35 deletions

File tree

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

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1803,13 +1803,13 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties
18031803
};
18041804
let uniform_val = match input.as_non_exposed_value() {
18051805
Some(TaggedValue::F64(x)) => *x,
1806-
Some(TaggedValue::F64Array4(x)) => x[0],
1806+
Some(TaggedValue::F64Table(table)) => table.iter_element_values().copied().next().unwrap_or(0.),
18071807
_ => 0.,
18081808
};
18091809
let individual_val = match input.as_non_exposed_value() {
1810-
Some(&TaggedValue::F64Array4(x)) => x,
1811-
Some(&TaggedValue::F64(x)) => [x; 4],
1812-
_ => [0.; 4],
1810+
Some(&TaggedValue::F64(x)) => vec![x; 4],
1811+
Some(TaggedValue::F64Table(table)) => table.iter_element_values().copied().collect(),
1812+
_ => vec![0.; 4],
18131813
};
18141814

18151815
// Uniform/individual radio input widget
@@ -1832,6 +1832,7 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties
18321832
]),
18331833
})
18341834
.on_commit(commit_value);
1835+
let individual_val_for_switch = individual_val.clone();
18351836
let individual = RadioEntryData::new("Individual")
18361837
.label("Individual")
18371838
.on_update(move |_| Message::Batched {
@@ -1845,7 +1846,7 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties
18451846
NodeGraphMessage::SetInputValue {
18461847
node_id,
18471848
input_index: CornerRadiusInput::<f64>::INDEX,
1848-
value: TaggedValue::F64Array4(individual_val),
1849+
value: TaggedValue::F64Table(individual_val_for_switch.iter().copied().map(graphene_std::table::TableRow::new_from_element).collect()),
18491850
}
18501851
.into(),
18511852
]),
@@ -1863,11 +1864,7 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties
18631864
.map(str::parse::<f64>)
18641865
.collect::<Result<Vec<f64>, _>>()
18651866
.ok()
1866-
.map(|v| {
1867-
let arr: Box<[f64; 4]> = v.into_boxed_slice().try_into().unwrap_or_default();
1868-
*arr
1869-
})
1870-
.map(TaggedValue::F64Array4)
1867+
.map(|values| TaggedValue::F64Table(values.into_iter().take(4).map(graphene_std::table::TableRow::new_from_element).collect()))
18711868
};
18721869
TextInput::default()
18731870
.value(individual_val.iter().map(|v| v.to_string()).collect::<Vec<_>>().join(", "))

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

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,7 @@ pub enum FrontendGraphDataType {
2121
impl FrontendGraphDataType {
2222
pub fn from_type(input: &Type) -> Self {
2323
match TaggedValue::from_type_or_none(input) {
24-
TaggedValue::U32(_)
25-
| TaggedValue::U64(_)
26-
| TaggedValue::F32(_)
27-
| TaggedValue::F64(_)
28-
| TaggedValue::DVec2(_)
29-
| TaggedValue::F64Array4(_)
30-
| TaggedValue::F64Table(_)
31-
| TaggedValue::DAffine2(_) => Self::Number,
24+
TaggedValue::U32(_) | TaggedValue::U64(_) | TaggedValue::F32(_) | TaggedValue::F64(_) | TaggedValue::DVec2(_) | TaggedValue::F64Table(_) | TaggedValue::DAffine2(_) => Self::Number,
3225
TaggedValue::Artboard(_) => Self::Artboard,
3326
TaggedValue::Graphic(_) => Self::Graphic,
3427
TaggedValue::Raster(_) => Self::Raster,

editor/src/messages/portfolio/document/utility_types/network_interface/resolved_types.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,9 @@ impl TypeSource {
5353
};
5454
match self.compiled_nested_type() {
5555
Some(nested_type) => match TaggedValue::from_type_or_none(nested_type) {
56-
TaggedValue::U32(_)
57-
| TaggedValue::U64(_)
58-
| TaggedValue::F32(_)
59-
| TaggedValue::F64(_)
60-
| TaggedValue::DVec2(_)
61-
| TaggedValue::F64Array4(_)
62-
| TaggedValue::F64Table(_)
63-
| TaggedValue::DAffine2(_) => FrontendGraphDataType::Number,
56+
TaggedValue::U32(_) | TaggedValue::U64(_) | TaggedValue::F32(_) | TaggedValue::F64(_) | TaggedValue::DVec2(_) | TaggedValue::F64Table(_) | TaggedValue::DAffine2(_) => {
57+
FrontendGraphDataType::Number
58+
}
6459
TaggedValue::Artboard(_) => FrontendGraphDataType::Artboard,
6560
TaggedValue::Graphic(_) => FrontendGraphDataType::Graphic,
6661
TaggedValue::Raster(_) => FrontendGraphDataType::Raster,

node-graph/graph-craft/src/document/value.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,14 +178,13 @@ tagged_value! {
178178
// ========================
179179
// LISTS OF PRIMITIVE TYPES
180180
// ========================
181-
F64Array4([f64; 4]),
182181
NodePath(Vec<NodeId>),
183182
// ===========
184183
// TABLE TYPES
185184
// ===========
186185
StringTable(Table<String>),
187186
#[serde(deserialize_with = "core_types::misc::migrate_vec_f64_to_table")] // TODO: Eventually remove this migration document upgrade code
188-
#[serde(alias = "VecF64", alias = "VecF32")]
187+
#[serde(alias = "VecF64", alias = "VecF32", alias = "F64Array4")]
189188
F64Table(Table<f64>),
190189
#[serde(deserialize_with = "graphic_types::migrations::migrate_vector")] // TODO: Eventually remove this migration document upgrade code
191190
#[serde(alias = "VectorData")]

node-graph/interpreted-executor/src/node_registry.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ fn node_registry() -> HashMap<ProtoNodeIdentifier, HashMap<NodeIOTypes, NodeCons
9999
async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Table<String>]),
100100
async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Table<f64>]),
101101
async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Table<u8>]),
102-
async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => [f64; 4]]),
103102
async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Graphic]),
104103
async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_std::text::Font]),
105104
async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Vec<BrushStroke>]),
@@ -173,7 +172,6 @@ fn node_registry() -> HashMap<ProtoNodeIdentifier, HashMap<NodeIOTypes, NodeCons
173172
async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => Option<f64>]),
174173
async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => Option<Color>]),
175174
async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => Option<NodeId>]),
176-
async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => [f64; 4]]),
177175
async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => Graphic]),
178176
async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => glam::f32::Vec2]),
179177
async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => glam::f32::Affine2]),

node-graph/nodes/vector/src/generator_nodes.rs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,37 @@ impl CornerRadius for f64 {
1818
Table::new_from_element(Vector::from_subpath(subpath::Subpath::new_rounded_rectangle(size / -2., size / 2., [clamped_radius; 4])))
1919
}
2020
}
21-
impl CornerRadius for [f64; 4] {
21+
impl CornerRadius for Table<f64> {
2222
fn generate(self, size: DVec2, clamped: bool) -> Table<Vector> {
23+
// Expand to four corners using the CSS `border-radius` shorthand rules.
24+
// - `[a]` → `[a, a, a, a]`
25+
// - `[a, b]` → `[a, b, a, b]`
26+
// - `[a, b, c]` → `[a, b, c, b]`
27+
// - `[a, b, c, d, …]` → `[a, b, c, d]`
28+
// - `[]` → `[0, 0, 0, 0]`
29+
let values: Vec<f64> = self.iter_element_values().copied().collect();
30+
let radii: [f64; 4] = match values.as_slice() {
31+
[] => [0., 0., 0., 0.],
32+
&[a] => [a, a, a, a],
33+
&[a, b] => [a, b, a, b],
34+
&[a, b, c] => [a, b, c, b],
35+
&[a, b, c, d, ..] => [a, b, c, d],
36+
};
37+
2338
let clamped_radius = if clamped {
2439
// Algorithm follows the CSS spec: <https://drafts.csswg.org/css-backgrounds/#corner-overlap>
2540

2641
let mut scale_factor: f64 = 1.;
2742
for i in 0..4 {
2843
let side_length = if i % 2 == 0 { size.x } else { size.y };
29-
let adjacent_corner_radius_sum = self[i] + self[(i + 1) % 4];
44+
let adjacent_corner_radius_sum = radii[i] + radii[(i + 1) % 4];
3045
if side_length < adjacent_corner_radius_sum {
3146
scale_factor = scale_factor.min(side_length / adjacent_corner_radius_sum);
3247
}
3348
}
34-
self.map(|x| x * scale_factor)
49+
radii.map(|x| x * scale_factor)
3550
} else {
36-
self
51+
radii
3752
};
3853
Table::new_from_element(Vector::from_subpath(subpath::Subpath::new_rounded_rectangle(size / -2., size / 2., clamped_radius)))
3954
}
@@ -140,7 +155,7 @@ fn rectangle<T: CornerRadius>(
140155
#[default(100)]
141156
height: f64,
142157
_individual_corner_radii: bool, // TODO: Move this to the bottom once we have a migration capability
143-
#[implementations(f64, [f64; 4])] corner_radius: T,
158+
#[implementations(f64, Table<f64>)] corner_radius: T,
144159
#[default(true)] clamped: bool,
145160
) -> Table<Vector> {
146161
corner_radius.generate(DVec2::new(width, height), clamped)

0 commit comments

Comments
 (0)