diff --git a/frame.js b/frame.js index 2690973f..20ef3b6c 100644 --- a/frame.js +++ b/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"}]}, diff --git a/page/index.css b/page/index.css index 7c1b994d..bec50d56 100644 --- a/page/index.css +++ b/page/index.css @@ -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; } diff --git a/plugin/local/wiki/draw.css b/plugin/local/wiki/draw.css index 0e11e188..834da46f 100644 --- a/plugin/local/wiki/draw.css +++ b/plugin/local/wiki/draw.css @@ -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; } diff --git a/plugin/local/wiki/draw.js b/plugin/local/wiki/draw.js index 553ef98b..28acddfe 100644 --- a/plugin/local/wiki/draw.js +++ b/plugin/local/wiki/draw.js @@ -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) { @@ -119,7 +114,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, draw: function(event, can, value) { var figure = can.onfigure[value.shape] var data = figure.draw(event, can, value.point, value.style) - can.core.Item(value.style, function(key, value) {data[key] = value}) + can.core.Item(value.style, function(key, value) { data[key] = value }) return can.onfigure._push(can, data, value.shape, can.group||can.svg) }, keydown: function(event, can, value) { diff --git a/plugin/state.js b/plugin/state.js index 5fa6f4f5..94e10a23 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -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: []}) diff --git a/plugin/story/paste.js b/plugin/story/paste.js deleted file mode 100644 index 8c3cb550..00000000 --- a/plugin/story/paste.js +++ /dev/null @@ -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) - }, -}) - diff --git a/plugin/story/spide.js b/plugin/story/spide.js index 269afb46..1cf9c06a 100644 --- a/plugin/story/spide.js +++ b/plugin/story/spide.js @@ -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"}]) +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { + typeof cb == "function" && cb(msg) + can.msg = msg, can.data = msg.Table() can.dir_root = msg.Option("dir_root") + can._tree = can.onimport._tree(can, msg) + can.Action("scale", parseInt(msg.Option("scale")||"1")) - 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"}}) + 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(can.request(event)) - can.core.Timer(1000, function() { - can.sub = sub._outputs[0] - can.msg = msg, can.data = msg.Table() - can.Action("height", "400") - can.Action("speed", "100") - can.Action("scale", "1") - can.Action("stroke-width", "1") + 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"}, +}) +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}) }) - if (x+name.length*16 > can.width) { - can.width = x+name.length*20 - } + }, + _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 - } + 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) { }, }) + diff --git a/plugin/story/ticker.js b/plugin/story/ticker.js deleted file mode 100644 index 538fd49d..00000000 --- a/plugin/story/ticker.js +++ /dev/null @@ -1,6 +0,0 @@ -Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, msg, list, cb, target) { can._output.innerHTML = "" - - }, -}) - diff --git a/plugin/story/trend.js b/plugin/story/trend.js index 7e6362fa..df2564bb 100644 --- a/plugin/story/trend.js +++ b/plugin/story/trend.js @@ -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) - }) - }) +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("speed", parseInt(msg.Option("speed")||"100")) + can.Action("height", parseInt(msg.Option("height")||"400")) - 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"}}) + 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(can.request(event)) - can.core.Timer(100, function() { - can.sub = sub._outputs[0] - 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) + 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++ - 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", - }, - }) + 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: { + "stroke-width": 1, "stroke": line.begin < line.close? "white": "black", + }, + }) - var one = line.begin < line.close? sub.onimport.draw({}, sub, { - 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", - }, - }): 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", - }, - }) + 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: { + "stroke-width": 1, "stroke": "white", "fill": "white", "rx": 0, "ry": 0, + }, + }: { + 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) - })() + 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"]})