|
- require("UIWidget");
- require("CCRectNode");
- local NodeEditor = class("NodeEditor" , require("Editor"));
-
- function NodeEditor:ctor()
- self.SelectedNodes = {}
- -- 节点计数器
- self.NodeCount = 1
- self.SelectedIndex = 1;
- end
-
- function NodeEditor:activate()
- -- 恢复场景的位置
- app.mainScene:setPosition(cc.p(0,0));
- -- 恢复下场景的缩放
- app.setting.ScreenScale = 1;
- app.mainScene:setScale(app.setting.ScreenScale);
- end
-
- function NodeEditor:unactivate()
- self:closeNode();
- end
-
- function NodeEditor:play()
- if self.node then
- self.node:playCurveAnimation();
- if self.node.stop then
- self.node:stop();
- end
- if self.node.play then
- self.node:play();
- end
- end
- end
-
- -- 是否可以选中此节点
- function NodeEditor:canSelectNode(flag, node)
- -- 忽略空节点
- if not flag and table.valueOfItem({"Layout", "GridLine" , "Scaler" , "Node" , "Scene"} , node.ClassName) then
- return false;
- end
-
- return true;
- end
-
- function NodeEditor:stop()
- if self.node then
- self.node:stopCurveAnimation();
- if self.node.stop then
- self.node:stop();
- end
- end
- end
-
- -- 各个派生类可以重写这个函数
- function NodeEditor:save(filename)
- NodeEditor.super.save(self, filename);
- --self.node:save(filename);
- self.node:saveToFile(filename);
-
- -- 清空undoredoManager
- app.undoRedoManager:clear();
- end
-
- -- 关闭光效
- function NodeEditor:closeNode()
- if self.node then
- self.node:removeFromParent();
- self.node = nil;
- end
- self:clearSelect();
- end
-
- -- 初始化光效,添加到场景中
- function NodeEditor:initNode(node)
- self.node = node
- app.mainLayer:addChild(self.node)
- end
-
- function NodeEditor:createNode(nodeType)
- local node = cc[nodeType]:createNode()
- -- 设置节点的名字
- node:setName(nodeType)
- if type(node.setDefaults) == "function" then
- node:setDefaults();
- end
- self:autoSetNodeName(node);
- return node;
- end
-
- -- 从文件载入节点
- function NodeEditor:loadNode(nodeFile)
- self:closeNode();
- --self.node = createNodeFromFile(nodeFile);
- self.node = tolua.cast(cc.StreamObject:loadFromFile(nodeFile) , "cc.Node3D");
- self:initNode(self.node);
- return self.node;
- end
-
- -- 清除所有选择
- function NodeEditor:clearSelect()
-
- for i , v in pairs(self.SelectedNodes) do
- v.selectedNode:removeFromParent();
- v.selectedNode = nil;
- end
-
- self.SelectedNodes = {};
- end
-
- --[[-- 通过命令清除所有选择
- function NodeEditor:commandClearSelect()
- if table.nums(self.SelectedNodes) <= 0 then
- return;
- end
-
- -- 通过command来清空选择
- local command = Commands:unselect(self.SelectedNodes);
- app.undoRedoManager:doCommand(command);
- end--]]
-
- -- 取消选择一个节点
- function NodeEditor:unSelectNode(node)
- if not self.SelectedNodes[node] then
- return
- end
-
- -- 去掉选择框
- local curNode = self.SelectedNodes[node];
- curNode.selectedNode:removeFromParent();
- curNode.selectedNode = nil;
-
- -- 从列表中去掉
- self.SelectedNodes[node] = nil;
- end
-
- -- 通过命令取消选择一个节点
- --[[function NodeEditor:commandUnselectNode(node)
- local nodes = {};
- table.insert(nodes, node);
- local command = Commands:unselect(nodes);
- app.undoRedoManager:doCommand(command);
- end--]]
-
- -- 选择一个节点
- function NodeEditor:selectNode(node)
- if self.SelectedNodes[node] then
- return;
- end
- self.SelectedNodes[node] = node;
- -- 保存计数值,记录选中的顺序
- node.SelectedIndex = self.SelectedIndex;
- self.SelectedIndex = self.SelectedIndex + 1;
-
- local rectNode = cc.RectNode:create(node);
- node.selectedNode = rectNode;
- app.mainLayer:addChild(rectNode);
- end
-
- -- 通过命令选择一个节点
- --[[function NodeEditor:commandSelectNode(node)
- local nodes = {};
- table.insert(nodes, node);
- local command = Commands:select(nodes);
- app.undoRedoManager:doCommand(command);
- end--]]
-
- -- 删除选中的节点
- function NodeEditor:deleteNode(node)
- -- 不在选中队列里不能删除
- if not self.SelectedNodes[node] then
- return;
- end
-
- -- 去掉选择框
- local curNode = self.SelectedNodes[node];
- curNode.selectedNode:removeFromParent();
- curNode.selectedNode = nil;
-
- -- 从列表中去掉
- self.SelectedNodes[node] = nil;
- node:removeFromParent();
- end
-
- -- 通过命令删除一个节点
- function NodeEditor:commandDeleteNode(node)
- local command = Commands:deleteNode(node);
- app.undoRedoManager:doCommand(command);
- end
-
- -- 删除所有选中的节点
- function NodeEditor:commandDeleteSelectNodes()
- if next(self.SelectedNodes) == nil then
- return;
- end
-
- -- 如果子节点和父节点都在删除的范围里面则只删除父节点就可以了
- local deleteNodes = {};
- for i, v in pairs(self.SelectedNodes) do
- if not ParentNodeIsInTable(v, self.SelectedNodes) then
- table.insert(deleteNodes, v);
- end
- end
-
- local commands = {};
- for i, v in pairs(deleteNodes) do
- local command = Commands:deleteNode(v);
- table.insert(commands, command);
- end
-
- -- 清空所有选中
- self:clearSelect();
- app.undoRedoManager:doCommand(Commands:batchCommand(commands));
- end
-
- -- 改变节点的父子关系
- function NodeEditor:commandModityNode(node, newParent)
- local command = Commands:modifyNode(node, newParent);
- app.undoRedoManager:doCommand(command);
- end
-
- -- 复制节点到另一个节点下面
- function NodeEditor:commandCopyNode(node, parentNode)
- local command = Commands:addNode(node, parentNode);
- app.undoRedoManager:doCommand(command);
- end
-
- -- 复制一个节点的动画到另一个节点下面
- function NodeEditor:commandCopyNodeAnim(node, parentNode)
- local command = Commands:copyNodeAnim(node, parentNode);
- app.undoRedoManager:doCommand(command);
- end
-
- function NodeEditor:sceneToMouse(x , y)
- return app.mainLayer:convertToWorldSpace(cc.p(x,y));
- end
-
- function NodeEditor:mouseToScene(x , y)
- return app.mainLayer:convertToNodeSpace(cc.p(x,y));
- end
-
- -- 摆放一个节点到场景中
- -- @nodeType 节点类型名字
- -- @parentNode 父节点
- -- @posWithMouse 鼠标的窗口位置
- function NodeEditor:placeNode(nodeType , parentNode , posWithMouse)
- local node = self:createNode(nodeType);
- local pNode = nil;
- if parentNode then
- pNode = parentNode;
- else
- pNode = self.node;
- end
-
- -- 设置世界坐标
- if posWithMouse then
- local worldPos = app.cameraController:convertScreenToWorldPos(posWithMouse.x , posWithMouse.y);
- local nodePos = pNode:convertToNodeSpace(worldPos);
- node:setTranslation(nodePos);
- end
-
- -- 通过命令添加到节点树里面
- local command = Commands:addNode(node, pNode);
- app.undoRedoManager:doCommand(command);
-
- return node;
- end
-
- return NodeEditor;
|