diff --git a/_server/editor_file.js b/_server/editor_file.js index 0304d2f1..ac789445 100644 --- a/_server/editor_file.js +++ b/_server/editor_file.js @@ -82,7 +82,7 @@ editor_file = function (editor, callback) { callback('未选中文件或无数据'); } */ var filename = 'project/floors/' + editor.currentFloorId + '.js'; - var datastr = ['main.floors.', editor.currentFloorId, '=\n{']; + var datastr = ['main.floors.', editor.currentFloorId, '=\n']; if (editor.currentFloorData.map == 'new') { /* editor.currentFloorData.map = editor.map.map(function (v) { @@ -108,14 +108,18 @@ editor_file = function (editor, callback) { editor.currentFloorData[name]=mapArray; } } - for (var ii in editor.currentFloorData) - if (editor.currentFloorData.hasOwnProperty(ii)) { - if (['map','bgmap','fgmap'].indexOf(ii)!==-1) - datastr = datastr.concat(['\n"', ii, '": [\n', formatMap(editor.currentFloorData[ii],ii!='map'), '\n],']); - else - datastr = datastr.concat(['\n"', ii, '": ', JSON.stringify(editor.currentFloorData[ii], null, 4), ',']); - } - datastr = datastr.concat(['\n}']); + // format 更改实现方式以支持undefined删除 + var tempJsonObj=Object.assign({},editor.currentFloorData); + var tempMap=[['map',editor.guid()],['bgmap',editor.guid()],['fgmap',editor.guid()]]; + tempMap.forEach(function(v){ + v[2]=tempJsonObj[v[0]]; + tempJsonObj[v[0]]=v[1]; + }); + var tempJson=JSON.stringify(tempJsonObj, null, 4); + tempMap.forEach(function(v){ + tempJson=tempJson.replace('"'+v[1]+'"','[\n'+ formatMap(v[2],v[0]!='map')+ '\n]') + }); + datastr = datastr.concat([tempJson]); datastr = datastr.join(''); alertWhenCompress(); fs.writeFile(filename, encode(datastr), 'base64', function (err, data) { @@ -626,7 +630,7 @@ editor_file = function (editor, callback) { actionList.forEach(function (value) { value[1] = value[1] + "['" + x + "," + y + "']"; }); - saveSetting('floors', actionList, function (err) { + saveSetting('floorloc', actionList, function (err) { callback([ (function () { var locObj = {}; @@ -745,7 +749,7 @@ editor_file = function (editor, callback) { if (isset(editor.main[v])) locObj.main[v] = data_obj.main[v]; else - locObj[v] = null; + locObj.main[v] = null; }); return locObj; })(), @@ -976,13 +980,18 @@ editor_file = function (editor, callback) { }); return; } - if (file == 'floors') { + if (file == 'floorloc') { actionList.forEach(function (value) { // 检测null/undefined - if (core.isset(value[2])) - eval("editor.currentFloorData" + value[1] + '=' + JSON.stringify(value[2])); - else - eval("delete editor.currentFloorData"+value[1]); + if (!core.isset(value[2]))value[2]=undefined; + eval("editor.currentFloorData" + value[1] + '=' + JSON.stringify(value[2])); + }); + editor_file.saveFloorFile(callback); + return; + } + if (file == 'floors') { + actionList.forEach(function (value) { + eval("editor.currentFloorData" + value[1] + '=' + JSON.stringify(value[2])); }); editor_file.saveFloorFile(callback); return; diff --git a/_server/editor_mode.js b/_server/editor_mode.js index 60b3c884..a59df12f 100644 --- a/_server/editor_mode.js +++ b/_server/editor_mode.js @@ -18,6 +18,7 @@ editor_mode = function (editor) { this.mode = ''; this.info = {}; this.appendPic = {}; + this.doubleClickMode='change'; } editor_mode.prototype.init = function (callback) { @@ -136,9 +137,15 @@ editor_mode = function (editor) { } // 开始遍历 recursionParse("", "", obj, commentObj); - var checkRange = function (evalstr, thiseval) { - if (evalstr) { - return eval(evalstr); + var checkRange = function (cobj, thiseval) { + if (cobj._range) { + return eval(cobj._range); + } + if (cobj._select) { + return cobj._select.values.indexOf(thiseval)!==-1; + } + if (cobj._bool) { + return [true,false].indexOf(thiseval)!==-1; } return true; } @@ -152,12 +159,12 @@ editor_mode = function (editor) { var input = thisTr.children[2].children[0].children[0]; var field = thisTr.children[0].getAttribute('title'); var cobj = JSON.parse(thisTr.children[1].getAttribute('cobj')); + var modeNode = thisTr.parentNode; + while (!editor_mode._ids.hasOwnProperty(modeNode.getAttribute('id'))) { + modeNode = modeNode.parentNode; + } input.onchange = function () { - var node = thisTr.parentNode; - while (!editor_mode._ids.hasOwnProperty(node.getAttribute('id'))) { - node = node.parentNode; - } - editor_mode.onmode(editor_mode._ids[node.getAttribute('id')]); + editor_mode.onmode(editor_mode._ids[modeNode.getAttribute('id')]); var thiseval = null; if (input.checked != null) input.value = input.checked; try { @@ -166,16 +173,31 @@ editor_mode = function (editor) { printe(field + ' : ' + ee); throw ee; } - if (checkRange(cobj._range, thiseval)) { + if (checkRange(cobj, thiseval)) { editor_mode.addAction(['change', field, thiseval]); - editor_mode.onmode('save');//自动保存 + editor_mode.onmode('save');//自动保存 删掉此行的话点保存按钮才会保存 } else { printe(field + ' : 输入的值不合要求,请鼠标放置在注释上查看说明'); } } + // 双击表格时 + // 正常编辑: 尝试用事件编辑器或多行文本编辑器打开 + // 添加: 在该项的同一级创建一个内容为null新的项, 刷新后生效并可以继续编辑 + // 删除: 删除该项, 刷新后生效 + // 在点击按钮 添加/删除 后,下一次双击将被视为 添加/删除 var dblclickfunc=function () { - if (cobj._type === 'event') editor_blockly.import(guid, {type: cobj._event}); - if (cobj._type === 'textarea') editor_multi.import(guid, {lint: cobj._lint, string: cobj._string}); + if(editor_mode.doubleClickMode==='change'){ + if (cobj._type === 'event') editor_blockly.import(guid, {type: cobj._event}); + if (cobj._type === 'textarea') editor_multi.import(guid, {lint: cobj._lint, string: cobj._string}); + } + if(editor_mode.doubleClickMode==='add'){ + editor_mode.doubleClickMode='change'; + addfunc() + } + if(editor_mode.doubleClickMode==='delete'){ + editor_mode.doubleClickMode='change'; + deletefunc() + } } input.ondblclick = dblclickfunc var doubleClickCheck=[0]; @@ -187,6 +209,46 @@ editor_mode = function (editor) { dblclickfunc() } } + var deletefunc=function(){ + editor_mode.onmode(editor_mode._ids[modeNode.getAttribute('id')]); + if (checkRange(cobj, null)) { + editor_mode.addAction(['delete', field, undefined]); + editor_mode.onmode('save');//自动保存 删掉此行的话点保存按钮才会保存 + } else { + printe(field + ' : 该值不允许为null,无法删除'); + } + } + var addfunc=function(){ + editor_mode.onmode(editor_mode._ids[modeNode.getAttribute('id')]); + // 1.输入id + var newid=prompt('请输入新项的id','newid'); + // 2.检查id是否符合规范或与已有id重复 + if (!/^[a-zA-Z0-9_]+$/.test(newid)){ + printe('id不符合规范, 请使用大小写字母数字下划线来构成'); + return; + } + var conflict=true; + var basefield=field.replace(/\[[^\[]*\]$/,''); + if (basefield==="['main']"){ + printe("全塔属性 ~ ['main'] 不允许添加新值"); + return; + } + try { + var baseobj=eval('obj'+basefield); + conflict=newid in baseobj; + } catch (ee) { + // 理论上这里不会发生错误 + printe(ee); + throw ee; + } + if (conflict){ + printe('id已存在, 请直接修改该项的值'); + return; + } + // 3.添加 + editor_mode.addAction(['add',basefield+"['"+newid+"']",null]); + editor_mode.onmode('save');//自动保存 删掉此行的话点保存按钮才会保存 + } }); } return {"HTML": outstr.join(''), "guids": guids, "listen": listen}; @@ -357,6 +419,7 @@ editor_mode = function (editor) { editor_mode.dom[name].style = 'z-index:-1;opacity: 0;'; } editor_mode.dom[mode].style = ''; + editor_mode.doubleClickMode='change'; // clear editor.drawEventBlock(); if (editor_mode[mode]) editor_mode[mode](); @@ -1131,6 +1194,19 @@ editor_mode = function (editor) { return true } + editor_mode.changeDoubleClickModeByButton=function(mode){ + ({ + delete:function(){ + printf('下一次双击表格的项删除, 编辑后刷新浏览器生效 (正常模式下双击是用事件编辑器或文本编辑器编辑)'); + editor_mode.doubleClickMode=mode; + }, + add:function(){ + printf('下一次双击表格的项, 在同级添加新项, 编辑后刷新浏览器生效 (正常模式下双击是用事件编辑器或文本编辑器编辑)'); + editor_mode.doubleClickMode=mode; + } + }[mode])(); + } + if (Boolean(callback)) callback(); } diff --git a/editor-mobile.html b/editor-mobile.html index 2c71fd1d..d0a663e1 100644 --- a/editor-mobile.html +++ b/editor-mobile.html @@ -116,7 +116,7 @@