Fix for bug #6747: make single button for node groups didn't work,

functionality was not implemented.
This commit is contained in:
2008-02-24 22:27:40 +00:00
parent 93034dc3f6
commit ed7156a258
4 changed files with 46 additions and 12 deletions

View File

@@ -153,7 +153,7 @@ void nodeUpdateType(struct bNodeTree *ntree, struct bNode* node, struct bNodeT
void nodeMakeDynamicType(struct bNode *node);
int nodeDynamicUnlinkText(struct ID *txtid);
void nodeFreeNode(struct bNodeTree *ntree, struct bNode *node);
struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node);
struct bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int internal);
struct bNodeLink *nodeAddLink(struct bNodeTree *ntree, struct bNode *fromnode, struct bNodeSocket *fromsock, struct bNode *tonode, struct bNodeSocket *tosock);
void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
@@ -179,6 +179,8 @@ int nodeGroupUnGroup(struct bNodeTree *ntree, struct bNode *gnode);
void nodeVerifyGroup(struct bNodeTree *ngroup);
void nodeGroupSocketUseFlags(struct bNodeTree *ngroup);
void nodeCopyGroup(struct bNode *gnode);
/* ************** COMMON NODES *************** */
#define NODE_GROUP 2

View File

@@ -801,6 +801,23 @@ int nodeGroupUnGroup(bNodeTree *ntree, bNode *gnode)
return 1;
}
void nodeCopyGroup(bNode *gnode)
{
bNodeSocket *sock;
gnode->id->us--;
gnode->id= (ID *)ntreeCopyTree((bNodeTree *)gnode->id, 0);
/* new_sock was set in nodeCopyNode */
for(sock=gnode->inputs.first; sock; sock=sock->next)
if(sock->tosock)
sock->tosock= sock->tosock->new_sock;
for(sock=gnode->outputs.first; sock; sock=sock->next)
if(sock->tosock)
sock->tosock= sock->tosock->new_sock;
}
/* ************** Add stuff ********** */
void nodeAddSockets(bNode *node, bNodeType *ntype)
{
@@ -901,23 +918,30 @@ void nodeUpdateType(bNodeTree *ntree, bNode* node, bNodeType *ntype)
/* keep socket listorder identical, for copying links */
/* ntree is the target tree */
bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node)
bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node, int internal)
{
bNode *nnode= MEM_callocN(sizeof(bNode), "dupli node");
bNodeSocket *sock;
bNodeSocket *sock, *oldsock;
*nnode= *node;
BLI_addtail(&ntree->nodes, nnode);
duplicatelist(&nnode->inputs, &node->inputs);
for(sock= nnode->inputs.first; sock; sock= sock->next)
sock->own_index= 0;
oldsock= node->inputs.first;
for(sock= nnode->inputs.first; sock; sock= sock->next, oldsock= oldsock->next) {
oldsock->new_sock= sock;
if(internal)
sock->own_index= 0;
}
duplicatelist(&nnode->outputs, &node->outputs);
for(sock= nnode->outputs.first; sock; sock= sock->next) {
sock->own_index= 0;
oldsock= node->outputs.first;
for(sock= nnode->outputs.first; sock; sock= sock->next, oldsock= oldsock->next) {
if(internal)
sock->own_index= 0;
sock->stack_index= 0;
sock->ns.data= NULL;
oldsock->new_sock= sock;
}
if(nnode->id)
@@ -995,7 +1019,7 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree, int internal_select)
node->new_node= NULL;
if(internal_select==0 || (node->flag & NODE_SELECT)) {
nnode= nodeCopyNode(newtree, node); /* sets node->new */
nnode= nodeCopyNode(newtree, node, internal_select); /* sets node->new */
if(internal_select) {
node->flag &= ~NODE_SELECT;
nnode->flag |= NODE_SELECT;

View File

@@ -58,7 +58,7 @@ typedef struct bNodeStack {
#define NS_OSA_VALUES 2
typedef struct bNodeSocket {
struct bNodeSocket *next, *prev;
struct bNodeSocket *next, *prev, *new_sock;
char name[32];
bNodeStack ns; /* custom data for inputs, only UI writes in this */

View File

@@ -247,6 +247,14 @@ static void node_but_title_cb(void *node_v, void *but_v)
allqueue(REDRAWNODE, 0);
}
static void node_group_alone_cb(void *node_v, void *unused_v)
{
bNode *node= node_v;
nodeCopyGroup(node);
allqueue(REDRAWNODE, 0);
}
/* ****************** BUTTON CALLBACKS FOR ALL TREES ***************** */
@@ -272,7 +280,7 @@ static int node_buts_group(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *
bt= uiDefBut(block, BUT, B_NOP, str1,
butr->xmax-19, butr->ymin, 19, 19,
NULL, 0, 0, 0, 0, "Displays number of users.");
//uiButSetFunc(bt, node_mat_alone_cb, node, NULL);
uiButSetFunc(bt, node_group_alone_cb, node, NULL);
}
uiBlockEndAlign(block);
@@ -3104,7 +3112,7 @@ static void node_draw_group_links(SpaceNode *snode, bNode *gnode)
bNodeSocket *sock;
glEnable(GL_BLEND);
glEnable( GL_LINE_SMOOTH );
glEnable(GL_LINE_SMOOTH);
fakelink.tonode= fakelink.fromnode= gnode;
@@ -3129,7 +3137,7 @@ static void node_draw_group_links(SpaceNode *snode, bNode *gnode)
}
glDisable(GL_BLEND);
glDisable( GL_LINE_SMOOTH );
glDisable(GL_LINE_SMOOTH);
}
/* groups are, on creation, centered around 0,0 */