SCErr meth_n_after(World *inWorld, int inSize, char *inData, ReplyAddress* /*inReply*/) { sc_msg_iter msg(inSize, inData); Node *prevNode = 0; Node *prevTarget = 0; while (msg.remain()) { Node *node = Msg_GetNode(inWorld, msg); Node *target = Msg_GetNode(inWorld, msg); if (!node || !target) continue; // tolerate failure if (prevNode && prevNode != node) { // move the last pair that succeeded Node_Remove(prevNode); Node_AddAfter(prevNode, prevTarget); Node_StateMsg(prevNode, kNode_Move); } prevNode = node; prevTarget = target; } if (prevNode) { // move the last pair that succeeded Node_Remove(prevNode); Node_AddAfter(prevNode, prevTarget); Node_StateMsg(prevNode, kNode_Move); } return kSCErr_None; }
// node destructor void Node_Dtor(Node *inNode) { Node_StateMsg(inNode, kNode_End); Node_Remove(inNode); World *world = inNode->mWorld; world->hw->mNodeLib->Remove(inNode); World_Free(world, inNode); }
void Group_DeepFreeGraphs(Group *inGroup) { Node *child = inGroup->mHead; while (child) { Node *next = child->mNext; if (child->mIsGroup) { Group_DeepFreeGraphs((Group*)child); } else { Node_Remove(child); Node_Delete(child); } child = next; } }
SCErr meth_g_tail(World *inWorld, int inSize, char *inData, ReplyAddress* /*inReply*/) { sc_msg_iter msg(inSize, inData); while (msg.remain()) { Group *group = Msg_GetGroup(inWorld, msg); if (!group) return kSCErr_GroupNotFound; Node *node = Msg_GetNode(inWorld, msg); if (!node) return kSCErr_NodeNotFound; //Group *prevGroup = node->mParent; Node_Remove(node); Group_AddTail(group, node); //if (group != prevGroup) { Node_StateMsg(node, kNode_Move); //} } return kSCErr_None; }
SCErr meth_n_order(World *inWorld, int inSize, char *inData, ReplyAddress* /*inReply*/) { SCErr err; Node *prevNode = 0; Node *node = 0; sc_msg_iter msg(inSize, inData); int32 addAction = msg.geti(); // place the first node in the list based on target and addAction switch (addAction) { case 0 : { Group *group = Msg_GetGroup(inWorld, msg); if (!group) return kSCErr_GroupNotFound; while(!node && msg.remain()) { node = Msg_GetNode(inWorld, msg); if(!node) scprintf("Warning Node not found\n"); } if (!node) return kSCErr_NodeNotFound; Group *prevGroup = node->mParent; Node_Remove(node); Group_AddHead(group, node); if (group != prevGroup) { Node_StateMsg(node, kNode_Move); } prevNode = node; } break; case 1 : { Group *group = Msg_GetGroup(inWorld, msg); if (!group) return kSCErr_GroupNotFound; while(!node && msg.remain()) { node = Msg_GetNode(inWorld, msg); if(!node) scprintf("Warning Node not found\n"); } if (!node) return kSCErr_NodeNotFound; Group *prevGroup = node->mParent; Node_Remove(node); Group_AddTail(group, node); if (group != prevGroup) { Node_StateMsg(node, kNode_Move); } prevNode = node; } break; case 2 : { Node *beforeNode = Msg_GetNode(inWorld, msg); if (!beforeNode) return kSCErr_TargetNodeNotFound; while(!node && msg.remain()) { node = Msg_GetNode(inWorld, msg); if(!node) scprintf("Warning Node not found\n"); } if (!node) return kSCErr_NodeNotFound; Node_Remove(node); Node_AddBefore(node, beforeNode); Node_StateMsg(node, kNode_Move); prevNode = node; } break; case 3 : { Node *afterNode = Msg_GetNode(inWorld, msg); if (!afterNode) return kSCErr_TargetNodeNotFound; while(!node && msg.remain()) { node = Msg_GetNode(inWorld, msg); if(!node) scprintf("Warning Node not found\n"); } if (!node) return kSCErr_NodeNotFound; Node_Remove(node); Node_AddAfter(node, afterNode); Node_StateMsg(node, kNode_Move); prevNode = node; } break; default: return kSCErr_Failed; } // now iterate through in order while (msg.remain()) { node = Msg_GetNode(inWorld, msg); if(!node) { scprintf("Warning Node not found\n"); continue; } Node_Remove(node); Node_AddAfter(node, prevNode); Node_StateMsg(node, kNode_Move); prevNode = node; } return kSCErr_None; }