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)
}, 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}) })
} }), 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)
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)
}, 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) }
} }), 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)
})
@ -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 }
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) {
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());

View File

@ -210,6 +210,7 @@ Volcanos("base", {help: "数据类型",
isObject: function(arg) { return typeof arg == "object" },
isArray: function(arg) { return typeof arg == "object" && arg.length != undefined },
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" },
isUndefined: function(arg) { return arg == undefined },
isNull: function(arg) { return arg == null },

View File

@ -181,5 +181,13 @@ Volcanos("core", {help: "数据结构",
}
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.Select(can, can.ui.content, "svg", function(svg) {
can.svg = can.group = svg, can.onimport._group(can, svg).click()
can.core.Item(can.onimport, function(key, value) {
key.indexOf("on") == 0 && (svg[key] = function(event) { value(event, can) })
can.core.ItemCB(can.onimport, function(key, cb) {
svg[key] = function(event) { cb(event, can) }
})
can.page.Select(can, svg, "*", function(item, index) {
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) {
can.onmotion.clear(can)
can.base.isFunc(cb) && cb(msg)
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
if (msg.Option("branch")) { return can.onappend.table(can, msg) }
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.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")
can.base.isFunc(cb) && cb(sub.request())
@ -39,10 +38,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
})
return node
},
_height: function(can, tree) {
if (!tree) { return 0 }
if (tree.hide) { return tree.height = 1 }
_height: function(can, tree) { if (!tree) { return 0 }
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) {
height += can.onimport._height(can, item)
@ -59,9 +57,9 @@ Volcanos("onaction", {help: "用户操作", list: ["编辑", ["view", "横向",
can.onmotion.clear(can, can.draw.svg)
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.draw.svg.Val("width", can.width+can.margin)
can.draw.svg.Val(chat.WIDTH, can.width+can.margin)
},
"纵向": function(event, can) {
can.onmotion.clear(can, can.draw.svg)
@ -81,10 +79,8 @@ Volcanos("onaction", {help: "用户操作", list: ["编辑", ["view", "横向",
tree.width = tree.view.Val("textLength")
if (x+tree.width > can.width) { can.width = x+tree.width }
can.core.Item(can.ondetail, function(key, value) {
if (key.indexOf("on") == 0 && can.base.isFunc(value)) {
tree.view[key] = function(event) { value(event, can, tree) }
}
can.core.ItemCB(can.ondetail, function(key, cb) {
tree.view[key] = function(event) { cb(event, can, tree) }
})
if (tree.hide) { return }
@ -140,21 +136,19 @@ Volcanos("ondetail", {help: "用户交互", list: [],
},
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) {
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
var top = 120, margin = 20; if (can.user.isMobile) { margin = 0
if (can.user.isLandscape) {
sub.Conf("height", window.innerHeight+200)
top = 24
sub.Conf(chat.HEIGHT, window.innerHeight+200), top = 24
} else {
sub.Conf("height", window.innerHeight+140)
top = 48
sub.Conf(chat.HEIGHT, window.innerHeight+140), top = 48
}
} else {
sub.Conf("height", height+120)
sub.Conf(chat.HEIGHT, height+120)
}
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) {
can.onmotion.clear(can)
can.base.isFunc(cb) && cb(msg)
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
if (msg.Option("branch")) { return can.onappend.table(can, msg) }
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.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")
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._status)
},
"趋势图": function(event, can) { var height = can.Action("height")
if (height == "max") { height = can.Conf("height") - chat.CMD_MARGIN }
"趋势图": function(event, can) { var height = can.Action(chat.HEIGHT)
if (height == "max") { height = can.Conf(chat.HEIGHT) - chat.CMD_MARGIN }
height = parseInt(height)
var space = 10
var width = parseInt(can.Conf("width"))
var space = 10, width = parseInt(can.Conf(chat.WIDTH))
var step = parseInt((width-2*space) / can.list.length)
can.onmotion.clear(can, can.draw.svg)
can.draw.svg.Val("height", height)
can.draw.svg.Val("width", width)
can.draw.svg.Val(chat.HEIGHT, height)
can.draw.svg.Val(chat.WIDTH, width)
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)} }
@ -69,7 +67,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图
shape: "line", point: [
order(index, step/2, line.min), order(index, step/2, line.max),
], 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: [
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? {
"stroke": "white", "fill": "white",
"stroke": chat.WHITE, "fill": chat.WHITE,
}: {
"stroke": "black", "fill": "black",
"stroke": chat.BLACK, "fill": chat.BLACK,
}),
_init: function(view) {
can.core.Item(can.ondetail, function(key, value) {
if (key.indexOf("on") == 0 && can.base.isFunc(value)) {
view[key] = function(event) { value(event, can, line) }
}
can.core.ItemCB(can.ondetail, function(key, cb) {
view[key] = function(event) { cb(event, can, line) }
})
},
})
@ -106,14 +102,13 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图
})
})
var space = 10
var width = parseInt(can.Conf("width"))
var height = parseInt(can.Action("height"))
var height = parseInt(can.Action(chat.HEIGHT))
var space = 10, width = parseInt(can.Conf(chat.WIDTH))
var step = parseInt((width-2*space) / can.list.length)
can.onmotion.clear(can, can.draw.svg)
can.draw.svg.Val("height", height)
can.draw.svg.Val("width", width)
can.draw.svg.Val(chat.HEIGHT, height)
can.draw.svg.Val(chat.WIDTH, width)
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)} }
@ -126,13 +121,11 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图
shape: "rect", point: [
order(index, key, width*which+2, 0), order(index, key, width*which+2+width, y),
], 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) {
can.core.Item(can.ondetail, function(key, value) {
if (key.indexOf("on") == 0 && can.base.isFunc(value)) {
view[key] = function(event) { value(event, can, line) }
}
can.core.ItemCB(can.ondetail, function(key, cb) {
view[key] = function(event) { cb(event, can, line) }
})
},
})

View File

@ -96,7 +96,7 @@ const wiki = {
FIELD: "field", SHELL: "shell", LOCAL: "local", PARSE: "parse",
}
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",
HEAD: "head", AUTO: "auto", LEFT: "left", MAIN: "main", FOOT: "foot",
SCROLL: "scroll", HEIGHT: "height", WIDTH: "width", LEFT: "left", TOP: "top",