Add support for visualizing Vec<String> in the Data panel

This commit is contained in:
Keavon Chambers 2025-11-03 13:13:54 -08:00
parent 0d8c521fbe
commit 0998abdaf3
4 changed files with 58 additions and 3 deletions

View File

@ -165,6 +165,7 @@ fn generate_layout(introspected_data: &Arc<dyn std::any::Any + Send + Sync + 'st
Table<Raster<GPU>>,
Table<Color>,
Table<GradientStops>,
Vec<String>,
f64,
u32,
u64,
@ -203,12 +204,44 @@ trait TableRowLayout {
}
}
impl<T: TableRowLayout> TableRowLayout for Vec<T> {
fn type_name() -> &'static str {
"Vec"
}
fn identifier(&self) -> String {
format!("Vec<{}> ({} element{})", T::type_name(), self.len(), if self.len() == 1 { "" } else { "s" })
}
fn element_page(&self, data: &mut LayoutData) -> Vec<LayoutGroup> {
if let Some(index) = data.desired_path.get(data.current_depth).copied() {
if let Some(row) = self.get(index) {
data.current_depth += 1;
let result = row.layout_with_breadcrumb(data);
data.current_depth -= 1;
return result;
} else {
warn!("Desired path truncated");
data.desired_path.truncate(data.current_depth);
}
}
let mut rows = self
.iter()
.enumerate()
.map(|(index, row)| vec![TextLabel::new(format!("{index}")).narrow(true).widget_holder(), row.element_widget(index)])
.collect::<Vec<_>>();
rows.insert(0, column_headings(&["", "element"]));
vec![LayoutGroup::Table { rows }]
}
}
impl<T: TableRowLayout> TableRowLayout for Table<T> {
fn type_name() -> &'static str {
"Table"
}
fn identifier(&self) -> String {
format!("Table<{}> ({} row{})", T::type_name(), self.len(), if self.len() == 1 { "" } else { "s" })
format!("Table<{}> ({} element{})", T::type_name(), self.len(), if self.len() == 1 { "" } else { "s" })
}
fn element_page(&self, data: &mut LayoutData) -> Vec<LayoutGroup> {
if let Some(index) = data.desired_path.get(data.current_depth).copied() {
@ -595,7 +628,13 @@ impl TableRowLayout for String {
"String"
}
fn identifier(&self) -> String {
"String".to_string()
// Show the first line, and if there are more, indicate that with an ellipsis
let first_line = self.lines().next().unwrap_or("");
if self.lines().count() > 1 {
format!("\"{}\"", first_line)
} else {
format!("\"{}\"", first_line)
}
}
fn element_page(&self, _data: &mut LayoutData) -> Vec<LayoutGroup> {
let widgets = vec![TextAreaInput::new(self.to_string()).disabled(true).widget_holder()];

View File

@ -37,7 +37,7 @@ impl FrontendGraphDataType {
TaggedValue::Vector(_) => Self::Vector,
TaggedValue::Color(_) => Self::Color,
TaggedValue::Gradient(_) | TaggedValue::GradientStops(_) | TaggedValue::GradientTable(_) => Self::Gradient,
TaggedValue::String(_) => Self::Typography,
TaggedValue::String(_) | TaggedValue::VecString(_) => Self::Typography,
_ => Self::General,
}
}

View File

@ -45,6 +45,21 @@
&:not(:first-child) {
margin-top: 0;
}
tr:first-child:has(td:first-child label:empty) ~ tr td:first-child {
width: 0;
}
}
.widget-span:has(.text-area-input) {
flex: 1 1 100%;
.text-area-input textarea {
height: 100%;
margin-top: 0;
margin-bottom: 0;
resize: none;
}
}
}
</style>

View File

@ -180,6 +180,7 @@ tagged_value! {
VecF64(Vec<f64>),
VecDVec2(Vec<DVec2>),
F64Array4([f64; 4]),
VecString(Vec<String>),
NodePath(Vec<NodeId>),
// ===========
// TABLE TYPES