Solved bad design decision in Node Editor:

The buttons uiBlock was stored in a Node, for retrieval of node buttons,
however that won't work when multiple windows show same Nodes.
Now implemented more correct unique Block names (as all over in UI), and
use that name to retrieve buttons with API call uiGetBlock().
This commit is contained in:
2006-06-17 13:04:09 +00:00
parent b159b27329
commit 19832a0639
5 changed files with 32 additions and 24 deletions

View File

@@ -846,7 +846,6 @@ bNode *nodeCopyNode(struct bNodeTree *ntree, struct bNode *node)
node->new= nnode;
nnode->new= NULL;
nnode->preview= NULL;
nnode->block= NULL;
return nnode;
}

View File

@@ -1280,7 +1280,6 @@ static void direct_link_nodetree(FileData *fd, bNodeTree *ntree)
/* and we connect the rest */
for(node= ntree->nodes.first; node; node= node->next) {
node->preview= NULL;
node->block= NULL;
node->lasty= 0;
for(sock= node->inputs.first; sock; sock= sock->next)
sock->link= newdataadr(fd, sock->link);

View File

@@ -39,7 +39,6 @@ struct SpaceNode;
struct bNodeLink;
struct bNodeType;
struct bNodeGroup;
struct uiBlock;
#define NODE_MAXSTR 32
@@ -113,7 +112,6 @@ typedef struct bNode {
ListBase inputs, outputs;
struct ID *id; /* optional link to libdata */
void *storage; /* custom data, must be struct, for storage in file */
struct uiBlock *block; /* each node has own block */
float locx, locy; /* root offset for drawing */
float width, miniwidth;

View File

@@ -1440,6 +1440,7 @@ static int node_get_colorid(bNode *node)
static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node)
{
bNodeSocket *sock;
uiBlock *block= NULL;
uiBut *bt;
rctf *rct= &node->totr;
float slen, iconofs;
@@ -1547,17 +1548,20 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node)
/* we make buttons for input sockets, if... */
if(node->flag & NODE_OPTIONS) {
if(node->inputs.first || node->typeinfo->butfunc) {
uiBlock *block= uiNewBlock(NULL, "node buttons", UI_EMBOSS, UI_HELV, sa->win);
BLI_addtail(&sa->uiblocks, block);
char str[32];
/* make unique block name, also used for handling blocks in editnode.c */
sprintf(str, "node buttons %p", node);
block= uiNewBlock(&sa->uiblocks, str, UI_EMBOSS, UI_HELV, sa->win);
uiBlockSetFlag(block, UI_BLOCK_NO_HILITE);
if(snode->id)
uiSetButLock(snode->id->lib!=NULL, "Can't edit library data");
node->block= block;
}
}
/* hurmf... another candidate for callback, have to see how this works first */
if(node->id && node->block && snode->treetype==NTREE_SHADER)
if(node->id && block && snode->treetype==NTREE_SHADER)
nodeShaderSynchronizeID(node, 0);
/* socket inputs, buttons */
@@ -1565,31 +1569,31 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node)
if(!(sock->flag & SOCK_HIDDEN)) {
socket_circle_draw(sock->locx, sock->locy, NODE_SOCKSIZE, sock->type, sock->flag & SELECT);
if(node->block && sock->link==NULL) {
if(block && sock->link==NULL) {
float *butpoin= sock->ns.vec;
if(sock->type==SOCK_VALUE) {
bt= uiDefButF(node->block, NUM, B_NODE_EXEC+node->nr, sock->name,
bt= uiDefButF(block, NUM, B_NODE_EXEC+node->nr, sock->name,
(short)sock->locx+NODE_DYS, (short)(sock->locy)-9, (short)node->width-NODE_DY, 17,
butpoin, sock->ns.min, sock->ns.max, 10, 2, "");
uiButSetFunc(bt, node_sync_cb, snode, node);
}
else if(sock->type==SOCK_VECTOR) {
uiDefBlockBut(node->block, socket_vector_menu, sock, sock->name,
uiDefBlockBut(block, socket_vector_menu, sock, sock->name,
(short)sock->locx+NODE_DYS, (short)sock->locy-9, (short)node->width-NODE_DY, 17,
"");
}
else if(node->block && sock->type==SOCK_RGBA) {
else if(block && sock->type==SOCK_RGBA) {
short labelw= node->width-NODE_DY-40, width;
if(labelw>0) width= 40; else width= node->width-NODE_DY;
bt= uiDefButF(node->block, COL, B_NODE_EXEC+node->nr, "",
bt= uiDefButF(block, COL, B_NODE_EXEC+node->nr, "",
(short)(sock->locx+NODE_DYS), (short)sock->locy-8, width, 15,
butpoin, 0, 0, 0, 0, "");
uiButSetFunc(bt, node_sync_cb, snode, node);
if(labelw>0) uiDefBut(node->block, LABEL, 0, sock->name,
if(labelw>0) uiDefBut(block, LABEL, 0, sock->name,
(short)(sock->locx+NODE_DYS) + 40, (short)sock->locy-8, labelw, 15,
NULL, 0, 0, 0, 0, "");
}
@@ -1627,9 +1631,9 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node)
/* buttons */
if(node->flag & NODE_OPTIONS) {
if(node->typeinfo->butfunc) {
node->typeinfo->butfunc(node->block, snode->nodetree, node, &node->butr);
node->typeinfo->butfunc(block, snode->nodetree, node, &node->butr);
}
uiDrawBlock(node->block);
uiDrawBlock(block);
}
}
@@ -1807,7 +1811,6 @@ static void node_draw_nodetree(ScrArea *sa, SpaceNode *snode, bNodeTree *ntree)
/* not selected first */
for(a=0, node= ntree->nodes.first; node; node= node->next, a++) {
node->block= NULL; /* were freed */
node->nr= a; /* index of node in list, used for exec event code */
if(!(node->flag & SELECT)) {
if(node->flag & NODE_GROUP_EDIT);

View File

@@ -1751,11 +1751,13 @@ void node_make_group(SpaceNode *snode)
/* special version to prevent overlapping buttons, has a bit of hack... */
/* yes, check for example composit_node_event(), file window use... */
static int node_uiDoBlocks(SpaceNode *snode, ListBase *lb, short event)
static int node_uiDoBlocks(ScrArea *sa, short event)
{
SpaceNode *snode= sa->spacedata.first;
ListBase *lb= &sa->uiblocks;
ListBase listb= *lb;
bNode *node;
rctf rect;
ListBase listb= *lb;
void *prev;
int retval= UI_NOTHING;
short mval[2];
@@ -1774,15 +1776,22 @@ static int node_uiDoBlocks(SpaceNode *snode, ListBase *lb, short event)
rect.ymax = rect.ymin + 4.0f;
for(node= snode->edittree->nodes.first; node; node= node->next) {
if(node->block) {
uiBlock *block;
char str[32];
/* retreive unique block name, see also drawnode.c */
sprintf(str, "node buttons %p", node);
block= uiGetBlock(str, sa);
if(block) {
if(node == visible_node(snode, &rect)) {
/* when there's menus, the prev pointer becomes zero! */
prev= ((struct Link *)node->block)->prev;
prev= ((struct Link *)block)->prev;
lb->first= lb->last= node->block;
lb->first= lb->last= block;
retval= uiDoBlocks(lb, event);
((struct Link *)node->block)->prev= prev;
((struct Link *)block)->prev= prev;
break;
}
@@ -1805,7 +1814,7 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(val) {
if( node_uiDoBlocks(snode, &sa->uiblocks, event)!=UI_NOTHING ) event= 0;
if( node_uiDoBlocks(sa, event)!=UI_NOTHING ) event= 0;
fromlib= (snode->id && snode->id->lib);