UI/Nodes: Improve feedback when adding node fails (e.g. on drag & drop)
This is especially useful when trying to add a node group instance, e.g. via drag & drop from the Outliner or Asset Browser. Previously this would just silently fail, with no information why. This is a source of confusion, e.g. earlier, it took me a moment to realize I was dragging a node group into itself, which failed of course. Blender should always try to help the user with useful error messages. Adds error messages like: "Nesting a node group inside of itself is not allowed", "Not a compositor node tree", etc. Adds a disabled hint return argument to node and node tree polling functions. On error the hint is reported, or could even be shown in advance (e.g. if checked via an operator poll option). Differential Revision: https://developer.blender.org/D10422 Reviewed by: Jacques Lucke
This commit is contained in:
@@ -2007,7 +2007,8 @@ bNode *nodeAddStaticNode(const struct bContext *C, bNodeTree *ntree, int type)
|
||||
/* do an extra poll here, because some int types are used
|
||||
* for multiple node types, this helps find the desired type
|
||||
*/
|
||||
if (ntype->type == type && (!ntype->poll || ntype->poll(ntype, ntree))) {
|
||||
const char *disabled_hint;
|
||||
if (ntype->type == type && (!ntype->poll || ntype->poll(ntype, ntree, &disabled_hint))) {
|
||||
idname = ntype->idname;
|
||||
break;
|
||||
}
|
||||
@@ -4407,15 +4408,17 @@ static void node_type_base_defaults(bNodeType *ntype)
|
||||
}
|
||||
|
||||
/* allow this node for any tree type */
|
||||
static bool node_poll_default(bNodeType *UNUSED(ntype), bNodeTree *UNUSED(ntree))
|
||||
static bool node_poll_default(bNodeType *UNUSED(ntype),
|
||||
bNodeTree *UNUSED(ntree),
|
||||
const char **UNUSED(disabled_hint))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/* use the basic poll function */
|
||||
static bool node_poll_instance_default(bNode *node, bNodeTree *ntree)
|
||||
static bool node_poll_instance_default(bNode *node, bNodeTree *ntree, const char **disabled_hint)
|
||||
{
|
||||
return node->typeinfo->poll(node->typeinfo, ntree);
|
||||
return node->typeinfo->poll(node->typeinfo, ntree, disabled_hint);
|
||||
}
|
||||
|
||||
/* NOLINTNEXTLINE: readability-function-size */
|
||||
@@ -4634,7 +4637,9 @@ void node_type_internal_links(bNodeType *ntype,
|
||||
|
||||
/* callbacks for undefined types */
|
||||
|
||||
static bool node_undefined_poll(bNodeType *UNUSED(ntype), bNodeTree *UNUSED(nodetree))
|
||||
static bool node_undefined_poll(bNodeType *UNUSED(ntype),
|
||||
bNodeTree *UNUSED(nodetree),
|
||||
const char **UNUSED(r_disabled_hint))
|
||||
{
|
||||
/* this type can not be added deliberately, it's just a placeholder */
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user