use crate::node::NamedRef;
use crate::{InspectorRowsResponse, NodeCtx};
pub trait RefExtUi {
fn inspector_rows(
&self,
named: &mut NamedRef,
ctx: &mut NodeCtx,
body: &mut egui_extras::TableBody,
) -> InspectorRowsResponse;
}
#[cfg(test)]
mod tests {
use super::*;
use crate::NodeUi;
struct StubExt;
impl RefExtUi for StubExt {
fn inspector_rows(
&self,
_named: &mut NamedRef,
_ctx: &mut NodeCtx,
body: &mut egui_extras::TableBody,
) -> InspectorRowsResponse {
let mut resp = InspectorRowsResponse::default();
body.row(18.0, |mut row| {
row.col(|ui| {
ui.label("stub");
});
row.col(|_| {});
});
resp.mark_changed();
resp.emit("stub-payload".to_string());
resp
}
}
#[test]
fn named_ref_inspector_merges_ext_ui_responses() {
type G = gantz_core::node::graph::Graph<NamedRef>;
let registry = gantz_ca::Registry::<G>::default();
let builtins = gantz_core::BuiltinSet::<NamedRef>::from_specs([]);
let demos = std::collections::HashMap::new();
let reg_ref = crate::RegistryRef::new(®istry, &builtins, &demos);
let mut vm = gantz_core::steel::steel_vm::engine::Engine::new_base();
let mut named = NamedRef::new(
"x".to_string(),
gantz_core::node::Ref::new([0u8; 32].into()),
);
let exts: [&dyn RefExtUi; 1] = [&StubExt];
let mut merged = InspectorRowsResponse::default();
egui::__run_test_ui(|ui| {
egui_extras::TableBuilder::new(ui)
.column(egui_extras::Column::auto())
.column(egui_extras::Column::remainder())
.body(|mut body| {
let mut ctx =
crate::NodeCtx::new(®_ref, &[0][..], &[], &[], &exts[..], &mut vm);
merged = named.inspector_rows(&mut ctx, &mut body);
});
});
assert!(merged.changed, "ext change must merge into the response");
let payload = merged
.payloads
.into_iter()
.find_map(|p| p.downcast::<String>().ok())
.expect("ext payload must merge into the response");
assert_eq!(payload, "stub-payload");
}
}