Fix wrong node parameter widgets, attempt 3 at #2323 (#2334)

* WIP, for TrueDoctor to continue

* Expose first implementation type as default type in field metadata

* Cleanup

---------

Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
Dennis Kobert
2025-03-01 22:26:21 +01:00
committed by GitHub
parent e41471c088
commit fd81d043a2
4 changed files with 30 additions and 10 deletions

View File

@@ -2697,7 +2697,8 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
.iter()
.zip(first_node_io.inputs.iter())
.enumerate()
.map(|(index, (field, ty))| {
.map(|(index, (field, node_io_ty))| {
let ty = field.default_type.as_ref().unwrap_or(node_io_ty);
let exposed = if index == 0 { *ty != fn_type!(()) } else { field.exposed };
match field.value_source {

View File

@@ -6,6 +6,7 @@ use crate::messages::layout::utility_types::widget_prelude::*;
use crate::messages::portfolio::document::utility_types::network_interface::InputConnector;
use crate::messages::prelude::*;
use dyn_any::DynAny;
use graph_craft::document::value::TaggedValue;
use graph_craft::document::{DocumentNode, DocumentNodeImplementation, NodeId, NodeInput};
use graph_craft::imaginate_input::{ImaginateMaskStartingFill, ImaginateSamplingMethod};
@@ -2128,7 +2129,7 @@ pub(crate) fn generate_node_properties(node_id: NodeId, context: &mut NodeProper
let mut number_options = (None, None, None);
let input_type = match implementation {
DocumentNodeImplementation::ProtoNode(proto_node_identifier) => {
DocumentNodeImplementation::ProtoNode(proto_node_identifier) => 'early_return: {
if let Some(field) = graphene_core::registry::NODE_METADATA
.lock()
.unwrap()
@@ -2136,16 +2137,22 @@ pub(crate) fn generate_node_properties(node_id: NodeId, context: &mut NodeProper
.and_then(|metadata| metadata.fields.get(input_index))
{
number_options = (field.number_min, field.number_max, field.number_mode_range);
if let Some(ref default) = field.default_type {
break 'early_return default.clone();
}
}
let Some(implementations) = &interpreted_executor::node_registry::NODE_REGISTRY.get(proto_node_identifier) else {
log::error!("Could not get implementation for protonode {proto_node_identifier:?}");
return Vec::new();
};
let proto_node_identifier = proto_node_identifier.clone();
let input_type = implementations
let mut input_types = implementations
.keys()
.filter_map(|item| item.inputs.get(input_index))
.find(|item| property_from_type(node_id, input_index, item, number_options, context).is_ok());
.filter(|ty| property_from_type(node_id, input_index, ty, number_options, context).is_ok())
.collect::<Vec<_>>();
input_types.sort_by_key(|ty| ty.type_name());
let input_type = input_types.first().cloned();
let Some(input_type) = input_type else {
log::error!("Could not get input type for protonode {proto_node_identifier:?} at index {input_index:?}");
return Vec::new();