Fix: Wrong node link drag search menu items for attribute statistic

Caused by capturing local variables by reference in a function that
outlives the scope it was created in. Also use a more generic function
for the first two inputs.
This commit is contained in:
Hans Goudey 2021-12-22 16:45:41 -06:00
parent 14621e7720
commit dca5be9b94
1 changed files with 5 additions and 10 deletions

View File

@ -132,16 +132,13 @@ static std::optional<CustomDataType> node_type_from_other_socket(const bNodeSock
static void node_gather_link_searches(GatherLinkSearchOpParams &params)
{
const bNodeType &node_type = params.node_type();
const NodeDeclaration &declaration = *params.node_type().fixed_declaration;
search_link_ops_for_declarations(params, declaration.inputs().take_front(2));
const std::optional<CustomDataType> type = node_type_from_other_socket(params.other_socket());
if (params.in_out() == SOCK_IN) {
if (params.other_socket().type == SOCK_GEOMETRY) {
params.add_item(IFACE_("Geometry"), [node_type](LinkSearchOpParams &params) {
bNode &node = params.add_node(node_type);
params.connect_available_socket(node, "Geometry");
});
}
if (type) {
params.add_item(IFACE_("Attribute"), [&](LinkSearchOpParams &params) {
params.add_item(IFACE_("Attribute"), [node_type, type](LinkSearchOpParams &params) {
bNode &node = params.add_node(node_type);
node.custom1 = *type;
params.update_and_connect_available_socket(node, "Attribute");
@ -149,9 +146,7 @@ static void node_gather_link_searches(GatherLinkSearchOpParams &params)
}
}
else if (type) {
/* Only use the first 8 declarations since we set the type automatically. */
const NodeDeclaration &declaration = *params.node_type().fixed_declaration;
for (const SocketDeclarationPtr &socket_decl : declaration.outputs().take_front(8)) {
for (const SocketDeclarationPtr &socket_decl : declaration.outputs()) {
StringRefNull name = socket_decl->name();
params.add_item(IFACE_(name.c_str()), [node_type, name, type](LinkSearchOpParams &params) {
bNode &node = params.add_node(node_type);