ccc-menu.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /**
  2. * 主要写creator菜单的功能扩展
  3. * auto zhuangzhuang
  4. * 借鉴的simple_code编辑器功能
  5. */
  6. const { ipcMain,ipcRenderer } = require('electron');
  7. const MainUtil = require('./main-util');
  8. /** 包名 */
  9. const PACKAGE_NAME = require('../package.json').name;
  10. /** 菜单对照表 取巧了 */
  11. const MENU_PANEL_TYPE = {"创建节点":"layerMenu","新建":"assetsLayer","create":"layerMenu","new":"assetsLayer"};
  12. const CCCMENU = {
  13. /**
  14. * 读取扩展逻辑文件
  15. */
  16. init(){
  17. this.menuCfgs = {}
  18. //默认给资源菜单添加
  19. let menuCfg = {
  20. layerMenu:[
  21. { type: 'separator' },
  22. { label : "绑定脚本", enabled:true, cmd: "cmdCreaorSciprt"},
  23. ],
  24. assetsLayer : [
  25. { type: 'separator' },
  26. { label : "自动生成模板", enabled:true, cmd: "cmdCreatePopLayer"},
  27. { label : "自定义模板", enabled:true, cmd: "cmdCreateLayer"},
  28. ],
  29. }
  30. this.menuCfgs["cc-widget-to-code"] = menuCfg;
  31. // hook 菜单
  32. if (!Editor.Menu[`__${PACKAGE_NAME}__`]) {
  33. Editor.Menu[`__${PACKAGE_NAME}__`] = true;
  34. Editor.Menu = this.hookMenu(Editor.Menu, this.hookMenuFunc.bind(this));
  35. }
  36. },
  37. hookMenu(orginMenu, hookFunc) {
  38. const menu = function () {
  39. hookFunc(...arguments);
  40. return new orginMenu(...arguments);
  41. };
  42. let menuProps = Object.getOwnPropertyNames(orginMenu);
  43. for (let prop of menuProps) {
  44. const object = Object.getOwnPropertyDescriptor(orginMenu, prop);
  45. if (object.writable) {
  46. menu[prop] = orginMenu[prop];
  47. }
  48. }
  49. menu.prototype = orginMenu.prototype;
  50. return menu;
  51. },
  52. hookMenuFunc(template)
  53. {
  54. const firstMenu = template[0];
  55. //Editor.log(firstMenu)
  56. let menuType = MENU_PANEL_TYPE[firstMenu.label];
  57. for (const id in this.menuCfgs)
  58. {
  59. let menuCfg = this.menuCfgs[id];
  60. if(!menuCfg) continue;
  61. let list = menuCfg[menuType];
  62. if(!list) continue;
  63. for (let i = 0; i < list.length; i++)
  64. {
  65. const item = list[i];
  66. if(item.type != 'separator'){
  67. this.applyItem(item,[item.label],firstMenu.params);
  68. }
  69. template.push(item);
  70. }
  71. }
  72. },
  73. applyItem(item,parnetPaths,args){
  74. if(item.submenu){
  75. for (let n = 0; n < item.submenu.length; n++)
  76. {
  77. let sub_item = item.submenu[n];
  78. let paths = JSON.parse( JSON.stringify(parnetPaths) )
  79. paths.push(sub_item.label)
  80. this.applyItem(sub_item,paths)
  81. }
  82. }else {
  83. if(item.message == null){
  84. let paths = JSON.parse( JSON.stringify(parnetPaths) )
  85. let toArgs = item.params || {label:item.label,paths,args:args||{}}
  86. item.click = ()=>{
  87. Editor.Ipc.sendToMain(`${PACKAGE_NAME}:${item.cmd}`, toArgs);
  88. };
  89. }else{
  90. let paths = JSON.parse( JSON.stringify(parnetPaths) )
  91. item.params = item.params || {label:item.label,paths,args:args||{}}
  92. }
  93. }
  94. },
  95. }
  96. module.exports = CCCMENU;