コード例 #1
0
ファイル: SC_MiscCmds.cpp プロジェクト: 2mc/supercollider
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;
}
コード例 #2
0
ファイル: SC_Node.cpp プロジェクト: HuaxingXu/supercollider
// 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);
}
コード例 #3
0
ファイル: SC_Group.cpp プロジェクト: 2mc/supercollider
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;
	}
}
コード例 #4
0
ファイル: SC_MiscCmds.cpp プロジェクト: 2mc/supercollider
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;
}
コード例 #5
0
ファイル: SC_MiscCmds.cpp プロジェクト: 2mc/supercollider
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;
}