From 4003b309f5a274148a1cdd049e2178137aabad79 Mon Sep 17 00:00:00 2001 From: PopSlime Date: Thu, 13 Oct 2022 12:40:08 +0800 Subject: [PATCH] Adapt skin editor to the new skin module and fix some bugs. Fix internal blocks being detached from literal blocks after sorting. Fix internal blocks not auto-sized. Fix sorting pointer offset. Code cleanup. --- Http/SkinEditor/app.js | 658 +++++++++++++++--------------- Http/SkinEditor/messages/en_US.js | 58 +-- Http/SkinEditor/messages/zh_CN.js | 130 +++--- 3 files changed, 426 insertions(+), 420 deletions(-) diff --git a/Http/SkinEditor/app.js b/Http/SkinEditor/app.js index 19851fd..a234a7f 100644 --- a/Http/SkinEditor/app.js +++ b/Http/SkinEditor/app.js @@ -11,447 +11,445 @@ var cel; var clist; var blocklists = { - "block.element": ["statement.obj", "statement.comp", "statement.filter", "statement.prop"], - "block.filter": ["statement.filter.type", "statement.filter.flag", "statement.filter.flag.n", "statement.filter.prop", "statement.filter.prop.n"], - "block.root": ["statement.select", "statement.define"], - "block.select": ["statement.select.type", "statement.select.flag", "statement.select.flag.n", "statement.select.prop", "statement.select.prop.n"], + "block.element": ["statement.obj", "statement.select"], + "block.filter": ["statement.filter.type", "statement.filter.exp"], + "block.object": ["statement.comp", "statement.prop", "statement.filter"], + "block.root": ["statement.select", "statement.define"], + "block.select": ["statement.select.type", "statement.select.exp"], }; var ilid = 0; var inputlists = { - "input.comp": ["image", "scale3", "rect", "polysec"], - "input.type": ["chart", "group", "track", "note"], + "input.comp": ["image", "polysec", "rect", "scale3", "text"], + "input.prop": [ + "pos", "rot", "scale", + "image.fit", "image.frame", "image.transparent", + "polysec.body", "polysec.head", "polysec.shape", "polysec.tail", + "rect.color", + "scale3.border", + "sprite.bound", "sprite.opacity", "sprite.pivot", "sprite.scale", "sprite.ui", "sprite.zindex", + "text.frames", "text.size", "text.spacing", "text.value", + ], + "input.type": ["chart", "group", "track", "note"], }; var statementlists = { - "statement.comp": ["input.comp"], - "statement.define": ["input.ident", "exp"], - "statement.filter": ["block.filter", "block.element"], - "statement.filter.flag": ["input.flag"], - "statement.filter.flag.n": ["input.flag"], - "statement.filter.prop": ["input.prop", "exp"], - "statement.filter.prop.n": ["input.prop", "exp"], - "statement.filter.type": ["input.type"], - "statement.obj": ["block.element"], - "statement.prop": ["input.prop", "exp"], - "statement.select": ["block.select", "block.element"], - "statement.select.flag": ["input.flag"], - "statement.select.flag.n": ["input.flag"], - "statement.select.prop": ["input.prop", "exp"], - "statement.select.prop.n": ["input.prop", "exp"], - "statement.select.type": ["input.type"], + "statement.comp": ["input.comp"], + "statement.define": ["input.ident", "exp"], + "statement.filter": ["block.filter", "block.object"], + "statement.filter.exp": ["exp"], + "statement.filter.type": ["input.type"], + "statement.obj": ["block.object"], + "statement.prop": ["input.prop", "exp"], + "statement.select": ["block.select", "block.element"], + "statement.select.exp": ["exp"], + "statement.select.type": ["input.type"], } -window.onload = function() { - lang = navigator.language.replace("-", "_"); - if (!messages[lang]) - lang = "en_US"; +window.onload = function () { + lang = navigator.language.replace("-", "_"); + if (!messages[lang]) lang = "en_US"; - app = $("#app"); - tv = $("#treeview"); - tree = $("#tree"); - app.find("tbr").replaceWith(function() { - return msg($(this).text()); - }); - addAddButton(tree).on("click", function(event) { - if (clist) - clist.remove(); - }); - tv.on("mousemove", null, null, onMouseMove); + app = $("#app"); + tv = $("#treeview"); + tree = $("#tree"); + app.find("tbr").replaceWith(function () { + return msg($(this).text()); + }); + addAddButton(tree).on("click", function (event) { + if (clist) clist.remove(); + }); + tv.on("mousemove", null, null, onMouseMove); - $(".tgbtn").on("click", function(event) { - var btn = $(this); - btn.toggleClass("tgbtn-active"); - onToggleButtonClick(btn.attr("id"), btn.hasClass("tgbtn-active")); - }); -} -; + $(".tgbtn").on("click", function (event) { + var btn = $(this); + btn.toggleClass("tgbtn-active"); + onToggleButtonClick(btn.attr("id"), btn.hasClass("tgbtn-active")); + }); +}; function addAddButton(el) { - return el.append($("").addClass("btn btn-add").text("+").on("click", null, el, onAddButtonClick)); + return el.append($("").addClass("btn btn-add").text("+").on("click", null, el, onAddButtonClick)); } function addAddExpButton(el) { - return el.append($("").addClass("btn btn-add").text("+").on("click", null, el, onAddExpButtonClick)); + return el.append($("").addClass("btn btn-add").text("+").on("click", null, el, onAddExpButtonClick)); } function addAddButtonLiteral(el) { - return el.append($("").addClass("btn btn-add t-inline").text("+").on("click", null, el, onAddButtonLiteralClick)); + return el.append($("").addClass("btn btn-add t-inline").text("+").on("click", null, el, onAddButtonLiteralClick)); } function addDeleteButton(el) { - return el.append($("").addClass("btn btn-delete").text("x").on("click", null, el, onDeleteButtonClick)); + return el.append($("").addClass("btn btn-delete").text("x").on("click", null, el, onDeleteButtonClick)); } function addDeleteButtonLiteral(el) { - return el.append($("").addClass("btn btn-delete t-inline").text("x").on("click", null, el, onDeleteButtonLiteralClick)); + return el.append($("").addClass("btn btn-delete t-inline").text("x").on("click", null, el, onDeleteButtonLiteralClick)); } function onAddButtonClick(event) { - cel = el = event.data; - generateAddList(event, blocklists[el.attr("key")]); + cel = el = event.data; + generateAddList(event, blocklists[el.attr("key")]); } function onAddExpButtonClick(event) { - cel = el = event.data; - generateAddExpList(event); + cel = el = event.data; + generateAddExpList(event); } function onAddButtonLiteralClick(event) { - var el = event.data.children(".t-internal"); - if (!el.hasClass("t-node")) - el = el.children(".t-node"); - event.data = el; - onAddButtonClick(event); + var el = event.data.children(".t-internal"); + if (!el.hasClass("t-node")) + el = el.children(".t-node"); + event.data = el; + onAddButtonClick(event); } function onDeleteButtonClick(event) { - event.data.remove(); + var el = event.data.parents(".t-literal").first(); + event.data.remove(); + if (el) updateLiteral(el); } function onDeleteButtonLiteralClick(event) { - var el = event.data.parents(".t-literal").first(); - fetchInternalStatements(el).eq(parseInt(event.data.attr("target"))).remove(); - updateLiteral(el); + var el = event.data.parents(".t-literal").first(); + fetchInternalStatements(el).eq(parseInt(event.data.attr("target"))).remove(); + updateLiteral(el); } var tblist = { - "tb-debug": "mode-debug", - "tb-hide-add": "mode-hide-add", - "tb-hide-delete": "mode-hide-delete", - "tb-sort": "mode-sort", + "tb-debug": "mode-debug", + "tb-hide-add": "mode-hide-add", + "tb-hide-delete": "mode-hide-delete", + "tb-sort": "mode-sort", } function onToggleButtonClick(id, state) { - var cls = tblist[id]; - if (state) - tv.addClass(cls); - else - tv.removeClass(cls); - if (cls == "mode-sort") { - var il = tv.find(".t-input"); - var sl = tv.find(".t-statement").not(".t-inline"); - if (state) { - il.each(function(i) { - $(il[i]).children("input").attr("disabled", ""); - }); - sl.each(function(i) { - $(sl[i]).on("click", null, $(sl[i]), onStatementSort); - }); - } else { - il.each(function(i) { - var el = $(il[i]); - if (!el.parents(".t-internal").length) - el.children("input").attr("disabled", null); - }); - sl.each(function(i) { - $(sl[i]).off("click", null, onStatementSort); - }); - tv.removeClass("state-grabbing"); - if (grabbing) { - grabbing.removeClass("t-grabbing"); - grabbing = null; - grabPointer.remove(); - } - } - } + var cls = tblist[id]; + if (state) tv.addClass(cls); + else tv.removeClass(cls); + if (cls == "mode-sort") { + var il = tv.find(".t-input"); + var sl = tv.find(".t-statement").not(".t-inline"); + if (state) { + il.each(function (i) { + $(il[i]).children("input").attr("disabled", ""); + }); + sl.each(function (i) { + $(sl[i]).on("click", null, $(sl[i]), onStatementSort); + }); + } + else { + il.each(function (i) { + var el = $(il[i]); + if (!el.parents(".t-internal").length) + el.children("input").attr("disabled", null); + }); + sl.each(function (i) { + $(sl[i]).off("click", null, onStatementSort); + }); + tv.removeClass("state-grabbing"); + if (grabbing) { + grabbing.removeClass("t-grabbing"); + grabbing = null; + grabPointer.remove(); + } + } + } } var grabbing; var grabPointer; function onStatementSort(event) { - event.stopPropagation(); - if (grabbing) { - var l = grabbing.parent().children(".t-statement"); - var i = getGrabPtrIndex(event.pageY); - if (i == l.length) - grabbing.insertAfter(l.last()); - else - grabbing.insertBefore(l.eq(i)); - tv.removeClass("state-grabbing"); - grabbing.removeClass("t-grabbing"); - updateLiteral(grabbing.parents(".t-literal").first()); - grabbing = null; - grabPointer.remove(); - } else { - grabbing = event.data; - grabbing.addClass("t-grabbing"); - tv.addClass("state-grabbing"); - grabPointer = $("
").addClass("grab-ptr"); - } + event.stopPropagation(); + if (grabbing) { + var l = grabbing.parent().children(".t-statement"); + var i = getGrabPtrIndex(event.pageY + tv.scrollTop() - tv[0].offsetTop); + if (i == l.length) + grabbing.insertAfter(l.last()); + else + grabbing.insertBefore(l.eq(i)); + tv.removeClass("state-grabbing"); + grabbing.removeClass("t-grabbing"); + grabPointer.remove(); + updateLiteral(grabbing.parents(".t-literal").first()); + grabbing = null; + } + else { + grabbing = event.data; + grabbing.addClass("t-grabbing"); + tv.addClass("state-grabbing"); + grabPointer = $("
").addClass("grab-ptr"); + } } function onMouseMove(event) { - if (grabbing) { - var l = grabbing.parent().children(".t-statement"); - var i = getGrabPtrIndex(event.pageY); - if (i == l.length) - grabPointer.remove().insertAfter(l.last()); - else - grabPointer.remove().insertBefore(l.eq(i)); - } + if (grabbing) { + var l = grabbing.parent().children(".t-statement"); + var i = getGrabPtrIndex(event.pageY + tv.scrollTop() - tv[0].offsetTop); + if (i == l.length) + grabPointer.remove().insertAfter(l.last()); + else + grabPointer.remove().insertBefore(l.eq(i)); + } } function getGrabPtrIndex(y) { - var l = grabbing.parent().children(".t-statement"); - var tl = l.map(function(i) { - return l[i].offsetTop - tree.scrollTop() - y; - }).toArray(); - tl.push(l.last()[0].offsetTop + l.last().height() - tree.scrollTop() - y); - return ArrayUtil.binarySearch(tl, 0, function(a, b) { - return a - b; - }, true); + var l = grabbing.parent().children(".t-statement"); + var tl = l.map(function (i) { + return l[i].offsetTop - y; + }).toArray(); + tl.push(l.last()[0].offsetTop + l.last().height() - y); + return ArrayUtil.binarySearch(tl, 0, function (a, b) { + return a - b; + }, true); } function generateAddList(event, items) { - event.stopPropagation(); - if (clist) - clist.remove(); - var ul = $("").addClass("t-list"); - for (var i in items) { - var item = items[i]; - ul.append($("
  • ").addClass("t-li").attr("key", item).text(msg("list." + item)).on("click", null, item, onAddItemClick)); - } - popup(event, ul); + event.stopPropagation(); + if (clist) clist.remove(); + var ul = $("").addClass("t-list"); + for (var i in items) { + var item = items[i]; + ul.append($("
  • ").addClass("t-li").attr("key", item).text(msg("list." + item)).on("click", null, item, onAddItemClick)); + } + popup(event, ul); } function generateAddExpList(event, items) { - event.stopPropagation(); - if (clist) - clist.remove(); - var ul = $("").addClass("t-list t-exp-list"); - for (var i in items) { - var item = items[i]; - ul.append($("
  • ").addClass("t-li").attr("key", item).text(msg("list." + item)).on("click", null, item, onAddItemClick)); - } - popup(event, ul); + event.stopPropagation(); + if (clist) clist.remove(); + var ul = $("").addClass("t-list t-exp-list"); + for (var i in items) { + var item = items[i]; + ul.append($("
  • ").addClass("t-li").attr("key", item).text(msg("list." + item)).on("click", null, item, onAddItemClick)); + } + popup(event, ul); } function popup(event, ul) { - clist = ul; - app.append(ul); - var left = event.pageX; - if (left + ul.outerWidth() > window.innerWidth) - left = Math.max(0, left - ul.outerWidth()); - var top = event.pageY; - if (top + ul.outerHeight() > window.innerHeight) - top = Math.max(0, top - ul.outerHeight()); - ul.css({ - "left": left, - "top": top - }); + clist = ul; + app.append(ul); + var left = event.pageX; + if (left + ul.outerWidth() > window.innerWidth) + left = Math.max(0, left - ul.outerWidth()); + var top = event.pageY; + if (top + ul.outerHeight() > window.innerHeight) + top = Math.max(0, top - ul.outerHeight()); + ul.css({ + "left": left, + "top": top + }); } function generateInputList(el, key) { - var il = inputlists[key]; - if (!il) - return; - var id = "il-" + ilid.toString(); - var dl = $("").attr("id", id); - for (var i in il) { - var li = il[i]; - dl.append($("