Add project files.
This commit is contained in:
253
Http/SkinEditor/app.css
Normal file
253
Http/SkinEditor/app.css
Normal file
@@ -0,0 +1,253 @@
|
||||
body {
|
||||
overflow: hidden;
|
||||
margin: 0;
|
||||
font-family: sans-serif;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
#app {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
#toolbar {
|
||||
height: 32px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.tgbtn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.tgbtn-active {
|
||||
background-color: lightblue;
|
||||
}
|
||||
|
||||
.tgbtn:hover {
|
||||
background-color: lightgray;
|
||||
}
|
||||
|
||||
#toolbar .tgbtn {
|
||||
min-width: 64px;
|
||||
height: 100%;
|
||||
padding: 0 8px;
|
||||
border-right: solid 1px gray;
|
||||
}
|
||||
|
||||
#treeview {
|
||||
height: calc(100% - 32px);
|
||||
}
|
||||
|
||||
#tree {
|
||||
overflow: auto;
|
||||
height: calc(100% - 10px);
|
||||
}
|
||||
|
||||
.t-list {
|
||||
position: absolute;
|
||||
max-width: 100vw;
|
||||
max-height: 100vh;
|
||||
overflow: auto;
|
||||
background-color: floralwhite;
|
||||
border: solid 1px gray;
|
||||
border-radius: 4px;
|
||||
padding: 2px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.t-li {
|
||||
list-style: none;
|
||||
padding: 0 4px;
|
||||
margin: 1px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.t-li:hover {
|
||||
background-color: lightblue;
|
||||
}
|
||||
|
||||
input {
|
||||
border: none;
|
||||
font-family: sans-serif;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.t-node {
|
||||
padding: 1px 4px;
|
||||
margin: 4px 0;
|
||||
}
|
||||
|
||||
.t-node, .t-node-sup {
|
||||
transition: 0.25s;
|
||||
}
|
||||
|
||||
.t-node.t-inline {
|
||||
padding: 0 2px;
|
||||
margin: 4px 2px;
|
||||
}
|
||||
|
||||
.t-internal {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.t-literal {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.btn {
|
||||
width: 16px;
|
||||
height: 0px;
|
||||
font-size: small;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
overflow: hidden;
|
||||
cursor: pointer;
|
||||
transition: 0.25s;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.btn.t-inline {
|
||||
display: inline-block;
|
||||
width: 0;
|
||||
height: 16px;
|
||||
margin: 0 2px;
|
||||
}
|
||||
|
||||
.btn:only-child {
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.btn.t-inline:only-child {
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
.t-statement > .btn {
|
||||
}
|
||||
|
||||
.t-node:hover > .btn {
|
||||
transition: 0.25s;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.t-node:hover > .btn.t-inline {
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
.btn-add {
|
||||
border: solid 1px green;
|
||||
}
|
||||
|
||||
.mode-hide-add .btn-add {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.btn-delete {
|
||||
border: solid 1px red;
|
||||
}
|
||||
|
||||
.mode-hide-delete .btn-delete {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.t-block {
|
||||
border-left: solid 1px darkcyan;
|
||||
}
|
||||
|
||||
.t-exp {
|
||||
border-top: solid 1px gray;
|
||||
}
|
||||
|
||||
.t-exp.t-inline {
|
||||
padding: 2px 4px;
|
||||
}
|
||||
|
||||
.t-exp:hover {
|
||||
border-top: solid 3px gray;
|
||||
}
|
||||
|
||||
.t-input {
|
||||
display: inline-block;
|
||||
border: solid 1px magenta;
|
||||
}
|
||||
|
||||
.t-statement {
|
||||
border-left: solid 1px orange;
|
||||
}
|
||||
|
||||
.t-statement.t-inline {
|
||||
border: solid 1px orange;
|
||||
}
|
||||
|
||||
.t-node:hover {
|
||||
transition: 0.25s;
|
||||
border-left-width: 3px;
|
||||
}
|
||||
|
||||
.t-inline {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
/* Debug Mode */
|
||||
.mode-debug .t-internal {
|
||||
display: block;
|
||||
background-color: lightgray;
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
/* Sort Mode */
|
||||
.mode-sort .t-internal {
|
||||
display: block;
|
||||
background-color: lightgray;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.mode-sort input {
|
||||
cursor: grab;
|
||||
}
|
||||
|
||||
.mode-sort .t-node {
|
||||
border-color: lightgray;
|
||||
}
|
||||
|
||||
.mode-sort .t-statement {
|
||||
cursor: grab;
|
||||
padding-left: 10px;
|
||||
border-color: orange;
|
||||
border-left-width: 2px;
|
||||
}
|
||||
|
||||
.mode-sort .t-statement:hover {
|
||||
border-color: yellow;
|
||||
border-left-width: 5px;
|
||||
}
|
||||
|
||||
.mode-sort .t-statement.t-inline {
|
||||
border-color: lightgray;
|
||||
}
|
||||
|
||||
.mode-sort .btn {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.mode-sort.state-grabbing .t-node {
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
.mode-sort.state-grabbing input {
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
.mode-sort.state-grabbing .t-grabbing {
|
||||
background-color: lightgreen;
|
||||
border-left-color: green;
|
||||
}
|
||||
|
||||
.grab-ptr {
|
||||
margin: 0;
|
||||
border: solid 1px green;
|
||||
}
|
||||
456
Http/SkinEditor/app.js
Normal file
456
Http/SkinEditor/app.js
Normal file
File diff suppressed because it is too large
Load Diff
26
Http/SkinEditor/array_util.js
Normal file
26
Http/SkinEditor/array_util.js
Normal file
@@ -0,0 +1,26 @@
|
||||
var ArrayUtil = {
|
||||
binarySearch: function(a, i, c, f) {
|
||||
var s = 0
|
||||
, e = a.length - 1;
|
||||
while (e - s > 1) {
|
||||
var m = Math.floor((e + s) / 2);
|
||||
var r = c(i, a[m]);
|
||||
if (r < 0)
|
||||
e = m;
|
||||
else if (r > 0)
|
||||
s = m;
|
||||
else
|
||||
return m;
|
||||
}
|
||||
if (!f)
|
||||
return -e;
|
||||
else {
|
||||
var rs = Math.abs(c(i, a[s]));
|
||||
var re = Math.abs(c(i, a[e]));
|
||||
if (re < rs)
|
||||
return e;
|
||||
else
|
||||
return s;
|
||||
}
|
||||
}
|
||||
};
|
||||
24
Http/SkinEditor/index.html
Normal file
24
Http/SkinEditor/index.html
Normal file
@@ -0,0 +1,24 @@
|
||||
<!DOCTYPE HTML>
|
||||
<head>
|
||||
<title>Skin Editor - Cosmo Resona</title>
|
||||
<link type="text/css" rel="stylesheet" href="app.css"/>
|
||||
<script type="text/javascript" src="jquery-3.6.0.min.js"></script>
|
||||
<script type="text/javascript" src="stretchy.min.js"></script>
|
||||
<script type="text/javascript" src="array_util.js"></script>
|
||||
<script type="text/javascript" src="app.js"></script>
|
||||
<script type="text/javascript" src="messages/en_US.js"></script>
|
||||
<!--<script type="text/javascript" src="messages/zh_CN.js" charset="UTF-8"></script>-->
|
||||
</head>
|
||||
<body>
|
||||
<div id="app">
|
||||
<div id="toolbar">
|
||||
<div class="tgbtn" id="tb-sort"><tbr>tool.sort</tbr></div>
|
||||
<div class="tgbtn" id="tb-hide-add"><tbr>tool.hideadd</tbr></div>
|
||||
<div class="tgbtn" id="tb-hide-delete"><tbr>tool.hidedelete</tbr></div>
|
||||
<div class="tgbtn" id="tb-debug"><tbr>tool.debug</tbr></div>
|
||||
</div>
|
||||
<div id="treeview">
|
||||
<div id="tree" class="t-node t-root" key="block.root"></div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
2
Http/SkinEditor/jquery-3.6.0.min.js
vendored
Normal file
2
Http/SkinEditor/jquery-3.6.0.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
65
Http/SkinEditor/messages/en_US.js
Normal file
65
Http/SkinEditor/messages/en_US.js
Normal file
@@ -0,0 +1,65 @@
|
||||
messages["en_US"] = {
|
||||
"block.filter": "If {}",
|
||||
"block.select": "Select {}",
|
||||
"input.comp.default": "component",
|
||||
"input.comp.image": "image sprite",
|
||||
"input.comp.polysec": "polygon sectional mesh",
|
||||
"input.comp.rect": "colored rectangle",
|
||||
"input.comp.scale3": "scale3 sprite",
|
||||
"input.ident.default": "variable",
|
||||
"input.flag.default": "flag",
|
||||
"input.prop.default": "property",
|
||||
"input.type.chart": "chart",
|
||||
"input.type.default": "element",
|
||||
"input.type.group": "track group",
|
||||
"input.type.note": "note",
|
||||
"input.type.track": "track",
|
||||
"list.statement.comp": "Attach a component",
|
||||
"list.statement.define": "Define a variable",
|
||||
"list.statement.filter": "Filter element",
|
||||
"list.statement.filter.flag": "Filter flag",
|
||||
"list.statement.filter.flag.n": "Filter flag (negative)",
|
||||
"list.statement.filter.prop": "Filter property",
|
||||
"list.statement.filter.prop.n": "Filter property (negative)",
|
||||
"list.statement.filter.type": "Filter element type",
|
||||
"list.statement.obj": "Create a container",
|
||||
"list.statement.prop": "Set property",
|
||||
"list.statement.select": "Select elements",
|
||||
"list.statement.select.flag": "Filter flag",
|
||||
"list.statement.select.flag.n": "Filter flag (negative)",
|
||||
"list.statement.select.prop": "Filter property",
|
||||
"list.statement.select.prop.n": "Filter property (negative)",
|
||||
"list.statement.select.type": "Filter element type",
|
||||
"literal.block.filter": "If {statement.filter.flag} {statement.filter.flag.n} {statement.filter.type} {statement.filter.prop} {statement.filter.prop.n}",
|
||||
"literal.block.select": "For each {statement.select.flag} {statement.select.flag.n} {statement.select.type?element} {statement.select.prop} {statement.select.prop.n}",
|
||||
"literal.statement.filter.flag": "it is {0}",
|
||||
"literal.statement.filter.flag.n": "it is not {0}",
|
||||
"literal.statement.filter.prop": "its {0} is {1}",
|
||||
"literal.statement.filter.prop.n": "its {0} is not {1}",
|
||||
"literal.statement.filter.type": "it is a {0}",
|
||||
"literal.statement.select.flag": "{0}",
|
||||
"literal.statement.select.flag.n": "non-{0}",
|
||||
"literal.statement.select.prop": "whose {0} is {1}",
|
||||
"literal.statement.select.prop.n": "whose {0} is not {1}",
|
||||
"literal.statement.select.type": "{0}",
|
||||
"statement.comp": "with a {0}",
|
||||
"statement.define": "Define {0} = {1}",
|
||||
"statement.filter": "{0} {1}",
|
||||
"statement.filter.flag": "it is {0}",
|
||||
"statement.filter.flag.n": "it is not {0}",
|
||||
"statement.filter.prop": "its {0} is {1}",
|
||||
"statement.filter.prop.n": "its {0} is not {1}",
|
||||
"statement.filter.type": "it is a {0}",
|
||||
"statement.obj": "Create a container {0}",
|
||||
"statement.prop": "Set its {0} to {1}",
|
||||
"statement.select": "{0} {1}",
|
||||
"statement.select.flag": "that is {0}",
|
||||
"statement.select.flag.n": "that is not {0}",
|
||||
"statement.select.prop": "whose {0} is {1}",
|
||||
"statement.select.prop.n": "whose {0} is not {1}",
|
||||
"statement.select.type": "{0}",
|
||||
"tool.debug": "Debug",
|
||||
"tool.hideadd": "Hide Add",
|
||||
"tool.hidedelete": "Hide Delete",
|
||||
"tool.sort": "Sort",
|
||||
};
|
||||
65
Http/SkinEditor/messages/zh_CN.js
Normal file
65
Http/SkinEditor/messages/zh_CN.js
Normal file
@@ -0,0 +1,65 @@
|
||||
messages["zh_CN"] = {
|
||||
"block.filter": "如果 {}",
|
||||
"block.select": "选择 {}",
|
||||
"input.comp.default": "组件",
|
||||
"input.comp.image": "图片元件",
|
||||
"input.comp.polysec": "多边形截面网格",
|
||||
"input.comp.rect": "纯色矩形",
|
||||
"input.comp.scale3": "三段拉伸元件",
|
||||
"input.ident.default": "变量",
|
||||
"input.flag.default": "标记",
|
||||
"input.prop.default": "属性",
|
||||
"input.type.chart": "谱面",
|
||||
"input.type.default": "元素",
|
||||
"input.type.group": "轨道组",
|
||||
"input.type.note": "音符",
|
||||
"input.type.track": "轨道",
|
||||
"list.statement.comp": "附加组件",
|
||||
"list.statement.define": "定义变量",
|
||||
"list.statement.filter": "筛选元素",
|
||||
"list.statement.filter.flag": "筛选标记",
|
||||
"list.statement.filter.flag.n": "筛选标记(否定)",
|
||||
"list.statement.filter.prop": "筛选属性",
|
||||
"list.statement.filter.prop.n": "筛选属性(否定)",
|
||||
"list.statement.filter.type": "筛选元素类型",
|
||||
"list.statement.obj": "创建容器",
|
||||
"list.statement.prop": "设置属性",
|
||||
"list.statement.select": "选择元素",
|
||||
"list.statement.select.flag": "筛选标记",
|
||||
"list.statement.select.flag.n": "筛选标记(否定)",
|
||||
"list.statement.select.prop": "筛选属性",
|
||||
"list.statement.select.prop.n": "筛选属性(否定)",
|
||||
"list.statement.select.type": "筛选元素类型",
|
||||
"literal.block.filter": "如果 {statement.filter.flag} {statement.filter.flag.n} {statement.filter.type} {statement.filter.prop} {statement.filter.prop.n}",
|
||||
"literal.block.select": "对于每个 {statement.select.prop} {statement.select.prop.n} {statement.select.flag} {statement.select.flag.n} {statement.select.type?元素}",
|
||||
"literal.statement.filter.flag": "该元素带有标记 {0}",
|
||||
"literal.statement.filter.flag.n": "该元素不带有标记 {0}",
|
||||
"literal.statement.filter.prop": "该元素的 {0} {1}",
|
||||
"literal.statement.filter.prop.n": "该元素的 {0} 不 {1}",
|
||||
"literal.statement.filter.type": "该元素是 {0}",
|
||||
"literal.statement.select.flag": "{0}",
|
||||
"literal.statement.select.flag.n": "非{0}",
|
||||
"literal.statement.select.prop": "{0} {1} 的",
|
||||
"literal.statement.select.prop.n": "{0} 不 {1} 的",
|
||||
"literal.statement.select.type": "{0}",
|
||||
"statement.comp": "创建一个 {0} 组件",
|
||||
"statement.define": "定义变量 {0} = {1}",
|
||||
"statement.filter": "{0} {1}",
|
||||
"statement.filter.flag": "该元素带有标记 {0}",
|
||||
"statement.filter.flag.n": "该元素不带有标记 {0}",
|
||||
"statement.filter.prop": "该元素的 {0} {1}",
|
||||
"statement.filter.prop.n": "该元素的 {0} 不 {1}",
|
||||
"statement.filter.type": "该元素是 {0}",
|
||||
"statement.obj": "创建一个容器 {0}",
|
||||
"statement.prop": "设置属性 {0} 为 {1}",
|
||||
"statement.select": "{0} {1}",
|
||||
"statement.select.flag": "{0}",
|
||||
"statement.select.flag.n": "非{0}",
|
||||
"statement.select.prop": "{0} {1} 的",
|
||||
"statement.select.prop.n": "{0} 不 {1} 的",
|
||||
"statement.select.type": "{0}",
|
||||
"tool.debug": "调试",
|
||||
"tool.hideadd": "隐藏添加按钮",
|
||||
"tool.hidedelete": "隐藏删除按钮",
|
||||
"tool.sort": "排序",
|
||||
};
|
||||
5
Http/SkinEditor/stretchy.min.js
vendored
Normal file
5
Http/SkinEditor/stretchy.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user