|
- require("EditorGlobalFunction")
-
- local MoveTool = class("MoveTool")
- function MoveTool:ctor()
- self.onSelect = nil;
- end
-
- function MoveTool:clear()
- self.startPos = nil;
- self.originPoies = nil;
- if self.selectRectNode then
- self.selectRectNode:removeFromParent();
- self.selectRectNode = nil;
- end
- end
-
- -- 计算节点是否跟矩形相交,如果相交,则插入到intersects表中
- local function intersectNode(node , rect , intersects , all)
- -- 隐藏节点不给选中
- if not node:isVisible() then
- return;
- end
- node:sortAllChildren();
- -- 递归
- local children = node:getChildren();
- for i = #children , 1 , -1 do
- intersectNode(children[i] , rect , intersects , all)
- end
- if node:selectTest(rect) then
- -- 是否忽略空节点
- if app.editor:canSelectNode(all, node) then
- table.insert(intersects , node);
- end
- end
- end
-
- function MoveTool:MouseDown(button , x , y)
- -- 按下ALT控制相机
- if app.cs.getModifierKeys() == Keys.Alt then
- return false;
- end
-
- -- 不是鼠标左键按下不处理
- if button ~= MouseButtons.Left then
- if button == MouseButtons.Right then
- return true;
- end
- return false;
- end
-
- self.startPos = cc.p(x, y);
- self.originPoies = {};
-
- local size = cc.Director:getInstance():getWinSize();
- local screenSize = cc.Director:getInstance():getWinSizeInPixels();
- local ray = app.mainCamera:pickRay(self.startPos.x / screenSize.width , self.startPos.y / screenSize.height);
- --[[local hitTest = cc.PhysicsController:getInstance():rayTest(ray, 100000)
- if hitTest == true then
- print("击中目标了")
- end--]]
- -- 计算点选的区域
- local rect = cc.Rectangle:new(self.startPos.x / size.width , self.startPos.y / size.height , 1 / size.width , 1 / size.height);
- -- 看是否点中的是已选择的,如果是,则只是记录点选位置
- local hitNode;
- for i , v in pairs(app.editor.SelectedNodes) do
- if v:selectTest(rect) then
- hitNode = v;
- end
- end
- -- 没选中任何东西
- if not hitNode then
- if self.selectRectNode then
- self.selectRectNode:removeFromParent();
- self.selectRectNode = nil;
- end
-
- -- 这里需要支持撤销
- --[[local commands = {};
- -- 有选中的东西则需要通过命令来撤销
- if next(app.editor.SelectedNodes) ~= nil then
- local command = Commands:unselect(app.editor.SelectedNodes);
- table.insert(commands, command);
- end--]]
- -- 实现Ctrl按住可以多选
- if app.cs.getModifierKeys() ~= Keys.Control then
- app.editor:clearSelect();
- end
- local intersects = {};
- -- 递归计算哪些节点相交
- intersectNode(app.editor.node , rect , intersects);
- -- 选中第一个
- local selectedNode = intersects[1];
- if selectedNode then
- -- 选中
- app.cs.selectNodes({selectedNode});
- app.editor:selectNode(selectedNode);
- app.cs.setPropertyObject(selectedNode);
- -- 通过命令来选中
- --[[local command = Commands:select(intersects);
- table.insert(commands, command);--]]
- else
- self.selectRectNode = cc.BoxNode:create();
- self.selectRectNode.startPos = app.visibleRect:convertScreenToGLView(self.startPos.x, self.startPos.y);
- self.selectRectNode.endPos = app.visibleRect:convertScreenToGLView(self.startPos.x, self.startPos.y);
- -- 计算开始点
- app.mainLayer:addChild(self.selectRectNode);
- end
-
- --app.undoRedoManager:doCommand(Commands:batchCommand(commands));
- end
-
- -- 记录下所有节点的位置
- for i , v in pairs(app.editor.SelectedNodes) do
- -- 如果自己的父节点在这个列表里面则不需要统计了
- if not ParentNodeIsInTable(v, app.editor.SelectedNodes) then
- self.originPoies[v] =
- {
- pos = v:getTranslation();
- rotate = v:getEulerRotation();
- }
- end
- end
-
- return true;
- end
-
- -- 派生类重写
- function MoveTool:moveTo(screenX, screenY)
-
- end
-
- -- 派生类重写
- function MoveTool:commandMoveTo(screenX, screenY)
-
- end
-
- -- 派生类重写
- function MoveTool:commandMoveBy(offset)
-
- end
-
- -- 派生类重写
- function MoveTool:MouseMove(button , x , y)
- if not self.startPos then return end
- -- 计算结束点
- if self.selectRectNode then
- self.selectRectNode.endPos = app.visibleRect:convertScreenToGLView(x, y);
- end
-
- self:moveTo(x, y);
- end
-
- function MoveTool:MouseUp(button , x , y)
- if button == MouseButtons.Right then
- local editor = app.editor;
- --editor:clearSelect ();
- local size = cc.Director:getInstance():getWinSize();
- local intersects = {};
- local rect = cc.Rectangle:new(x / size.width , y / size.height , 1 / size.width , 1 / size.height);
- -- 递归计算哪些节点相交
- intersectNode(editor.node ,rect, intersects, true);
-
- local items = {};
- for _ , item in pairs(intersects) do
- table.insert(items , {
- text = item:getName () ;
- func = function()
- editor:clearSelect ();
- editor:selectNode (item);
- app.cs.selectNodes ({item});
- app.cs.setPropertyObject (item);
- end;
- });
- end
- app.cs.popMenu(items,{x=x;y=y;});
- return;
- end
-
- if not self.startPos then return end
- -- 计算结束点
- self:commandMoveTo(x, y);
-
- -- 如果没有元素
- if next(app.editor.SelectedNodes) == nil then
- local startPos = self.startPos;
- local endPos = cc.p(x, y);
- -- 计算框选的区域
- local size = cc.Director:getInstance():getWinSize();
- local rect = cc.Rectangle:new(math.min(startPos.x , endPos.x) / size.width
- , math.min(startPos.y , endPos.y) / size.height
- , math.abs(endPos.x - startPos.x) / size.width
- , math.abs(endPos.y - startPos.y) / size.height
- );
- local intersects = {};
- -- 计算哪些节点相交
- -- 递归
- intersectNode(app.editor.node , rect , intersects);
- -- 实现Ctrl按住可以多选
- if app.cs.getModifierKeys() ~= Keys.Control then
- app.editor:clearSelect();
- end
-
- -- 通过命令来选中
- --[[local command = Commands:select(intersects);
- app.undoRedoManager:doCommand(command);--]]
-
- if intersects[1] then
- app.cs.setPropertyObject(intersects[1]);
- end
- app.cs.selectNodes(intersects);
- for i , v in pairs(intersects) do
- app.editor:selectNode(v);
- end
- end
-
- self:clear();
- end
-
- function MoveTool:KeyDown(Control, Alt, Shift, KeyCode)
- end
-
- function MoveTool:KeyUp(Control, Alt, Shift, KeyCode)
-
- end
-
- function MoveTool:DialogKey(Control, Alt, Shift, KeyCode)
- if Alt then
- if KeyCode == Keys.Up then
- local maxY = 0;
- for i , v in pairs(app.editor.SelectedNodes) do
- local node = v;
- maxY = math.max(maxY , node:getPositionY() + node:getAnchorPoint().y * node:getContentSize().height);
- end
- for i , v in pairs(app.editor.SelectedNodes) do
- local node = v;
- local offsetY = maxY - (node:getPositionY() + node:getAnchorPoint().y * node:getContentSize().height);
- node:setPositionY(node:getPositionY() + offsetY);
- end
- elseif KeyCode == Keys.Down then
- local minY = 65536;
- for i , v in pairs(app.editor.SelectedNodes) do
- local node = v;
- minY = math.min(minY , node:getPositionY() - node:getAnchorPoint().y * node:getContentSize().height);
- end
- for i , v in pairs(app.editor.SelectedNodes) do
- local node = v;
- local offsetY = minY - (node:getPositionY() - node:getAnchorPoint().y * node:getContentSize().height);
- node:setPositionY(node:getPositionY() + offsetY);
- end
- elseif KeyCode == Keys.Left then
- local minX = 65536;
- for i , v in pairs(app.editor.SelectedNodes) do
- local node = v;
- minX = math.min(minX , node:getPositionX() - node:getAnchorPoint().x * node:getContentSize().width);
- end
- for i , v in pairs(app.editor.SelectedNodes) do
- local node = v;
- local offsetX = minX - (node:getPositionX() - node:getAnchorPoint().x * node:getContentSize().width);
- node:setPositionX(node:getPositionX() + offsetX);
- end
- elseif KeyCode == Keys.Right then
- local maxX = 0;
- for i , v in pairs(app.editor.SelectedNodes) do
- local node = v;
- maxX = math.max(maxX , node:getPositionX() + node:getAnchorPoint().x * node:getContentSize().width);
- end
- for i , v in pairs(app.editor.SelectedNodes) do
- local node = v;
- local offsetX = maxX - (node:getPositionX() + node:getAnchorPoint().x * node:getContentSize().width);
- node:setPositionX(node:getPositionX() + offsetX);
- end
- end
-
- else
- local offset = cc.p(0,0);
- if KeyCode == Keys.Up then
- offset.y = 1;
- end
- if KeyCode == Keys.Down then
- offset.y = -1;
- end
- if KeyCode == Keys.Left then
- offset.x = -1;
- end
- if KeyCode == Keys.Right then
- offset.x = 1;
- end
- self:commandMoveBy(offset);
- end
- end
-
- return MoveTool;
|