forked from x/volcanos
opt trend
This commit is contained in:
parent
fdab93a60d
commit
52f3801585
36
frame.js
36
frame.js
@ -248,13 +248,13 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
|
||||
typeof item == "string"? /*按键*/ can.onappend.input(can, "input", {type: "button", value: item, onclick: function(event) {
|
||||
var cb = meta[item] || meta["_engine"] || can.onkeymap && can.onkeymap._remote
|
||||
typeof cb == "function"? cb(event, can, item): can.run(event, ["action", item], function(msg) {}, true)
|
||||
}}, action): item.length > 0? /*列表*/ can.onappend.input(can, "input", {type: "select", name: item[0], values: item.slice(1), title: item[0], onchange: function(event) {
|
||||
}}, "", action): item.length > 0? /*列表*/ can.onappend.input(can, "input", {type: "select", name: item[0], values: item.slice(1), title: item[0], onchange: function(event) {
|
||||
var which = item[event.target.selectedIndex+1]
|
||||
var cb = meta[which]
|
||||
typeof cb == "function" && cb(event, can, which)
|
||||
var cb = meta[item[0]]
|
||||
typeof cb == "function" && cb(event, can, item[0], which)
|
||||
}}, action): item.input? /*文本*/ can.page.Append(can, action, [{view: "item", list: [{type: "input", name: item.input[0], onkeydown: function(event) {
|
||||
}}, "", action): item.input? /*文本*/ can.page.Append(can, action, [{view: "item", list: [{type: "input", name: item.input[0], onkeydown: function(event) {
|
||||
item.input[1](event, can)
|
||||
}}] }]): typeof item == "object" && /*其它*/ can.page.Append(can, action, [item])
|
||||
})
|
||||
@ -264,6 +264,10 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
|
||||
item.name && item.value && msg.Option(item.name, item.value)
|
||||
})
|
||||
|
||||
if (cmds[0] == "action" && can.onaction[cmds[1]]) {
|
||||
return can.onaction[cmds[1]](event, can)
|
||||
}
|
||||
|
||||
return can.run(event, cmds||[], function(msg) {
|
||||
if (can.onimport._process(can, msg, cmds, cb)) { return }
|
||||
typeof cb == "function" && cb(msg)
|
||||
@ -363,7 +367,9 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
|
||||
return can.page.Append(can, target, [{view: ["item "+item.type], list: [{text: [name, "label"]}, {text: [": ", "label"]}, input]}])[item.name]
|
||||
},
|
||||
table: function(can, type, msg, cb, target) {
|
||||
var table = can.page.AppendTable(can, msg, target, msg.append, cb)
|
||||
var table = can.page.AppendTable(can, msg, target||can._output, msg.append, cb||function(value) {
|
||||
return {text: [value, "td"]}
|
||||
})
|
||||
table && can.page.Modify(can, table, {className: type||"content"})
|
||||
return table
|
||||
},
|
||||
@ -390,7 +396,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
|
||||
|
||||
meta.name = meta.name || msg.name&&msg.name[0] || "story"
|
||||
meta.help = meta.help || msg.help&&msg.help[0] || "story"
|
||||
meta.width = can._target.offsetWidth
|
||||
meta.width = meta.width || can._target.offsetWidth
|
||||
meta.type = "story"
|
||||
|
||||
can.onappend._init(can, meta, ["/plugin/state.js"], function(story) {
|
||||
@ -399,6 +405,15 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
|
||||
}, target || can._output)
|
||||
}, true)
|
||||
},
|
||||
plugins: function(can, meta, cb, target) {
|
||||
can.onappend.plugin(can, meta, function(sub) {
|
||||
sub.onmotion.hidden(sub, sub._legend)
|
||||
sub.onmotion.hidden(sub, sub._option)
|
||||
sub.onmotion.hidden(sub, sub._action)
|
||||
sub.onmotion.hidden(sub, sub._status)
|
||||
typeof cb == "function" && cb(sub)
|
||||
}, target)
|
||||
},
|
||||
}, [], function(can) {})
|
||||
Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, target, width, height) {
|
||||
can.page.Select(can, target, ["fieldset.head", "fieldset.foot"], function(field) {
|
||||
@ -434,6 +449,13 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe
|
||||
can.page.Remove(can, ui.legend)
|
||||
},
|
||||
|
||||
resize: function(can, name, cb) {
|
||||
var list = []; can.onengine.listen(can, name, function(width, height) {
|
||||
can.Conf({width: width, height: height}), can.core.Delay(list, 100, function() {
|
||||
typeof cb == "function" && cb(event)
|
||||
})
|
||||
})
|
||||
},
|
||||
profile: function(can, target) { target = target || can._target
|
||||
return can.page.Append(can, target, [{view: ["void", "table"], list: [{type: "tr", list: [
|
||||
{type: "td", list: [{view: ["project"]}]},
|
||||
@ -452,9 +474,9 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe
|
||||
]}
|
||||
]}] }])
|
||||
},
|
||||
project: function(can, target) {
|
||||
can.ui = can.page.Append(can, target, [{view: ["void", "table"], list: [{type: "tr", list: [
|
||||
{type: "td", list: [{view: "project"}]}, {type: "td", list: [
|
||||
project: function(can, target) { target = target || can._target
|
||||
return can.page.Append(can, target, [{view: ["void", "table"], list: [{type: "tr", list: [
|
||||
{type: "td", list: [{view: "project", style: {display: "none"}}]}, {type: "td", list: [
|
||||
{view: ["void", "table"], list: [
|
||||
{type: "tr", list: [{view: "content"}]},
|
||||
{type: "tr", list: [{view: "display"}]},
|
||||
|
@ -191,6 +191,9 @@ fieldset>div.action>div.item {
|
||||
fieldset>div.action>div.item.space {
|
||||
width:10px;
|
||||
}
|
||||
fieldset>div.action>div.item label {
|
||||
display:none;
|
||||
}
|
||||
fieldset>div.status>div.item {
|
||||
float:left; padding:4px;
|
||||
}
|
||||
|
@ -7,6 +7,6 @@ fieldset.drawer div.output div.project div.item:hover {
|
||||
fieldset.drawer div.output div.project div.item.select {
|
||||
background-color:red; border:solid 2px yellow;
|
||||
}
|
||||
fieldset.drawer div.output svg {
|
||||
border: 1px solid red;
|
||||
fieldset.drawer div.output div.content svg {
|
||||
background-color:#1b5b738c;
|
||||
}
|
||||
|
@ -1,11 +1,6 @@
|
||||
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { can._output.innerHTML = ""
|
||||
can.onappend.table(can, "content", msg, null, target), can.ui = can.page.Append(can, target, [
|
||||
{view: "project", style: {display: "none"}},
|
||||
{view: "content", onmouseenter: function(event) {
|
||||
can.onkeypop.action = can
|
||||
}}, {view: "display"},
|
||||
])
|
||||
can.page.Modify(can, can._action, {style: {display: "none"}})
|
||||
can.ui = can.onlayout.project(can)
|
||||
can.onmotion.hidden(can, can._action)
|
||||
|
||||
// 交互数据
|
||||
can.point = [], can.keys = []
|
||||
@ -14,7 +9,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
|
||||
can.current = null
|
||||
|
||||
// 加载绘图
|
||||
var code = can.onappend.board(can, "content", msg.Result()||can.onexport.content(can), can.ui.content)
|
||||
can.page.Modify(can, can.ui.content, msg.Result()||can.onexport.content(can))
|
||||
can.page.Select(can, can.ui.content, "svg", function(svg) { can.svg = can.group = svg
|
||||
can.onimport.block(can, svg), can.onimport.group(can, svg).click()
|
||||
can.page.Select(can, svg, "*", function(item, index) {
|
||||
|
@ -100,5 +100,57 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg,
|
||||
"结束": function(event, can, name) { can.user.confirm("确定结束?") && can.run(event, ["action", name], function(msg) {
|
||||
can.run({})
|
||||
}, true) },
|
||||
|
||||
"关闭": function(event, can) {
|
||||
can.page.Remove(can, can._target)
|
||||
},
|
||||
"复制": function(event, can) {
|
||||
can.onaction._show(can, args, {
|
||||
position: "fixed",
|
||||
left: layout.left+100, top: layout.top+100,
|
||||
width: layout.width, height: layout.height,
|
||||
})
|
||||
},
|
||||
"分屏": function(event, can) {
|
||||
if (event.ctrlKey) {
|
||||
layout.height = layout.height/2
|
||||
can.onaction._resize(sub, layout)
|
||||
|
||||
can.onaction._show(can, args, {
|
||||
position: "fixed",
|
||||
left: layout.left, top: layout.top+layout.height+10,
|
||||
width: layout.width, height: layout.height,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
layout.width = layout.width/2
|
||||
can.onaction._resize(sub, layout)
|
||||
|
||||
can.onaction._show(can, args, {
|
||||
position: "fixed",
|
||||
left: layout.left+layout.width+10, top: layout.top,
|
||||
width: layout.width, height: layout.height,
|
||||
})
|
||||
},
|
||||
"最大": function(event, can) {
|
||||
if (event.ctrlKey) {
|
||||
layout.left = 0, layout.top = 40
|
||||
layout.width = window.innerWidth/2
|
||||
layout.height = window.innerHeight/2
|
||||
can.onaction._resize(sub, layout)
|
||||
return
|
||||
}
|
||||
|
||||
layout.left = 0, layout.top = 40
|
||||
layout.width = window.innerWidth-40
|
||||
layout.height = window.innerHeight-60
|
||||
if (can.user.isMobile) {
|
||||
if (window.innerWidth > window.innerHeight) {
|
||||
layout.top = 0
|
||||
}
|
||||
}
|
||||
can.onaction._resize(sub, layout)
|
||||
},
|
||||
})
|
||||
Volcanos("onexport", {help: "导出数据", list: []})
|
||||
|
@ -1,22 +0,0 @@
|
||||
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { can._output.innerHTML = "";
|
||||
can.ui = can.page.Append(can, can._target, [
|
||||
{view: ["content", "div"]}, {view: ["display", "pre"]},
|
||||
])
|
||||
can.onappend.table(can, "content", msg, null, can.ui.content)
|
||||
can.onappend.board(can, "content", msg.Result(), can.ui.display)
|
||||
return typeof cb == "function" && cb(msg)
|
||||
},
|
||||
})
|
||||
Volcanos("onaction", {help: "控件交互", list: [],
|
||||
"添加": function(event, can) {
|
||||
},
|
||||
})
|
||||
Volcanos("ondetail", {help: "控件交互", list: ["编辑", "删除"],
|
||||
"编辑": function(event, can, key) {
|
||||
console.log(key)
|
||||
},
|
||||
"删除": function(event, can, key) {
|
||||
console.log(key)
|
||||
},
|
||||
})
|
||||
|
@ -1,62 +1,26 @@
|
||||
Volcanos("onimport", {help: "导入数据", list: [],
|
||||
_init: function(can, msg, list, cb, target) { can._output.innerHTML = ""
|
||||
if (msg.Option("_display") == "table") {
|
||||
can.onappend.table(can, "content", msg, function(value, key) {
|
||||
return {text: [value, "td"], click: function(event) {
|
||||
can.sup.onaction.change(event, can.sup, key, value, function(msg) {
|
||||
can.run(event)
|
||||
})
|
||||
}}
|
||||
}, can._target)
|
||||
return typeof cb == "function" && cb(msg)
|
||||
}
|
||||
can.ui = can.page.Append(can, can._output, [{view: "content"}, {view: "display"}])
|
||||
can.dir_root = msg.Option("dir_root")
|
||||
|
||||
can.onappend._init(can, {name: "draw", help: "绘图", inputs: [
|
||||
{type: "text", name: "path", value: "hi.svg"},
|
||||
{type: "button", name: "查看", value: "auto"},
|
||||
], index: "web.wiki.draw.draw", feature: {display: "/plugin/local/wiki/draw.js"}}
|
||||
, Volcanos.meta.libs.concat(["/plugin/state.js"]), function(sub) {
|
||||
can.page.Modify(can, sub._legend, {style: {display: "none"}})
|
||||
can.page.Modify(can, sub._option, {style: {display: "none"}})
|
||||
can.page.Modify(can, sub._action, {style: {display: "none"}})
|
||||
can.page.Modify(can, sub._status, {style: {display: "none"}})
|
||||
sub.run = function(event, cmds, cb, silent) {
|
||||
typeof cb == "function" && cb(can.request(event))
|
||||
can.core.Timer(1000, function() {
|
||||
can.sub = sub._outputs[0]
|
||||
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
|
||||
typeof cb == "function" && cb(msg)
|
||||
can.msg = msg, can.data = msg.Table()
|
||||
can.Action("height", "400")
|
||||
can.Action("speed", "100")
|
||||
can.Action("scale", "1")
|
||||
can.Action("stroke-width", "1")
|
||||
can.dir_root = msg.Option("dir_root")
|
||||
can._tree = can.onimport._tree(can, msg)
|
||||
can.Action("scale", parseInt(msg.Option("scale")||"1"))
|
||||
|
||||
can.onmotion.clear(can)
|
||||
can.onappend.plugins(can, {index: "web.wiki.draw"}, function(sub) {
|
||||
sub.run = function(event, cmds, cb, silent) {
|
||||
typeof cb == "function" && cb(sub.request())
|
||||
|
||||
can.core.Timer(100, function() { can.sub = sub._outputs[0]
|
||||
can.sub.svg.Value("transform", "scale("+(can.Action("scale")||1)+")")
|
||||
can.onaction["横向"](event, can)
|
||||
sub.Action("go", "run")
|
||||
|
||||
can.onaction[can.Action("view")](event, can)
|
||||
can.onlayout.resize(can, "action.resize", function(event) {
|
||||
can.onaction[can.Action("view")](event, can)
|
||||
})
|
||||
})
|
||||
}
|
||||
}, can.ui.content)
|
||||
},
|
||||
})
|
||||
Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "横向", "纵向"], ["scale", "0.2", "0.5", "1", "2", "5"]],
|
||||
"编辑": function(event, can) {
|
||||
var hide = can.sub._action.style.display == "none"
|
||||
can.page.Modify(can, can.sub._action, {style: {display: hide? "": "none"}})
|
||||
can.page.Modify(can, can.sub._status, {style: {display: hide? "": "none"}})
|
||||
},
|
||||
"清空": function(event, can) {
|
||||
can.sub.svg.innerHTML = ""
|
||||
},
|
||||
view: function(event, can, cmd, value) {
|
||||
can.onaction[value](event, can)
|
||||
},
|
||||
height: function(event, can, cmd) {
|
||||
can.onaction[can.Action("view")](event, can)
|
||||
},
|
||||
scale: function(event, can, cmd) {
|
||||
can.sub.svg.Value("transform", "scale("+can.Action("scale")+")")
|
||||
can.onaction[can.Action("view")](event, can)
|
||||
},
|
||||
|
||||
_tree: function(can, msg) { var list = {}
|
||||
@ -74,189 +38,128 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "横向",
|
||||
_height: function(can, tree) {
|
||||
if (!tree) { return }
|
||||
if (tree.hide) { return tree.height = 1 }
|
||||
if (tree.list.length == 0) { return tree.height = 1 }
|
||||
|
||||
if (tree.list.length == 0) {
|
||||
return tree.height = 1
|
||||
}
|
||||
|
||||
var height = 0
|
||||
can.core.List(tree.list, function(item) {
|
||||
height += can.onaction._height(can, item)
|
||||
var height = 0; can.core.List(tree.list, function(item) {
|
||||
height += can.onimport._height(can, item)
|
||||
})
|
||||
return tree.height = height
|
||||
},
|
||||
_draw: function(can, tree, x, y) { var sub = can.sub, name = tree.name || can.Option("name") || "."
|
||||
tree.view = sub.onimport.draw({}, sub, {
|
||||
shape: "text", point: [{x: x, y: y+tree.height*30/2}], style: {inner: name, "text-anchor": "start", "stroke-width": 1, fill: "yellow"},
|
||||
})
|
||||
if (x+name.length*16 > can.width) {
|
||||
can.width = x+name.length*20
|
||||
Volcanos("onaction", {help: "操作数据", list: ["编辑", ["view", "横向", "纵向"], ["scale", "0.2", "0.5", "1", "2", "5"]],
|
||||
"编辑": function(event, can) {
|
||||
can.onmotion.toggle(can, can.sub._action)
|
||||
can.onmotion.toggle(can, can.sub._status)
|
||||
},
|
||||
"清空": function(event, can) {
|
||||
can.onmotion.clear(can, can.sub.svg)
|
||||
},
|
||||
view: function(event, can, cmd, key) {
|
||||
can.onaction[key](event, can)
|
||||
},
|
||||
height: function(event, can) {
|
||||
can.onaction[can.Action("view")](event, can)
|
||||
},
|
||||
scale: function(event, can) {
|
||||
can.sub.svg.Value("transform", "scale("+(can.Action("scale")||"1")+")")
|
||||
can.onaction[can.Action("view")](event, can)
|
||||
},
|
||||
|
||||
_show: function(can, args, layout) {
|
||||
can.page.Remove(can, can.inner), can.onappend.plugin(can, {
|
||||
index: "web.code.inner", args: args,
|
||||
_action: ["关闭", "最大", "分屏", "复制"],
|
||||
width: layout.width, height: layout.height,
|
||||
}, function(sub) { can.inner = sub._target
|
||||
sub.run = function(event, cmds, cb, silent) {
|
||||
can.run(event, ["action", "inner"].concat(cmds), function(msg) {
|
||||
typeof cb == "function" && cb(msg)
|
||||
}, true)
|
||||
}
|
||||
can.page.Modify(can, sub._target, {style: layout})
|
||||
})
|
||||
},
|
||||
_draw: function(can, tree, x, y) { var sub = can.sub, name = tree.name || can.Option("name") || "."
|
||||
if (x+name.length*16 > can.width) { can.width = x+name.length*20 }
|
||||
|
||||
tree.view = sub.onimport.draw({}, sub, {
|
||||
shape: "text", point: [
|
||||
{x: x, y: y+tree.height*30/2}
|
||||
], style: {
|
||||
"stroke-width": 1, "fill": "yellow", "text-anchor": "start", inner: name,
|
||||
},
|
||||
})
|
||||
|
||||
tree.view.onclick = function(event) {
|
||||
if (name.endsWith("/") || tree.tags) {
|
||||
sub.svg.innerHTML = ""
|
||||
tree.hide = !tree.hide
|
||||
can.onaction["横向"](event, can)
|
||||
can.onaction[can.Action("view")](event, can)
|
||||
return
|
||||
}
|
||||
|
||||
if (tree.name.endsWith("go") ||
|
||||
tree.name.endsWith("c") ||
|
||||
tree.name.endsWith("h")) {
|
||||
if (tree.name.endsWith("go") || tree.name.endsWith("c") || tree.name.endsWith("h")) {
|
||||
can.run(event, [can.Option("name"), tree.file], function(msg) {
|
||||
msg.Table(function(value) { tree.tags = true
|
||||
tree.list.push({type: "tags", file: value.file, line: value.line, name: value.name, last: tree, list: []})
|
||||
})
|
||||
|
||||
sub.svg.innerHTML = ""
|
||||
tree.hide = !tree.hide
|
||||
can.onaction["横向"](event, can)
|
||||
can.onaction[can.Action("view")](event, can)
|
||||
}, true)
|
||||
return
|
||||
}
|
||||
|
||||
var width = 720, height = 400
|
||||
can.onaction._show(can, [can.dir_root, tree.file, tree.line], {
|
||||
position: "fixed", width: 800, height: 600,
|
||||
left: event.x-(event.x>600? 400: 100),
|
||||
top: event.y-(event.y>600? 400: 0),
|
||||
position: "fixed", width: width, height: height+240,
|
||||
left: event.x+width>window.innerWidth? window.innerWidth-width: event.x,
|
||||
top: event.y+height+120>window.innerHeight? window.innerHeight-height-120: event.y,
|
||||
})
|
||||
}
|
||||
tree.view.onmouseenter = function(event) {
|
||||
can.page.Remove(can, can.pos)
|
||||
can.pos = sub.onimport.draw({}, sub, {
|
||||
shape: "rect", point: [{x: x, y: y+tree.height*30/2-15}, {
|
||||
x: x+name.length*16,
|
||||
y: y+tree.height*30/2+15,
|
||||
}], style: {"stroke": "red", "stroke-width": 1, fill: "none"},
|
||||
shape: "rect", point: [
|
||||
{x: x, y: y+tree.height*30/2-15},
|
||||
{x: x+name.length*16, y: y+tree.height*30/2+15},
|
||||
], style: {
|
||||
"stroke": "red", "stroke-width": 1, "fill": "none",
|
||||
},
|
||||
})
|
||||
event.stopPropagation()
|
||||
event.preventDefault()
|
||||
event.stopPropagation(), event.preventDefault()
|
||||
}
|
||||
|
||||
if (tree.hide) { return }
|
||||
var offset = 0
|
||||
can.core.List(tree.list, function(item) {
|
||||
|
||||
function line(p0, p1) {
|
||||
return "M "+p0.x+","+p0.y+" Q "+(p0.x+(p1.x-p0.x)/3)+","+p0.y+" "+(p0.x+p1.x)/2+","+(p0.y+p1.y)/2+" T "+p1.x+","+p1.y
|
||||
}
|
||||
|
||||
var offset = 0; can.core.List(tree.list, function(item) {
|
||||
sub.onimport.draw({}, sub, {
|
||||
shape: "path", point: [], style: {
|
||||
fill: "none",
|
||||
stroke: "cyan", "stroke-width": 1, d: line(
|
||||
"stroke-width": 1, "stroke": "cyan", "fill": "none", d: line(
|
||||
{x: x+name.length*16-10, y: y+tree.height*30/2},
|
||||
{x: x+name.length*16+40, y: y+offset+item.height*30/2}
|
||||
),
|
||||
},
|
||||
})
|
||||
|
||||
can.onaction._draw(can, item, x+name.length*20+20, y+offset)
|
||||
offset += item.height*30
|
||||
})
|
||||
},
|
||||
_resize: function(can, layout) {
|
||||
can.page.Modify(can, can._target, {style: layout})
|
||||
can.page.Select(can, can._output, "div.profile", function(item) {
|
||||
can.page.Modify(can, item, {style: {
|
||||
"max-height": layout.height-60,
|
||||
"width": layout.width,
|
||||
}})
|
||||
})
|
||||
can.page.Select(can, can._output, "div.content", function(item) {
|
||||
can.page.Modify(can, item, {style: {
|
||||
"max-width": layout.width - 100,
|
||||
}})
|
||||
})
|
||||
can.page.Select(can, can._output, "div.search", function(item) {
|
||||
can.page.Modify(can, item, {style: {
|
||||
position: "absolute", bottom: 0,
|
||||
width: layout.width,
|
||||
}})
|
||||
})
|
||||
},
|
||||
_show: function(can, args, layout) {
|
||||
can.onappend.plugin(can, {index: "web.code.inner", args: args, _action: ["最大", "分屏", "复制", "关闭"], width: layout.width, height: layout.height}, function(sub, value) {
|
||||
can.onmotion.move(sub, sub._target, layout)
|
||||
can.onaction._resize(sub, layout)
|
||||
|
||||
sub.run = function(event, cmds, cb, silent) {
|
||||
switch (cmds[1]) {
|
||||
case "关闭":
|
||||
can.page.Remove(can, sub._target)
|
||||
break
|
||||
case "复制":
|
||||
can.onaction._show(can, args, {
|
||||
position: "fixed",
|
||||
left: layout.left+100, top: layout.top+100,
|
||||
width: layout.width, height: layout.height,
|
||||
})
|
||||
break
|
||||
case "分屏":
|
||||
if (event.ctrlKey) {
|
||||
layout.height = layout.height/2
|
||||
can.onaction._resize(sub, layout)
|
||||
|
||||
can.onaction._show(can, args, {
|
||||
position: "fixed",
|
||||
left: layout.left, top: layout.top+layout.height+10,
|
||||
width: layout.width, height: layout.height,
|
||||
})
|
||||
break
|
||||
}
|
||||
|
||||
layout.width = layout.width/2
|
||||
can.onaction._resize(sub, layout)
|
||||
|
||||
can.onaction._show(can, args, {
|
||||
position: "fixed",
|
||||
left: layout.left+layout.width+10, top: layout.top,
|
||||
width: layout.width, height: layout.height,
|
||||
})
|
||||
break
|
||||
case "最大":
|
||||
if (event.ctrlKey) {
|
||||
layout.left = 0, layout.top = 40
|
||||
layout.width = window.innerWidth/2
|
||||
layout.height = window.innerHeight/2
|
||||
can.onaction._resize(sub, layout)
|
||||
break
|
||||
}
|
||||
|
||||
layout.left = 0, layout.top = 40
|
||||
layout.width = window.innerWidth-40
|
||||
layout.height = window.innerHeight-60
|
||||
if (can.user.isMobile) {
|
||||
if (window.innerWidth > window.innerHeight) {
|
||||
layout.top = 0
|
||||
}
|
||||
}
|
||||
can.onaction._resize(sub, layout)
|
||||
break
|
||||
default:
|
||||
can.run(event, ["inner"].concat(cmds), function(msg) {
|
||||
cb(msg), can.core.Timer(10, function() {
|
||||
// can.onaction._resize(sub, layout)
|
||||
})
|
||||
}, true)
|
||||
}
|
||||
}
|
||||
if (can.user.isMobile) {
|
||||
can.core.Timer(100, function() {
|
||||
sub.run({}, ["some", "最大"])
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
"横向": function(event, can) { var sub = can.sub
|
||||
can.width = 0
|
||||
can._tree = can._tree || can.onaction._tree(can, can._msg)
|
||||
can.onaction._height(can, can._tree[""])
|
||||
"横向": function(event, can) {
|
||||
if (!can._tree[""]) { return }
|
||||
sub.svg.Val("height", can._tree[""].height*30)
|
||||
can.onaction._draw(can, can._tree[""], 0, 0)
|
||||
sub.svg.Val("width", can.width)
|
||||
|
||||
can.onmotion.clear(can, can.sub.svg)
|
||||
can.onimport._height(can, can._tree[""])
|
||||
can.sub.svg.Val("height", can._tree[""].height*30)
|
||||
can.width = 0, can.onaction._draw(can, can._tree[""], 0, 0)
|
||||
can.sub.svg.Val("width", can.width)
|
||||
},
|
||||
"纵向": function(event, can) {
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
|
@ -1,6 +0,0 @@
|
||||
Volcanos("onimport", {help: "导入数据", list: [],
|
||||
_init: function(can, msg, list, cb, target) { can._output.innerHTML = ""
|
||||
|
||||
},
|
||||
})
|
||||
|
@ -1,80 +1,56 @@
|
||||
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { can._output.innerHTML = ""
|
||||
var list = []; can.onengine.listen(can, "action.resize", function(width, height) {
|
||||
can.Conf({width: width, height: height}), can.core.Delay(list, 100, function() {
|
||||
can.onimport._init(can, msg, list, cb, target)
|
||||
})
|
||||
})
|
||||
|
||||
if (msg.Option("_display") == "table") {
|
||||
can.onappend.table(can, "content", msg, function(value, key) {
|
||||
return {text: [value, "td"], click: function(event) {
|
||||
can.sup.onaction.change(event, can.sup, key, value, function(msg) {
|
||||
can.run(event)
|
||||
})
|
||||
}}
|
||||
}, can._target)
|
||||
return typeof cb == "function" && cb(msg)
|
||||
}
|
||||
can.ui = can.page.Append(can, can._output, [{view: "content"}, {view: "display"}])
|
||||
|
||||
can.onappend._init(can, {name: "draw", help: "绘图", inputs: [
|
||||
{type: "text", name: "path", value: "hi.svg"},
|
||||
{type: "button", name: "查看", value: "auto"},
|
||||
], index: "web.wiki.draw.draw", feature: {display: "/plugin/local/wiki/draw.js"}}
|
||||
, Volcanos.meta.libs.concat(["/plugin/state.js"]), function(sub) {
|
||||
can.page.Modify(can, sub._legend, {style: {display: "none"}})
|
||||
can.page.Modify(can, sub._option, {style: {display: "none"}})
|
||||
can.page.Modify(can, sub._action, {style: {display: "none"}})
|
||||
can.page.Modify(can, sub._status, {style: {display: "none"}})
|
||||
sub.run = function(event, cmds, cb, silent) {
|
||||
typeof cb == "function" && cb(can.request(event))
|
||||
can.core.Timer(100, function() {
|
||||
can.sub = sub._outputs[0]
|
||||
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
|
||||
typeof cb == "function" && cb(msg)
|
||||
can.msg = msg, can.data = msg.Table()
|
||||
var action = can.Conf("action")
|
||||
can.Action("height", parseInt(action && action.height ||"400"))
|
||||
can.Action("speed", parseInt(action && action.speed ||"100"))
|
||||
can.onaction["股价图"](event, can)
|
||||
can.Action("speed", parseInt(msg.Option("speed")||"100"))
|
||||
can.Action("height", parseInt(msg.Option("height")||"400"))
|
||||
|
||||
can.onmotion.clear(can)
|
||||
can.onappend.plugins(can, {index: "web.wiki.draw"}, function(sub) {
|
||||
sub.run = function(event, cmds, cb, silent) {
|
||||
typeof cb == "function" && cb(sub.request())
|
||||
|
||||
can.core.Timer(100, function() { can.sub = sub._outputs[0]
|
||||
can.onaction[can.Action("view")](event, can)
|
||||
can.onlayout.resize(can, "action.resize", function(event) {
|
||||
can.onaction[can.Action("view")](event, can)
|
||||
})
|
||||
})
|
||||
}
|
||||
}, can.ui.content)
|
||||
return typeof cb == "function" && cb(msg)
|
||||
})
|
||||
},
|
||||
})
|
||||
Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", ["view", "股价图", "趋势图", "数据源"], ["height", "100", "200", "400", "600"], ["speed", "10", "20", "50", "100"]],
|
||||
"编辑": function(event, can) {
|
||||
var hide = can.sub._action.style.display == "none"
|
||||
can.page.Modify(can, can.sub._action, {style: {display: hide? "": "none"}})
|
||||
can.page.Modify(can, can.sub._status, {style: {display: hide? "": "none"}})
|
||||
can.onmotion.toggle(can, can.sub._action)
|
||||
can.onmotion.toggle(can, can.sub._status)
|
||||
},
|
||||
"清空": function(event, can) {
|
||||
can.sub.svg.innerHTML = ""
|
||||
can.onmotion.clear(can, can.sub.svg)
|
||||
},
|
||||
view: function(event, can, cmd, value) {
|
||||
can.onaction[value](event, can)
|
||||
view: function(event, can, cmd, key) {
|
||||
can.onaction[key](event, can)
|
||||
},
|
||||
height: function(event, can, cmd) {
|
||||
height: function(event, can, key) {
|
||||
can.onaction[can.Action("view")](event, can)
|
||||
},
|
||||
|
||||
"股价图": function(event, can) { var sub = can.sub, data = can.data
|
||||
if (!can.list) { var count = 0, add = 0, del = 0, max = 0, begin = ""
|
||||
can.max = 0, can.min = 0, can.rest = 0, can.list = can.core.List(data, function(value, index) {
|
||||
if (index == 0) { begin = value.date }
|
||||
var line = {};
|
||||
line.note = value[can.msg.append[4]]
|
||||
line.date = value[can.msg.append[0]]
|
||||
line.add = parseInt(value[can.msg.append[1]])
|
||||
line.del = parseInt(value[can.msg.append[2]])
|
||||
if (!can.list) { var begin = "", count = 0, rest = 0, add = 0, del = 0, max = 0
|
||||
can.max = 0, can.min = 0, can.list = can.core.List(data, function(value, index) {
|
||||
var line = {
|
||||
note: value[can.msg.append[4]],
|
||||
date: value[can.msg.append[0]],
|
||||
add: parseInt(value[can.msg.append[1]]),
|
||||
del: parseInt(value[can.msg.append[2]]),
|
||||
}
|
||||
|
||||
line.begin = can.rest
|
||||
line.max = can.rest + line.add
|
||||
line.min = can.rest - line.del
|
||||
line.close = can.rest = can.rest + line.add - line.del
|
||||
line.begin = rest
|
||||
line.max = rest + line.add
|
||||
line.min = rest - line.del
|
||||
line.close = rest + line.add - line.del
|
||||
|
||||
count++
|
||||
add += line.add
|
||||
del += line.del
|
||||
begin = begin || value.date, count++
|
||||
rest = line.close, add += line.add, del += line.del
|
||||
if (line.max - line.min > max) {
|
||||
max = line.max - line.min
|
||||
}
|
||||
@ -85,116 +61,97 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", ["view",
|
||||
can.Status("from", begin)
|
||||
can.Status("commit", count)
|
||||
can.Status("total", add+del)
|
||||
can.Status("max", max)
|
||||
}
|
||||
|
||||
var space = 10
|
||||
var view = parseInt(can.Action("height"))
|
||||
var max = parseInt(can.Conf("width"))-120
|
||||
var step = parseInt(max / can.list.length)||2
|
||||
can.onmotion.clear(can, sub.svg)
|
||||
|
||||
var width = can.list.length * step + space * 2
|
||||
sub.svg.Val("width", width)
|
||||
|
||||
var height = view + space * 2
|
||||
sub.svg.Val("height", height)
|
||||
|
||||
sub.svg.innerHTML = ""
|
||||
can.ui.display.innerHTML = ""
|
||||
sub.svg.Val("width", width)
|
||||
|
||||
function compute(y) { return (y - can.min)/(can.max - can.min)*view }
|
||||
var i = 0; can.core.Next(can.list, function(line, next) {
|
||||
(function() { var index = i++
|
||||
can.core.Next(can.list, function(line, next, index) {
|
||||
sub.onimport.draw({}, sub, {
|
||||
shape: "line", point: [
|
||||
{x: space/2+step*index+step/4, y: space/2+view-compute(line.min)},
|
||||
{x: space/2+step*index+step/4, y: space/2+view-compute(line.max)},
|
||||
], style: line.begin < line.close? {
|
||||
"stroke-width": 1, "stroke": "white",
|
||||
}: {
|
||||
"stroke-width": 1, "stroke": "black",
|
||||
], style: {
|
||||
"stroke-width": 1, "stroke": line.begin < line.close? "white": "black",
|
||||
},
|
||||
})
|
||||
|
||||
var one = line.begin < line.close? sub.onimport.draw({}, sub, {
|
||||
var one = sub.onimport.draw({}, sub, line.begin < line.close? {
|
||||
shape: "rect", point: [
|
||||
{x: space/2+step*index, y: space/2+view-compute(line.begin)},
|
||||
{x: space/2+step*index+step/2, y: space/2+view-compute(line.close)},
|
||||
], style: {
|
||||
"rx": 0, "ry": 0, "stroke-width": 1, "stroke": "white", "fill": "white",
|
||||
"stroke-width": 1, "stroke": "white", "fill": "white", "rx": 0, "ry": 0,
|
||||
},
|
||||
}): sub.onimport.draw({}, sub, {
|
||||
}: {
|
||||
shape: "rect", point: [
|
||||
{x: space/2+step*index, y: space/2+view-compute(line.close)},
|
||||
{x: space/2+step*index+step/2, y: space/2+view-compute(line.begin)},
|
||||
], style: {
|
||||
"rx": 0, "ry": 0, "stroke-width": 1, "stroke": "black", "fill": "black",
|
||||
},
|
||||
})
|
||||
|
||||
one.onmouseover = function(event) { can.Status(line) }
|
||||
}); one.onmouseover = function(event) { can.Status(line) }
|
||||
|
||||
can.core.Timer(parseInt(can.Action("speed")), next)
|
||||
})()
|
||||
})
|
||||
},
|
||||
"趋势图": function(event, can, value, cmd, target) {var sub = can.sub, data = can.data;
|
||||
"趋势图": function(event, can, value, cmd, target) { var sub = can.sub, data = can.data
|
||||
var space = 10
|
||||
var view = parseInt(can.Action("height"))
|
||||
var max = parseInt(can.Conf("width"))-120
|
||||
var step = parseInt(max / can.list.length)||2
|
||||
can.onmotion.clear(can, sub.svg)
|
||||
|
||||
var width = can.list.length * step + space * 2
|
||||
sub.svg.Val("width", width)
|
||||
|
||||
var max = {}
|
||||
var height = 0
|
||||
var max = {};
|
||||
can.core.List(can.msg.append, function(key, which) {
|
||||
height += view + space * 2
|
||||
max[key] = 0;
|
||||
can.core.List(data, function(value, index) {
|
||||
|
||||
max[key] = 0, can.core.List(data, function(value, index) {
|
||||
if ((parseInt(value[key])||0) > max[key]) {
|
||||
max[key] = parseInt(value[key])||0
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
var width = can.list.length * step + space * 2
|
||||
sub.svg.Val("height", height+space*2)
|
||||
sub.svg.Val("width", width)
|
||||
|
||||
sub.svg.innerHTML = ""
|
||||
can.core.List(can.msg.append, function(key, which) {
|
||||
var y = (space*2+view)*(which+1)
|
||||
can.core.List(can.msg.append, function(key, which) { var y = (space*2+view)*(which+1)
|
||||
sub.onimport.draw({}, sub, {
|
||||
shape: "text", point: [
|
||||
{x: width/2, y: y+space},
|
||||
],
|
||||
style: {
|
||||
"font-size": 20,
|
||||
"stroke-width": 0,
|
||||
"fill": "red",
|
||||
inner: key,
|
||||
], style: {
|
||||
"font-size": 20, "stroke-width": 0, "fill": "red", inner: key,
|
||||
},
|
||||
})
|
||||
|
||||
can.core.List(data, function(line, index) {
|
||||
var one = sub.onimport.draw({}, sub, {
|
||||
shape: "rect",
|
||||
point: [
|
||||
shape: "rect", point: [
|
||||
{x: space+step*index, y: y},
|
||||
{x: space+step*index+step/4, y: y-parseInt(line[key])/(max[key]||1)*view}
|
||||
],
|
||||
style: {
|
||||
"rx": 0, "ry": 0,
|
||||
"stroke-width": 1, "stroke": "white", "fill": "white",
|
||||
], style: {
|
||||
"stroke-width": 1, "stroke": "white", "fill": "white", "rx": 0, "ry": 0,
|
||||
},
|
||||
})
|
||||
|
||||
one.onmouseover = function(event) { can.Status(line) }
|
||||
}); one.onmouseover = function(event) { can.Status(line) }
|
||||
})
|
||||
})
|
||||
},
|
||||
"数据源": function(event, can) {
|
||||
can.ui.display.innerHTML = ""
|
||||
can.onappend.table(can, "content", can._msg, null, can.ui.display)
|
||||
can.onmotion.clear(can, can.sub.ui.display)
|
||||
can.onappend.table(can, "content", can.msg, null, can.sub.ui.display)
|
||||
},
|
||||
})
|
||||
Volcanos("onexport", {help: "导出数据", list: ["from", "commit", "total", "date", "begin", "add", "del", "close", "note"]})
|
||||
|
Loading…
x
Reference in New Issue
Block a user