From dacac1711230b008af03065efacd4ec742fba770 Mon Sep 17 00:00:00 2001 From: shaoying Date: Fri, 17 Jul 2020 02:14:07 +0800 Subject: [PATCH] add spide.js --- frame.js | 3 +- plugin/local/code/inner.css | 4 + plugin/local/code/inner.js | 285 ++++-------------------------------- plugin/local/wiki/draw.js | 47 +++++- plugin/story/spide.js | 141 ++++++++++++++++++ plugin/story/trend.js | 188 +++++++++++------------- 6 files changed, 305 insertions(+), 363 deletions(-) create mode 100644 plugin/story/spide.js diff --git a/frame.js b/frame.js index 5075dc26..466cc6f9 100644 --- a/frame.js +++ b/frame.js @@ -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, + _legend: legend, _option: option, _action: action, _output: output, _status: status, _target: field, _inputs: {}, _outputs: [], _history: [], - _option: option, _action: action, _output: output, Option: function(key, value) { if (typeof key == "object") { return sub.core.Item(key, sub.Option), key } 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} can.page.Modify(can, target, {style: {opacity: 0}}) can.Timer(time, function(event, value, index) { - console.log(arguments) can.page.Modify(can, target, {style: {opacity: (index+1)/time.length}}) }, function() { }) diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 5a5cc56e..3d5ff746 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -106,6 +106,10 @@ fieldset.editor>div.output div.search { height:120px; overflow:auto; clear:both; } +fieldset.editor>div.output div.search td>div { + max-height:100px; + overflow:hidden; +} fieldset.editor>div.output div.holdon { max-height:400px; overflow:auto; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index c09e44e2..8306eebd 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -41,7 +41,6 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, can.onimport.project(can, can.Option("path")) can.onsyntax._init(can, msg) can.onkeymap._init(can) - can.onaction.selectLine(can, parseInt(msg.Option("line"))) }) 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} !can.core.Eq(can.history[can.history.length-1], push) && can.history.push(push) - can.Option({path: path, file: file, line: line||1}) - if (can.tabview[path+file]) { - can.onsyntax._init(can, can.tabview[path+file]) - can.onaction.selectLine(can, line||1) - return + function show() { + if (can._msg) { + can._msg.Option("line", can.Option("line")) + } + + 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) { - msg.Option({path: can.Option("path"), file: can.Option("file")}) + if (can.tabview[path+file]) { return show() } + + 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.onsyntax._init(can, can.tabview[path+file] = msg) - can.Option({path: path, file: file, line: line||1}) + can.onimport.tabview(can, path, file) }, ondblclick: function(event) { can.onkeymap._remote(event, can, "运行") }, oncontextmenu: function(event) { @@ -87,11 +92,12 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, }, }]).first.click() - can.onaction.selectLine(can, line||1) }, true) }, 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.onimport.tabview(can, can.Option("path"), value.path) }) @@ -116,9 +122,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], }); if (cache) { return } // remote - can.parse = can.base.Ext(can.file), can.max = 0, can.core.List(can.ls = msg.Result().split("\n"), function(item) { - can.onaction.appendLine(can, item) - }) + can.parse = can.base.Ext(can.file), can.max = 0 // status 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: { // "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) }, true): init(p) }, @@ -166,97 +174,6 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], "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: { prefix: {"#": "comment"}, profile: true, @@ -272,158 +189,20 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], syntax: "keyword", }, }, - mod: { - prefix: {"#": "comment"}, - keyword: { - "module": "keyword", - "require": "keyword", - "replace": "keyword", - "=>": "keyword", - }, + json: {link: "js"}, + css: { + suffix: {"{": "comment"}, }, - go: { - 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: { + html: { split: { space: " ", - 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", - + operator: "<>", }, keyword: { + "head": "keyword", + "body": "keyword", }, }, - man2: {link: "man3"}, - man1: {link: "man3"}, - man8: {link: "man3"}, url: { line: function(can, line) { @@ -789,7 +568,7 @@ Volcanos("onaction", {help: "控件交互", list: [ can.Status("npos", index+1) value = value.replace("<", "<").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)) }} }) diff --git a/plugin/local/wiki/draw.js b/plugin/local/wiki/draw.js index f82e2e94..c9110509 100644 --- a/plugin/local/wiki/draw.js +++ b/plugin/local/wiki/draw.js @@ -1,6 +1,6 @@ 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, [ - {view: "project"}, {view: "profile"}, + {view: "project", style: {display: "none"}}, {view: "profile"}, {view: "preview"}, {view: "content", onmouseenter: function(event) { can.onkeypop.action = can }}, {view: "display"}, @@ -41,6 +41,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, "shape": "rect", "grid": "10", "go": "auto", + "go": "manual", }, function(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 }, }, // - 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 < 2) {return} @@ -551,7 +553,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["", "项目", "保存", "", {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: [" 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"], ], "项目": function(event, can, key) { @@ -600,6 +602,37 @@ Volcanos("onaction", {help: "组件菜单", list: ["", "项目", "保存", "", can.onappend.board(can, can.ui.display, "board", msg) }, 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) { var shape = can.Action("shape") var figure = can.onfigure[shape] @@ -661,6 +694,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["", "项目", "保存", "", _point: function(event, can) { var p = can.svg.getBoundingClientRect() 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.y = point.y - point.y % parseInt(can.Action("grid")) return point @@ -745,7 +779,7 @@ Volcanos("ondetail", {help: "组件详情", list: ["复制", "标签", "编辑", }, "编辑": function(event, can) { var target = event.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)} }), function(event, cmd, meta, list) { 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"], file: function(can, svg) { return ['', svg? svg.innerHTML: "", ""]).join("") }, diff --git a/plugin/story/spide.js b/plugin/story/spide.js new file mode 100644 index 00000000..c19c32ff --- /dev/null +++ b/plugin/story/spide.js @@ -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"]}) + diff --git a/plugin/story/trend.js b/plugin/story/trend.js index aebb3021..0c9459f9 100644 --- a/plugin/story/trend.js +++ b/plugin/story/trend.js @@ -1,45 +1,51 @@ 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") { - var table = can.page.AppendTable(can, can._output, msg, msg.append, function(event, value, key, index, tr, td) { - can.page.Select(can, can._option, "input.args", function(input) { if (input.name == key) { var data = input.dataset || {} - input.value = value - if (data.action == "auto") { - can.run(event, [], function(msg) {}) - } - } }) - }) - return typeof cb == "function" && cb(msg); + 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.ui = can.page.Append(can, target, [{view: "action"}, {view: "output"}, {view: "status"}, {view: "total"}, { - view: "display", style: {position: "absolute", "white-space": "pre", color: "yellow"}, onclick: function(event) { - can.page.ClassList.add(can, can.ui.display, "hidden") - }, - }]) - can.data = msg.Table() - can.page.ClassList.add(can, can.ui.total, "status") - - return - can.sub = can.Output(can, {}, "/plugin/local/wiki/draw", can.request({}), function() { - can.Action("width", 600) - can.onaction["编辑"]({}, can) - can.onaction["股价图"]({}, can) - }, can.ui.output, can.ui.action, can._option, can.ui.status) + 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.ui.content) }, }) -Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", "股价图", "趋势", "比例", ["width", "200", "400", "600", "800", "1000"], ["height", "200", "400", "600"], "表格"], - "编辑": function(event, can, value, cmd, target) { - can.page.ClassList.neg(can, can.ui.action, "hidden") - can.page.ClassList.neg(can, can.ui.status, "hidden") +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, value, cmd, target) { + "清空": function(event, can) { can.sub.svg.innerHTML = "" }, - "股价图": function(event, can, value, cmd, target) {var sub = can.sub, data = can.data; - if (!can.list) { - var count = 0, add = 0, del = 0, max = 0 + view: function(event, can, cmd, value) { + can.onaction[value](event, can) + }, + 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) { var line = {}; line.note = value[can.msg.append[4]] @@ -63,19 +69,11 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", "股价 } 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 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 width = can.list.length * step + space * 2 @@ -84,52 +82,50 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", "股价 var height = view + space * 2 sub.svg.Val("height", height) - can.core.List(can.list, function(line, index) { - sub.onimport.draw({}, sub, { - 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", - }, - }) + sub.svg.innerHTML = "" + can.ui.display.innerHTML = "" - var one = line.begin < line.close? sub.onimport.draw({}, sub, { - shape: "rect", point: [ - {x: space/2+step*index, y: space/2+view-line.begin/can.max*view}, - {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 i = 0; can.core.Next(can.list, function(line, next) { + (function() { var index = i++ + sub.onimport.draw({}, sub, { + 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", + }, + }) - one.onmouseover = function(event) { - 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 one = line.begin < line.close? sub.onimport.draw({}, sub, { + shape: "rect", point: [ + {x: space/2+step*index, y: space/2+view-line.begin/can.max*view}, + {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); - msg.Push(line, ["date", "note", "begin", "add", "del", "close"], "detail") - can.ui.display.innerHTML = "" - can.page.AppendTable(can, can.ui.display, msg, msg.append) - } + one.onmouseover = function(event) { can.Status(line) } + + can.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.Action("width")) + var max = parseInt(can.Conf("width"))-100 var step = parseInt(max / can.list.length)||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.innerHTML = "" can.core.List(can.msg.append, function(key, which) { var y = (space*2+view)*(which+1) 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, { shape: "rect", point: [ {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: { "rx": 0, "ry": 0, @@ -176,30 +173,15 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", "股价 }, }) - one.onmouseover = function(event) { - 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) - } + one.onmouseover = function(event) { can.Status(line) } }) }) }, - "表格": function(event, can, value, cmd, target) {var sub = can.sub, data = can.data; - if (!can.ui.table) { - can.ui.table = can.page.AppendTable(can, can.target, can.msg, can.msg.append) - can.ui.table.style.clear = "both" - return - } - can.page.ClassList.neg(can, can.ui.table, "hidden") + "数据源": function(event, can) { + can.ui.display.innerHTML = "" + can.onappend.table(can, can.ui.display, "table", can._msg) }, }) Volcanos("onchoice", {help: "组件交互", list: []}) Volcanos("ondetail", {help: "组件详情", list: []}) -Volcanos("onexport", {help: "导出数据", list: []}) +Volcanos("onexport", {help: "导出数据", list: ["date", "begin", "add", "del", "close", "note"]})