1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00
This commit is contained in:
shaoying 2022-07-01 23:20:19 +08:00
parent a261df7e75
commit e88b01b3e8
3 changed files with 82 additions and 86 deletions

160
frame.js
View File

@ -114,7 +114,7 @@ Volcanos("ondaemon", {help: "推荐引擎", list: [], _init: function(can, name)
}): can.onengine._search({}, can, msg, can, ["_search", cmd].concat(arg), function() { msg.Reply() }) }): can.onengine._search({}, can, msg, can, ["_search", cmd].concat(arg), function() { msg.Reply() })
}) })
}, _list: [""], }, _list: [""],
exit: function(can, msg, sub) { window.close() }, exit: function(can, msg, sub) { can.user.close() },
refresh: function(can, msg, sub) { sub.Update() }, refresh: function(can, msg, sub) { sub.Update() },
pwd: function(can, msg, arg) { can.ondaemon._list[0] = arg[0] }, pwd: function(can, msg, arg) { can.ondaemon._list[0] = arg[0] },
grow: function(can, msg, sub, arg) { sub.onimport._grow(sub, can.page.Color(arg.join(""))) }, grow: function(can, msg, sub, arg) { sub.onimport._grow(sub, can.page.Color(arg.join(""))) },
@ -131,7 +131,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
var sub = Volcanos(meta.name, {_follow: can.core.Keys(can._follow, meta.name), _target: field, var sub = Volcanos(meta.name, {_follow: can.core.Keys(can._follow, meta.name), _target: field,
_legend: legend, _option: option, _action: action, _output: output, _status: status, _legend: legend, _option: option, _action: action, _output: output, _status: status,
_inputs: {}, _outputs: [], _history: [], _inputs: {}, _outputs: [], _history: [], _root: can._root,
Status: function(key, value) { Status: function(key, value) {
if (can.base.isObject(key)) { return can.core.Item(key, sub.Status), key } if (can.base.isObject(key)) { return can.core.Item(key, sub.Status), key }
@ -629,7 +629,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
if (ls[i] == ctx.INDEX) { item.type = item.type||html.PLUGIN } if (ls[i] == ctx.INDEX) { item.type = item.type||html.PLUGIN }
} }
}) })
return {type: "demo", style: {height: can.ConfHeight()||window.innerHeight}, list: stack[0].list} return {type: "demo", style: {height: can.ConfHeight()||can._root._height}, list: stack[0].list}
}, },
_plugin: function(can, value, meta, cb, target) { _plugin: function(can, value, meta, cb, target) {
@ -686,12 +686,12 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
can.page.style(sub, sub._target, meta.style), can.onmotion.hidden(can, sub._target) can.page.style(sub, sub._target, meta.style), can.onmotion.hidden(can, sub._target)
can.base.isFunc(cb) && cb(sub, function(sub, hide) { can.onmotion.hidden(can, sub._target, !hide), can.base.isFunc(cbs) && cbs(sub) }) can.base.isFunc(cb) && cb(sub, function(sub, hide) { can.onmotion.hidden(can, sub._target, !hide), can.base.isFunc(cbs) && cbs(sub) })
}, document.body) }, can._root._target)
}, target, last) } }) }, target, last) } })
}) })
}, },
float: function(can, msg, cb) { float: function(can, msg, cb) {
var ui = can.onappend.field(can, "story toast float", {}, document.body) var ui = can.onappend.field(can, "story toast float", {}, can._root._target)
ui.close = function() { can.page.Remove(can, ui.first) } ui.close = function() { can.page.Remove(can, ui.first) }
can.getActionSize(function(left, top, height, width) { can.getActionSize(function(left, top, height, width) {
@ -726,16 +726,14 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
}, },
}) })
Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, target) { target = target||document.body Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, target) { target = target||can._root._target
if (can.page.Select(can, target, html.FIELDSET_MAIN+".page").length > 0) { if (can.page.Select(can, target, can.core.Keys(html.FIELDSET_MAIN, "page")).length > 0) {
can.page.Select(can, target, html.FIELDSET_LEFT, function(field, index) { can.page.Select(can, target, html.FIELDSET_LEFT, function(field) { can.page.styleHeight(can, field, "")
can.page.styleHeight(can, field, "")
can.page.Select(can, target, [[html.FIELDSET_LEFT, html.DIV_OUTPUT]], function(output) { can.page.Select(can, target, [[html.FIELDSET_LEFT, html.DIV_OUTPUT]], function(output) {
can.page.styleHeight(can, output, "") can.page.styleHeight(can, output, "")
}) })
}) })
can.page.Select(can, target, html.FIELDSET_MAIN, function(field, index) { can.page.Select(can, target, html.FIELDSET_MAIN, function(field) { can.page.styleHeight(can, field, "")
can.page.styleHeight(can, field, "")
can.page.Select(can, target, [[html.FIELDSET_MAIN, html.DIV_OUTPUT]], function(output) { can.page.Select(can, target, [[html.FIELDSET_MAIN, html.DIV_OUTPUT]], function(output) {
can.page.styleHeight(can, output, "") can.page.styleHeight(can, output, "")
}) })
@ -743,17 +741,17 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe
return return
} }
var width = window.innerWidth, height = window.innerHeight var width = can._root._width, height = can._root._height
can.page.Select(can, target, can.page.Keys(html.FIELDSET_HEAD, html.FIELDSET_FOOT), function(field) { can.page.Select(can, target, can.page.Keys(html.FIELDSET_HEAD, html.FIELDSET_FOOT), function(field) {
height -= field.offsetHeight height -= field.offsetHeight
}) })
var offset = can.user.isMobile && !can.user.isLandscape()? 100: 0
can.page.Select(can, target, html.FIELDSET_LEFT, function(field, index) { can.page.Select(can, target, html.FIELDSET_LEFT, function(field, index) {
var offset = can.user.isMobile && !can.user.isLandscape()? 100: 0
can.user.isMobile || (width -= field.offsetWidth) can.user.isMobile || (width -= field.offsetWidth)
can.page.styleHeight(can, field, height-offset) can.page.styleHeight(can, field, height-offset)
can.page.Select(can, target, [[html.FIELDSET_LEFT, html.DIV_OUTPUT]], function(output) { can.page.Select(can, target, [[html.FIELDSET_LEFT, html.DIV_OUTPUT]], function(output) {
can.page.styleHeight(can, output, height-html.ACTION_HEIGHT-1-offset) can.page.styleHeight(can, output, height-offset-html.ACTION_HEIGHT-1)
}) })
}) })
@ -771,7 +769,7 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe
can.user.topic(can, can._topic || can.misc.Search(can, chat.TOPIC) || Volcanos.meta.args.topic || (can.base.isNight()? chat.BLACK: chat.WHITE)) can.user.topic(can, can._topic || can.misc.Search(can, chat.TOPIC) || Volcanos.meta.args.topic || (can.base.isNight()? chat.BLACK: chat.WHITE))
}, },
background: function(can, url, target) { background: function(can, url, target) {
can.page.style(can, target||document.body, html.BACKGROUND, url == "" || url == "void"? "": 'url("'+url+'")') can.page.style(can, target||can._root._target, html.BACKGROUND, url == "" || url == "void"? "": 'url("'+url+'")')
}, },
figure: function(event, can, target, right, layout) { target = target||can._target figure: function(event, can, target, right, layout) { target = target||can._target
if (layout) { return can.page.style(can, target, layout), can.onmotion.move(can, target, layout), layout } if (layout) { return can.page.style(can, target, layout), can.onmotion.move(can, target, layout), layout }
@ -784,12 +782,12 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe
layout = {left: left, top: top} layout = {left: left, top: top}
if (layout.top < 0) { layout.top = 0 } if (layout.top < 0) { layout.top = 0 }
if (layout.left < 0) { layout.left = 0 } if (layout.left < 0) { layout.left = 0 }
if (layout.left+target.offsetWidth>window.innerWidth) { if (layout.left+target.offsetWidth > can._root._width) { layout.right = 0, layout.left = "" }
layout.right = 0, layout.left = ""
} if (!(can.user.isMobile && can.user.isLandscape()) && layout.top+target.offsetHeight > can._root._height-html.ACTION_HEIGHT) {
if (!(can.user.isMobile && can.user.isLandscape()) && top+target.offsetHeight>window.innerHeight-32) { layout.bottom = can._root._height - event.clientY+event.offsetY, layout.top = ""
layout.bottom = window.innerHeight - event.clientY+event.offsetY, layout.top = ""
if (right) { layout.bottom -= target.offsetHeight } if (right) { layout.bottom -= target.offsetHeight }
if (layout.bottom < html.ACTION_HEIGHT) { layout.bottom = html.ACTION_HEIGHT }
} }
return can.page.style(can, target, layout), can.onmotion.move(can, target, layout), layout return can.page.style(can, target, layout), can.onmotion.move(can, target, layout), layout
}, },
@ -840,46 +838,12 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe
}, },
}) })
Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, target) { Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, target) {
window.addEventListener("orientationchange", function(event) { window.addEventListener(html.ORIENTATIONCHANGE, function(event) { can.onengine.signal(can, html.ORIENTATIONCHANGE) })
can.onengine.signal(can, "orientationchange") can.onmotion.float.auto(can, target)
}), can.onmotion.float.auto(can, target)
},
focus: function(can, target) { if (!target) { return }
target.setSelectionRange && target.setSelectionRange(0, -1), target.focus()
},
share: function(event, can, input, args) {
return can.user.input(event, can, input, function(ev, button, data, list, _args) {
can.search(can.request(event, {args: [mdb.TYPE, chat.FIELD].concat(args||[], _args||[])})._event, [["Header", chat.ONACTION, web.SHARE]])
})
},
story: {
_hash: {
spark: function(can, meta, target) {
meta[mdb.NAME] == html.INNER? can.onmotion.copy(can, target): can.page.Select(can, target, html.SPAN, function(item) {
can.onmotion.copy(can, item)
})
},
},
auto: function(can, target) { var that = this
can.page.Select(can, target||can._output, ".story", function(item) { var meta = item.dataset
can.page.style(can, item, can.base.Obj(meta.style))
can.core.CallFunc(that._hash[meta.type], [can, meta, target||can._output])
})
can.page.Select(can, target||can._output, html.IFRAME, function(item) {
can.page.style(can, item, html.HEIGHT, can.Conf(html.HEIGHT)-88, html.WIDTH, can.Conf(html.WIDTH)-30)
})
can.page.Select(can, target||can._output, html.SVG, function(item) {
item.oncontextmenu = function(event) {
can.user.carte(event, can, kit.Dict(mdb.EXPORT, function(event, can, button) {
}), [mdb.EXPORT])
}
})
},
}, },
float: {_hash: {}, float: {_hash: {},
del: function(can, key) { del: function(can, key) {
key == chat.CARTE && can.page.Select(can, document.body, can.core.Keys(html.DIV, chat.CARTE), function(item) { key == chat.CARTE && can.page.Select(can, can._root._target, can.core.Keys(html.DIV, chat.CARTE), function(item) {
can.page.Remove(can, item) can.page.Remove(can, item)
}) })
var last = this._hash[key]; if (!last) { return } var last = this._hash[key]; if (!last) { return }
@ -895,6 +859,37 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
}}) }})
}, },
}, },
story: {
_hash: {
spark: function(can, meta, target) {
meta[mdb.NAME] == html.INNER? can.onmotion.copy(can, target): can.page.Select(can, target, html.SPAN, function(item) {
can.onmotion.copy(can, item)
})
},
},
auto: function(can, target) { var that = this; target = target||can._output
can.page.Select(can, target, ".story", function(item) { var meta = item.dataset
can.page.style(can, item, can.base.Obj(meta.style))
can.core.CallFunc(that._hash[meta.type], [can, meta, target])
})
can.page.Select(can, target, html.IFRAME, function(item) {
can.page.style(can, item, html.HEIGHT, can.ConfHeight()-88, html.WIDTH, can.ConfWidth()-30)
})
},
},
copy: function(can, target, text, cb) {
target.title = "点击复制", target.onclick = function(event) {
can.user.copy(event, can, text||target.innerText)
can.request(event, kit.Dict(ice.MSG_HANDLE, ice.TRUE))
can.base.isFunc(cb) && cb(event)
}
},
link: function(can, target, text) {
if (target.innerText == "") { target.innerText = target.href }
can.page.Modify(can, target, {target: "_blank"})
},
clear: function(can, target) { return can.page.Modify(can, target||can._output, ""), true },
cache: function(can, next) { var list = can.base.Obj(can.core.List(arguments).slice(2), [can._output]) cache: function(can, next) { var list = can.base.Obj(can.core.List(arguments).slice(2), [can._output])
can.core.List(list, function(item) { can.page.Cache(item._cache_key, item, item.scrollTop+1) }) can.core.List(list, function(item) { can.page.Cache(item._cache_key, item, item.scrollTop+1) })
var key = next(can._cache_data = can._cache_data||{}) var key = next(can._cache_data = can._cache_data||{})
@ -902,8 +897,15 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
if (pos) { item.scrollTo && item.scrollTo(0, pos-1); return item } if (pos) { item.scrollTo && item.scrollTo(0, pos-1); return item }
}).length > 0 }).length > 0
}, },
clear: function(can, target) { return can.page.Modify(can, target||can._output, ""), true },
delay: function(can, cb) { can.core.Timer(100, cb) }, delay: function(can, cb) { can.core.Timer(100, cb) },
focus: function(can, target) { if (!target) { return }
target.setSelectionRange && target.setSelectionRange(0, -1), target.focus()
},
share: function(event, can, input, args) {
return can.user.input(event, can, input, function(ev, button, data, list, _args) {
can.search(can.request(event, {args: [mdb.TYPE, chat.FIELD].concat(args||[], _args||[])})._event, [["Header", chat.ONACTION, web.SHARE]])
})
},
hidden: function(can, target, show) { hidden: function(can, target, show) {
can.page.styleDisplay(can, target||can._target, show? "": html.NONE) can.page.styleDisplay(can, target||can._target, show? "": html.NONE)
@ -971,16 +973,19 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
}) })
}, },
link: function(can, target, text) { hide: function(can, time, cb, target) { target = target||can._target
if (target.innerText == "") { target.innerText = target.href } time = can.base.isObject(time)? time: {value: 10, length: time||20}
can.page.Modify(can, target, {target: "_blank"}) can.page.style(can, target, html.OPACITY, 1)
can.core.Timer(time, function(event, value, index) {
can.page.style(can, target, html.OPACITY, 1-(index+1)/time.length)
}, function() { can.base.isFunc(cb) && cb(), can.page.style(can, target, html.DISPLAY, html.NONE) })
}, },
copy: function(can, target, text, cb) { show: function(can, time, cb, target) { target = target||can._target
target.title = "点击复制", target.onclick = function(event) { time = can.base.isObject(time)? time: {interval: 10, length: time||30}
can.user.copy(event, can, text||target.innerText) can.page.style(can, target, html.OPACITY, 0, html.DISPLAY, html.BLOCK)
can.request(event, kit.Dict(ice.MSG_HANDLE, ice.TRUE)) can.core.Timer(time, function(event, value, index) {
can.base.isFunc(cb) && cb(event) can.page.style(can, target, html.OPACITY, (index+1)/time.length)
} }, cb)
}, },
move: function(can, target, layout, cb) { var begin; layout = layout||{} move: function(can, target, layout, cb) { var begin; layout = layout||{}
can.page.style(can, target, layout), target.onmousedown = function(event) { can.page.style(can, target, layout), target.onmousedown = function(event) {
@ -1003,20 +1008,6 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
} }
can.base.isFunc(cb) && cb(target, layout) can.base.isFunc(cb) && cb(target, layout)
}, },
show: function(can, time, cb, target) { target = target||can._target
time = can.base.isObject(time)? time: {interval: 10, length: time||30}
can.page.style(can, target, html.OPACITY, 0, html.DISPLAY, html.BLOCK)
can.core.Timer(time, function(event, value, index) {
can.page.style(can, target, html.OPACITY, (index+1)/time.length)
}, cb)
},
hide: function(can, time, cb, target) { target = target||can._target
time = can.base.isObject(time)? time: {value: 10, length: time||20}
can.page.style(can, target, html.OPACITY, 1)
can.core.Timer(time, function(event, value, index) {
can.page.style(can, target, html.OPACITY, 1-(index+1)/time.length)
}, function() { can.base.isFunc(cb) && cb(), can.page.style(can, target, html.DISPLAY, html.NONE) })
},
selectField: function(event, can) { selectField: function(event, can) {
if (event.key == "Enter") { return can.run(event) } if (event.key == "Enter") { return can.run(event) }
@ -1083,22 +1074,21 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
Volcanos("onkeymap", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) { Volcanos("onkeymap", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) {
document.body.onclick = function(event) { document.body.onclick = function(event) {
if (window.webview) { if (window.webview) {
if (event.target.tagName == "A") { if (event.target.tagName == "A") { can.user.open(event.target.href) }
window.open(event.target.href)
}
} }
} }
can.onkeymap._build(can), document.body.onkeydown = function(event) { can.onkeymap._build(can), document.body.onkeydown = function(event) {
if (event.metaKey) { if (window.webview) { if (event.metaKey) { if (window.webview) {
switch (event.key) { switch (event.key) {
case "q": window.terminate(); break case "q": window.terminate(); break
case "w": window.close(); break case "w": can.user.close(); break
case "r": location.reload(); break case "r": location.reload(); break
case "f": can.onengine.signal(can, "onopensearch", can.request({}, {type: "*"})); break case "f": can.onengine.signal(can, "onopensearch", can.request({}, {type: "*"})); break
case "[": history.back(); break case "[": history.back(); break
case "]": history.forward(); break case "]": history.forward(); break
} }
} return } } return }
if (can.page.tagis([html.SELECT, html.INPUT, html.TEXTAREA], event.target)) { return } if (can.page.tagis([html.SELECT, html.INPUT, html.TEXTAREA], event.target)) { return }
var msg = can.request(event, {"model": "normal"}); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } var msg = can.request(event, {"model": "normal"}); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }
can.onengine.signal(can, chat.ONKEYDOWN, msg); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } can.onengine.signal(can, chat.ONKEYDOWN, msg); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }

View File

@ -44,6 +44,7 @@ Volcanos("user", {help: "用户操作", info: {}, agent: {
reload: function(force) { (force || confirm("重新加载页面?")) && location.reload() }, reload: function(force) { (force || confirm("重新加载页面?")) && location.reload() },
jumps: function(url) { location.href = url }, jumps: function(url) { location.href = url },
open: function(url) { window.open(url) }, open: function(url) { window.open(url) },
close: function(url) { window.close() },
time: function(can, time, fmt) { var now = can.base.Date(time) time: function(can, time, fmt) { var now = can.base.Date(time)
var list = can.user.language(can) == "en"? ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"] var list = can.user.language(can) == "en"? ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]
return can.base.Time(time, (fmt||"%y-%m-%d %H:%M:%S").replace("%w", list[now.getDay()])) return can.base.Time(time, (fmt||"%y-%m-%d %H:%M:%S").replace("%w", list[now.getDay()]))

View File

@ -251,6 +251,7 @@ var html = {
ESCAPE: "Escape", ENTER: "Enter", TAB: "Tab", ESCAPE: "Escape", ENTER: "Enter", TAB: "Tab",
ONMOUSEENTER: "onmouseenter", ONMOUSEENTER: "onmouseenter",
ORIENTATIONCHANGE: "orientationchange"
} }
var lang = { var lang = {
UNDEFINED: "undefined", UNDEFINED: "undefined",
@ -285,7 +286,11 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args:
// 根模块 // 根模块
_can_name = "", name = Config.name||"chat", cb = can||function(can) { _can_name = "", name = Config.name||"chat", cb = can||function(can) {
can.onengine._init(can, can.Conf(Config), Config.panels, Config._init, can._target) can.onengine._init(can, can.Conf(Config), Config.panels, Config._init, can._target)
}, can = {_follow: name, _target: Config.target||meta.target}, can._root = can }, can = {
_follow: name, _target: Config.target||meta.target,
_height: Config.height||window.innerHeight,
_width: Config.width||window.innerWidth,
}, can._root = can
for (var k in Config) { can[k] = Config[k] } for (var k in Config) { can[k] = Config[k] }
} }