You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

472 lines
9.7 KiB

  1. Commands = {}
  2. -- 批量命令
  3. function Commands:batchCommand(commands)
  4. --[[
  5. local function isParent(node , parent)
  6. local myParent = node:getParent();
  7. if myParent == parent then
  8. return true;
  9. else
  10. if myParent then
  11. return isParent(myParent , parent);
  12. end
  13. end
  14. end
  15. local function sortFunction(a , b)
  16. return isParent(b.node , a.node);
  17. end
  18. table.sort(commands , sortFunction);
  19. print("BatchStart");
  20. for i, v in ipairs(commands) do
  21. print("节点" , v.node:getName());
  22. end
  23. print("BatchEnd");
  24. ]]
  25. local function redo()
  26. if next(commands) == nil then
  27. return false;
  28. end
  29. for i, v in ipairs(commands) do
  30. v:redo();
  31. end
  32. return true;
  33. end
  34. --
  35. local function undo()
  36. for i = #commands , 1 , -1 do
  37. commands[i]:undo();
  38. end
  39. end
  40. local function clear()
  41. for i, v in ipairs(commands) do
  42. if type(v.clear) == "function" then
  43. v:clear();
  44. end
  45. end
  46. end
  47. return { redo = redo, undo = undo, clear = clear };
  48. end
  49. -- 选中命令
  50. --[[function Commands:select(nodes)
  51. local selectNodes = clone(nodes);
  52. -- 恢复操作
  53. local function redo()
  54. if table.nums(selectNodes) <= 0 then
  55. return false;
  56. end
  57. -- 通知c#那边选中第一个
  58. if selectNodes[1] then
  59. app.cs.setPropertyObject(selectNodes[1]);
  60. end
  61. for i , v in pairs(selectNodes) do
  62. app.editor:selectNode(v);
  63. end
  64. return true;
  65. end
  66. -- 撤销操作
  67. local function undo()
  68. for i , v in pairs(selectNodes) do
  69. app.editor:unSelectNode(v);
  70. end
  71. end
  72. return {redo = redo , undo = undo};
  73. end
  74. -- 取消选中命令
  75. function Commands:unselect(nodes)
  76. local selectNodes = clone(nodes);
  77. -- 恢复操作
  78. local function redo()
  79. if table.nums(selectNodes) <= 0 then
  80. return false;
  81. end
  82. for i , v in pairs(selectNodes) do
  83. app.editor:unSelectNode(v);
  84. end
  85. return true;
  86. end
  87. -- 撤销操作
  88. local function undo()
  89. for i , v in pairs(selectNodes) do
  90. app.editor:selectNode(v);
  91. end
  92. end
  93. return {redo = redo , undo = undo};
  94. end--]]
  95. -- 移动命令
  96. -- 这里使用的node的父节点空间的位置,使用者要在外部转换好
  97. function Commands:moveNode(node , newPos)
  98. local originalPos;
  99. -- 恢复操作
  100. local function redo()
  101. if not node then
  102. return false;
  103. end
  104. originalPos = node:getTranslation();
  105. node:setTranslation(newPos);
  106. -- 通知c#设置关键帧
  107. if app.cs.setKeyFrame then
  108. app.cs.setKeyFrame(node , "位置");
  109. end
  110. return true;
  111. end
  112. -- 撤销操作
  113. local function undo()
  114. node:setTranslation(originalPos);
  115. -- 通知c#设置关键帧
  116. if app.cs.setKeyFrame then
  117. app.cs.setKeyFrame(node , "位置");
  118. end
  119. end
  120. return {redo = redo , undo = undo , node = node};
  121. end
  122. -- 旋转命令
  123. -- 这里使用的node的父节点空间的位置,使用者要在外部转换好
  124. function Commands:rotateNode(node , newPos)
  125. local originalPos;
  126. -- 恢复操作
  127. local function redo()
  128. if not node then
  129. return false;
  130. end
  131. originalPos = node:getEulerRotation();
  132. node:setEulerRotation(newPos);
  133. -- 通知c#设置关键帧
  134. if app.cs.setKeyFrame then
  135. app.cs.setKeyFrame(node , "旋转");
  136. end
  137. return true;
  138. end
  139. -- 撤销操作
  140. local function undo()
  141. node:setEulerRotation(originalPos);
  142. -- 通知c#设置关键帧
  143. if app.cs.setKeyFrame then
  144. app.cs.setKeyFrame(node , "旋转");
  145. end
  146. end
  147. return {redo = redo , undo = undo , node = node};
  148. end
  149. -- 移动命令
  150. -- 这里使用的node的父节点空间的位置,使用者要在外部转换好
  151. function Commands:setWorldPosition(node , newPos)
  152. local originalPos;
  153. -- 恢复操作
  154. local function redo()
  155. if not node then
  156. return false;
  157. end
  158. originalPos = node:getWorldPosition();
  159. node:setWorldPosition(newPos);
  160. -- 通知c#设置关键帧
  161. if app.cs.setKeyFrame then
  162. app.cs.setKeyFrame(node , "位置");
  163. end
  164. return true;
  165. end
  166. -- 撤销操作
  167. local function undo()
  168. node:setWorldPosition(originalPos);
  169. -- 通知c#设置关键帧
  170. if app.cs.setKeyFrame then
  171. app.cs.setKeyFrame(node , "位置");
  172. end
  173. end
  174. return {redo = redo , undo = undo , node = node};
  175. end
  176. -- 改变大小命令
  177. -- 这里使用的node的父节点空间的位置,使用者要在外部转换好
  178. function Commands:sizeNode(node , newSize)
  179. local originalSize;
  180. -- 恢复操作
  181. local function redo()
  182. if not node then
  183. return false;
  184. end
  185. originalSize = node:getSize();
  186. node:setSize(newSize);
  187. -- 通知c#设置关键帧
  188. if app.cs.setKeyFrame then
  189. app.cs.setKeyFrame(node , "尺寸");
  190. end
  191. app.editor:relayoutAll();
  192. return true;
  193. end
  194. -- 撤销操作
  195. local function undo()
  196. node:setSize(originalSize);
  197. -- 通知c#设置关键帧
  198. if app.cs.setKeyFrame then
  199. app.cs.setKeyFrame(node , "尺寸");
  200. end
  201. app.editor:relayoutAll();
  202. end
  203. return {redo = redo , undo = undo , node = node};
  204. end
  205. -- 删除一个节点
  206. function Commands:deleteNode(node)
  207. local parent;
  208. local childrenIndexs = {};
  209. local releaseNode = true;
  210. -- 恢复操作
  211. local function redo()
  212. parent = node:getParent();
  213. -- 记录子节点的索引位置
  214. for i, v in pairs(parent:getChildren()) do
  215. childrenIndexs[v] = i;
  216. end
  217. node:retain();
  218. node:removeFromParent();
  219. -- 通知c#更新树状结构
  220. app.cs.deleteNode(node);
  221. -- 删除这个节点
  222. app.editor:deleteNode(node);
  223. -- 选中当前节点
  224. app.cs.setPropertyObject(parent);
  225. --app.editor:selectNode(parent);
  226. releaseNode = true;
  227. app.editor:relayoutAll();
  228. return true;
  229. end
  230. -- 撤销操作
  231. local function undo()
  232. parent:addChild(node);
  233. app.editor:autoSetNodeName(node);
  234. for i, v in pairs(parent:getChildren()) do
  235. v:setOrderOfArrival(childrenIndexs[v]);
  236. end
  237. -- 重新排序
  238. parent:sortAllChildren();
  239. node:release();
  240. -- 更新下树形结构
  241. app.cs.addNode(node , node , childrenIndexs[node] - 1);
  242. -- 清空序列
  243. childrenIndexs = {};
  244. -- 选中这个节点
  245. app.editor:selectNode(node);
  246. releaseNode = false;
  247. app.editor:relayoutAll();
  248. end
  249. -- 清空操作
  250. local function clear()
  251. if releaseNode then
  252. node:release();
  253. end
  254. end
  255. return {redo = redo , undo = undo, clear = clear , node = node};
  256. end
  257. -- 改变节点
  258. function Commands:modifyNode(node, newParent)
  259. local originParent;
  260. -- 恢复操作
  261. local function redo()
  262. if not node or not newParent or not node:getParent() then
  263. return false;
  264. end
  265. originParent = node:getParent();
  266. node:retain();
  267. node:removeFromParent();
  268. newParent:addChild(node);
  269. app.editor:autoSetNodeName(node);
  270. node:release();
  271. -- 通知编辑器的树更新
  272. app.cs.modifyNode(node, newParent);
  273. app.editor:relayoutAll();
  274. return true;
  275. end
  276. -- 撤销操作
  277. local function undo()
  278. node:retain();
  279. node:removeFromParent();
  280. originParent:addChild(node);
  281. app.editor:autoSetNodeName(node);
  282. node:release();
  283. -- 通知编辑器的树更新
  284. app.cs.modifyNode(node, originParent);
  285. app.editor:relayoutAll();
  286. end
  287. return {redo = redo , undo = undo , node = node};
  288. end
  289. -- 交换节点
  290. function Commands:swapNode(node1, node2)
  291. local originParent;
  292. -- 恢复操作
  293. local function redo()
  294. if not node1 or not node1:getParent() or node1:getParent() ~= node2:getParent() then
  295. return false;
  296. end
  297. originParent = node1:getParent();
  298. originParent:swapChild(node1 , node2);
  299. -- 通知编辑器的树更新
  300. app.cs.swapNode(node1, node2);
  301. app.editor:relayoutAll();
  302. return true;
  303. end
  304. -- 撤销操作
  305. local function undo()
  306. originParent:swapChild(node1 , node2);
  307. -- 通知编辑器的树更新
  308. app.cs.swapNode(node1, node2);
  309. app.editor:relayoutAll();
  310. end
  311. return {redo = redo , undo = undo , node = node1};
  312. end
  313. -- 拷贝一个节点
  314. function Commands:addNode(node, parentNode)
  315. local releaseNode = false;
  316. local function redo()
  317. if node == nil or parentNode == nil then
  318. return false;
  319. end
  320. local oldCount = node:getReferenceCount();
  321. -- 添加节点
  322. parentNode:addChild(node);
  323. app.editor:autoSetNodeName(node);
  324. local newCount = node:getReferenceCount();
  325. -- 添加节点失败,例如UIPageView不支持添加非Layout派生的节点成为他的子节点
  326. if newCount == oldCount then
  327. return false;
  328. end
  329. if releaseNode then
  330. node:release();
  331. end
  332. -- 更新树形结构
  333. app.cs.addNode(node , node , -1);
  334. -- 选中当前节点
  335. app.cs.setPropertyObject(node);
  336. releaseNode = false;
  337. app.editor:relayoutAll();
  338. return true;
  339. end
  340. local function undo()
  341. if node == nil or parentNode == nil then
  342. return;
  343. end
  344. -- 这里需要保存下
  345. node:retain();
  346. node:removeFromParent();
  347. -- 更新树形结构
  348. app.cs.deleteNode(node);
  349. app.cs.setPropertyObject(parentNode);
  350. releaseNode = true;
  351. app.editor:relayoutAll();
  352. end
  353. local function clear()
  354. if releaseNode then
  355. node:release();
  356. end
  357. end
  358. return { redo = redo, undo = undo, clear = clear , node = node };
  359. end
  360. -- 拷贝一个节点动画
  361. function Commands:copyNodeAnim(node, parentNode)
  362. local releaseNode = false;
  363. local copyAnim = parentNode:saveAnimation(cc.CURVE_ANIMATION);
  364. local function redo()
  365. if node == nil or parentNode == nil then
  366. return false;
  367. end
  368. -- 复制动画
  369. parentNode:removeAllAnimations();
  370. node:cloneIntoAnim(parentNode);
  371. if releaseNode and not tolua.isnull(node) then
  372. node:release();
  373. end
  374. -- 选中当前节点
  375. app.cs.setPropertyObject(parentNode);
  376. releaseNode = false;
  377. app.editor:relayoutAll();
  378. return true;
  379. end
  380. local function undo()
  381. if node == nil or parentNode == nil then
  382. return;
  383. end
  384. parentNode:removeAllAnimations();
  385. local anim = parentNode:loadAnimation(copyAnim)
  386. parentNode:addAnimation(anim);
  387. -- 更新树形结构
  388. app.cs.setPropertyObject(parentNode);
  389. releaseNode = true;
  390. app.editor:relayoutAll();
  391. end
  392. local function clear()
  393. if releaseNode and not tolua.isnull(node) then
  394. node:release();
  395. end
  396. end
  397. return { redo = redo, undo = undo, clear = clear , node = node };
  398. end
  399. require("CombineEffectCommands")