Rename WidgetHolder to WidgetInstance

This commit is contained in:
Keavon Chambers
2025-12-04 01:10:22 -08:00
parent 810ce40e9b
commit 4581689d9c
36 changed files with 647 additions and 644 deletions
@@ -97,11 +97,11 @@ impl DataPanelMessageHandler {
widgets.extend([
if is_layer {
IconLabel::new("Layer").tooltip_description("Name of the selected layer.").widget_holder()
IconLabel::new("Layer").tooltip_description("Name of the selected layer.").widget_instance()
} else {
IconLabel::new("Node").tooltip_description("Name of the selected node.").widget_holder()
IconLabel::new("Node").tooltip_description("Name of the selected node.").widget_instance()
},
Separator::new(SeparatorType::Related).widget_holder(),
Separator::new(SeparatorType::Related).widget_instance(),
TextInput::new(network_interface.display_name(&node_id, &[]))
.tooltip_description(if is_layer { "Name of the selected layer." } else { "Name of the selected node." })
.on_update(move |text_input| {
@@ -113,8 +113,8 @@ impl DataPanelMessageHandler {
.into()
})
.max_width(200)
.widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
]);
}
@@ -122,7 +122,7 @@ impl DataPanelMessageHandler {
if !layout_data.breadcrumbs.is_empty() {
let breadcrumb = BreadcrumbTrailButtons::new(layout_data.breadcrumbs)
.on_update(|&len| DataPanelMessage::TruncateElementPath { len: len as usize }.into())
.widget_holder();
.widget_instance();
widgets.push(breadcrumb);
}
@@ -177,12 +177,12 @@ fn generate_layout(introspected_data: &Arc<dyn std::any::Any + Send + Sync + 'st
])
}
fn column_headings(value: &[&str]) -> Vec<WidgetHolder> {
value.iter().map(|text| TextLabel::new(*text).widget_holder()).collect()
fn column_headings(value: &[&str]) -> Vec<WidgetInstance> {
value.iter().map(|text| TextLabel::new(*text).widget_instance()).collect()
}
fn label(x: impl Into<String>) -> Vec<LayoutGroup> {
let error = vec![TextLabel::new(x).widget_holder()];
let error = vec![TextLabel::new(x).widget_instance()];
vec![LayoutGroup::Row { widgets: error }]
}
@@ -193,11 +193,11 @@ trait TableRowLayout {
data.breadcrumbs.push(self.identifier());
self.element_page(data)
}
fn element_widget(&self, index: usize) -> WidgetHolder {
fn element_widget(&self, index: usize) -> WidgetInstance {
TextButton::new(self.identifier())
.on_update(move |_| DataPanelMessage::PushToElementPath { index }.into())
.narrow(true)
.widget_holder()
.widget_instance()
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
vec![]
@@ -227,7 +227,7 @@ impl<T: TableRowLayout> TableRowLayout for Vec<T> {
let mut rows = self
.iter()
.enumerate()
.map(|(index, row)| vec![TextLabel::new(format!("{index}")).narrow(true).widget_holder(), row.element_widget(index)])
.map(|(index, row)| vec![TextLabel::new(format!("{index}")).narrow(true).widget_instance(), row.element_widget(index)])
.collect::<Vec<_>>();
rows.insert(0, column_headings(&["", "element"]));
@@ -261,13 +261,13 @@ impl<T: TableRowLayout> TableRowLayout for Table<T> {
.enumerate()
.map(|(index, row)| {
vec![
TextLabel::new(format!("{index}")).narrow(true).widget_holder(),
TextLabel::new(format!("{index}")).narrow(true).widget_instance(),
row.element.element_widget(index),
TextLabel::new(format_transform_matrix(row.transform)).narrow(true).widget_holder(),
TextLabel::new(format!("{}", row.alpha_blending)).narrow(true).widget_holder(),
TextLabel::new(format_transform_matrix(row.transform)).narrow(true).widget_instance(),
TextLabel::new(format!("{}", row.alpha_blending)).narrow(true).widget_instance(),
TextLabel::new(row.source_node_id.map_or_else(|| "-".to_string(), |id| format!("{}", id.0)))
.narrow(true)
.widget_holder(),
.widget_instance(),
]
})
.collect::<Vec<_>>();
@@ -342,7 +342,7 @@ impl TableRowLayout for Vector {
.on_update(move |_| DataPanelMessage::ViewVectorTableTab { tab }.into())
})
.collect();
let table_tabs = vec![RadioInput::new(table_tab_entries).selected_index(Some(data.vector_table_tab as u32)).widget_holder()];
let table_tabs = vec![RadioInput::new(table_tab_entries).selected_index(Some(data.vector_table_tab as u32)).widget_instance()];
let mut table_rows = Vec::new();
match data.vector_table_tab {
@@ -351,37 +351,37 @@ impl TableRowLayout for Vector {
match self.style.fill.clone() {
Fill::None => table_rows.push(vec![
TextLabel::new("Fill").narrow(true).widget_holder(),
ColorInput::new(FillChoice::None).disabled(true).menu_direction(Some(MenuDirection::Top)).narrow(true).widget_holder(),
TextLabel::new("Fill").narrow(true).widget_instance(),
ColorInput::new(FillChoice::None).disabled(true).menu_direction(Some(MenuDirection::Top)).narrow(true).widget_instance(),
]),
Fill::Solid(color) => table_rows.push(vec![
TextLabel::new("Fill").narrow(true).widget_holder(),
TextLabel::new("Fill").narrow(true).widget_instance(),
ColorInput::new(FillChoice::Solid(color))
.disabled(true)
.menu_direction(Some(MenuDirection::Top))
.narrow(true)
.widget_holder(),
.widget_instance(),
]),
Fill::Gradient(gradient) => {
table_rows.push(vec![
TextLabel::new("Fill").narrow(true).widget_holder(),
TextLabel::new("Fill").narrow(true).widget_instance(),
ColorInput::new(FillChoice::Gradient(gradient.stops))
.disabled(true)
.menu_direction(Some(MenuDirection::Top))
.narrow(true)
.widget_holder(),
.widget_instance(),
]);
table_rows.push(vec![
TextLabel::new("Fill Gradient Type").narrow(true).widget_holder(),
TextLabel::new(gradient.gradient_type.to_string()).narrow(true).widget_holder(),
TextLabel::new("Fill Gradient Type").narrow(true).widget_instance(),
TextLabel::new(gradient.gradient_type.to_string()).narrow(true).widget_instance(),
]);
table_rows.push(vec![
TextLabel::new("Fill Gradient Start").narrow(true).widget_holder(),
TextLabel::new(format_dvec2(gradient.start)).narrow(true).widget_holder(),
TextLabel::new("Fill Gradient Start").narrow(true).widget_instance(),
TextLabel::new(format_dvec2(gradient.start)).narrow(true).widget_instance(),
]);
table_rows.push(vec![
TextLabel::new("Fill Gradient End").narrow(true).widget_holder(),
TextLabel::new(format_dvec2(gradient.end)).narrow(true).widget_holder(),
TextLabel::new("Fill Gradient End").narrow(true).widget_instance(),
TextLabel::new(format_dvec2(gradient.end)).narrow(true).widget_instance(),
]);
}
}
@@ -389,81 +389,81 @@ impl TableRowLayout for Vector {
if let Some(stroke) = self.style.stroke.clone() {
let color = if let Some(color) = stroke.color { FillChoice::Solid(color) } else { FillChoice::None };
table_rows.push(vec![
TextLabel::new("Stroke").narrow(true).widget_holder(),
ColorInput::new(color).disabled(true).menu_direction(Some(MenuDirection::Top)).narrow(true).widget_holder(),
TextLabel::new("Stroke").narrow(true).widget_instance(),
ColorInput::new(color).disabled(true).menu_direction(Some(MenuDirection::Top)).narrow(true).widget_instance(),
]);
table_rows.push(vec![
TextLabel::new("Stroke Weight").narrow(true).widget_holder(),
TextLabel::new(format!("{} px", stroke.weight)).narrow(true).widget_holder(),
TextLabel::new("Stroke Weight").narrow(true).widget_instance(),
TextLabel::new(format!("{} px", stroke.weight)).narrow(true).widget_instance(),
]);
table_rows.push(vec![
TextLabel::new("Stroke Dash Lengths").narrow(true).widget_holder(),
TextLabel::new("Stroke Dash Lengths").narrow(true).widget_instance(),
TextLabel::new(if stroke.dash_lengths.is_empty() {
"-".to_string()
} else {
format!("[{}]", stroke.dash_lengths.iter().map(|x| format!("{x} px")).collect::<Vec<_>>().join(", "))
})
.narrow(true)
.widget_holder(),
.widget_instance(),
]);
table_rows.push(vec![
TextLabel::new("Stroke Dash Offset").narrow(true).widget_holder(),
TextLabel::new(format!("{}", stroke.dash_offset)).narrow(true).widget_holder(),
TextLabel::new("Stroke Dash Offset").narrow(true).widget_instance(),
TextLabel::new(format!("{}", stroke.dash_offset)).narrow(true).widget_instance(),
]);
table_rows.push(vec![
TextLabel::new("Stroke Cap").narrow(true).widget_holder(),
TextLabel::new(stroke.cap.to_string()).narrow(true).widget_holder(),
TextLabel::new("Stroke Cap").narrow(true).widget_instance(),
TextLabel::new(stroke.cap.to_string()).narrow(true).widget_instance(),
]);
table_rows.push(vec![
TextLabel::new("Stroke Join").narrow(true).widget_holder(),
TextLabel::new(stroke.join.to_string()).narrow(true).widget_holder(),
TextLabel::new("Stroke Join").narrow(true).widget_instance(),
TextLabel::new(stroke.join.to_string()).narrow(true).widget_instance(),
]);
table_rows.push(vec![
TextLabel::new("Stroke Join Miter Limit").narrow(true).widget_holder(),
TextLabel::new(format!("{}", stroke.join_miter_limit)).narrow(true).widget_holder(),
TextLabel::new("Stroke Join Miter Limit").narrow(true).widget_instance(),
TextLabel::new(format!("{}", stroke.join_miter_limit)).narrow(true).widget_instance(),
]);
table_rows.push(vec![
TextLabel::new("Stroke Align").narrow(true).widget_holder(),
TextLabel::new(stroke.align.to_string()).narrow(true).widget_holder(),
TextLabel::new("Stroke Align").narrow(true).widget_instance(),
TextLabel::new(stroke.align.to_string()).narrow(true).widget_instance(),
]);
table_rows.push(vec![
TextLabel::new("Stroke Transform").narrow(true).widget_holder(),
TextLabel::new(format_transform_matrix(&stroke.transform)).narrow(true).widget_holder(),
TextLabel::new("Stroke Transform").narrow(true).widget_instance(),
TextLabel::new(format_transform_matrix(&stroke.transform)).narrow(true).widget_instance(),
]);
table_rows.push(vec![
TextLabel::new("Stroke Non-Scaling").narrow(true).widget_holder(),
TextLabel::new((if stroke.non_scaling { "Yes" } else { "No" }).to_string()).narrow(true).widget_holder(),
TextLabel::new("Stroke Non-Scaling").narrow(true).widget_instance(),
TextLabel::new((if stroke.non_scaling { "Yes" } else { "No" }).to_string()).narrow(true).widget_instance(),
]);
table_rows.push(vec![
TextLabel::new("Stroke Paint Order").narrow(true).widget_holder(),
TextLabel::new(stroke.paint_order.to_string()).narrow(true).widget_holder(),
TextLabel::new("Stroke Paint Order").narrow(true).widget_instance(),
TextLabel::new(stroke.paint_order.to_string()).narrow(true).widget_instance(),
]);
}
let colinear = self.colinear_manipulators.iter().map(|[a, b]| format!("[{a} / {b}]")).collect::<Vec<_>>().join(", ");
let colinear = if colinear.is_empty() { "-".to_string() } else { colinear };
table_rows.push(vec![
TextLabel::new("Colinear Handle IDs").narrow(true).widget_holder(),
TextLabel::new(colinear).narrow(true).widget_holder(),
TextLabel::new("Colinear Handle IDs").narrow(true).widget_instance(),
TextLabel::new(colinear).narrow(true).widget_instance(),
]);
table_rows.push(vec![
TextLabel::new("Upstream Nested Layers").narrow(true).widget_holder(),
TextLabel::new("Upstream Nested Layers").narrow(true).widget_instance(),
TextLabel::new(if self.upstream_data.is_some() {
"Yes (this preserves references to its upstream nested layers for editing by tools)"
} else {
"No (this doesn't preserve references to its upstream nested layers for editing by tools)"
})
.narrow(true)
.widget_holder(),
.widget_instance(),
]);
}
VectorTableTab::Points => {
table_rows.push(column_headings(&["", "position"]));
table_rows.extend(self.point_domain.iter().map(|(id, position)| {
vec![
TextLabel::new(format!("{}", id.inner())).narrow(true).widget_holder(),
TextLabel::new(format!("{position}")).narrow(true).widget_holder(),
TextLabel::new(format!("{}", id.inner())).narrow(true).widget_instance(),
TextLabel::new(format!("{position}")).narrow(true).widget_instance(),
]
}));
}
@@ -471,10 +471,10 @@ impl TableRowLayout for Vector {
table_rows.push(column_headings(&["", "start_index", "end_index", "handles"]));
table_rows.extend(self.segment_domain.iter().map(|(id, start, end, handles)| {
vec![
TextLabel::new(format!("{}", id.inner())).narrow(true).widget_holder(),
TextLabel::new(format!("{start}")).narrow(true).widget_holder(),
TextLabel::new(format!("{end}")).narrow(true).widget_holder(),
TextLabel::new(format!("{handles:?}")).narrow(true).widget_holder(),
TextLabel::new(format!("{}", id.inner())).narrow(true).widget_instance(),
TextLabel::new(format!("{start}")).narrow(true).widget_instance(),
TextLabel::new(format!("{end}")).narrow(true).widget_instance(),
TextLabel::new(format!("{handles:?}")).narrow(true).widget_instance(),
]
}));
}
@@ -482,9 +482,9 @@ impl TableRowLayout for Vector {
table_rows.push(column_headings(&["", "segment_range", "fill"]));
table_rows.extend(self.region_domain.iter().map(|(id, segment_range, fill)| {
vec![
TextLabel::new(format!("{}", id.inner())).narrow(true).widget_holder(),
TextLabel::new(format!("{segment_range:?}")).narrow(true).widget_holder(),
TextLabel::new(format!("{}", fill.inner())).narrow(true).widget_holder(),
TextLabel::new(format!("{}", id.inner())).narrow(true).widget_instance(),
TextLabel::new(format!("{segment_range:?}")).narrow(true).widget_instance(),
TextLabel::new(format!("{}", fill.inner())).narrow(true).widget_instance(),
]
}));
}
@@ -505,7 +505,7 @@ impl TableRowLayout for Raster<CPU> {
let raster = self.data();
if raster.width == 0 || raster.height == 0 {
let widgets = vec![TextLabel::new("Image has no area").widget_holder()];
let widgets = vec![TextLabel::new("Image has no area").widget_instance()];
return vec![LayoutGroup::Row { widgets }];
}
@@ -520,7 +520,7 @@ impl TableRowLayout for Raster<CPU> {
base64_string
});
let widgets = vec![ImageLabel::new(base64_string).widget_holder()];
let widgets = vec![ImageLabel::new(base64_string).widget_instance()];
vec![LayoutGroup::Row { widgets }]
}
}
@@ -533,7 +533,7 @@ impl TableRowLayout for Raster<GPU> {
format!("Raster ({}x{})", self.data().width(), self.data().height())
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
let widgets = vec![TextLabel::new("Raster is a texture on the GPU and cannot currently be displayed here").widget_holder()];
let widgets = vec![TextLabel::new("Raster is a texture on the GPU and cannot currently be displayed here").widget_instance()];
vec![LayoutGroup::Row { widgets }]
}
}
@@ -545,12 +545,12 @@ impl TableRowLayout for Color {
fn identifier(&self) -> String {
format!("Color (#{})", self.to_gamma_srgb().to_rgba_hex_srgb())
}
fn element_widget(&self, _index: usize) -> WidgetHolder {
fn element_widget(&self, _index: usize) -> WidgetInstance {
ColorInput::new(FillChoice::Solid(*self))
.disabled(true)
.menu_direction(Some(MenuDirection::Top))
.narrow(true)
.widget_holder()
.widget_instance()
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
let widgets = vec![self.element_widget(0)];
@@ -565,12 +565,12 @@ impl TableRowLayout for GradientStops {
fn identifier(&self) -> String {
format!("Gradient ({} stops)", self.0.len())
}
fn element_widget(&self, _index: usize) -> WidgetHolder {
fn element_widget(&self, _index: usize) -> WidgetInstance {
ColorInput::new(FillChoice::Gradient(self.clone()))
.menu_direction(Some(MenuDirection::Top))
.disabled(true)
.narrow(true)
.widget_holder()
.widget_instance()
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
let widgets = vec![self.element_widget(0)];
@@ -586,7 +586,7 @@ impl TableRowLayout for f64 {
"Number (f64)".to_string()
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
let widgets = vec![TextLabel::new(self.to_string()).widget_holder()];
let widgets = vec![TextLabel::new(self.to_string()).widget_instance()];
vec![LayoutGroup::Row { widgets }]
}
}
@@ -599,7 +599,7 @@ impl TableRowLayout for u32 {
"Number (u32)".to_string()
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
let widgets = vec![TextLabel::new(self.to_string()).widget_holder()];
let widgets = vec![TextLabel::new(self.to_string()).widget_instance()];
vec![LayoutGroup::Row { widgets }]
}
}
@@ -612,7 +612,7 @@ impl TableRowLayout for u64 {
"Number (u64)".to_string()
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
let widgets = vec![TextLabel::new(self.to_string()).widget_holder()];
let widgets = vec![TextLabel::new(self.to_string()).widget_instance()];
vec![LayoutGroup::Row { widgets }]
}
}
@@ -625,7 +625,7 @@ impl TableRowLayout for bool {
"Bool".to_string()
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
let widgets = vec![TextLabel::new(self.to_string()).widget_holder()];
let widgets = vec![TextLabel::new(self.to_string()).widget_instance()];
vec![LayoutGroup::Row { widgets }]
}
}
@@ -644,7 +644,7 @@ impl TableRowLayout for String {
}
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
let widgets = vec![TextAreaInput::new(self.to_string()).disabled(true).widget_holder()];
let widgets = vec![TextAreaInput::new(self.to_string()).disabled(true).widget_instance()];
vec![LayoutGroup::Row { widgets }]
}
}
@@ -657,7 +657,7 @@ impl TableRowLayout for Option<f64> {
"Option<f64>".to_string()
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
let widgets = vec![TextLabel::new(format!("{self:?}")).widget_holder()];
let widgets = vec![TextLabel::new(format!("{self:?}")).widget_instance()];
vec![LayoutGroup::Row { widgets }]
}
}
@@ -670,7 +670,7 @@ impl TableRowLayout for DVec2 {
"Vec2".to_string()
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
let widgets = vec![TextLabel::new(format!("({}, {})", self.x, self.y)).widget_holder()];
let widgets = vec![TextLabel::new(format!("({}, {})", self.x, self.y)).widget_instance()];
vec![LayoutGroup::Row { widgets }]
}
}
@@ -683,7 +683,7 @@ impl TableRowLayout for Vec2 {
"Vec2".to_string()
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
let widgets = vec![TextLabel::new(format!("({}, {})", self.x, self.y)).widget_holder()];
let widgets = vec![TextLabel::new(format!("({}, {})", self.x, self.y)).widget_instance()];
vec![LayoutGroup::Row { widgets }]
}
}
@@ -696,7 +696,7 @@ impl TableRowLayout for DAffine2 {
"Transform".to_string()
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
let widgets = vec![TextLabel::new(format_transform_matrix(self)).widget_holder()];
let widgets = vec![TextLabel::new(format_transform_matrix(self)).widget_instance()];
vec![LayoutGroup::Row { widgets }]
}
}
@@ -710,7 +710,7 @@ impl TableRowLayout for Affine2 {
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
let matrix = DAffine2::from_cols_array(&self.to_cols_array().map(|x| x as f64));
let widgets = vec![TextLabel::new(format_transform_matrix(&matrix)).widget_holder()];
let widgets = vec![TextLabel::new(format_transform_matrix(&matrix)).widget_instance()];
vec![LayoutGroup::Row { widgets }]
}
}
@@ -2194,8 +2194,8 @@ impl DocumentMessageHandler {
// .selected_index(Some(self.document_mode as u32))
// .draw_icon(true)
// .interactive(false) // TODO: set to true when dialogs are not spawned
// .widget_holder(),
// Separator::new(SeparatorType::Section).widget_holder(),
// .widget_instance(),
// Separator::new(SeparatorType::Section).widget_instance(),
],
}]);
@@ -2215,13 +2215,13 @@ impl DocumentMessageHandler {
.tooltip_shortcut(action_shortcut!(AnimationMessageDiscriminant::RestartAnimation))
.on_update(|_| AnimationMessage::RestartAnimation.into())
.disabled(time == Duration::ZERO)
.widget_holder(),
.widget_instance(),
IconButton::new(if animation_is_playing { "PlaybackPause" } else { "PlaybackPlay" }, 24)
.tooltip_label(if animation_is_playing { "Pause Animation" } else { "Play Animation" })
.tooltip_shortcut(action_shortcut!(AnimationMessageDiscriminant::ToggleLivePreview))
.on_update(|_| AnimationMessage::ToggleLivePreview.into())
.widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
CheckboxInput::new(self.overlays_visibility_settings.all)
.icon("Overlays")
.tooltip_label("Overlays")
@@ -2233,14 +2233,14 @@ impl DocumentMessageHandler {
}
.into()
})
.widget_holder(),
.widget_instance(),
PopoverButton::new()
.popover_layout(vec![
LayoutGroup::Row {
widgets: vec![TextLabel::new("Overlays").bold(true).widget_holder()],
widgets: vec![TextLabel::new("Overlays").bold(true).widget_instance()],
},
LayoutGroup::Row {
widgets: vec![TextLabel::new("General").widget_holder()],
widgets: vec![TextLabel::new("General").widget_instance()],
},
LayoutGroup::Row {
widgets: {
@@ -2255,8 +2255,8 @@ impl DocumentMessageHandler {
.into()
})
.for_label(checkbox_id)
.widget_holder(),
TextLabel::new("Artboard Name".to_string()).for_checkbox(checkbox_id).widget_holder(),
.widget_instance(),
TextLabel::new("Artboard Name".to_string()).for_checkbox(checkbox_id).widget_instance(),
]
},
},
@@ -2273,13 +2273,13 @@ impl DocumentMessageHandler {
.into()
})
.for_label(checkbox_id)
.widget_holder(),
TextLabel::new("G/R/S Measurement".to_string()).for_checkbox(checkbox_id).widget_holder(),
.widget_instance(),
TextLabel::new("G/R/S Measurement".to_string()).for_checkbox(checkbox_id).widget_instance(),
]
},
},
LayoutGroup::Row {
widgets: vec![TextLabel::new("Select Tool").widget_holder()],
widgets: vec![TextLabel::new("Select Tool").widget_instance()],
},
LayoutGroup::Row {
widgets: {
@@ -2294,8 +2294,8 @@ impl DocumentMessageHandler {
.into()
})
.for_label(checkbox_id)
.widget_holder(),
TextLabel::new("Quick Measurement".to_string()).for_checkbox(checkbox_id).widget_holder(),
.widget_instance(),
TextLabel::new("Quick Measurement".to_string()).for_checkbox(checkbox_id).widget_instance(),
]
},
},
@@ -2312,8 +2312,8 @@ impl DocumentMessageHandler {
.into()
})
.for_label(checkbox_id)
.widget_holder(),
TextLabel::new("Transform Cage".to_string()).for_checkbox(checkbox_id).widget_holder(),
.widget_instance(),
TextLabel::new("Transform Cage".to_string()).for_checkbox(checkbox_id).widget_instance(),
]
},
},
@@ -2330,8 +2330,8 @@ impl DocumentMessageHandler {
.into()
})
.for_label(checkbox_id)
.widget_holder(),
TextLabel::new("Transform Dial".to_string()).for_checkbox(checkbox_id).widget_holder(),
.widget_instance(),
TextLabel::new("Transform Dial".to_string()).for_checkbox(checkbox_id).widget_instance(),
]
},
},
@@ -2348,8 +2348,8 @@ impl DocumentMessageHandler {
.into()
})
.for_label(checkbox_id)
.widget_holder(),
TextLabel::new("Transform Pivot".to_string()).for_checkbox(checkbox_id).widget_holder(),
.widget_instance(),
TextLabel::new("Transform Pivot".to_string()).for_checkbox(checkbox_id).widget_instance(),
]
},
},
@@ -2366,8 +2366,8 @@ impl DocumentMessageHandler {
.into()
})
.for_label(checkbox_id)
.widget_holder(),
TextLabel::new("Transform Origin".to_string()).for_checkbox(checkbox_id).widget_holder(),
.widget_instance(),
TextLabel::new("Transform Origin".to_string()).for_checkbox(checkbox_id).widget_instance(),
]
},
},
@@ -2384,8 +2384,8 @@ impl DocumentMessageHandler {
.into()
})
.for_label(checkbox_id)
.widget_holder(),
TextLabel::new("Hover Outline".to_string()).for_checkbox(checkbox_id).widget_holder(),
.widget_instance(),
TextLabel::new("Hover Outline".to_string()).for_checkbox(checkbox_id).widget_instance(),
]
},
},
@@ -2402,13 +2402,13 @@ impl DocumentMessageHandler {
.into()
})
.for_label(checkbox_id)
.widget_holder(),
TextLabel::new("Selection Outline".to_string()).for_checkbox(checkbox_id).widget_holder(),
.widget_instance(),
TextLabel::new("Selection Outline".to_string()).for_checkbox(checkbox_id).widget_instance(),
]
},
},
LayoutGroup::Row {
widgets: vec![TextLabel::new("Pen & Path Tools").widget_holder()],
widgets: vec![TextLabel::new("Pen & Path Tools").widget_instance()],
},
LayoutGroup::Row {
widgets: {
@@ -2423,8 +2423,8 @@ impl DocumentMessageHandler {
.into()
})
.for_label(checkbox_id)
.widget_holder(),
TextLabel::new("Path".to_string()).for_checkbox(checkbox_id).widget_holder(),
.widget_instance(),
TextLabel::new("Path".to_string()).for_checkbox(checkbox_id).widget_instance(),
]
},
},
@@ -2441,8 +2441,8 @@ impl DocumentMessageHandler {
.into()
})
.for_label(checkbox_id)
.widget_holder(),
TextLabel::new("Anchors".to_string()).for_checkbox(checkbox_id).widget_holder(),
.widget_instance(),
TextLabel::new("Anchors".to_string()).for_checkbox(checkbox_id).widget_instance(),
]
},
},
@@ -2460,17 +2460,17 @@ impl DocumentMessageHandler {
.into()
})
.for_label(checkbox_id)
.widget_holder(),
.widget_instance(),
TextLabel::new("Handles".to_string())
.disabled(!self.overlays_visibility_settings.anchors)
.for_checkbox(checkbox_id)
.widget_holder(),
.widget_instance(),
]
},
},
])
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
CheckboxInput::new(snapping_state.snapping_enabled)
.icon("Snapping")
.tooltip_label("Snapping")
@@ -2482,15 +2482,15 @@ impl DocumentMessageHandler {
}
.into()
})
.widget_holder(),
.widget_instance(),
PopoverButton::new()
.popover_layout(
[
LayoutGroup::Row {
widgets: vec![TextLabel::new("Snapping").bold(true).widget_holder()],
widgets: vec![TextLabel::new("Snapping").bold(true).widget_instance()],
},
LayoutGroup::Row {
widgets: vec![TextLabel::new(SnappingOptions::BoundingBoxes.to_string()).widget_holder()],
widgets: vec![TextLabel::new(SnappingOptions::BoundingBoxes.to_string()).widget_instance()],
},
]
.into_iter()
@@ -2509,13 +2509,13 @@ impl DocumentMessageHandler {
.tooltip_label(name)
.tooltip_description(description)
.for_label(checkbox_id)
.widget_holder(),
TextLabel::new(name).tooltip_label(name).tooltip_description(description).for_checkbox(checkbox_id).widget_holder(),
.widget_instance(),
TextLabel::new(name).tooltip_label(name).tooltip_description(description).for_checkbox(checkbox_id).widget_instance(),
]
},
}))
.chain([LayoutGroup::Row {
widgets: vec![TextLabel::new(SnappingOptions::Paths.to_string()).widget_holder()],
widgets: vec![TextLabel::new(SnappingOptions::Paths.to_string()).widget_instance()],
}])
.chain(SNAP_FUNCTIONS_FOR_PATHS.into_iter().map(|(name, closure, description)| LayoutGroup::Row {
widgets: {
@@ -2532,26 +2532,26 @@ impl DocumentMessageHandler {
.tooltip_label(name)
.tooltip_description(description)
.for_label(checkbox_id)
.widget_holder(),
TextLabel::new(name).tooltip_label(name).tooltip_description(description).for_checkbox(checkbox_id).widget_holder(),
.widget_instance(),
TextLabel::new(name).tooltip_label(name).tooltip_description(description).for_checkbox(checkbox_id).widget_instance(),
]
},
}))
.collect(),
)
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
CheckboxInput::new(self.snapping_state.grid_snapping)
.icon("Grid")
.tooltip_label("Grid")
.tooltip_shortcut(action_shortcut!(DocumentMessageDiscriminant::ToggleGridVisibility))
.on_update(|optional_input: &CheckboxInput| DocumentMessage::GridVisibility { visible: optional_input.checked }.into())
.widget_holder(),
.widget_instance(),
PopoverButton::new()
.popover_layout(overlay_options(&self.snapping_state.grid))
.popover_min_width(Some(320))
.widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
RadioInput::new(vec![
RadioEntryData::new("Normal")
.icon("RenderModeNormal")
@@ -2572,18 +2572,18 @@ impl DocumentMessageHandler {
])
.selected_index(Some(self.render_mode as u32))
.narrow(true)
.widget_holder(),
.widget_instance(),
// PopoverButton::new()
// .popover_layout(vec![
// LayoutGroup::Row {
// widgets: vec![TextLabel::new("Render Mode").bold(true).widget_holder()],
// widgets: vec![TextLabel::new("Render Mode").bold(true).widget_instance()],
// },
// LayoutGroup::Row {
// widgets: vec![TextLabel::new("Coming soon").widget_holder()],
// widgets: vec![TextLabel::new("Coming soon").widget_instance()],
// },
// ])
// .widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_holder(),
// .widget_instance(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
];
widgets.extend(navigation_controls(&self.document_ptz, &self.navigation_handler, false));
@@ -2591,7 +2591,7 @@ impl DocumentMessageHandler {
let tilt_value = self.navigation_handler.snapped_tilt(self.document_ptz.tilt()) / (std::f64::consts::PI / 180.);
if tilt_value.abs() > 0.00001 {
widgets.extend([
Separator::new(SeparatorType::Related).widget_holder(),
Separator::new(SeparatorType::Related).widget_instance(),
NumberInput::new(Some(tilt_value))
.unit("°")
.increment_behavior(NumberInputIncrementBehavior::Callback)
@@ -2616,19 +2616,19 @@ impl DocumentMessageHandler {
}
.into()
})
.widget_holder(),
.widget_instance(),
]);
}
widgets.extend([
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
TextButton::new("Node Graph")
.icon(Some((if self.graph_view_overlay_open { "GraphViewOpen" } else { "GraphViewClosed" }).into()))
.hover_icon(Some((if self.graph_view_overlay_open { "GraphViewClosed" } else { "GraphViewOpen" }).into()))
.tooltip_label(if self.graph_view_overlay_open { "Hide Node Graph" } else { "Show Node Graph" })
.tooltip_shortcut(action_shortcut!(DocumentMessageDiscriminant::GraphViewOverlayToggle))
.on_update(move |_| DocumentMessage::GraphViewOverlayToggle.into())
.widget_holder(),
.widget_instance(),
]);
let document_bar_layout = WidgetLayout::new(vec![LayoutGroup::Row { widgets }]);
@@ -2726,8 +2726,8 @@ impl DocumentMessageHandler {
.draw_icon(false)
.max_width(100)
.tooltip_label("Blend Mode")
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
NumberInput::new(opacity)
.label("Opacity")
.unit("%")
@@ -2748,8 +2748,8 @@ impl DocumentMessageHandler {
.on_commit(|_| DocumentMessage::AddTransaction.into())
.max_width(100)
.tooltip_label("Opacity")
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
NumberInput::new(fill)
.label("Fill")
.unit("%")
@@ -2770,7 +2770,7 @@ impl DocumentMessageHandler {
.on_commit(|_| DocumentMessage::AddTransaction.into())
.max_width(100)
.tooltip_label("Fill")
.widget_holder(),
.widget_instance(),
];
let layers_panel_control_bar_left = WidgetLayout::new(vec![LayoutGroup::Row { widgets }]);
@@ -2781,14 +2781,14 @@ impl DocumentMessageHandler {
.tooltip_shortcut(action_shortcut!(DocumentMessageDiscriminant::ToggleSelectedLocked))
.on_update(|_| NodeGraphMessage::ToggleSelectedLocked.into())
.disabled(!has_selection)
.widget_holder(),
.widget_instance(),
IconButton::new(if selection_all_visible { "EyeVisible" } else { "EyeHidden" }, 24)
.hover_icon(Some((if selection_all_visible { "EyeHide" } else { "EyeShow" }).into()))
.tooltip_label(if selection_all_visible { "Hide Selected" } else { "Show Selected" })
.tooltip_shortcut(action_shortcut!(DocumentMessageDiscriminant::ToggleSelectedVisibility))
.on_update(|_| DocumentMessage::ToggleSelectedVisibility.into())
.disabled(!has_selection)
.widget_holder(),
.widget_instance(),
];
let layers_panel_control_bar_right = WidgetLayout::new(vec![LayoutGroup::Row { widgets }]);
@@ -2843,11 +2843,11 @@ impl DocumentMessageHandler {
Message::NoOp
}
})
.widget_holder();
.widget_instance();
vec![LayoutGroup::Row { widgets: vec![node_chooser] }]
})
.widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
IconButton::new("Folder", 24)
.tooltip_label("Group Selected")
.tooltip_shortcut(action_shortcut!(DocumentMessageDiscriminant::GroupSelectedLayers))
@@ -2856,18 +2856,18 @@ impl DocumentMessageHandler {
DocumentMessage::GroupSelectedLayers { group_folder_type }.into()
})
.disabled(!has_selection)
.widget_holder(),
.widget_instance(),
IconButton::new("NewLayer", 24)
.tooltip_label("New Layer")
.tooltip_shortcut(action_shortcut!(DocumentMessageDiscriminant::CreateEmptyFolder))
.on_update(|_| DocumentMessage::CreateEmptyFolder.into())
.widget_holder(),
.widget_instance(),
IconButton::new("Trash", 24)
.tooltip_label("Delete Selected")
.tooltip_shortcut(action_shortcut!(DocumentMessageDiscriminant::DeleteSelectedLayers))
.on_update(|_| DocumentMessage::DeleteSelectedLayers.into())
.disabled(!has_selection)
.widget_holder(),
.widget_instance(),
];
let layers_panel_bottom_bar = WidgetLayout::new(vec![LayoutGroup::Row { widgets }]);
@@ -3144,24 +3144,24 @@ impl<'a> ClickXRayIter<'a> {
}
}
pub fn navigation_controls(ptz: &PTZ, navigation_handler: &NavigationMessageHandler, node_graph: bool) -> Vec<WidgetHolder> {
pub fn navigation_controls(ptz: &PTZ, navigation_handler: &NavigationMessageHandler, node_graph: bool) -> Vec<WidgetInstance> {
let mut list = vec![
IconButton::new("ZoomIn", 24)
.tooltip_label("Zoom In")
.tooltip_shortcut(action_shortcut!(NavigationMessageDiscriminant::CanvasZoomIncrease))
.on_update(|_| NavigationMessage::CanvasZoomIncrease { center_on_mouse: false }.into())
.widget_holder(),
.widget_instance(),
IconButton::new("ZoomOut", 24)
.tooltip_label("Zoom Out")
.tooltip_shortcut(action_shortcut!(NavigationMessageDiscriminant::CanvasZoomDecrease))
.on_update(|_| NavigationMessage::CanvasZoomDecrease { center_on_mouse: false }.into())
.widget_holder(),
.widget_instance(),
IconButton::new("ZoomReset", 24)
.tooltip_label("Reset Tilt and Zoom to 100%")
.tooltip_shortcut(action_shortcut!(NavigationMessageDiscriminant::CanvasTiltResetAndZoomTo100Percent))
.on_update(|_| NavigationMessage::CanvasTiltResetAndZoomTo100Percent.into())
.disabled(ptz.tilt().abs() < 1e-4 && (ptz.zoom() - 1.).abs() < 1e-4)
.widget_holder(),
.widget_instance(),
];
if ptz.flip && !node_graph {
list.push(
@@ -3170,11 +3170,11 @@ pub fn navigation_controls(ptz: &PTZ, navigation_handler: &NavigationMessageHand
.tooltip_description("Flip the canvas back to its standard orientation.")
.tooltip_shortcut(action_shortcut!(NavigationMessageDiscriminant::CanvasFlip))
.on_update(|_| NavigationMessage::CanvasFlip.into())
.widget_holder(),
.widget_instance(),
);
}
list.extend([
Separator::new(SeparatorType::Related).widget_holder(),
Separator::new(SeparatorType::Related).widget_instance(),
NumberInput::new(Some(navigation_handler.snapped_zoom(ptz.zoom()) * 100.))
.unit("%")
.min(0.000001)
@@ -3189,7 +3189,7 @@ pub fn navigation_controls(ptz: &PTZ, navigation_handler: &NavigationMessageHand
.increment_behavior(NumberInputIncrementBehavior::Callback)
.increment_callback_decrease(|_| NavigationMessage::CanvasZoomDecrease { center_on_mouse: false }.into())
.increment_callback_increase(|_| NavigationMessage::CanvasZoomIncrease { center_on_mouse: false }.into())
.widget_holder(),
.widget_instance(),
]);
list
}
@@ -2536,7 +2536,7 @@ fn static_input_properties() -> InputProperties {
};
if let Some(&TaggedValue::F64(val)) = input.as_non_exposed_value() {
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
NumberInput::new(Some(val))
.unit("°")
.mode(NumberInputMode::Range)
@@ -2548,7 +2548,7 @@ fn static_input_properties() -> InputProperties {
index,
))
.on_commit(node_properties::commit_value)
.widget_holder(),
.widget_instance(),
]);
}
@@ -2567,7 +2567,7 @@ fn static_input_properties() -> InputProperties {
};
if let Some(&TaggedValue::DVec2(val)) = input.as_non_exposed_value() {
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
NumberInput::new(Some(val.x))
.label("X")
.unit("°")
@@ -2579,8 +2579,8 @@ fn static_input_properties() -> InputProperties {
index,
))
.on_commit(node_properties::commit_value)
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
NumberInput::new(Some(val.y))
.label("Y")
.unit("°")
@@ -2592,7 +2592,7 @@ fn static_input_properties() -> InputProperties {
index,
))
.on_commit(node_properties::commit_value)
.widget_holder(),
.widget_instance(),
]);
}
@@ -2144,12 +2144,12 @@ impl NodeGraphMessageHandler {
}
}
})
.widget_holder();
.widget_instance();
vec![LayoutGroup::Row { widgets: vec![node_chooser] }]
})
.widget_holder(),
.widget_instance(),
//
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
//
IconButton::new("Folder", 24)
.tooltip_label("Group Selected")
@@ -2159,20 +2159,20 @@ impl NodeGraphMessageHandler {
DocumentMessage::GroupSelectedLayers { group_folder_type }.into()
})
.disabled(!has_selection)
.widget_holder(),
.widget_instance(),
IconButton::new("NewLayer", 24)
.tooltip_label("New Layer")
.tooltip_shortcut(action_shortcut!(DocumentMessageDiscriminant::CreateEmptyFolder))
.on_update(|_| DocumentMessage::CreateEmptyFolder.into())
.widget_holder(),
.widget_instance(),
IconButton::new("Trash", 24)
.tooltip_label("Delete Selected")
.tooltip_shortcut(action_shortcut!(DocumentMessageDiscriminant::DeleteSelectedLayers))
.on_update(|_| DocumentMessage::DeleteSelectedLayers.into())
.disabled(!has_selection)
.widget_holder(),
.widget_instance(),
//
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
//
IconButton::new(if selection_all_locked { "PadlockLocked" } else { "PadlockUnlocked" }, 24)
.hover_icon(Some((if selection_all_locked { "PadlockUnlocked" } else { "PadlockLocked" }).into()))
@@ -2180,14 +2180,14 @@ impl NodeGraphMessageHandler {
.tooltip_shortcut(action_shortcut!(NodeGraphMessageDiscriminant::ToggleSelectedLocked))
.on_update(|_| NodeGraphMessage::ToggleSelectedLocked.into())
.disabled(!has_selection || !selection_includes_layers)
.widget_holder(),
.widget_instance(),
IconButton::new(if selection_all_visible { "EyeVisible" } else { "EyeHidden" }, 24)
.hover_icon(Some((if selection_all_visible { "EyeHide" } else { "EyeShow" }).into()))
.tooltip_label(if selection_all_visible { "Hide Selected" } else { "Show Selected" })
.tooltip_shortcut(action_shortcut!(NodeGraphMessageDiscriminant::ToggleSelectedVisibility))
.on_update(|_| NodeGraphMessage::ToggleSelectedVisibility.into())
.disabled(!has_selection)
.widget_holder(),
.widget_instance(),
];
let mut selection = selected_nodes.selected_nodes();
@@ -2212,8 +2212,8 @@ impl NodeGraphMessageHandler {
.icon(Some("FrameAll".to_string()))
.tooltip_description("Restore preview to the graph output.")
.on_update(move |_| NodeGraphMessage::TogglePreview { node_id }.into())
.widget_holder();
widgets.extend([Separator::new(SeparatorType::Unrelated).widget_holder(), button]);
.widget_instance();
widgets.extend([Separator::new(SeparatorType::Unrelated).widget_instance(), button]);
} else if let Some(&node_id) = selection {
let selection_is_not_already_the_output = !network
.exports
@@ -2226,15 +2226,15 @@ impl NodeGraphMessageHandler {
.tooltip_description("Temporarily set the graph output to the selected node or layer. Perform the shortcut on a node or layer for quick access.")
.tooltip_shortcut(action_shortcut_manual!(Key::Alt, Key::MouseLeft))
.on_update(move |_| NodeGraphMessage::TogglePreview { node_id }.into())
.widget_holder();
widgets.extend([Separator::new(SeparatorType::Unrelated).widget_holder(), button]);
.widget_instance();
widgets.extend([Separator::new(SeparatorType::Unrelated).widget_instance(), button]);
}
}
let subgraph_path_names_length = subgraph_path_names.len();
if subgraph_path_names_length >= 2 {
widgets.extend([
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
BreadcrumbTrailButtons::new(subgraph_path_names)
.on_update(move |index| {
DocumentMessage::ExitNestedNetwork {
@@ -2242,7 +2242,7 @@ impl NodeGraphMessageHandler {
}
.into()
})
.widget_holder(),
.widget_instance(),
]);
}
@@ -2273,19 +2273,19 @@ impl NodeGraphMessageHandler {
}
.into()
})
.widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
];
widgets.extend(navigation_controls(node_graph_ptz, navigation_handler, true));
widgets.extend([
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
TextButton::new("Node Graph")
.icon(Some("GraphViewOpen".into()))
.hover_icon(Some("GraphViewClosed".into()))
.tooltip_label("Hide Node Graph")
.tooltip_shortcut(action_shortcut!(DocumentMessageDiscriminant::GraphViewOverlayToggle))
.on_update(move |_| DocumentMessage::GraphViewOverlayToggle.into())
.widget_holder(),
.widget_instance(),
]);
self.widgets[1] = LayoutGroup::Row { widgets };
@@ -2332,9 +2332,9 @@ impl NodeGraphMessageHandler {
if let [node_id] = *nodes.as_slice() {
properties.push(LayoutGroup::Row {
widgets: vec![
Separator::new(SeparatorType::Related).widget_holder(),
IconLabel::new("Node").tooltip_description("Name of the selected node.").widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
Separator::new(SeparatorType::Related).widget_instance(),
IconLabel::new("Node").tooltip_description("Name of the selected node.").widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
TextInput::new(context.network_interface.display_name(&node_id, context.selection_network_path))
.tooltip_description("Name of the selected node.")
.on_update(move |text_input| {
@@ -2345,8 +2345,8 @@ impl NodeGraphMessageHandler {
}
.into()
})
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
],
});
}
@@ -2360,14 +2360,14 @@ impl NodeGraphMessageHandler {
// This may require store a separate path for the properties panel
let mut properties = vec![LayoutGroup::Row {
widgets: vec![
Separator::new(SeparatorType::Related).widget_holder(),
IconLabel::new("File").tooltip_description("Name of the current document.").widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
Separator::new(SeparatorType::Related).widget_instance(),
IconLabel::new("File").tooltip_description("Name of the current document.").widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
TextInput::new(context.document_name)
.tooltip_description("Name of the current document.")
.on_update(|text_input| DocumentMessage::RenameDocument { new_name: text_input.value.clone() }.into())
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
],
}];
@@ -2407,9 +2407,9 @@ impl NodeGraphMessageHandler {
let mut layer_properties = vec![LayoutGroup::Row {
widgets: vec![
Separator::new(SeparatorType::Related).widget_holder(),
IconLabel::new("Layer").tooltip_description("Name of the selected layer.").widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
Separator::new(SeparatorType::Related).widget_instance(),
IconLabel::new("Layer").tooltip_description("Name of the selected layer.").widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
TextInput::new(context.network_interface.display_name(&layer, context.selection_network_path))
.tooltip_description("Name of the selected layer.")
.on_update(move |text_input| {
@@ -2420,8 +2420,8 @@ impl NodeGraphMessageHandler {
}
.into()
})
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
PopoverButton::new()
.icon(Some("Node".to_string()))
.tooltip_description("Add an operation to the end of this layer's chain of nodes.")
@@ -2442,11 +2442,11 @@ impl NodeGraphMessageHandler {
}
.into()
})
.widget_holder();
.widget_instance();
vec![LayoutGroup::Row { widgets: vec![node_chooser] }]
})
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
],
}];
@@ -27,7 +27,7 @@ use graphene_std::vector::misc::{ArcType, CentroidType, ExtrudeJoiningAlgorithm,
use graphene_std::vector::style::{Fill, FillChoice, FillType, GradientStops, GradientType, PaintOrder, StrokeAlign, StrokeCap, StrokeJoin};
pub(crate) fn string_properties(text: &str) -> Vec<LayoutGroup> {
let widget = TextLabel::new(text).widget_holder();
let widget = TextLabel::new(text).widget_instance();
vec![LayoutGroup::Row { widgets: vec![widget] }]
}
@@ -46,7 +46,7 @@ pub fn commit_value<T>(_: &T) -> Message {
DocumentMessage::AddTransaction.into()
}
pub fn expose_widget(node_id: NodeId, index: usize, data_type: FrontendGraphDataType, exposed: bool) -> WidgetHolder {
pub fn expose_widget(node_id: NodeId, index: usize, data_type: FrontendGraphDataType, exposed: bool) -> WidgetInstance {
ParameterExposeButton::new()
.exposed(exposed)
.data_type(data_type)
@@ -63,20 +63,20 @@ pub fn expose_widget(node_id: NodeId, index: usize, data_type: FrontendGraphData
}
.into()]),
})
.widget_holder()
.widget_instance()
}
// TODO: Remove this when we have proper entry row formatting that includes room for Assists.
pub fn add_blank_assist(widgets: &mut Vec<WidgetHolder>) {
pub fn add_blank_assist(widgets: &mut Vec<WidgetInstance>) {
widgets.extend_from_slice(&[
// Custom CSS specific to the Properties panel converts this Section separator into the width of an assist (24px).
Separator::new(SeparatorType::Section).widget_holder(),
Separator::new(SeparatorType::Section).widget_instance(),
// This last one is the separator after the 24px assist.
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
]);
}
pub fn start_widgets(parameter_widgets_info: ParameterWidgetsInfo) -> Vec<WidgetHolder> {
pub fn start_widgets(parameter_widgets_info: ParameterWidgetsInfo) -> Vec<WidgetInstance> {
let ParameterWidgetsInfo {
document_node,
node_id,
@@ -101,7 +101,7 @@ pub fn start_widgets(parameter_widgets_info: ParameterWidgetsInfo) -> Vec<Widget
if exposable {
widgets.push(expose_widget(node_id, index, input_type, input.is_exposed()));
}
widgets.push(TextLabel::new(name).tooltip_description(description).widget_holder());
widgets.push(TextLabel::new(name).tooltip_description(description).widget_instance());
if blank_assist {
add_blank_assist(&mut widgets);
}
@@ -229,7 +229,7 @@ pub(crate) fn property_from_type(
_ => {
let mut widgets = start_widgets(default_info);
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
TextLabel::new("-")
.tooltip_label(format!(
"Data Type: {}",
@@ -241,7 +241,7 @@ pub(crate) fn property_from_type(
.unwrap_or_else(|| graphene_std::format_type(concrete_type.name.as_ref())),
))
.tooltip_description("This data can only be supplied through the node graph because no widget exists for its type.")
.widget_holder(),
.widget_instance(),
]);
return Err(vec![widgets.into()]);
}
@@ -249,7 +249,7 @@ pub(crate) fn property_from_type(
}
}
}
Type::Generic(_) => vec![TextLabel::new("Generic type (not supported)").widget_holder()].into(),
Type::Generic(_) => vec![TextLabel::new("Generic type (not supported)").widget_instance()].into(),
Type::Fn(_, out) => return property_from_type(node_id, index, out, number_options, unit, display_decimal_places, step, context),
Type::Future(out) => return property_from_type(node_id, index, out, number_options, unit, display_decimal_places, step, context),
};
@@ -259,7 +259,7 @@ pub(crate) fn property_from_type(
Ok(extra_widgets)
}
pub fn text_widget(parameter_widgets_info: ParameterWidgetsInfo) -> Vec<WidgetHolder> {
pub fn text_widget(parameter_widgets_info: ParameterWidgetsInfo) -> Vec<WidgetInstance> {
let ParameterWidgetsInfo { document_node, node_id, index, .. } = parameter_widgets_info;
let mut widgets = start_widgets(parameter_widgets_info);
@@ -271,17 +271,17 @@ pub fn text_widget(parameter_widgets_info: ParameterWidgetsInfo) -> Vec<WidgetHo
};
if let Some(TaggedValue::String(x)) = &input.as_non_exposed_value() {
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
TextInput::new(x.clone())
.on_update(update_value(|x: &TextInput| TaggedValue::String(x.value.clone()), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
])
}
widgets
}
pub fn text_area_widget(parameter_widgets_info: ParameterWidgetsInfo) -> Vec<WidgetHolder> {
pub fn text_area_widget(parameter_widgets_info: ParameterWidgetsInfo) -> Vec<WidgetInstance> {
let ParameterWidgetsInfo { document_node, node_id, index, .. } = parameter_widgets_info;
let mut widgets = start_widgets(parameter_widgets_info);
@@ -293,17 +293,17 @@ pub fn text_area_widget(parameter_widgets_info: ParameterWidgetsInfo) -> Vec<Wid
};
if let Some(TaggedValue::String(x)) = &input.as_non_exposed_value() {
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
TextAreaInput::new(x.clone())
.on_update(update_value(|x: &TextAreaInput| TaggedValue::String(x.value.clone()), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
])
}
widgets
}
pub fn bool_widget(parameter_widgets_info: ParameterWidgetsInfo, checkbox_input: CheckboxInput) -> Vec<WidgetHolder> {
pub fn bool_widget(parameter_widgets_info: ParameterWidgetsInfo, checkbox_input: CheckboxInput) -> Vec<WidgetInstance> {
let ParameterWidgetsInfo { document_node, node_id, index, .. } = parameter_widgets_info;
let mut widgets = start_widgets(parameter_widgets_info);
@@ -315,18 +315,18 @@ pub fn bool_widget(parameter_widgets_info: ParameterWidgetsInfo, checkbox_input:
};
if let Some(&TaggedValue::Bool(x)) = input.as_non_exposed_value() {
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
checkbox_input
.checked(x)
.on_update(update_value(|x: &CheckboxInput| TaggedValue::Bool(x.checked), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
])
}
widgets
}
pub fn reference_point_widget(parameter_widgets_info: ParameterWidgetsInfo, disabled: bool) -> Vec<WidgetHolder> {
pub fn reference_point_widget(parameter_widgets_info: ParameterWidgetsInfo, disabled: bool) -> Vec<WidgetInstance> {
let ParameterWidgetsInfo { document_node, node_id, index, .. } = parameter_widgets_info;
let mut widgets = start_widgets(parameter_widgets_info);
@@ -338,7 +338,7 @@ pub fn reference_point_widget(parameter_widgets_info: ParameterWidgetsInfo, disa
};
if let Some(&TaggedValue::ReferencePoint(reference_point)) = input.as_non_exposed_value() {
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
CheckboxInput::new(reference_point != ReferencePoint::None)
.on_update(update_value(
move |x: &CheckboxInput| TaggedValue::ReferencePoint(if x.checked { ReferencePoint::Center } else { ReferencePoint::None }),
@@ -346,12 +346,12 @@ pub fn reference_point_widget(parameter_widgets_info: ParameterWidgetsInfo, disa
index,
))
.disabled(disabled)
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
ReferencePointInput::new(reference_point)
.on_update(update_value(move |x: &ReferencePointInput| TaggedValue::ReferencePoint(x.value), node_id, index))
.disabled(disabled)
.widget_holder(),
.widget_instance(),
])
}
widgets
@@ -361,15 +361,15 @@ pub fn footprint_widget(parameter_widgets_info: ParameterWidgetsInfo, extra_widg
let ParameterWidgetsInfo { document_node, node_id, index, .. } = parameter_widgets_info;
let mut location_widgets = start_widgets(parameter_widgets_info);
location_widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder());
location_widgets.push(Separator::new(SeparatorType::Unrelated).widget_instance());
let mut scale_widgets = vec![TextLabel::new("").widget_holder()];
let mut scale_widgets = vec![TextLabel::new("").widget_instance()];
add_blank_assist(&mut scale_widgets);
scale_widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder());
scale_widgets.push(Separator::new(SeparatorType::Unrelated).widget_instance());
let mut resolution_widgets = vec![TextLabel::new("").widget_holder()];
let mut resolution_widgets = vec![TextLabel::new("").widget_instance()];
add_blank_assist(&mut resolution_widgets);
resolution_widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder());
resolution_widgets.push(Separator::new(SeparatorType::Unrelated).widget_instance());
let Some(document_node) = document_node else { return LayoutGroup::default() };
let Some(input) = document_node.inputs.get(index) else {
@@ -405,8 +405,8 @@ pub fn footprint_widget(parameter_widgets_info: ParameterWidgetsInfo, extra_widg
index,
))
.on_commit(commit_value)
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
NumberInput::new(Some(top_left.y))
.label("Y")
.unit(" px")
@@ -429,7 +429,7 @@ pub fn footprint_widget(parameter_widgets_info: ParameterWidgetsInfo, extra_widg
index,
))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]);
scale_widgets.extend_from_slice(&[
@@ -452,8 +452,8 @@ pub fn footprint_widget(parameter_widgets_info: ParameterWidgetsInfo, extra_widg
index,
))
.on_commit(commit_value)
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
NumberInput::new(Some(bounds.y))
.label("H")
.unit(" px")
@@ -473,7 +473,7 @@ pub fn footprint_widget(parameter_widgets_info: ParameterWidgetsInfo, extra_widg
index,
))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]);
resolution_widgets.push(
@@ -495,7 +495,7 @@ pub fn footprint_widget(parameter_widgets_info: ParameterWidgetsInfo, extra_widg
index,
))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
);
}
@@ -513,15 +513,15 @@ pub fn transform_widget(parameter_widgets_info: ParameterWidgetsInfo, extra_widg
let ParameterWidgetsInfo { document_node, node_id, index, .. } = parameter_widgets_info;
let mut location_widgets = start_widgets(parameter_widgets_info);
location_widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder());
location_widgets.push(Separator::new(SeparatorType::Unrelated).widget_instance());
let mut rotation_widgets = vec![TextLabel::new("").widget_holder()];
let mut rotation_widgets = vec![TextLabel::new("").widget_instance()];
add_blank_assist(&mut rotation_widgets);
rotation_widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder());
rotation_widgets.push(Separator::new(SeparatorType::Unrelated).widget_instance());
let mut scale_widgets = vec![TextLabel::new("").widget_holder()];
let mut scale_widgets = vec![TextLabel::new("").widget_instance()];
add_blank_assist(&mut scale_widgets);
scale_widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder());
scale_widgets.push(Separator::new(SeparatorType::Unrelated).widget_instance());
let Some(document_node) = document_node else { return LayoutGroup::default() };
let Some(input) = document_node.inputs.get(index) else {
@@ -548,8 +548,8 @@ pub fn transform_widget(parameter_widgets_info: ParameterWidgetsInfo, extra_widg
index,
))
.on_commit(commit_value)
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
NumberInput::new(Some(translation.y))
.label("Y")
.unit(" px")
@@ -563,7 +563,7 @@ pub fn transform_widget(parameter_widgets_info: ParameterWidgetsInfo, extra_widg
index,
))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]);
rotation_widgets.extend_from_slice(&[NumberInput::new(Some(rotation.to_degrees()))
@@ -580,7 +580,7 @@ pub fn transform_widget(parameter_widgets_info: ParameterWidgetsInfo, extra_widg
index,
))
.on_commit(commit_value)
.widget_holder()]);
.widget_instance()]);
scale_widgets.extend_from_slice(&[
NumberInput::new(Some(scale.x))
@@ -595,8 +595,8 @@ pub fn transform_widget(parameter_widgets_info: ParameterWidgetsInfo, extra_widg
index,
))
.on_commit(commit_value)
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
NumberInput::new(Some(scale.y))
.label("H")
.unit("x")
@@ -609,7 +609,7 @@ pub fn transform_widget(parameter_widgets_info: ParameterWidgetsInfo, extra_widg
index,
))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]);
vec![
@@ -642,7 +642,7 @@ pub fn vec2_widget(parameter_widgets_info: ParameterWidgetsInfo, x: &str, y: &st
match input.as_non_exposed_value() {
Some(&TaggedValue::DVec2(dvec2)) => {
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
NumberInput::new(Some(dvec2.x))
.label(x)
.unit(unit)
@@ -651,8 +651,8 @@ pub fn vec2_widget(parameter_widgets_info: ParameterWidgetsInfo, x: &str, y: &st
.is_integer(is_integer)
.on_update(update_value(move |input: &NumberInput| TaggedValue::DVec2(DVec2::new(input.value.unwrap(), dvec2.y)), node_id, index))
.on_commit(commit_value)
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
NumberInput::new(Some(dvec2.y))
.label(y)
.unit(unit)
@@ -661,12 +661,12 @@ pub fn vec2_widget(parameter_widgets_info: ParameterWidgetsInfo, x: &str, y: &st
.is_integer(is_integer)
.on_update(update_value(move |input: &NumberInput| TaggedValue::DVec2(DVec2::new(dvec2.x, input.value.unwrap())), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]);
}
Some(&TaggedValue::F64(value)) => {
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
NumberInput::new(Some(value))
.label(x)
.unit(unit)
@@ -675,8 +675,8 @@ pub fn vec2_widget(parameter_widgets_info: ParameterWidgetsInfo, x: &str, y: &st
.is_integer(is_integer)
.on_update(update_value(move |input: &NumberInput| TaggedValue::DVec2(DVec2::new(input.value.unwrap(), value)), node_id, index))
.on_commit(commit_value)
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
NumberInput::new(Some(value))
.label(y)
.unit(unit)
@@ -685,7 +685,7 @@ pub fn vec2_widget(parameter_widgets_info: ParameterWidgetsInfo, x: &str, y: &st
.is_integer(is_integer)
.on_update(update_value(move |input: &NumberInput| TaggedValue::DVec2(DVec2::new(value, input.value.unwrap())), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]);
}
_ => {}
@@ -694,7 +694,7 @@ pub fn vec2_widget(parameter_widgets_info: ParameterWidgetsInfo, x: &str, y: &st
LayoutGroup::Row { widgets }
}
pub fn array_of_number_widget(parameter_widgets_info: ParameterWidgetsInfo, text_input: TextInput) -> Vec<WidgetHolder> {
pub fn array_of_number_widget(parameter_widgets_info: ParameterWidgetsInfo, text_input: TextInput) -> Vec<WidgetInstance> {
let ParameterWidgetsInfo { document_node, node_id, index, .. } = parameter_widgets_info;
let mut widgets = start_widgets(parameter_widgets_info);
@@ -716,17 +716,17 @@ pub fn array_of_number_widget(parameter_widgets_info: ParameterWidgetsInfo, text
};
if let Some(TaggedValue::VecF64(x)) = &input.as_non_exposed_value() {
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
text_input
.value(x.iter().map(|v| v.to_string()).collect::<Vec<_>>().join(", "))
.on_update(optionally_update_value(move |x: &TextInput| from_string(&x.value), node_id, index))
.widget_holder(),
.widget_instance(),
])
}
widgets
}
pub fn array_of_vec2_widget(parameter_widgets_info: ParameterWidgetsInfo, text_props: TextInput) -> Vec<WidgetHolder> {
pub fn array_of_vec2_widget(parameter_widgets_info: ParameterWidgetsInfo, text_props: TextInput) -> Vec<WidgetInstance> {
let ParameterWidgetsInfo { document_node, node_id, index, .. } = parameter_widgets_info;
let mut widgets = start_widgets(parameter_widgets_info);
@@ -748,17 +748,17 @@ pub fn array_of_vec2_widget(parameter_widgets_info: ParameterWidgetsInfo, text_p
};
if let Some(TaggedValue::VecDVec2(x)) = &input.as_non_exposed_value() {
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
text_props
.value(x.iter().map(|v| format!("({}, {})", v.x, v.y)).collect::<Vec<_>>().join(", "))
.on_update(optionally_update_value(move |x: &TextInput| from_string(&x.value), node_id, index))
.widget_holder(),
.widget_instance(),
])
}
widgets
}
pub fn font_inputs(parameter_widgets_info: ParameterWidgetsInfo) -> (Vec<WidgetHolder>, Option<Vec<WidgetHolder>>) {
pub fn font_inputs(parameter_widgets_info: ParameterWidgetsInfo) -> (Vec<WidgetInstance>, Option<Vec<WidgetInstance>>) {
let ParameterWidgetsInfo { document_node, node_id, index, .. } = parameter_widgets_info;
let mut first_widgets = start_widgets(parameter_widgets_info);
@@ -773,22 +773,22 @@ pub fn font_inputs(parameter_widgets_info: ParameterWidgetsInfo) -> (Vec<WidgetH
};
if let Some(TaggedValue::Font(font)) = &input.as_non_exposed_value() {
first_widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
FontInput::new(font.font_family.clone(), font.font_style.clone())
.on_update(update_value(from_font_input, node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]);
let mut second_row = vec![TextLabel::new("").widget_holder()];
let mut second_row = vec![TextLabel::new("").widget_instance()];
add_blank_assist(&mut second_row);
second_row.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
FontInput::new(font.font_family.clone(), font.font_style.clone())
.is_style_picker(true)
.on_update(update_value(from_font_input, node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]);
second_widgets = Some(second_row);
}
@@ -796,7 +796,7 @@ pub fn font_inputs(parameter_widgets_info: ParameterWidgetsInfo) -> (Vec<WidgetH
}
// Two number fields beside one another, the first for the fractional part (decimals, range mode) and the second for the whole part (integers, increment mode)
pub fn progression_widget(parameter_widgets_info: ParameterWidgetsInfo, number_props: NumberInput) -> Vec<WidgetHolder> {
pub fn progression_widget(parameter_widgets_info: ParameterWidgetsInfo, number_props: NumberInput) -> Vec<WidgetInstance> {
let ParameterWidgetsInfo { document_node, node_id, index, .. } = parameter_widgets_info;
let mut widgets = start_widgets(parameter_widgets_info);
@@ -811,7 +811,7 @@ pub fn progression_widget(parameter_widgets_info: ParameterWidgetsInfo, number_p
let fractional_part = x.fract();
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
number_props
.clone()
.label("Progress")
@@ -821,10 +821,10 @@ pub fn progression_widget(parameter_widgets_info: ParameterWidgetsInfo, number_p
.value(Some(fractional_part))
.on_update(update_value(move |input: &NumberInput| TaggedValue::F64(whole_part + input.value.unwrap()), node_id, index))
.on_commit(commit_value)
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
TextLabel::new("+").widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
TextLabel::new("+").widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
number_props
.label("Element #")
.mode_increment()
@@ -833,13 +833,13 @@ pub fn progression_widget(parameter_widgets_info: ParameterWidgetsInfo, number_p
.value(Some(whole_part))
.on_update(update_value(move |input: &NumberInput| TaggedValue::F64(input.value.unwrap() + fractional_part), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
])
}
widgets
}
pub fn number_widget(parameter_widgets_info: ParameterWidgetsInfo, number_props: NumberInput) -> Vec<WidgetHolder> {
pub fn number_widget(parameter_widgets_info: ParameterWidgetsInfo, number_props: NumberInput) -> Vec<WidgetInstance> {
let ParameterWidgetsInfo { document_node, node_id, index, .. } = parameter_widgets_info;
let mut widgets = start_widgets(parameter_widgets_info);
@@ -851,75 +851,75 @@ pub fn number_widget(parameter_widgets_info: ParameterWidgetsInfo, number_props:
};
match input.as_non_exposed_value() {
Some(&TaggedValue::F64(x)) => widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
number_props
.value(Some(x))
.on_update(update_value(move |x: &NumberInput| TaggedValue::F64(x.value.unwrap()), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]),
Some(&TaggedValue::F32(x)) => widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
number_props
.value(Some(x as f64))
.on_update(update_value(move |x: &NumberInput| TaggedValue::F32(x.value.unwrap() as f32), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]),
Some(&TaggedValue::U32(x)) => widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
number_props
.value(Some(x as f64))
.on_update(update_value(move |x: &NumberInput| TaggedValue::U32((x.value.unwrap()) as u32), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]),
Some(&TaggedValue::U64(x)) => widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
number_props
.value(Some(x as f64))
.on_update(update_value(move |x: &NumberInput| TaggedValue::U64((x.value.unwrap()) as u64), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]),
Some(&TaggedValue::OptionalF64(x)) => {
// TODO: Don't wipe out the previously set value (setting it back to the default of 100) when reenabling this checkbox back to Some from None
let toggle_enabled = move |checkbox_input: &CheckboxInput| TaggedValue::OptionalF64(if checkbox_input.checked { Some(100.) } else { None });
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
// The checkbox toggles if the value is Some or None
CheckboxInput::new(x.is_some())
.on_update(update_value(toggle_enabled, node_id, index))
.on_commit(commit_value)
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
number_props
.value(x)
.on_update(update_value(move |x: &NumberInput| TaggedValue::OptionalF64(x.value), node_id, index))
.disabled(x.is_none())
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]);
}
Some(&TaggedValue::DVec2(dvec2)) => widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
number_props
// We use an arbitrary `y` instead of an arbitrary `x` here because the "Grid" node's "Spacing" value's height should be used from rectangular mode when transferred to "Y Spacing" in isometric mode
.value(Some(dvec2.y))
.on_update(update_value(move |x: &NumberInput| TaggedValue::F64(x.value.unwrap()), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]),
Some(&TaggedValue::FVec2(vec2)) => widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
number_props
// We use an arbitrary `y` instead of an arbitrary `x` here because the "Grid" node's "Spacing" value's height should be used from rectangular mode when transferred to "Y Spacing" in isometric mode
.value(Some(vec2.y as f64))
.on_update(update_value(move |x: &NumberInput| TaggedValue::F32(x.value.unwrap() as f32), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
]),
_ => {}
}
@@ -954,10 +954,10 @@ pub fn blend_mode_widget(parameter_widgets_info: ParameterWidgetsInfo) -> Layout
.collect();
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
DropdownInput::new(entries)
.selected_index(blend_mode.index_in_list_svg_subset().map(|index| index as u32))
.widget_holder(),
.widget_instance(),
]);
}
LayoutGroup::Row { widgets }.with_tooltip_description("Formula used for blending.")
@@ -975,7 +975,7 @@ pub fn color_widget(parameter_widgets_info: ParameterWidgetsInfo, color_button:
};
// Add a separator
widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder());
widgets.push(Separator::new(SeparatorType::Unrelated).widget_instance());
// Add the color input
match &**tagged_value {
@@ -985,7 +985,7 @@ pub fn color_widget(parameter_widgets_info: ParameterWidgetsInfo, color_button:
.allow_none(false)
.on_update(update_value(|input: &ColorInput| TaggedValue::ColorNotInTable(input.value.as_solid().unwrap()), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
),
TaggedValue::OptionalColorNotInTable(color) => widgets.push(
color_button
@@ -993,7 +993,7 @@ pub fn color_widget(parameter_widgets_info: ParameterWidgetsInfo, color_button:
.allow_none(true)
.on_update(update_value(|input: &ColorInput| TaggedValue::OptionalColorNotInTable(input.value.as_solid()), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
),
TaggedValue::Color(color_table) => widgets.push(
color_button
@@ -1007,7 +1007,7 @@ pub fn color_widget(parameter_widgets_info: ParameterWidgetsInfo, color_button:
index,
))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
),
TaggedValue::GradientTable(gradient_table) => widgets.push(
color_button
@@ -1021,7 +1021,7 @@ pub fn color_widget(parameter_widgets_info: ParameterWidgetsInfo, color_button:
index,
))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
),
TaggedValue::GradientStops(gradient_stops) => widgets.push(
color_button
@@ -1032,7 +1032,7 @@ pub fn color_widget(parameter_widgets_info: ParameterWidgetsInfo, color_button:
index,
))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
),
x => warn!("Colour {x:?}"),
}
@@ -1057,11 +1057,11 @@ pub fn curve_widget(parameter_widgets_info: ParameterWidgetsInfo) -> LayoutGroup
};
if let Some(TaggedValue::Curve(curve)) = &input.as_non_exposed_value() {
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
CurveInput::new(curve.clone())
.on_update(update_value(|x: &CurveInput| TaggedValue::Curve(x.value.clone()), node_id, index))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
])
}
LayoutGroup::Row { widgets }
@@ -1467,10 +1467,10 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties
// Corner Radius
let mut corner_radius_row_1 = start_widgets(ParameterWidgetsInfo::new(node_id, CornerRadiusInput::<f64>::INDEX, true, context));
corner_radius_row_1.push(Separator::new(SeparatorType::Unrelated).widget_holder());
corner_radius_row_1.push(Separator::new(SeparatorType::Unrelated).widget_instance());
let mut corner_radius_row_2 = vec![Separator::new(SeparatorType::Unrelated).widget_holder()];
corner_radius_row_2.push(TextLabel::new("").widget_holder());
let mut corner_radius_row_2 = vec![Separator::new(SeparatorType::Unrelated).widget_instance()];
corner_radius_row_2.push(TextLabel::new("").widget_instance());
add_blank_assist(&mut corner_radius_row_2);
let document_node = match get_document_node(node_id, context) {
@@ -1540,7 +1540,7 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties
]),
})
.on_commit(commit_value);
let radio_input = RadioInput::new(vec![uniform, individual]).selected_index(Some(is_individual as u32)).widget_holder();
let radio_input = RadioInput::new(vec![uniform, individual]).selected_index(Some(is_individual as u32)).widget_instance();
corner_radius_row_1.push(radio_input);
// Radius value input widget
@@ -1561,14 +1561,14 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties
TextInput::default()
.value(individual_val.iter().map(|v| v.to_string()).collect::<Vec<_>>().join(", "))
.on_update(optionally_update_value(move |x: &TextInput| from_string(&x.value), node_id, CornerRadiusInput::<f64>::INDEX))
.widget_holder()
.widget_instance()
} else {
NumberInput::default()
.value(Some(uniform_val))
.unit(" px")
.on_update(update_value(move |x: &NumberInput| TaggedValue::F64(x.value.unwrap()), node_id, CornerRadiusInput::<f64>::INDEX))
.on_commit(commit_value)
.widget_holder()
.widget_instance()
};
corner_radius_row_2.push(input_widget);
}
@@ -1730,7 +1730,7 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte
let backup_color_fill: Fill = backup_color.clone().into();
let backup_gradient_fill: Fill = backup_gradient.clone().into();
widgets_first_row.push(Separator::new(SeparatorType::Unrelated).widget_holder());
widgets_first_row.push(Separator::new(SeparatorType::Unrelated).widget_instance());
widgets_first_row.push(
ColorInput::default()
.value(fill.clone().into())
@@ -1765,12 +1765,12 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte
]),
})
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
);
let mut widgets = vec![LayoutGroup::Row { widgets: widgets_first_row }];
let fill_type_switch = {
let mut row = vec![TextLabel::new("").widget_holder()];
let mut row = vec![TextLabel::new("").widget_instance()];
match fill {
Fill::Solid(_) | Fill::None => add_blank_assist(&mut row),
Fill::Gradient(gradient) => {
@@ -1788,8 +1788,8 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte
node_id,
FillInput::<Color>::INDEX,
))
.widget_holder();
row.push(Separator::new(SeparatorType::Unrelated).widget_holder());
.widget_instance();
row.push(Separator::new(SeparatorType::Unrelated).widget_instance());
row.push(reverse_button);
}
}
@@ -1806,8 +1806,8 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte
];
row.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
RadioInput::new(entries).selected_index(Some(if fill.as_gradient().is_some() { 1 } else { 0 })).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
RadioInput::new(entries).selected_index(Some(if fill.as_gradient().is_some() { 1 } else { 0 })).widget_instance(),
]);
LayoutGroup::Row { widgets: row }
@@ -1815,7 +1815,7 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte
widgets.push(fill_type_switch);
if let Fill::Gradient(gradient) = fill.clone() {
let mut row = vec![TextLabel::new("").widget_holder()];
let mut row = vec![TextLabel::new("").widget_instance()];
match gradient.gradient_type {
GradientType::Linear => add_blank_assist(&mut row),
GradientType::Radial => {
@@ -1838,8 +1838,8 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte
node_id,
FillInput::<Color>::INDEX,
))
.widget_holder();
row.push(Separator::new(SeparatorType::Unrelated).widget_holder());
.widget_instance();
row.push(Separator::new(SeparatorType::Unrelated).widget_instance());
row.push(reverse_radial_gradient_button);
}
}
@@ -1875,8 +1875,8 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte
];
row.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
RadioInput::new(entries).selected_index(Some(gradient.gradient_type as u32)).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
RadioInput::new(entries).selected_index(Some(gradient.gradient_type as u32)).widget_instance(),
]);
widgets.push(LayoutGroup::Row { widgets: row });
@@ -1996,7 +1996,7 @@ pub fn math_properties(node_id: NodeId, context: &mut NodePropertiesContext) ->
};
if let Some(TaggedValue::String(x)) = &input.as_non_exposed_value() {
widgets.extend_from_slice(&[
Separator::new(SeparatorType::Unrelated).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
TextInput::new(x.clone())
.centered(true)
.on_update(update_value(
@@ -2017,13 +2017,13 @@ pub fn math_properties(node_id: NodeId, context: &mut NodePropertiesContext) ->
ExpressionInput::INDEX,
))
.on_commit(commit_value)
.widget_holder(),
.widget_instance(),
])
}
widgets
})();
let operand_b = number_widget(ParameterWidgetsInfo::new(node_id, OperandBInput::<f64>::INDEX, true, context), NumberInput::default());
let operand_a_hint = vec![TextLabel::new("(Operand A is the primary input)").widget_holder()];
let operand_a_hint = vec![TextLabel::new("(Operand A is the primary input)").widget_instance()];
vec![
LayoutGroup::Row { widgets: expression }.with_tooltip_description(r#"A math expression that may incorporate "A" and/or "B", such as "sqrt(A + B) - B^2"."#),
@@ -2077,7 +2077,7 @@ pub mod choice {
fn disabled(self, disabled: bool) -> Self;
fn build<U, C>(&self, current: Self::Value, updater_factory: impl Fn() -> U, committer_factory: impl Fn() -> C) -> WidgetHolder
fn build<U, C>(&self, current: Self::Value, updater_factory: impl Fn() -> U, committer_factory: impl Fn() -> C) -> WidgetInstance
where
U: Fn(&Self::Value) -> Message + 'static + Send + Sync,
C: Fn(&()) -> Message + 'static + Send + Sync;
@@ -2116,7 +2116,7 @@ pub mod choice {
todo!()
}
fn dropdown_menu<U, C>(&self, current: E, updater_factory: impl Fn() -> U, committer_factory: impl Fn() -> C) -> WidgetHolder
fn dropdown_menu<U, C>(&self, current: E, updater_factory: impl Fn() -> U, committer_factory: impl Fn() -> C) -> WidgetInstance
where
U: Fn(&E) -> Message + 'static + Send + Sync,
C: Fn(&()) -> Message + 'static + Send + Sync,
@@ -2134,10 +2134,10 @@ pub mod choice {
.collect()
})
.collect();
DropdownInput::new(items).disabled(self.disabled).selected_index(Some(current.as_u32())).widget_holder()
DropdownInput::new(items).disabled(self.disabled).selected_index(Some(current.as_u32())).widget_instance()
}
fn radio_buttons<U, C>(&self, current: E, updater_factory: impl Fn() -> U, committer_factory: impl Fn() -> C) -> WidgetHolder
fn radio_buttons<U, C>(&self, current: E, updater_factory: impl Fn() -> U, committer_factory: impl Fn() -> C) -> WidgetInstance
where
U: Fn(&E) -> Message + 'static + Send + Sync,
C: Fn(&()) -> Message + 'static + Send + Sync,
@@ -2156,7 +2156,7 @@ pub mod choice {
if let Some(icon) = var_meta.icon { entry.icon(icon) } else { entry.label(var_meta.label) }
})
.collect();
RadioInput::new(items).selected_index(Some(current.as_u32())).widget_holder()
RadioInput::new(items).selected_index(Some(current.as_u32())).widget_instance()
}
}
@@ -2171,7 +2171,7 @@ pub mod choice {
E::DESCRIPTION
}
fn build<U, C>(&self, current: Self::Value, updater_factory: impl Fn() -> U, committer_factory: impl Fn() -> C) -> WidgetHolder
fn build<U, C>(&self, current: Self::Value, updater_factory: impl Fn() -> U, committer_factory: impl Fn() -> C) -> WidgetInstance
where
U: Fn(&Self::Value) -> Message + 'static + Send + Sync,
C: Fn(&()) -> Message + 'static + Send + Sync,
@@ -2222,7 +2222,7 @@ pub mod choice {
let committer = || super::commit_value;
let updater = || super::update_value(move |v: &W::Value| TaggedValue::from(v.clone()), node_id, index);
let widget = self.widget_factory.build(current, updater, committer);
widgets.extend_from_slice(&[Separator::new(SeparatorType::Unrelated).widget_holder(), widget]);
widgets.extend_from_slice(&[Separator::new(SeparatorType::Unrelated).widget_instance(), widget]);
}
let mut row = LayoutGroup::Row { widgets };
@@ -236,13 +236,13 @@ pub fn overlay_options(grid: &GridSnapping) -> Vec<LayoutGroup> {
};
widgets.push(LayoutGroup::Row {
widgets: vec![TextLabel::new("Grid").bold(true).widget_holder()],
widgets: vec![TextLabel::new("Grid").bold(true).widget_instance()],
});
widgets.push(LayoutGroup::Row {
widgets: vec![
TextLabel::new("Type").table_align(true).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_holder(),
TextLabel::new("Type").table_align(true).widget_instance(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
RadioInput::new(vec![
RadioEntryData::new("rectangular").label("Rectangular").on_update(update_val(grid, |grid, _| {
if let GridType::Isometric { y_axis_spacing, angle_a, angle_b } = grid.grid_type {
@@ -268,98 +268,101 @@ pub fn overlay_options(grid: &GridSnapping) -> Vec<LayoutGroup> {
GridType::Rectangular { .. } => 0,
GridType::Isometric { .. } => 1,
}))
.widget_holder(),
.widget_instance(),
],
});
let mut color_widgets = vec![TextLabel::new("Display").table_align(true).widget_holder(), Separator::new(SeparatorType::Unrelated).widget_holder()];
let mut color_widgets = vec![
TextLabel::new("Display").table_align(true).widget_instance(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
];
color_widgets.extend([
CheckboxInput::new(grid.dot_display)
.icon("GridDotted")
.tooltip_label("Display as Dotted Grid")
.on_update(update_display(grid, |grid| Some(&mut grid.dot_display)))
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
]);
color_widgets.push(
ColorInput::new(FillChoice::Solid(grid.grid_color.to_gamma_srgb()))
.tooltip_label("Grid Display Color")
.allow_none(false)
.on_update(update_color(grid, |grid| Some(&mut grid.grid_color)))
.widget_holder(),
.widget_instance(),
);
widgets.push(LayoutGroup::Row { widgets: color_widgets });
widgets.push(LayoutGroup::Row {
widgets: vec![
TextLabel::new("Origin").table_align(true).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_holder(),
TextLabel::new("Origin").table_align(true).widget_instance(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
NumberInput::new(Some(grid.origin.x))
.label("X")
.unit(" px")
.min_width(98)
.on_update(update_origin(grid, |grid| Some(&mut grid.origin.x)))
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
NumberInput::new(Some(grid.origin.y))
.label("Y")
.unit(" px")
.min_width(98)
.on_update(update_origin(grid, |grid| Some(&mut grid.origin.y)))
.widget_holder(),
.widget_instance(),
],
});
match grid.grid_type {
GridType::Rectangular { spacing } => widgets.push(LayoutGroup::Row {
widgets: vec![
TextLabel::new("Spacing").table_align(true).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_holder(),
TextLabel::new("Spacing").table_align(true).widget_instance(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
NumberInput::new(Some(spacing.x))
.label("X")
.unit(" px")
.min(0.)
.min_width(98)
.on_update(update_origin(grid, |grid| grid.grid_type.rectangular_spacing().map(|spacing| &mut spacing.x)))
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
NumberInput::new(Some(spacing.y))
.label("Y")
.unit(" px")
.min(0.)
.min_width(98)
.on_update(update_origin(grid, |grid| grid.grid_type.rectangular_spacing().map(|spacing| &mut spacing.y)))
.widget_holder(),
.widget_instance(),
],
}),
GridType::Isometric { y_axis_spacing, angle_a, angle_b } => {
widgets.push(LayoutGroup::Row {
widgets: vec![
TextLabel::new("Y Spacing").table_align(true).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_holder(),
TextLabel::new("Y Spacing").table_align(true).widget_instance(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
NumberInput::new(Some(y_axis_spacing))
.unit(" px")
.min(0.)
.min_width(200)
.on_update(update_origin(grid, |grid| grid.grid_type.isometric_y_spacing()))
.widget_holder(),
.widget_instance(),
],
});
widgets.push(LayoutGroup::Row {
widgets: vec![
TextLabel::new("Angles").table_align(true).widget_holder(),
Separator::new(SeparatorType::Unrelated).widget_holder(),
TextLabel::new("Angles").table_align(true).widget_instance(),
Separator::new(SeparatorType::Unrelated).widget_instance(),
NumberInput::new(Some(angle_a))
.unit("°")
.min_width(98)
.on_update(update_origin(grid, |grid| grid.grid_type.angle_a()))
.widget_holder(),
Separator::new(SeparatorType::Related).widget_holder(),
.widget_instance(),
Separator::new(SeparatorType::Related).widget_instance(),
NumberInput::new(Some(angle_b))
.unit("°")
.min_width(98)
.on_update(update_origin(grid, |grid| grid.grid_type.angle_b()))
.widget_holder(),
.widget_instance(),
],
});
}