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

add can.core.ItemCB

This commit is contained in:
harveyshao 2021-10-18 14:36:54 +08:00
parent 2e6d8c318c
commit 1dfc749b6e
7 changed files with 50 additions and 54 deletions

View File

@ -9,9 +9,9 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta,
return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, panel, cmds, cb) return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, panel, cmds, cb)
}, can[item.name] = panel, panel._root = can, panel._trans = panel.onaction._trans }, can[item.name] = panel, panel._root = can, panel._trans = panel.onaction._trans
can.core.Item(panel.onaction, function(key, cb) { if (key.indexOf("on") == 0) { can.core.ItemCB(panel.onaction, function(key, cb) {
can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {can: panel, msg: msg}) }) can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {can: panel, msg: msg}) })
} }), panel.onaction._init(panel, item, item.list, next, panel._target) }), panel.onaction._init(panel, item, item.list, next, panel._target)
can.onmotion.float.auto(can, panel._output) can.onmotion.float.auto(can, panel._output)
panel.onkeypop._build(panel) panel.onkeypop._build(panel)
@ -145,9 +145,9 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
return can.Update(event, can.Input(cmds, silent), cb, silent) return can.Update(event, can.Input(cmds, silent), cb, silent)
}, can._inputs[item.name] = input, input.sup = can }, can._inputs[item.name] = input, input.sup = can
can.core.Item(input.onaction, function(key, cb) { if (key.indexOf("on") == 0) { can.core.ItemCB(input.onaction, function(key, cb) {
input._target[key] = function(event) { cb(event, input) } input._target[key] = function(event) { cb(event, input) }
} }), can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target]) }), can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target])
can.onappend.figure(input, item, input._target) can.onappend.figure(input, item, input._target)
}) })
@ -306,7 +306,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
figure: function(can, meta, target, cb) { if ([html.BUTTON, html.SELECT].indexOf(meta.type) > -1) { return } figure: function(can, meta, target, cb) { if ([html.BUTTON, html.SELECT].indexOf(meta.type) > -1) { return }
var input = meta.action||kit.MDB_KEY; input != "auto" && can.require(["/plugin/input/"+input+".js"], function(can) { var input = meta.action||kit.MDB_KEY; input != "auto" && can.require(["/plugin/input/"+input+".js"], function(can) {
can.core.Item(can.onfigure[input], function(key, on) { if (key.indexOf("on") != 0) { return } can.core.ItemCB(can.onfigure[input], function(key, on) {
target[key] = function(event) { target[key] = function(event) {
can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT}, [], function(sub) { sub.Conf(meta) can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT}, [], function(sub) { sub.Conf(meta)
sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option()); sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option());

View File

@ -210,6 +210,7 @@ Volcanos("base", {help: "数据类型",
isObject: function(arg) { return typeof arg == "object" }, isObject: function(arg) { return typeof arg == "object" },
isArray: function(arg) { return typeof arg == "object" && arg.length != undefined }, isArray: function(arg) { return typeof arg == "object" && arg.length != undefined },
isFunction: function(arg) { return typeof arg == "function" }, isFunction: function(arg) { return typeof arg == "function" },
isCallback: function(key, value) { return key.indexOf("on") == 0 && can.base.isFunc(value) },
isFunc: function(cb) { return typeof cb == "function" }, isFunc: function(cb) { return typeof cb == "function" },
isUndefined: function(arg) { return arg == undefined }, isUndefined: function(arg) { return arg == undefined },
isNull: function(arg) { return arg == null }, isNull: function(arg) { return arg == null },

View File

@ -181,5 +181,13 @@ Volcanos("core", {help: "数据结构",
} }
return list return list
}), }),
ItemCB: shy("迭代器", function(obj, cb) { var list = []
for (var k in obj) {
if (k.indexOf("on") == 0 && typeof obj[k] == lang.FUNCTION) {
cb(k, obj[k])
list.push(k)
}
}
}),
}) })

View File

@ -14,8 +14,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.page.Modify(can, can.ui.content, msg.Result()||can.onexport.content(can)) can.page.Modify(can, can.ui.content, msg.Result()||can.onexport.content(can))
can.page.Select(can, can.ui.content, "svg", function(svg) { can.page.Select(can, can.ui.content, "svg", function(svg) {
can.svg = can.group = svg, can.onimport._group(can, svg).click() can.svg = can.group = svg, can.onimport._group(can, svg).click()
can.core.Item(can.onimport, function(key, value) { can.core.ItemCB(can.onimport, function(key, cb) {
key.indexOf("on") == 0 && (svg[key] = function(event) { value(event, can) }) svg[key] = function(event) { cb(event, can) }
}) })
can.page.Select(can, svg, "*", function(item, index) { can.page.Select(can, svg, "*", function(item, index) {
item.tagName == "g"? can.onimport._group(can, item): can.onimport._block(can, item) item.tagName == "g"? can.onimport._group(can, item): can.onimport._block(can, item)

View File

@ -1,6 +1,5 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onmotion.clear(can) can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
can.base.isFunc(cb) && cb(msg)
if (msg.Option("branch")) { return can.onappend.table(can, msg) } if (msg.Option("branch")) { return can.onappend.table(can, msg) }
can.dir_root = msg.Option("dir_root") can.dir_root = msg.Option("dir_root")
@ -9,7 +8,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can._tree[""].name = can.dir_root.split("/").pop() can._tree[""].name = can.dir_root.split("/").pop()
can.size = 30, can.margin = 30 can.size = 30, can.margin = 30
can.onappend.plugin(can, {index: "web.wiki.draw", style: "output"}, function(sub) { can.onappend.plugin(can, {index: "web.wiki.draw", style: chat.OUTPUT}, function(sub) {
sub.run = function(event, cmds, cb) { sub.Action("go", "run") sub.run = function(event, cmds, cb) { sub.Action("go", "run")
can.base.isFunc(cb) && cb(sub.request()) can.base.isFunc(cb) && cb(sub.request())
@ -39,10 +38,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
}) })
return node return node
}, },
_height: function(can, tree) { _height: function(can, tree) { if (!tree) { return 0 }
if (!tree) { return 0 }
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 }
if (tree.hide) { return tree.height = 1 }
var height = 0; can.core.List(tree.list, function(item) { var height = 0; can.core.List(tree.list, function(item) {
height += can.onimport._height(can, item) height += can.onimport._height(can, item)
@ -59,9 +57,9 @@ Volcanos("onaction", {help: "用户操作", list: ["编辑", ["view", "横向",
can.onmotion.clear(can, can.draw.svg) can.onmotion.clear(can, can.draw.svg)
can.onimport._height(can, can._tree[""]) can.onimport._height(can, can._tree[""])
can.draw.svg.Val("height", can._tree[""].height*can.size+2*can.margin) can.draw.svg.Val(chat.HEIGHT, can._tree[""].height*can.size+2*can.margin)
can.width = 0, can.onaction._draw(can, can._tree[""], can.margin, can.margin) can.width = 0, can.onaction._draw(can, can._tree[""], can.margin, can.margin)
can.draw.svg.Val("width", can.width+can.margin) can.draw.svg.Val(chat.WIDTH, can.width+can.margin)
}, },
"纵向": function(event, can) { "纵向": function(event, can) {
can.onmotion.clear(can, can.draw.svg) can.onmotion.clear(can, can.draw.svg)
@ -81,10 +79,8 @@ Volcanos("onaction", {help: "用户操作", list: ["编辑", ["view", "横向",
tree.width = tree.view.Val("textLength") tree.width = tree.view.Val("textLength")
if (x+tree.width > can.width) { can.width = x+tree.width } if (x+tree.width > can.width) { can.width = x+tree.width }
can.core.Item(can.ondetail, function(key, value) { can.core.ItemCB(can.ondetail, function(key, cb) {
if (key.indexOf("on") == 0 && can.base.isFunc(value)) { tree.view[key] = function(event) { cb(event, can, tree) }
tree.view[key] = function(event) { value(event, can, tree) }
}
}) })
if (tree.hide) { return } if (tree.hide) { return }
@ -140,21 +136,19 @@ Volcanos("ondetail", {help: "用户交互", list: [],
}, },
plugin: function(event, can, args) { plugin: function(event, can, args) {
can.onappend.plugin(can, {type: "float", index: "web.code.inner", args: args, _action: ["关闭"]}, function(sub) { can.onappend.plugin(can, {type: chat.FLOAT, index: "web.code.inner", args: args, _action: [cli.CLOSE]}, function(sub) {
sub.run = function(event, cmds, cb) { sub.run = function(event, cmds, cb) {
can.run(event, can.misc.Concat([ctx.ACTION, "inner"], cmds), function(msg) { can.run(event, can.misc.Concat([ctx.ACTION, "inner"], cmds), function(msg) {
msg.Option(ice.MSG_ACTION, "close") msg.Option(ice.MSG_ACTION, cli.CLOSE)
can.search(event, ["Action.onexport.size"], function(msg, left, top, width, height) { left = left||0 can.search(event, ["Action.onexport.size"], function(msg, left, top, width, height) { left = left||0
var top = 120, margin = 20; if (can.user.isMobile) { margin = 0 var top = 120, margin = 20; if (can.user.isMobile) { margin = 0
if (can.user.isLandscape) { if (can.user.isLandscape) {
sub.Conf("height", window.innerHeight+200) sub.Conf(chat.HEIGHT, window.innerHeight+200), top = 24
top = 24
} else { } else {
sub.Conf("height", window.innerHeight+140) sub.Conf(chat.HEIGHT, window.innerHeight+140), top = 48
top = 48
} }
} else { } else {
sub.Conf("height", height+120) sub.Conf(chat.HEIGHT, height+120)
} }
var layout = {position: "fixed", left: left+margin, top: top} var layout = {position: "fixed", left: left+margin, top: top}

View File

@ -1,13 +1,12 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onmotion.clear(can) can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
can.base.isFunc(cb) && cb(msg)
if (msg.Option("branch")) { return can.onappend.table(can, msg) } if (msg.Option("branch")) { return can.onappend.table(can, msg) }
can.msg = msg, can.data = msg.Table(), can.onimport._sum(can) can.msg = msg, can.data = msg.Table(), can.onimport._sum(can)
can.Action("height", msg.Option("height")||can.user.mod.isCmd? "max": can.user.isMobile&&can.user.isLandscape? "200": "400") can.Action(chat.HEIGHT, msg.Option(chat.HEIGHT)||can.user.mod.isCmd? "max": can.user.isMobile&&can.user.isLandscape? "200": "400")
can.Action("speed", parseInt(msg.Option("speed")||"100")) can.Action("speed", parseInt(msg.Option("speed")||"100"))
can.onappend.plugin(can, {index: "web.wiki.draw", style: "output"}, function(sub) { can.onappend.plugin(can, {index: "web.wiki.draw", style: chat.OUTPUT}, function(sub) {
sub.run = function(event, cmds, cb) { sub.Action("go", "run") sub.run = function(event, cmds, cb) { sub.Action("go", "run")
can.base.isFunc(cb) && cb(sub.request()) can.base.isFunc(cb) && cb(sub.request())
@ -49,17 +48,16 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图
can.onmotion.toggle(can, can.draw._action) can.onmotion.toggle(can, can.draw._action)
can.onmotion.toggle(can, can.draw._status) can.onmotion.toggle(can, can.draw._status)
}, },
"趋势图": function(event, can) { var height = can.Action("height") "趋势图": function(event, can) { var height = can.Action(chat.HEIGHT)
if (height == "max") { height = can.Conf("height") - chat.CMD_MARGIN } if (height == "max") { height = can.Conf(chat.HEIGHT) - chat.CMD_MARGIN }
height = parseInt(height) height = parseInt(height)
var space = 10 var space = 10, width = parseInt(can.Conf(chat.WIDTH))
var width = parseInt(can.Conf("width"))
var step = parseInt((width-2*space) / can.list.length) var step = parseInt((width-2*space) / can.list.length)
can.onmotion.clear(can, can.draw.svg) can.onmotion.clear(can, can.draw.svg)
can.draw.svg.Val("height", height) can.draw.svg.Val(chat.HEIGHT, height)
can.draw.svg.Val("width", width) can.draw.svg.Val(chat.WIDTH, width)
function scale(y) { return (y - can.min)/(can.max - can.min)*(height-2*space) } function scale(y) { return (y - can.min)/(can.max - can.min)*(height-2*space) }
function order(index, x, y) { return {x: space+step*index+x, y: height-space-scale(y)} } function order(index, x, y) { return {x: space+step*index+x, y: height-space-scale(y)} }
@ -69,7 +67,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图
shape: "line", point: [ shape: "line", point: [
order(index, step/2, line.min), order(index, step/2, line.max), order(index, step/2, line.min), order(index, step/2, line.max),
], style: { ], style: {
"stroke-width": 1, "stroke": line.begin < line.close? "white": "black", "stroke-width": 1, "stroke": line.begin < line.close? chat.WHITE: chat.BLACK,
}, },
}) })
@ -77,15 +75,13 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图
shape: "rect", point: [ shape: "rect", point: [
order(index, step/4, line.close), order(index, step/4*3, line.begin), order(index, step/4, line.close), order(index, step/4*3, line.begin),
], style: can.base.Copy({"stroke-width": 1, "rx": 0, "ry": 0}, line.begin < line.close? { ], style: can.base.Copy({"stroke-width": 1, "rx": 0, "ry": 0}, line.begin < line.close? {
"stroke": "white", "fill": "white", "stroke": chat.WHITE, "fill": chat.WHITE,
}: { }: {
"stroke": "black", "fill": "black", "stroke": chat.BLACK, "fill": chat.BLACK,
}), }),
_init: function(view) { _init: function(view) {
can.core.Item(can.ondetail, function(key, value) { can.core.ItemCB(can.ondetail, function(key, cb) {
if (key.indexOf("on") == 0 && can.base.isFunc(value)) { view[key] = function(event) { cb(event, can, line) }
view[key] = function(event) { value(event, can, line) }
}
}) })
}, },
}) })
@ -106,14 +102,13 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图
}) })
}) })
var space = 10 var height = parseInt(can.Action(chat.HEIGHT))
var width = parseInt(can.Conf("width")) var space = 10, width = parseInt(can.Conf(chat.WIDTH))
var height = parseInt(can.Action("height"))
var step = parseInt((width-2*space) / can.list.length) var step = parseInt((width-2*space) / can.list.length)
can.onmotion.clear(can, can.draw.svg) can.onmotion.clear(can, can.draw.svg)
can.draw.svg.Val("height", height) can.draw.svg.Val(chat.HEIGHT, height)
can.draw.svg.Val("width", width) can.draw.svg.Val(chat.WIDTH, width)
function scale(key, y) { return (y - min[key])/(max[key] - min[key])*(height-2*space) } function scale(key, y) { return (y - min[key])/(max[key] - min[key])*(height-2*space) }
function order(index, key, x, y) { return {x: space+step*index+x, y: space+scale(key, y)} } function order(index, key, x, y) { return {x: space+step*index+x, y: space+scale(key, y)} }
@ -126,13 +121,11 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图
shape: "rect", point: [ shape: "rect", point: [
order(index, key, width*which+2, 0), order(index, key, width*which+2+width, y), order(index, key, width*which+2, 0), order(index, key, width*which+2+width, y),
], style: { ], style: {
"stroke-width": 1, "stroke": "white", "fill": "white", "rx": 0, "ry": 0, "stroke-width": 1, "stroke": chat.WHITE, "fill": chat.WHITE, "rx": 0, "ry": 0,
}, },
_init: function(view) { _init: function(view) {
can.core.Item(can.ondetail, function(key, value) { can.core.ItemCB(can.ondetail, function(key, cb) {
if (key.indexOf("on") == 0 && can.base.isFunc(value)) { view[key] = function(event) { cb(event, can, line) }
view[key] = function(event) { value(event, can, line) }
}
}) })
}, },
}) })

View File

@ -96,7 +96,7 @@ const wiki = {
FIELD: "field", SHELL: "shell", LOCAL: "local", PARSE: "parse", FIELD: "field", SHELL: "shell", LOCAL: "local", PARSE: "parse",
} }
const chat = { const chat = {
LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", OUTPUT: "output",
STORY: "story", CARTE: "carte", INPUT: "input", FLOAT: "float", STORY: "story", CARTE: "carte", INPUT: "input", FLOAT: "float",
HEAD: "head", AUTO: "auto", LEFT: "left", MAIN: "main", FOOT: "foot", HEAD: "head", AUTO: "auto", LEFT: "left", MAIN: "main", FOOT: "foot",
SCROLL: "scroll", HEIGHT: "height", WIDTH: "width", LEFT: "left", TOP: "top", SCROLL: "scroll", HEIGHT: "height", WIDTH: "width", LEFT: "left", TOP: "top",