1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00

add spide.js

This commit is contained in:
shaoying 2020-07-17 02:14:07 +08:00
parent d18228996d
commit dacac17112
6 changed files with 305 additions and 363 deletions

View File

@ -177,8 +177,8 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met
// 添加插件 // 添加插件
var sub = Volcanos(meta.name, { _help: meta.name, _follow: can._follow+"."+meta.name, var sub = Volcanos(meta.name, { _help: meta.name, _follow: can._follow+"."+meta.name,
_legend: legend, _option: option, _action: action, _output: output, _status: status,
_target: field, _inputs: {}, _outputs: [], _history: [], _target: field, _inputs: {}, _outputs: [], _history: [],
_option: option, _action: action, _output: output,
Option: function(key, value) { Option: function(key, value) {
if (typeof key == "object") { return sub.core.Item(key, sub.Option), key } if (typeof key == "object") { return sub.core.Item(key, sub.Option), key }
if (key == undefined) { value = {} if (key == undefined) { value = {}
@ -611,7 +611,6 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can) {
show: function(can, target, time) { time = time || {value: 100, length: 30} show: function(can, target, time) { time = time || {value: 100, length: 30}
can.page.Modify(can, target, {style: {opacity: 0}}) can.page.Modify(can, target, {style: {opacity: 0}})
can.Timer(time, function(event, value, index) { can.Timer(time, function(event, value, index) {
console.log(arguments)
can.page.Modify(can, target, {style: {opacity: (index+1)/time.length}}) can.page.Modify(can, target, {style: {opacity: (index+1)/time.length}})
}, function() { }, function() {
}) })

View File

@ -106,6 +106,10 @@ fieldset.editor>div.output div.search {
height:120px; overflow:auto; height:120px; overflow:auto;
clear:both; clear:both;
} }
fieldset.editor>div.output div.search td>div {
max-height:100px;
overflow:hidden;
}
fieldset.editor>div.output div.holdon { fieldset.editor>div.output div.holdon {
max-height:400px; overflow:auto; max-height:400px; overflow:auto;
} }

View File

@ -41,7 +41,6 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb,
can.onimport.project(can, can.Option("path")) can.onimport.project(can, can.Option("path"))
can.onsyntax._init(can, msg) can.onsyntax._init(can, msg)
can.onkeymap._init(can) can.onkeymap._init(can)
can.onaction.selectLine(can, parseInt(msg.Option("line")))
}) })
return typeof cb == "function" && cb(msg) return typeof cb == "function" && cb(msg)
}, },
@ -58,17 +57,23 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb,
var push = {path: path, file: file, line: line} var push = {path: path, file: file, line: line}
!can.core.Eq(can.history[can.history.length-1], push) && can.history.push(push) !can.core.Eq(can.history[can.history.length-1], push) && can.history.push(push)
can.Option({path: path, file: file, line: line||1}) function show() {
if (can.tabview[path+file]) { if (can._msg) {
can.onsyntax._init(can, can.tabview[path+file]) can._msg.Option("line", can.Option("line"))
can.onaction.selectLine(can, line||1) }
return
can._msg = can.tabview[path+file]
can.file = file, can.parse = can.base.Ext(file), can.max = 0
can.Option({path: path, file: file, line: line||parseInt(can._msg.Option("line"))})
can.onsyntax._init(can, can._msg)
} }
can.run({}, [path, file], function(msg) { if (can.tabview[path+file]) { return show() }
msg.Option({path: can.Option("path"), file: can.Option("file")})
can.run({}, ["action", "render", can.base.Ext(file), file, path], function(msg) {
can.tabview[path+file] = msg
msg.Option({path: path, file: file, line: line})
can.page.Append(can, can._action, [{view: ["file", "div", file], onclick: function(event) { can.page.Append(can, can._action, [{view: ["file", "div", file], onclick: function(event) {
can.onsyntax._init(can, can.tabview[path+file] = msg) can.onimport.tabview(can, path, file)
can.Option({path: path, file: file, line: line||1})
}, ondblclick: function(event) { }, ondblclick: function(event) {
can.onkeymap._remote(event, can, "运行") can.onkeymap._remote(event, can, "运行")
}, oncontextmenu: function(event) { }, oncontextmenu: function(event) {
@ -87,11 +92,12 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb,
}, },
}]).first.click() }]).first.click()
can.onaction.selectLine(can, line||1)
}, true) }, true)
}, },
project: function(can, path) { can.Option({path: path}) project: function(can, path) { can.Option({path: path})
can.run({}, [path+"/"], function(msg) { can.ui.project.innerHTML = "" var msg = can.request({})
msg.Option("dir_deep", "true")
can.run(msg._event, ["action", "render", "dir", "", path+"/"], function(msg) { can.ui.project.innerHTML = ""
can.onappend.tree(can, msg, can.ui.project, function(event, value) { can.onappend.tree(can, msg, can.ui.project, function(event, value) {
can.onimport.tabview(can, can.Option("path"), value.path) can.onimport.tabview(can, can.Option("path"), value.path)
}) })
@ -116,9 +122,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
}); if (cache) { return } }); if (cache) { return }
// remote // remote
can.parse = can.base.Ext(can.file), can.max = 0, can.core.List(can.ls = msg.Result().split("\n"), function(item) { can.parse = can.base.Ext(can.file), can.max = 0
can.onaction.appendLine(can, item)
})
// status // status
can.Status("文件名", can.file), can.Status("解析器", can.parse) can.Status("文件名", can.file), can.Status("解析器", can.parse)
@ -129,7 +133,11 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
typeof p.display == "object" && ( p.display.height && can.page.Modify(can, can.ui.display, {style: { typeof p.display == "object" && ( p.display.height && can.page.Modify(can, can.ui.display, {style: {
// "max-height": p.display.height, // "max-height": p.display.height,
}})) }}))
}; var p = can.onsyntax[can.parse]; !p? can.run({}, ["action", "plug", can.Option("path"), can.Option("file")], function(msg) { can.core.List(can.ls = msg.Result().split("\n"), function(item) {
can.onaction.appendLine(can, item)
})
can.onaction.selectLine(can, can.Option("line")||1)
}; var p = can.onsyntax[can.parse]; !p? can.run({}, ["action", "plugin", can.parse, can.Option("file"), can.Option("path")], function(msg) {
p = can.onsyntax[can.parse] = can.base.Obj(msg.Result()), can.onsyntax._init(can, can._msg), init(p) p = can.onsyntax[can.parse] = can.base.Obj(msg.Result()), can.onsyntax._init(can, can._msg), init(p)
}, true): init(p) }, true): init(p)
}, },
@ -166,97 +174,6 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
"endif": "keyword", "endif": "keyword",
}, },
}, },
c: {link: "h"},
h: {
split: {
space: " ",
operator: "{[(.:,;!|<>)]}",
},
prefix: {
"//": "comment",
"/*": "comment",
"*": "comment",
},
keyword: {
"#include": "keyword",
"#define": "keyword",
"#ifndef": "keyword",
"#ifdef": "keyword",
"#else": "keyword",
"#endif": "keyword",
"typedef": "keyword",
"if": "keyword",
"else": "keyword",
"for": "keyword",
"while": "keyword",
"do": "keyword",
"range": "keyword",
"break": "keyword",
"continue": "keyword",
"switch": "keyword",
"case": "keyword",
"default": "keyword",
"return": "keyword",
"union": "datatype",
"struct": "datatype",
"extern": "datatype",
"unsigned": "datatype",
"static": "datatype",
"double": "datatype",
"const": "datatype",
"void": "datatype",
"long": "datatype",
"char": "datatype",
"int": "datatype",
"sizeof": "function",
"assert": "function",
"zmalloc": "function",
"NULL": "string",
"0": "string",
"1": "string",
"-1": "string",
},
},
sh: {
prefix: {"#": "comment"},
suffix: {"\x7B": "comment"},
keyword: {
"export": "keyword",
"source": "keyword",
"require": "keyword",
"if": "keyword",
"then": "keyword",
"fi": "keyword",
"for": "keyword",
"do": "keyword",
"done": "keyword",
"local": "keyword",
"echo": "keyword",
"kill": "keyword",
"let": "keyword",
"cd": "keyword",
"xargs": "function",
"date": "function",
"find": "function",
"grep": "function",
"sed": "function",
"awk": "function",
"pwd": "function",
"ps": "function",
"ls": "function",
"rm": "function",
"go": "function",
},
},
shy: { shy: {
prefix: {"#": "comment"}, prefix: {"#": "comment"},
profile: true, profile: true,
@ -272,158 +189,20 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
syntax: "keyword", syntax: "keyword",
}, },
}, },
mod: { json: {link: "js"},
prefix: {"#": "comment"}, css: {
keyword: { suffix: {"{": "comment"},
"module": "keyword",
"require": "keyword",
"replace": "keyword",
"=>": "keyword",
},
}, },
go: { html: {
split: {
space: " \t",
operator: "{[(&.:,;!|<>)]}",
},
prefix: {"//": "comment"},
keyword: {
"package": "keyword",
"import": "keyword",
"const": "keyword",
"func": "keyword",
"var": "keyword",
"type": "keyword",
"struct": "keyword",
"interface": "keyword",
"if": "keyword",
"else": "keyword",
"for": "keyword",
"range": "keyword",
"break": "keyword",
"continue": "keyword",
"switch": "keyword",
"case": "keyword",
"default": "keyword",
"fallthrough": "keyword",
"defer": "keyword",
"go": "keyword",
"select": "keyword",
"return": "keyword",
"map": "datatype",
"chan": "datatype",
"string": "datatype",
"error": "datatype",
"bool": "datatype",
"byte": "datatype",
"int": "datatype",
"int64": "datatype",
"float64": "datatype",
"len": "function",
"cap": "function",
"copy": "function",
"append": "function",
"nil": "string",
"m": "function",
"msg": "function",
},
},
godoc: {link: "go"},
js: {
split: { split: {
space: " ", space: " ",
operator: "{[(.:,;!|)]}", operator: "<>",
},
prefix: {"//": "comment"},
keyword: {
"var": "keyword",
"new": "keyword",
"delete": "keyword",
"typeof": "keyword",
"function": "keyword",
"if": "keyword",
"else": "keyword",
"for": "keyword",
"while": "keyword",
"break": "keyword",
"continue": "keyword",
"switch": "keyword",
"case": "keyword",
"default": "keyword",
"return": "keyword",
"window": "function",
"console": "function",
"document": "function",
"arguments": "function",
"event": "function",
"Date": "function",
"JSON": "function",
"0": "string",
"1": "string",
"10": "string",
"-1": "string",
"true": "string",
"false": "string",
"undefined": "string",
"null": "string",
"__proto__": "function",
"setTimeout": "function",
"createElement": "function",
"appendChild": "function",
"removeChild": "function",
"parentNode": "function",
"childNodes": "function",
"Volcanos": "function",
"request": "function",
"require": "function",
"cb": "function",
"cbs": "function",
"shy": "function",
"can": "function",
"sub": "function",
"msg": "function",
"res": "function",
"pane": "function",
"plugin": "function",
},
word: function(value, index, array) {
var libs = {base: true, core: true, misc: true, page: true, user: true}
return array[index-2]=="can"&&array[index-1]=="."&&(libs[value]||libs[value.text])? {keyword: "function", text: value.text||value}: value
},
},
json: {link: "js"},
man3: {
split: {
},
prefix: {
"NAME": "comment",
"LIBRARY": "comment",
"SYNOPSIS": "comment",
"DESCRIPTION": "comment",
"STANDARDS": "comment",
"SEE ALSO": "comment",
"HISTORY": "comment",
"BUGS": "comment",
}, },
keyword: { keyword: {
"head": "keyword",
"body": "keyword",
}, },
}, },
man2: {link: "man3"},
man1: {link: "man3"},
man8: {link: "man3"},
url: { url: {
line: function(can, line) { line: function(can, line) {
@ -789,7 +568,7 @@ Volcanos("onaction", {help: "控件交互", list: [
can.Status("npos", index+1) can.Status("npos", index+1)
value = value.replace("<", "&lt;").replace(">", "&gt;") value = value.replace("<", "&lt;").replace(">", "&gt;")
value = value.replace("./", "") value = value.replace("./", "")
return {text: [value, "td"], onclick: function(event) { return {text: ["", "td"], list: [{text: [value, "div"]}], onclick: function(event) {
line.line && can.onimport.tabview(can, can.Option("path"), line.file.replace("./", ""), parseInt(line.line)) line.line && can.onimport.tabview(can, can.Option("path"), line.file.replace("./", ""), parseInt(line.line))
}} }}
}) })

View File

@ -1,6 +1,6 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { can._output.innerHTML = "" Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { can._output.innerHTML = ""
can.onappend.table(can, target, "table", msg), can.ui = can.page.Append(can, target, [ can.onappend.table(can, target, "table", msg), can.ui = can.page.Append(can, target, [
{view: "project"}, {view: "profile"}, {view: "project", style: {display: "none"}}, {view: "profile"},
{view: "preview"}, {view: "content", onmouseenter: function(event) { {view: "preview"}, {view: "content", onmouseenter: function(event) {
can.onkeypop.action = can can.onkeypop.action = can
}}, {view: "display"}, }}, {view: "display"},
@ -41,6 +41,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
"shape": "rect", "shape": "rect",
"grid": "10", "grid": "10",
"go": "auto", "go": "auto",
"go": "manual",
}, function(key, value) { }, function(key, value) {
can.svg.Value(key, can.Action(key, can.svg.Value(key)||value)) can.svg.Value(key, can.Action(key, can.svg.Value(key)||value))
}) })
@ -344,7 +345,8 @@ Volcanos("onfigure", {help: "图形绘制", list: [],
return target.Val("yy")+tt.ty return target.Val("yy")+tt.ty
}, },
}, // <path d="M10 10 H 90 V 90 H 10 Z" fill="transparent" stroke="black"/> }, // <path d="M10 10 H 90 V 90 H 10 Z" fill="transparent" stroke="black"/>
draw: function(event, can, point) { draw: function(event, can, point, style) {
if (style && style.d) { return style }
if (point.length == 1) { can._temp = {} } if (point.length == 1) { can._temp = {} }
if (point.length < 2) {return} if (point.length < 2) {return}
@ -551,7 +553,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["", "项目", "保存", "",
{text: [" c:", "div", "item"]}, ["stroke", "red", "yellow", "green", "purple", "blue", "cyan", "white", "black"], {text: [" c:", "div", "item"]}, ["stroke", "red", "yellow", "green", "purple", "blue", "cyan", "white", "black"],
{text: [" f:", "div", "item"]}, ["fill", "red", "yellow", "green", "purple", "blue", "cyan", "white", "black", "#0000"], {text: [" f:", "div", "item"]}, ["fill", "red", "yellow", "green", "purple", "blue", "cyan", "white", "black", "#0000"],
{text: [" g:", "div", "item"]}, ["go", "run", "auto", "manual"], {text: [" g:", "div", "item"]}, ["go", "run", "auto", "manual"],
{text: [" a:", "div", "item"]}, ["mode", "draw", "resize", "delete"], {text: [" a:", "div", "item"]}, ["mode", "translate", "draw", "resize", "delete"],
{text: [" s:", "div", "item"]}, ["shape", "block", "rect", "text", "line", "path", "circle", "ellipse", "heart"], {text: [" s:", "div", "item"]}, ["shape", "block", "rect", "text", "line", "path", "circle", "ellipse", "heart"],
], ],
"项目": function(event, can, key) { "项目": function(event, can, key) {
@ -600,6 +602,37 @@ Volcanos("onaction", {help: "组件菜单", list: ["", "项目", "保存", "",
can.onappend.board(can, can.ui.display, "board", msg) can.onappend.board(can, can.ui.display, "board", msg)
}, true) }, true)
}, },
translate: function(event, can, point) {
if (event.type == "click") {
if (point.length == 1) {
var target = can.group
can._temp = {
x: target.Val("translate_x"),
y: target.Val("translate_y"),
target: target,
}
return
}
var target = can._temp.target
var x = target.Val("translate_x") + point[1].x - point[0].x
var y = target.Val("translate_y") + point[1].y - point[0].y
target.Value("transform", "translate("+x+","+y+") scale(1)")
target.Value("translate_x", x)
target.Value("translate_y", y)
console.log(x, y)
can.point = []
return
}
if (point.length > 1) {
var shape = "line"
var figure = can.onfigure[shape]
var data = figure.draw && figure.draw(event, can, point)
var obj = data && can.onfigure._push(can, data, figure.data.name||shape, can.group||can.svg)
return obj
}
},
draw: function(event, can, point) { draw: function(event, can, point) {
var shape = can.Action("shape") var shape = can.Action("shape")
var figure = can.onfigure[shape] var figure = can.onfigure[shape]
@ -661,6 +694,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["", "项目", "保存", "",
_point: function(event, can) { _point: function(event, can) {
var p = can.svg.getBoundingClientRect() var p = can.svg.getBoundingClientRect()
var point = {x: event.clientX-p.x, y: event.clientY-p.y} var point = {x: event.clientX-p.x, y: event.clientY-p.y}
if (can.Action("mode") == "view") { return point }
point.x = point.x - point.x % parseInt(can.Action("grid")) point.x = point.x - point.x % parseInt(can.Action("grid"))
point.y = point.y - point.y % parseInt(can.Action("grid")) point.y = point.y - point.y % parseInt(can.Action("grid"))
return point return point
@ -745,7 +779,7 @@ Volcanos("ondetail", {help: "组件详情", list: ["复制", "标签", "编辑",
}, },
"编辑": function(event, can) { var target = event.target "编辑": function(event, can) { var target = event.target
var figure = can.onfigure._get(can, target) var figure = can.onfigure._get(can, target)
can.user.input(event, can, can.core.List(["x", "y"].concat(figure.data.copy||[]), function(item) { can.user.input(event, can, can.core.List(["x", "y", "transform", "translate_x", "translate_y"].concat(figure.data.copy||[]), function(item) {
return {_input: "text", name: item, value: target.Value(item)} return {_input: "text", name: item, value: target.Value(item)}
}), function(event, cmd, meta, list) { }), function(event, cmd, meta, list) {
can.core.Item(meta, function(key, value) { can.core.Item(meta, function(key, value) {
@ -779,7 +813,10 @@ Volcanos("ondetail", {help: "组件详情", list: ["复制", "标签", "编辑",
Volcanos("onexport", {help: "导出数据", list: ["point", "group", "target", "zone", "type", "name", "keys"], Volcanos("onexport", {help: "导出数据", list: ["point", "group", "target", "zone", "type", "name", "keys"],
file: function(can, svg) { file: function(can, svg) {
return ['<svg vertion="1.1" xmlns="https://www.w3.org/2000/svg" text-anchor="middle" dominant-baseline="middle"'].concat( return ['<svg vertion="1.1" xmlns="https://www.w3.org/2000/svg" text-anchor="middle" dominant-baseline="middle"'].concat(
svg? can.core.List(["count", "width", "height", "font-size", "stroke-width", "stroke", "fill"], function(item) { svg? can.core.List([
"count", "width", "height", "font-size", "stroke-width", "stroke", "fill",
"transform", "translate_x", "translate_y",
], function(item) {
return svg.Value(item)? ' ' + item + '="' + svg.Value(item) + '"': "" return svg.Value(item)? ' ' + item + '="' + svg.Value(item) + '"': ""
}): [" width=600 height=200 "]).concat(['>', svg? svg.innerHTML: "", "</svg>"]).join("") }): [" width=600 height=200 "]).concat(['>', svg? svg.innerHTML: "", "</svg>"]).join("")
}, },

141
plugin/story/spide.js Normal file
View File

@ -0,0 +1,141 @@
Volcanos("onimport", {help: "导入数据", list: [],
_init: function(can, msg, list, cb, target) { can._output.innerHTML = ""
if (msg.Option("_display") == "table") {
can.onappend.table(can, can._target, "table", msg)
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.Timer(100, function() {
can.sub = sub._outputs[0]
can.msg = msg, can.data = msg.Table()
can.Action("height", "400")
can.Action("speed", "100")
can.onaction["横向"](event, can)
can.Timer(100, function() {
can.core.Next(["base", "base/mdb", "base/log", "base/gdb", "base/ctx", "base/cli", "LICENSE"], function(value, next) {
can._tree[value].view.scrollIntoView()
can._tree[value].view.onclick()
can.Timer(500, next)
})
})
})
}
}, can.ui.content)
},
})
Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", ["view", "横向", "纵向"], ["height", "100", "200", "400", "600"], ["speed", "10", "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"}})
},
"清空": 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)
},
_tree: function(can, msg) { var list = {}
msg.Table(function(value, index) {
can.core.List(value.path.split("/"), function(item, index, array) {
var last = array.slice(0, index).join("/") || ""
var name = array.slice(0, index+1).join("/")
list[last] = list[last] || {name: last, list: []}
if (!item || list[name]) { return }
list[last].list.push(list[name] = {hide: true, name: item+(index==array.length-1? "": "/"), last: last, list: []})
})
})
return list
},
_height: function(can, tree) {
if (tree.hide) { 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)
})
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"},
})
tree.view.onclick = function(event) {
sub.svg.innerHTML = ""
tree.hide = !tree.hide
can.onaction["横向"](event, can)
if (!event) {return}
event.stopPropagation()
event.preventDefault()
}
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"},
})
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
}
sub.onimport.draw({}, sub, {
// shape: "line", point: [
// {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},
// ], style: {inner: name, "text-anchor": "start", stroke: "cyan", "stroke-width": 1},
shape: "path", point: [], style: {
fill: "none",
stroke: "cyan", "stroke-width": 1, 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
})
},
"横向": function(event, can) { var sub = can.sub
can._tree = can._tree || can.onaction._tree(can, can._msg)
can.onaction._height(can, can._tree[""])
sub.svg.Val("height", can._tree[""].height*30)
can.onaction._draw(can, can._tree[""], 0, 0)
},
"纵向": function(event, can) {
},
})
Volcanos("onchoice", {help: "组件交互", list: []})
Volcanos("ondetail", {help: "组件详情", list: []})
Volcanos("onexport", {help: "导出数据", list: ["date", "begin", "add", "del", "close", "note"]})

View File

@ -1,45 +1,51 @@
Volcanos("onimport", {help: "导入数据", list: [], Volcanos("onimport", {help: "导入数据", list: [],
_init: function(can, msg, list, cb, target) { can._output.innerHTML = ""; _init: function(can, msg, list, cb, target) { can._output.innerHTML = ""
if (msg.Option("_display") == "table") { if (msg.Option("_display") == "table") {
var table = can.page.AppendTable(can, can._output, msg, msg.append, function(event, value, key, index, tr, td) { can.onappend.table(can, can._target, "table", msg)
can.page.Select(can, can._option, "input.args", function(input) { if (input.name == key) { var data = input.dataset || {} return typeof cb == "function" && cb(msg)
input.value = value
if (data.action == "auto") {
can.run(event, [], function(msg) {})
}
} })
})
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: [
can.ui = can.page.Append(can, target, [{view: "action"}, {view: "output"}, {view: "status"}, {view: "total"}, { {type: "text", name: "path", value: "hi.svg"},
view: "display", style: {position: "absolute", "white-space": "pre", color: "yellow"}, onclick: function(event) { {type: "button", name: "查看", value: "auto"},
can.page.ClassList.add(can, can.ui.display, "hidden") ], 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.data = msg.Table() can.page.Modify(can, sub._option, {style: {display: "none"}})
can.page.ClassList.add(can, can.ui.total, "status") can.page.Modify(can, sub._action, {style: {display: "none"}})
can.page.Modify(can, sub._status, {style: {display: "none"}})
return sub.run = function(event, cmds, cb, silent) {
can.sub = can.Output(can, {}, "/plugin/local/wiki/draw", can.request({}), function() { typeof cb == "function" && cb(can.request(event))
can.Action("width", 600) can.Timer(100, function() {
can.onaction["编辑"]({}, can) can.sub = sub._outputs[0]
can.onaction["股价图"]({}, can) can.msg = msg, can.data = msg.Table()
}, can.ui.output, can.ui.action, can._option, can.ui.status) can.Action("height", "400")
can.Action("speed", "100")
can.onaction["股价图"](event, can)
})
}
}, can.ui.content)
}, },
}) })
Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", "股价图", "趋势", "比例", ["width", "200", "400", "600", "800", "1000"], ["height", "200", "400", "600"], "表格"], Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", ["view", "股价图", "趋势图", "数据源"], ["height", "100", "200", "400", "600"], ["speed", "10", "50", "100"]],
"编辑": function(event, can, value, cmd, target) { "编辑": function(event, can) {
can.page.ClassList.neg(can, can.ui.action, "hidden") var hide = can.sub._action.style.display == "none"
can.page.ClassList.neg(can, can.ui.status, "hidden") 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, value, cmd, target) { "清空": function(event, can) {
can.sub.svg.innerHTML = "" can.sub.svg.innerHTML = ""
}, },
"股价图": function(event, can, value, cmd, target) {var sub = can.sub, data = can.data; view: function(event, can, cmd, value) {
if (!can.list) { can.onaction[value](event, can)
var count = 0, add = 0, del = 0, max = 0 },
height: function(event, can, cmd) {
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
can.max = 0, can.rest = 0, can.list = can.core.List(data, function(value, index) { can.max = 0, can.rest = 0, can.list = can.core.List(data, function(value, index) {
var line = {}; var line = {};
line.note = value[can.msg.append[4]] line.note = value[can.msg.append[4]]
@ -63,19 +69,11 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", "股价
} }
return line return line
}) })
var begin = new Date(data[0].date)
var end = new Date(data[data.length-1].date)
var avg = parseInt((add + del) / (end - begin) * 1000 * 3600 * 24)
can.page.AppendStatus(can, can.ui.total, ["from", "days", "count", "avg", "max", "add", "del", "rest"], {
from: can.base.Time(begin).split(" ")[0], days: can.base.Duration(end-begin),
count: count, avg: avg, max: max, add: add, del: del, rest: can.rest,
})
} }
var space = 10 var space = 10
var view = parseInt(can.Action("height")) var view = parseInt(can.Action("height"))
var max = parseInt(can.Action("width")) var max = parseInt(can.Conf("width"))-100
var step = parseInt(max / can.list.length)||2 var step = parseInt(max / can.list.length)||2
var width = can.list.length * step + space * 2 var width = can.list.length * step + space * 2
@ -84,52 +82,50 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", "股价
var height = view + space * 2 var height = view + space * 2
sub.svg.Val("height", height) sub.svg.Val("height", height)
can.core.List(can.list, function(line, index) { sub.svg.innerHTML = ""
sub.onimport.draw({}, sub, { can.ui.display.innerHTML = ""
shape: "line", point: [
{x: space/2+step*index+step/4, y: space/2+view-line.min/can.max*view},
{x: space/2+step*index+step/4, y: space/2+view-line.max/can.max*view},
], style: line.begin < line.close? {
"stroke-width": 1, "stroke": "white",
}: {
"stroke-width": 1, "stroke": "black",
},
})
var one = line.begin < line.close? sub.onimport.draw({}, sub, { var i = 0; can.core.Next(can.list, function(line, next) {
shape: "rect", point: [ (function() { var index = i++
{x: space/2+step*index, y: space/2+view-line.begin/can.max*view}, sub.onimport.draw({}, sub, {
{x: space/2+step*index+step/2, y: space/2+view-line.close/can.max*view}, shape: "line", point: [
], style: { {x: space/2+step*index+step/4, y: space/2+view-line.min/can.max*view},
"rx": 0, "ry": 0, {x: space/2+step*index+step/4, y: space/2+view-line.max/can.max*view},
"stroke-width": 1, "stroke": "white", "fill": "white", ], style: line.begin < line.close? {
}, "stroke-width": 1, "stroke": "white",
}): sub.onimport.draw({}, sub, { }: {
shape: "rect", point: [ "stroke-width": 1, "stroke": "black",
{x: space/2+step*index, y: space/2+view-line.close/can.max*view}, },
{x: space/2+step*index+step/2, y: space/2+view-line.begin/can.max*view}, })
], style: {
"rx": 0, "ry": 0,
"stroke-width": 1, "stroke": "black", "fill": "black",
},
})
one.onmouseover = function(event) { var one = line.begin < line.close? sub.onimport.draw({}, sub, {
can.page.ClassList.del(can, can.ui.display, "hidden") shape: "rect", point: [
can.ui.display.style.left = event.clientX+space/2+"px" {x: space/2+step*index, y: space/2+view-line.begin/can.max*view},
can.ui.display.style.top = event.clientY+space/2+"px" {x: space/2+step*index+step/2, y: space/2+view-line.close/can.max*view},
], style: {
"rx": 0, "ry": 0,
"stroke-width": 1, "stroke": "white", "fill": "white",
},
}): sub.onimport.draw({}, sub, {
shape: "rect", point: [
{x: space/2+step*index, y: space/2+view-line.close/can.max*view},
{x: space/2+step*index+step/2, y: space/2+view-line.begin/can.max*view},
], style: {
"rx": 0, "ry": 0,
"stroke-width": 1, "stroke": "black", "fill": "black",
},
})
var msg = can.Event(event); one.onmouseover = function(event) { can.Status(line) }
msg.Push(line, ["date", "note", "begin", "add", "del", "close"], "detail")
can.ui.display.innerHTML = "" can.Timer(parseInt(can.Action("speed")), next)
can.page.AppendTable(can, can.ui.display, msg, msg.append) })()
}
}) })
}, },
"趋势": 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 space = 10
var view = parseInt(can.Action("height")) var view = parseInt(can.Action("height"))
var max = parseInt(can.Action("width")) var max = parseInt(can.Conf("width"))-100
var step = parseInt(max / can.list.length)||2 var step = parseInt(max / can.list.length)||2
var width = can.list.length * step + space * 2 var width = can.list.length * step + space * 2
@ -149,6 +145,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", "股价
sub.svg.Val("height", height+space*2) sub.svg.Val("height", height+space*2)
sub.svg.innerHTML = ""
can.core.List(can.msg.append, function(key, which) { can.core.List(can.msg.append, function(key, which) {
var y = (space*2+view)*(which+1) var y = (space*2+view)*(which+1)
sub.onimport.draw({}, sub, { sub.onimport.draw({}, sub, {
@ -163,12 +160,12 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", "股价
}, },
}) })
can.core.List(data, function(value, index) { can.core.List(data, function(line, index) {
var one = sub.onimport.draw({}, sub, { var one = sub.onimport.draw({}, sub, {
shape: "rect", shape: "rect",
point: [ point: [
{x: space+step*index, y: y}, {x: space+step*index, y: y},
{x: space+step*index+step/4, y: y-parseInt(value[key])/(max[key]||1)*view} {x: space+step*index+step/4, y: y-parseInt(line[key])/(max[key]||1)*view}
], ],
style: { style: {
"rx": 0, "ry": 0, "rx": 0, "ry": 0,
@ -176,30 +173,15 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", "股价
}, },
}) })
one.onmouseover = function(event) { one.onmouseover = function(event) { can.Status(line) }
can.page.ClassList.del(can, can.ui.display, "hidden")
can.ui.display.style.left = event.clientX+space/2+"px"
can.ui.display.style.top = event.clientY+space/2+"px"
var msg = can.Event(event);
msg.Push(value, can.core.Item(value, function(key) {
return msg[key] = [], key
}), "detail")
can.ui.display.innerHTML = ""
can.page.AppendTable(can, can.ui.display, msg, msg.append)
}
}) })
}) })
}, },
"表格": function(event, can, value, cmd, target) {var sub = can.sub, data = can.data; "数据源": function(event, can) {
if (!can.ui.table) { can.ui.display.innerHTML = ""
can.ui.table = can.page.AppendTable(can, can.target, can.msg, can.msg.append) can.onappend.table(can, can.ui.display, "table", can._msg)
can.ui.table.style.clear = "both"
return
}
can.page.ClassList.neg(can, can.ui.table, "hidden")
}, },
}) })
Volcanos("onchoice", {help: "组件交互", list: []}) Volcanos("onchoice", {help: "组件交互", list: []})
Volcanos("ondetail", {help: "组件详情", list: []}) Volcanos("ondetail", {help: "组件详情", list: []})
Volcanos("onexport", {help: "导出数据", list: []}) Volcanos("onexport", {help: "导出数据", list: ["date", "begin", "add", "del", "close", "note"]})