dynamic table

This commit is contained in:
YouWei Zhao 2019-01-12 10:10:29 -05:00
parent db566da909
commit bad6ff1412
4 changed files with 119 additions and 34 deletions

View File

@ -82,7 +82,7 @@ editor_file = function (editor, callback) {
callback('未选中文件或无数据'); callback('未选中文件或无数据');
} */ } */
var filename = 'project/floors/' + editor.currentFloorId + '.js'; 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') { if (editor.currentFloorData.map == 'new') {
/* /*
editor.currentFloorData.map = editor.map.map(function (v) { editor.currentFloorData.map = editor.map.map(function (v) {
@ -108,14 +108,18 @@ editor_file = function (editor, callback) {
editor.currentFloorData[name]=mapArray; editor.currentFloorData[name]=mapArray;
} }
} }
for (var ii in editor.currentFloorData) // format 更改实现方式以支持undefined删除
if (editor.currentFloorData.hasOwnProperty(ii)) { var tempJsonObj=Object.assign({},editor.currentFloorData);
if (['map','bgmap','fgmap'].indexOf(ii)!==-1) var tempMap=[['map',editor.guid()],['bgmap',editor.guid()],['fgmap',editor.guid()]];
datastr = datastr.concat(['\n"', ii, '": [\n', formatMap(editor.currentFloorData[ii],ii!='map'), '\n],']); tempMap.forEach(function(v){
else v[2]=tempJsonObj[v[0]];
datastr = datastr.concat(['\n"', ii, '": ', JSON.stringify(editor.currentFloorData[ii], null, 4), ',']); tempJsonObj[v[0]]=v[1];
} });
datastr = datastr.concat(['\n}']); 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(''); datastr = datastr.join('');
alertWhenCompress(); alertWhenCompress();
fs.writeFile(filename, encode(datastr), 'base64', function (err, data) { fs.writeFile(filename, encode(datastr), 'base64', function (err, data) {
@ -626,7 +630,7 @@ editor_file = function (editor, callback) {
actionList.forEach(function (value) { actionList.forEach(function (value) {
value[1] = value[1] + "['" + x + "," + y + "']"; value[1] = value[1] + "['" + x + "," + y + "']";
}); });
saveSetting('floors', actionList, function (err) { saveSetting('floorloc', actionList, function (err) {
callback([ callback([
(function () { (function () {
var locObj = {}; var locObj = {};
@ -745,7 +749,7 @@ editor_file = function (editor, callback) {
if (isset(editor.main[v])) if (isset(editor.main[v]))
locObj.main[v] = data_obj.main[v]; locObj.main[v] = data_obj.main[v];
else else
locObj[v] = null; locObj.main[v] = null;
}); });
return locObj; return locObj;
})(), })(),
@ -976,13 +980,18 @@ editor_file = function (editor, callback) {
}); });
return; return;
} }
if (file == 'floors') { if (file == 'floorloc') {
actionList.forEach(function (value) { actionList.forEach(function (value) {
// 检测null/undefined // 检测null/undefined
if (core.isset(value[2])) 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])); eval("editor.currentFloorData" + value[1] + '=' + JSON.stringify(value[2]));
else
eval("delete editor.currentFloorData"+value[1]);
}); });
editor_file.saveFloorFile(callback); editor_file.saveFloorFile(callback);
return; return;

View File

@ -18,6 +18,7 @@ editor_mode = function (editor) {
this.mode = ''; this.mode = '';
this.info = {}; this.info = {};
this.appendPic = {}; this.appendPic = {};
this.doubleClickMode='change';
} }
editor_mode.prototype.init = function (callback) { editor_mode.prototype.init = function (callback) {
@ -136,9 +137,15 @@ editor_mode = function (editor) {
} }
// 开始遍历 // 开始遍历
recursionParse("", "", obj, commentObj); recursionParse("", "", obj, commentObj);
var checkRange = function (evalstr, thiseval) { var checkRange = function (cobj, thiseval) {
if (evalstr) { if (cobj._range) {
return eval(evalstr); 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; return true;
} }
@ -152,12 +159,12 @@ editor_mode = function (editor) {
var input = thisTr.children[2].children[0].children[0]; var input = thisTr.children[2].children[0].children[0];
var field = thisTr.children[0].getAttribute('title'); var field = thisTr.children[0].getAttribute('title');
var cobj = JSON.parse(thisTr.children[1].getAttribute('cobj')); var cobj = JSON.parse(thisTr.children[1].getAttribute('cobj'));
input.onchange = function () { var modeNode = thisTr.parentNode;
var node = thisTr.parentNode; while (!editor_mode._ids.hasOwnProperty(modeNode.getAttribute('id'))) {
while (!editor_mode._ids.hasOwnProperty(node.getAttribute('id'))) { modeNode = modeNode.parentNode;
node = node.parentNode;
} }
editor_mode.onmode(editor_mode._ids[node.getAttribute('id')]); input.onchange = function () {
editor_mode.onmode(editor_mode._ids[modeNode.getAttribute('id')]);
var thiseval = null; var thiseval = null;
if (input.checked != null) input.value = input.checked; if (input.checked != null) input.value = input.checked;
try { try {
@ -166,17 +173,32 @@ editor_mode = function (editor) {
printe(field + ' : ' + ee); printe(field + ' : ' + ee);
throw ee; throw ee;
} }
if (checkRange(cobj._range, thiseval)) { if (checkRange(cobj, thiseval)) {
editor_mode.addAction(['change', field, thiseval]); editor_mode.addAction(['change', field, thiseval]);
editor_mode.onmode('save');//自动保存 editor_mode.onmode('save');//自动保存 删掉此行的话点保存按钮才会保存
} else { } else {
printe(field + ' : 输入的值不合要求,请鼠标放置在注释上查看说明'); printe(field + ' : 输入的值不合要求,请鼠标放置在注释上查看说明');
} }
} }
// 双击表格时
// 正常编辑: 尝试用事件编辑器或多行文本编辑器打开
// 添加: 在该项的同一级创建一个内容为null新的项, 刷新后生效并可以继续编辑
// 删除: 删除该项, 刷新后生效
// 在点击按钮 添加/删除 后,下一次双击将被视为 添加/删除
var dblclickfunc=function () { var dblclickfunc=function () {
if(editor_mode.doubleClickMode==='change'){
if (cobj._type === 'event') editor_blockly.import(guid, {type: cobj._event}); 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 (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 input.ondblclick = dblclickfunc
var doubleClickCheck=[0]; var doubleClickCheck=[0];
thisTr.onclick = function(){ thisTr.onclick = function(){
@ -187,6 +209,46 @@ editor_mode = function (editor) {
dblclickfunc() 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}; 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[name].style = 'z-index:-1;opacity: 0;';
} }
editor_mode.dom[mode].style = ''; editor_mode.dom[mode].style = '';
editor_mode.doubleClickMode='change';
// clear // clear
editor.drawEventBlock(); editor.drawEventBlock();
if (editor_mode[mode]) editor_mode[mode](); if (editor_mode[mode]) editor_mode[mode]();
@ -1131,6 +1194,19 @@ editor_mode = function (editor) {
return true 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(); if (Boolean(callback)) callback();
} }

View File

@ -116,7 +116,7 @@
</div> </div>
</div> </div>
<div id="left3" class='leftTab' style="z-index:-1;opacity: 0;"><!-- enemyitem --> <div id="left3" class='leftTab' style="z-index:-1;opacity: 0;"><!-- enemyitem -->
<h3 class="leftTabHeader">图块属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">保存</button> <h3 class="leftTabHeader">图块属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">保存</button>&nbsp;&nbsp;<button onclick="editor.mode.changeDoubleClickModeByButton('add')">添加</button>&nbsp;&nbsp;<button onclick="editor.mode.changeDoubleClickModeByButton('delete')">删除</button>
</h3> </h3>
<div class="leftTabContent"> <div class="leftTabContent">
<div id='newIdIdnum'><!-- id and idnum --> <div id='newIdIdnum'><!-- id and idnum -->
@ -142,7 +142,7 @@
</div> </div>
</div> </div>
<div id="left4" class='leftTab' style="z-index:-1;opacity: 0;"><!-- floor --> <div id="left4" class='leftTab' style="z-index:-1;opacity: 0;"><!-- floor -->
<h3 class="leftTabHeader">楼层属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">保存</button> <h3 class="leftTabHeader">楼层属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">保存</button>&nbsp;&nbsp;<button onclick="editor.mode.changeDoubleClickModeByButton('add')">添加</button>&nbsp;&nbsp;<button onclick="editor.mode.changeDoubleClickModeByButton('delete')">删除</button>
</h3> </h3>
<div class="leftTabContent"> <div class="leftTabContent">
<div class='etable'> <div class='etable'>
@ -159,7 +159,7 @@
</div> </div>
</div> </div>
<div id="left5" class='leftTab' style="z-index:-1;opacity: 0;"><!-- tower --> <div id="left5" class='leftTab' style="z-index:-1;opacity: 0;"><!-- tower -->
<h3 class="leftTabHeader">全塔属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">保存</button> <h3 class="leftTabHeader">全塔属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">保存</button>&nbsp;&nbsp;<button onclick="editor.mode.changeDoubleClickModeByButton('add')">添加</button>
</h3> </h3>
<div class="leftTabContent"> <div class="leftTabContent">
<div class='etable'> <div class='etable'>

View File

@ -112,7 +112,7 @@
</div> </div>
</div> </div>
<div id="left3" class='leftTab' style="z-index:-1;opacity: 0;"><!-- enemyitem --> <div id="left3" class='leftTab' style="z-index:-1;opacity: 0;"><!-- enemyitem -->
<h3 class="leftTabHeader">图块属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">保存</button> <h3 class="leftTabHeader">图块属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">保存</button>&nbsp;&nbsp;<button onclick="editor.mode.changeDoubleClickModeByButton('add')">添加</button>&nbsp;&nbsp;<button onclick="editor.mode.changeDoubleClickModeByButton('delete')">删除</button>
</h3> </h3>
<div class="leftTabContent"> <div class="leftTabContent">
<div id='newIdIdnum'><!-- id and idnum --> <div id='newIdIdnum'><!-- id and idnum -->
@ -138,7 +138,7 @@
</div> </div>
</div> </div>
<div id="left4" class='leftTab' style="z-index:-1;opacity: 0;"><!-- floor --> <div id="left4" class='leftTab' style="z-index:-1;opacity: 0;"><!-- floor -->
<h3 class="leftTabHeader">楼层属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">保存</button> <h3 class="leftTabHeader">楼层属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">保存</button>&nbsp;&nbsp;<button onclick="editor.mode.changeDoubleClickModeByButton('add')">添加</button>&nbsp;&nbsp;<button onclick="editor.mode.changeDoubleClickModeByButton('delete')">删除</button>
</h3> </h3>
<div class="leftTabContent"> <div class="leftTabContent">
<div class='etable'> <div class='etable'>
@ -155,7 +155,7 @@
</div> </div>
</div> </div>
<div id="left5" class='leftTab' style="z-index:-1;opacity: 0;"><!-- tower --> <div id="left5" class='leftTab' style="z-index:-1;opacity: 0;"><!-- tower -->
<h3 class="leftTabHeader">全塔属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">保存</button> <h3 class="leftTabHeader">全塔属性&nbsp;&nbsp;<button onclick="editor.mode.onmode('save')">保存</button>&nbsp;&nbsp;<button onclick="editor.mode.changeDoubleClickModeByButton('add')">添加</button>
</h3> </h3>
<div class="leftTabContent"> <div class="leftTabContent">
<div class='etable'> <div class='etable'>