1
0
mirror of https://shylinux.com/x/ContextOS synced 2025-06-26 18:07:30 +08:00

vps opt miniCAD

This commit is contained in:
shylinux 2018-09-02 21:07:20 +08:00
parent 448d9dbc15
commit 84bba14ebd
3 changed files with 202 additions and 145 deletions

View File

@ -9,10 +9,24 @@ canvas {
width:380px;
overflow:auto;
}
.debug_info p{
.debug_info p {
margin:0;
padding:0;
}
thead {
display:block;
width:100%;
}
th,td {
width:60px;
padding:0;
margin:0;
}
#draw_history {
display:inline-block;
max-height:120px;
overflow-y:scroll;
}
.demo {
float:left;
margin-right:10px;

View File

@ -76,7 +76,7 @@ demo3.onclick = draw3;
draw3()
//}}}
var draw_history = [{shape:"clear"}];
var draw_history = [{shape:"hide"}];
var his = document.getElementById("draw_history");
var draw = document.getElementById("draw").getContext("2d");
@ -89,9 +89,13 @@ var current_ctx = {//{{{
index_point: false,
begin_point: null,
end_point: null,
last_point: null,
last_move: 0,
config: {
shape: {value: "rect", list: [
{text: "移动", value: "move"},
{text: "隐藏", value: "hide"},
{text: "心形", value: "heart"},
{text: "圆形", value: "cycle"},
{text: "矩形", value: "rect"},
@ -112,13 +116,16 @@ var current_ctx = {//{{{
{text: "白色", value: "white"},
]},
scale: {text: "比例", value: 1},
offsetX: {text: "X偏移", value: 0},
offsetY: {text: "Y偏移", value: 0},
point: {text: "坐标", value: "0,0"},
begin: {text: "隐藏", value: 0},
interval: {text: "间隔", value: 100},
json: {text: "数据", value: ""},
},
command: {
cmd_shape: {
move: {text: "移动", key: "m", conf:{"shape": "move"}},
hide: {text: "隐藏", key: "h"},
heart: {text: "心形", key: "e",
conf:{"shape": "heart", "stroke": "fill"},
cmd:{"fill": "cmd_stroke"},
@ -152,14 +159,11 @@ var current_ctx = {//{{{
stroke: {type: "config"},
color: {type: "config"},
scale: {type: "cache"},
begin: {type: "cache"},
point: {type: "cache"},
},
ctrl_show: {
big: {text: "放大", key: "b"},
small: {text: "缩小", key: "m"},
hide: {text: "隐藏"},
show: {text: "恢复"},
big: {text: "放大", key: "+"},
small: {text: "缩小", key: "-"},
play: {text: "播放", key: "a"},
interval: {type: "config", width: 30},
},
@ -169,7 +173,8 @@ var current_ctx = {//{{{
export: {text: "导出"},
import: {text: "导入"},
json: {type: "config", width: 80},
}
},
"": {},
},
}
//}}}
@ -207,9 +212,10 @@ function init(configs, commands) {//{{{
}
(function() {
var bar = group;
var key = which;
select.onchange = function(event) {
conf('config', key, event);
current_ctx.config[key].value = event.target[event.target.selectedIndex].value;
}
})();
} else {
@ -223,8 +229,18 @@ function init(configs, commands) {//{{{
(function() {
var key = which;
input.onkeyup = input.onblur = function(event) {
conf('config', key, event);
input.onblur = function(event) {
current_ctx.config[key].value = event.target.value;
}
input.onkeyup = function(event) {
switch (event.key) {
case "Enter":
current_ctx.config[key].value = event.target.value;
break
case "Escape":
event.target.value = current_ctx.config[key].value;
break
}
}
})();
}
@ -233,6 +249,7 @@ function init(configs, commands) {//{{{
cmd.className = group+" "+which;
if (command.key) {
control_map[command.key] = [group, which];
cmd.innerText = command.text+"("+command.key+")";
} else {
cmd.innerText = command.text
@ -240,9 +257,9 @@ function init(configs, commands) {//{{{
(function() {
var key = which;
var key1 = group;
var bar = group;
cmd.onclick = function(event) {
action(event, key, key1);
action(event, key, bar);
}
})();
}
@ -251,34 +268,11 @@ function init(configs, commands) {//{{{
}
}//}}}
function conf(group, which, value) {//{{{
if (value instanceof Event) {
var event = value;
switch (event.type) {
case "change":
current_ctx[group][which].value = event.target[event.target.selectedIndex].value;
break
case "keyup":
switch (event.key) {
case "Enter":
current_ctx[group][which].value = event.target.value;
break
case "Escape":
event.target.value = current_ctx[group][which].value;
break
}
break
case "blur":
current_ctx[group][which].value = event.target.value;
break
}
return
}
var config = current_ctx[group][which];
if (value != undefined) {
config.value = value;
var cs = document.getElementsByClassName(group+" "+which);
for (var i = 0; i < cs.length; i++) {
config.value = value;
if (cs[i].nodeName == "LABEL") {
cs[i].innerText = value;
} else {
@ -302,7 +296,7 @@ function info() {//{{{
}
}
debug_info = document.getElementsByClassName("debug_info");
var debug_info = document.getElementsByClassName("debug_info");
for (var i = 0; i < debug_info.length; i++) {
var p = debug_info[i].appendChild(document.createElement("p"));
p.appendChild(document.createTextNode(list.join(" ")));
@ -310,55 +304,49 @@ function info() {//{{{
}
}
//}}}
init(current_ctx.config, current_ctx.command);
var control_map = {//{{{
s: "stroke",
f: "fill",
e: "heart",
c: "cycle",
r: "rect",
v: "line",
t: "text",
d: "delete",
b: "big",
m: "small",
a: "play",
Escape: "escape",
Escape: ["", "escape"],
action: {
"escape": [function() {
current_ctx.begin_point = null;
current_ctx.end_point = null;
}],
"hide": [function() {
var s = {shape: "hide", time:1}
add_history(his, s);
draws(draw, s);
}],
"big": [function(){
conf("config", "scale", (conf("config", "scale")*current_ctx.big_scale).toFixed(3));
draw.scale(current_ctx.big_scale, current_ctx.big_scale);
var m = draw.getTransform();
conf("config", "scale", m.a);
}],
"small": [function(){
conf("config", "scale", (conf("config", "scale")*current_ctx.small_scale).toFixed(3));
draw.scale(current_ctx.small_scale, current_ctx.small_scale);
}],
"hide": [function() {
conf("config", "begin", draw_history.length);
}],
"show": [function() {
conf("config", "begin", 0);
var m = draw.getTransform();
conf("config", "scale", m.a);
}],
"play": [function() {
conf("config", "begin", 0);
refresh(conf("config", "interval"), 0);
draw.resetTransform();
conf("config", "scale", 1)
conf("config", "offsetX", 0)
conf("config", "offsetY", 0)
refresh(conf("config", "interval"), 0, "", function() {
var m = draw.getTransform();
conf("config", "scale", m.a);
conf("config", "offsetX", m.e)
conf("config", "offsetY", m.f)
});
return false
}],
"delete": [function() {
if (draw_history.length > 1) {
draw_history.pop();
var tr = his.rows[his.rows.length-1];
tr.parentElement.removeChild(tr)
draw_history.pop();
}
}],
"clear": [function() {
@ -374,13 +362,13 @@ var control_map = {//{{{
return false
}],
"import": [function() {
draw_history = JSON.parse(conf("config", "json"));
var im = JSON.parse(conf("config", "json"));
for (var i in im) {
add_history(his, im[i]);
draws(draw, im[i]);
}
}],
"default": [function(event, which, group) {
if (!which || !group) {
return false
}
var cs = document.getElementsByClassName(group);
for (var i = 0; i < cs.length; i++) {
cs[i].style.backgroundColor = "white";
@ -390,48 +378,41 @@ var control_map = {//{{{
for (var i = 0; i < cs.length; i++) {
cs[i].style.backgroundColor = "lightblue";
}
var command = current_ctx.command[group][which];
if (!command) {
return false
}
for (var k in command.conf) {
conf("config", k, command.conf[k]);
}
for (var k in command.cmd) {
action(event, k, command.cmd[k])
}
}],
}
}
//}}}
function control(event) {//{{{
if (event.type == "keyup") {
action(event, control_map[event.key]);
if (event.type == "keyup" && control_map[event.key]) {
action(event, control_map[event.key][1], control_map[event.key][0]);
}
}
//}}}
function action(event, which, group) {//{{{
var w = control_map.action[which]? which: "default";
while (control_map.action[w]) {
var command = current_ctx.command[group][which] || {};
for (var k in command.conf) {
conf("config", k, command.conf[k]);
}
for (var i in control_map.action[w]) {
var next = control_map.action[w][i](event, which, group);
w = next || w;
}
w = next;
if (next == undefined) {
refresh()
for (var k in command.cmd) {
action(event, k, command.cmd[k])
}
next == undefined && refresh()
w = next;
}
}
//}}}
action(null, "heart", "cmd_shape");
action(null, "red", "cmd_color");
function trans(point) {//{{{
point.x /= conf("config", "scale");
point.y /= conf("config", "scale");
return point;
return {
x: point.x/conf("config", "scale")-conf("config","offsetX"),
y: point.y/conf("config", "scale")-conf("config","offsetY"),
}
}
//}}}
function draw_point(event) {//{{{
@ -439,69 +420,85 @@ function draw_point(event) {//{{{
x: event.type == "touchstart"? event.touches[0].clientX: event.offsetX,
y: event.type == "touchstart"? event.touches[0].clientY: event.offsetY,
});
conf("config", "point", parseInt(point.x)+","+parseInt(point.y));
if (!current_ctx.begin_point) {
current_ctx.begin_point = point;
info(event.type, "begin_point", current_ctx.begin_point)
info(event.type, "begin_point: ", current_ctx.begin_point)
return
}
current_ctx.end_point = point;
info(event.type, "end_point", current_ctx.end_point)
info(event.type, "end_point: ", current_ctx.end_point)
var s = {
color:conf("config", "color"),
stroke:conf("config", "stroke"),
shape:conf("config", "shape"),
begin_point:current_ctx.begin_point,
end_point:current_ctx.end_point,
text:conf("config", "shape") == "text"? prompt("请入文字", ""): "",
shape: conf("config", "shape"),
stroke: conf("config", "stroke"),
color: conf("config", "color"),
begin_point: current_ctx.begin_point,
end_point: current_ctx.end_point,
text: conf("config", "shape") == "text"? prompt("请入文字", ""): "",
};
draws(draw, s);
add_history(his, s);
draws(draw, s);
refresh();
current_ctx.begin_point = null;
current_ctx.end_point = null;
}
//}}}
function draw_move(event) {//{{{
var point = trans({x:event.offsetX, y:event.offsetY});
conf("config", "point", parseInt(point.x)+","+parseInt(point.y));
if (current_ctx.agent.isMobile) {
return
}
if (current_ctx.begin_point) {
var point = trans({x:event.offsetX, y:event.offsetY});
conf("config", "point", parseInt(point.x)+","+parseInt(point.y));
info(event.type, "move_point", point)
var color = conf("config", "color");
var stroke = conf("config", "stroke");
var shape = conf("config", "shape");
if (current_ctx.begin_point) {
switch (conf("config", "shape")) {
case "move":
var m = draw.getTransform()
draw.translate(point.x-current_ctx.begin_point.x,point.y-current_ctx.begin_point.y);
refresh();
draw.setTransform(m)
break
default:
refresh();
draws(draw, {
color:conf("config", "color"),
stroke:conf("config", "stroke"),
shape:conf("config", "shape"),
begin_point:current_ctx.begin_point,
end_point:point,
text:"",
shape: shape, stroke: stroke, color: color,
begin_point: current_ctx.begin_point,
end_point: point,
text: "",
});
}
}
}
//}}}
function add_history(his, s) {//{{{
s.index = draw_history.length;
switch (s.shape) {
case "move":
s.type = "image"
}
draw_history.push(s);
var headers = ["color", "stroke", "shape", "x1", "y1", "x2", "y2", "text"]
if (his.rows.length == 0) {
var tr = his.insertRow(-1);
for (var i in headers) {
var th = tr.appendChild(document.createElement("th"));
th.appendChild(document.createTextNode(headers[i]))
}
if (s.begin_point) {
var begin_x = s.begin_point.x;
var begin_y = s.begin_point.y;
var end_x = s.end_point.x;
var end_y = s.end_point.y;
}
var tr = his.insertRow(-1);
var fields = [s.color, s.stroke, s.shape,
parseInt(s.begin_point.x), parseInt(s.begin_point.y),
parseInt(s.end_point.x), parseInt(s.end_point.y), s.text]
var tr = his.appendChild(document.createElement("tr"))
var headers = ["shape", "stroke", "color", "x1", "y1", "x2", "y2", "text"]
var fields = [s.shape, s.stroke, s.color,
parseInt(begin_x), parseInt(begin_y), parseInt(end_x), parseInt(end_y), s.text]
for (var i in fields) {
var td = tr.appendChild(document.createElement("td"));
@ -531,7 +528,7 @@ function add_history(his, s) {//{{{
default:
var input = td.appendChild(document.createElement("input"));
input.value = fields[i];
input.style.width="40px";
input.style.width="46px";
(function() {
var row = draw_history[tr.rowIndex]
@ -562,34 +559,59 @@ function add_history(his, s) {//{{{
})()
}
}
his.scrollTop+=100;
return s;
}
//}}}
function refresh(time, i) {//{{{
if (time) {
if (i < draw_history.length) {
draws(draw, draw_history[i++]);
setTimeout(function(){refresh(time, i)}, time);
function refresh(time, i, last, done) {//{{{
i = i || 0
if (!last || last > draw_history.length) {
last = draw_history.length;
}
if (time) {
if (i < last) {
draws(draw, draw_history[i]);
if (draw_history[i].type == "image") {
refresh(0, 0, i);
}
setTimeout(function(){refresh(time, i, last, done)}, draw_history[i].time||time);
i++
return
}
for (var i = conf("config", "begin"); i < draw_history.length; i++) {
typeof done == "function" && done();
return
}
for (i = i || 0; i < last; i++) {
if (draw_history[i].type != "image") {
draws(draw, draw_history[i]);
}
}
}
//}}}
function draws(draw, h) {//{{{
draw.save();
if (h.shape == "clear") {
draw.clearRect(0, 0,400/conf("config", "scale"), 400/conf("config", "scale"));
draw.restore();
return
}
if (h.begin_point) {
var begin_x = h.begin_point.x;
var begin_y = h.begin_point.y;
var end_x = h.end_point.x;
var end_y = h.end_point.y;
}
switch (h.shape) {
case "init":
case "move":
draw.translate(end_x-begin_x, end_y-begin_y);
var m = draw.getTransform();
conf("config", "offsetX", m.e)
conf("config", "offsetY", m.f)
return
}
draw.save();
if (h.color) {
if (h.stroke == "stroke") {
@ -599,8 +621,10 @@ function draws(draw, h) {//{{{
}
}
info("draw", h)
switch (h.shape) {
case "hide":
draw.clearRect(-conf("config", "offsetX")/conf("config", "scale"), -conf("config", "offsetY")/conf("config", "scale"), 400/conf("config", "scale"), 400/conf("config", "scale"));
break
case 'heart':
r = Math.sqrt(Math.pow(begin_x-end_x, 2)+Math.pow(begin_y-end_y,2));
a = Math.atan((end_y-begin_y)/(end_x-begin_x))/Math.PI*180;
@ -630,3 +654,7 @@ function draws(draw, h) {//{{{
}
//}}}
init(current_ctx.config, current_ctx.command);
action(null, "heart", "cmd_shape");
action(null, "red", "cmd_color");

View File

@ -17,7 +17,22 @@ onmouseup="draw_point(event)"
<div class="ctrl_status bar"></div>
<div class="debug_info"></div>
<div class="ctrl_data bar"></div>
<table id="draw_history"></table>
<table>
<thead>
<tr>
<th>color</th>
<th>stroke</th>
<th>shape</th>
<th>x1</th>
<th>y1</th>
<th>x2</th>
<th>y2</th>
<th>text</th>
</tr>
</thead>
<tbody id="draw_history"></tbody>
</table>
### canvas绘图
<canvas id="demo0" class="demo" width="120" height="120"></canvas>