From 44983d30b6deed5d9caa8f20d5a1d6b2325f99da Mon Sep 17 00:00:00 2001 From: harveyshao Date: Wed, 13 Jul 2022 08:20:03 +0800 Subject: [PATCH] opt vimer.js --- frame.js | 14 ++- lib/user.js | 4 +- panel/header.js | 2 +- plugin/local/code/inner.css | 7 +- plugin/local/code/inner.js | 192 ++++++++++++++++++++---------------- plugin/local/code/vimer.js | 35 +++---- plugin/local/team/plan.js | 2 +- plugin/state.js | 4 +- plugin/table.js | 49 +++++---- proto.js | 6 +- 10 files changed, 175 insertions(+), 140 deletions(-) diff --git a/frame.js b/frame.js index 580d3c2d..ad945dd3 100644 --- a/frame.js +++ b/frame.js @@ -331,7 +331,7 @@ Volcanos(chat.ONAPPEND, {help: "渲染引擎", _init: function(can, meta, list, can.onkeymap.input(event, can), can.onmotion.selectField(event, can) break case html.TEXTAREA: - switch (event.key) { case lang.TAB: can.onkeymap.insertText(event.target, ice.TB); can.onkeymap.prevent(event); break } + // switch (event.key) { case lang.TAB: can.onkeymap.insertText(event.target, ice.TB); can.onkeymap.prevent(event); break } break } @@ -541,12 +541,6 @@ Volcanos(chat.ONLAYOUT, {help: "页面布局", _init: function(can, target) { ta Volcanos(chat.ONMOTION, {help: "动态特效", _init: function(can, target) { window.addEventListener(html.ORIENTATIONCHANGE, function(event) { can.onengine.signal(can, html.ORIENTATIONCHANGE) }) can.onmotion.float.auto(can, target) - target.onclick = function(event) { - if (can.page.tagis(["input", "select", "textarea"], event.target)) { return } - can.page.Select(can, target, can.page.Keys("div.float", "fieldset.float"), function(item) { - can.page.Remove(can, item) - }) - } }, float: {_hash: {}, del: function(can, key) { @@ -604,7 +598,7 @@ Volcanos(chat.ONMOTION, {help: "动态特效", _init: function(can, target) { if (pos) { item.scrollTo && item.scrollTo(0, pos-1); return item } }).length > 0 }, - delay: function(can, cb) { can.core.Timer(100, cb) }, + delay: function(can, cb, interval) { can.core.Timer(interval||100, cb) }, focus: function(can, target) { if (!target) { return } target.setSelectionRange && target.setSelectionRange(0, -1), target.focus() }, @@ -792,6 +786,10 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互", _focus: [], _init: function(can, if (window.webview) { if (event.target.tagName == "A") { can.user.open(event.target.href) } } + if (can.page.tagis(["input", "select", "textarea"], event.target)) { return } + can.page.Select(can, document.body, can.page.Keys("fieldset.input.key.float"), function(item) { + can.page.Remove(can, item) + }) } can.onkeymap._build(can), document.body.onkeydown = function(event) { if (event.metaKey) { if (window.webview) { diff --git a/lib/user.js b/lib/user.js index 8bbdb446..320843ba 100644 --- a/lib/user.js +++ b/lib/user.js @@ -84,6 +84,7 @@ Volcanos("user", {help: "用户操作", info: {}, agent: { "plugin": "插件", "prev": "上一页", "next": "下一页", + "trash": "删除", "open": "打开", "close": "关闭", "start": "启动", "stop": "停止", "begin": "开始", "end": "结束", @@ -229,6 +230,7 @@ Volcanos("user", {help: "用户操作", info: {}, agent: { return can.base.isString(item)? {view: html.ITEM, list: [{text: can.user.trans(can, item), onclick: function(event) { can.user.isMobile && can.page.Remove(can, ui._target) can.base.isFunc(cb) && cb(event, item, meta, index) + can.onkeymap.prevent(event) }, onmouseenter: function(event) { carte._float && can.page.Remove(can, carte._float._target) } }] }: can.base.isArray(item)? {view: html.ITEM, list: [{text: can.user.trans(can, item[0])+" -> "}], onmouseenter: function(event) { @@ -258,7 +260,7 @@ Volcanos("user", {help: "用户操作", info: {}, agent: { }, input: function(event, can, form, cb, button) { if (!form || form.length == 0) { return cb() } - var msg = can.request(event) + var msg = can.request(event); event = event._event||event var ui = can.page.Append(can, document.body, [{view: [html.INPUT], style: {left: 0, top: 0}, list: [ {view: "content", list: [{view: [html.OPTION, html.TABLE], list: can.core.List(form, function(item) { item = can.base.isString(item)? {type: html.TEXT, name: item}: item.length > 0? {type: html.SELECT, name: item[0], values: item.slice(1)}: item diff --git a/panel/header.js b/panel/header.js index 67c5ed24..d20413d0 100644 --- a/panel/header.js +++ b/panel/header.js @@ -115,7 +115,7 @@ Volcanos(chat.ONPLUGIN, {help: "注册插件", }) }), "alert": shy("提示", {}, ["text", "list", "back"], function(can, msg, cmds) { - can.user.alert(cmds[0]) + cmds && cmds[0] && can.user.alert(cmds[0]) }), "info": shy("信息", {}, ["text", "list", "back"], function(can, msg, cmds) { msg.Echo("hello world") diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 68ea7747..6c5ab751 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -16,12 +16,13 @@ fieldset.inner>div.output div.content td.text span.datatype { color:lightgreen; fieldset.inner>div.output div.content td.text span.function { color:cyan; font-weight:bold; } fieldset.inner>div.output div.content td.text span.constant { color:magenta; } fieldset.inner>div.output div.content td.text span.string { color:magenta; } +fieldset.inner>div.output td.content iframe { border:0; } fieldset.inner>div.output td.content>div.tabs { display:none; } fieldset.inner>div.output td.content>div.path { display:none; } -fieldset.inner div.output fieldset.toolkit { background-color:#0e3369b3; position:absolute; bottom:0px; right:0px; } +fieldset.inner div.output fieldset.toolkit { position:absolute; bottom:0px; right:0px; } fieldset.inner>div.output fieldset.toolkit>div.output>fieldset { display:none; } -fieldset.inner>div.output fieldset.toolkit>div.output>fieldset.select { display:block; } +fieldset.inner>div.output fieldset.toolkit>div.output>fieldset.select { background-color:#0e3369b3; color:white; display:block; } fieldset.inner>div.status legend { background-color:#0d969f8a; padding:0px 10px; border-left:solid 2px red; height:30px; float:right; } fieldset.inner>div.status legend.select { background-color:green; } fieldset.inner>div.status legend:hover { background-color:green; } @@ -53,6 +54,8 @@ body.white.simple fieldset.inner>div.output div.content td.text span.string { co body.white.simple fieldset.inner>div.output div.content td.text span.function { color:#795e26; } body.white.simple fieldset.inner>div.output div.content td.text span.keyword { color:blue; } +body.white.simple>div.carte div.item:hover { background-color:#e3e6f1; } + body.mobile fieldset.inner>form.option input[name=file] { width:90px; } body.mobile fieldset.plugin.inner div.action { display:none; } body.mobile.landscape fieldset.plugin.inner div.action { display:contents; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 6c82017f..0ab65844 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -6,11 +6,12 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar can.onengine.plugin(can, can.onplugin) can.onmotion.clear(can), can.onlayout.profile(can) - can.page.styleWidth(can, can.ui.project, 180) + can.page.styleWidth(can, can.ui.project, 240) can.onimport._project(can, can.ui.project) can.onimport._profile(can, can.ui.profile) can.onimport._display(can, can.ui.display) can.base.isFunc(cb) && cb(msg) + can.ui._content = can.ui.content switch (can.Mode()) { case "simple": can.onimport._simple(can); break @@ -130,41 +131,68 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }, project: function(can, path) { can.onimport.zone(can, [ - {name: "source", _init: function(view) { var total = 0 - function show(view) { - can.run(can.request({}, {dir_root: path, dir_deep: true}), [ice.PWD], function(msg) { var list = msg.Table() - can.core.List(list, function(item) { if (can.Option(nfs.FILE).indexOf(item.path) == 0) { item.expand = true } }) - can.onimport.tree(can, list, nfs.PATH, ice.PS, function(event, item) { - can.onimport.tabview(can, path, item.path) // 显示文件 - }, view), can.Status("文件数", total += msg.Length()) - }, true) - } - if (path.length == 1) { - show(view) - } else { - var ui = can.onimport.zone(can, can.core.List(path, function(path) { return {name: path, _init: function(view) { - show(view) - }} }), view); can.onmotion.delay(can, function() { view.previousSibling.innerHTML = "" }) - } + {name: "source", _init: function(target) { var total = 0 + function show(target) { can.run(can.request({}, {dir_root: path, dir_deep: true}), [ice.PWD], function(msg) { var list = msg.Table() + can.core.List(list, function(item) { if (can.Option(nfs.FILE).indexOf(item.path) == 0) { item.expand = true } }) + can.onimport.tree(can, list, nfs.PATH, ice.PS, function(event, item) { + can.onimport.tabview(can, path, item.path) // 显示文件 + }, target), can.Status("文件数", total += msg.Length()) + }, true) } if (path.length == 1) { return show(target) } + + can.onimport.zone(can, can.core.List(path, function(path) { return {name: path, _init: function(target) { show(target) }} }), target) + can.onmotion.delay(can, function() { target.previousSibling.innerHTML = "" }) }}, - {name: "module", _init: function(view) { + {name: "plugin", _init: function(target) { + can.onimport.tree(can, can.core.Item(can.onengine.plugin.meta, function(key) { return {index: can.base.trimPrefix(key, "can.")} }), ctx.INDEX, ice.PT, function(event, item) { + can.onimport.tabview(can, can.Option(nfs.PATH), can.core.Keys("can", item.index), ctx.INDEX) // 显示插件 + }, target) + }}, + {name: "module", _init: function(target) { can.runAction(can.request({}, {fields: ctx.INDEX}), ctx.COMMAND, [mdb.SEARCH, ctx.COMMAND], function(msg) { can.onimport.tree(can, msg.Table(), ctx.INDEX, ice.PT, function(event, item) { can.onimport.tabview(can, can.Option(nfs.PATH), item.index, ctx.INDEX) // 显示模块 - }, view) + }, target) }) }}, - {name: "plugin", _init: function(view) { - can.onimport.tree(can, can.core.Item(can.onengine.plugin.meta, function(key) { return {index: can.base.trimPrefix(key, "can.")} }), ctx.INDEX, ice.PT, function(event, item) { - can.onimport.tabview(can, can.Option(nfs.PATH), can.core.Keys("can", item.index), ctx.INDEX) // 显示插件 - }, view) - }}, + {name: "dreams", _init: function(target) { var call = arguments.callee + can.runAction({}, ice.RUN, [web.DREAM], function(msg) { + msg.Table(function(item) { + function carte(event) { + var list = []; switch (item.status) { + case "start": list = ["open", "stop"]; break + case "stop": list = ["start", "trash"]; break + } + can.user.carteRight(event, can, {}, list, function(event, action) { + can.runAction(can.request({}, item), ice.RUN, [web.DREAM, ctx.ACTION, action], function(msg) { + can.onmotion.clear(can, target), call(target) + }) + }) + } + + var color = item.status == "start"? "": "gray" + can.page.Append(can, target, [{view: html.ITEM, list: [{text: [item.name, html.DIV], style: {color: color}, onmouseenter: carte}], onclick: function() { + can.onimport.tabview(can, can.Option(nfs.PATH), item.name, web.DREAM) // 显示空间 + }}]) + }) + }) + }, _menu: shy("", { + "create": function(event, zone) { + can.user.input(event, can, [mdb.NAME], function(list) { + can.runAction({}, ice.RUN, [web.DREAM, cli.START, list[0]], function(msg) { + can.onmotion.clear(can, zone._target), zone._init(zone._target), can.user.toastSuccess(can) + can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option(mdb.NAME), web.DREAM) // 显示空间 + }) + }) + }, + "refresh": function(event, zone) { + can.onmotion.clear(can, zone._target), zone._init(zone._target) + }, + }, ["create", "refresh"], function() {})}, ], can.ui.project) }, history: function(can, push) { can.base.Eq(push, can.history[can.history.length-1]) || can.history.push(push) - can.Status("跳转数", can.history.length) - return push + return can.Status("跳转数", can.history.length), push }, tabview: function(can, path, file, line, cb, skip, skip2) { var key = can.onexport.keys(can, file, path) if (can.isCmdMode()) { location.hash = file+ice.FS+(line||1) } @@ -174,16 +202,16 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar return can._msg.Option(can.Option()), can.onsyntax._init(can, can._msg, cb, skip2) } - can.onimport.history(can, {path: path, file: file, line: line}) function show(msg) { var skip2 = skip; can.tabview[key] = msg - msg._tab = can.onimport.tabs(can, [{name: file.split(msg.Option(nfs.LINE) == ctx.INDEX? ice.PT: ice.PS).pop(), text: file}], function(event, meta) { - msg._tab = event.target - can.onimport.tabview(can, path, file, msg.Option(nfs.LINE), cb, false, skip2), cb = null, skip2 = false + can.onimport.tabs(can, [{name: file.split(line == ctx.INDEX? ice.PT: ice.PS).pop(), text: file}], function(event, meta) { + msg._tab = event.target, can.onimport.tabview(can, path, file, msg.Option(nfs.LINE), cb, false, skip2), cb = null, skip2 = false }, function(item) { delete(can.tabview[key]) }, can.ui._tabs, function(item) {}) } - can.Option({path: path, file: file, line: line||1}) - line == ctx.INDEX? show(can.request({}, {index: file, line: line})): can.run({}, [path, file], show, true) + can.Option(can.onimport.history(can, {path: path, file: file, line: line})) + line == ctx.INDEX? show(can.request({}, {index: file, line: line})): + line == web.DREAM? show(can.request({}, {index: file, line: line})): + can.run({}, [path, file], show, true) }, profile: function(can, msg) { var width = can.profile_size[can.onexport.keys(can)]||(can.ConfWidth()-can.ui.project.offsetWidth)/2 @@ -200,8 +228,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar can.onmotion.toggle(can, can.ui.display, true), can.onimport.layout(can) }), can.onmotion.toggle(can, can.ui.display, true), can.onimport.layout(can) }, - process: function(can, msg, target, width, height) { - can.onmotion.clear(can, target), can.user.toastSuccess(can) + process: function(can, msg, target, width, height) { can.onmotion.clear(can, target), can.user.toastSuccess(can) if (msg.Option(ice.MSG_PROCESS) == "_field") { msg.Table(function(meta) { meta.display = msg.Option(ice.MSG_DISPLAY) can.onimport.plugin(can, meta, target, function(sub) { width && sub.ConfWidth(width), height && sub.ConfHeight(height), sub.Focus() }) @@ -250,9 +277,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }, }, [""]) Volcanos(chat.ONPLUGIN, {help: "注册插件", - "local": shy("按键", {}, ["mode", "key", ice.LIST, ice.BACK], function(msg, cmds) { - }), - "code.inner.keymap": shy("按键", {}, ["mode", "key", ice.LIST, ice.BACK], function(can, msg, cmds) { + "can.code.inner.keymap": shy("按键", {}, ["mode", "key", ice.LIST, ice.BACK], function(can, msg, cmds) { can.core.Item(can.onkeymap._mode, function(mode, value) { (!cmds[0] || cmds[0] == mode) && can.core.Item(value, function(key, func) { if (cmds[0] == mode && cmds[1] == key) { @@ -272,9 +297,7 @@ Volcanos(chat.ONPLUGIN, {help: "注册插件", }), }) Volcanos(chat.ONSYNTAX, {help: "语法高亮", list: ["keyword", "prefix", "line"], _init: function(can, msg, cb, skip) { - if (can.isCmdMode()) { - can.ui._path.innerText = msg.Option(ctx.INDEX)? msg.Option(nfs.FILE): can.base.Path(msg.Option(nfs.PATH), msg.Option(nfs.FILE)) - } + if (can.ui._path) { can.ui._path.innerText = msg.Option(ctx.INDEX)? msg.Option(nfs.FILE): can.base.Path(msg.Option(nfs.PATH), msg.Option(nfs.FILE)) } if (can.onmotion.cache(can, function(cache_data) { can.file && (cache_data[can.file] = {current: can.current, max: can.max, @@ -291,20 +314,44 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", list: ["keyword", "prefix", "line can.onmotion.delay(can, function() { can.onimport.layout(can) msg.Option(ctx.INDEX) && can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]) }) + + can.page.Select(can, can._output, can.page.Keys("div.content", html.IFRAME), function(item) { + if (can.onmotion.toggle(can, item, item == msg._ui)) { can.ui.content = msg._ui } + }) return can.file - }, can.ui.content, can.ui.profile_output, can.ui.display_output) && !skip) { + }, can.ui._content, can.ui.profile_output, can.ui.display_output) && !skip) { return can.onaction.selectLine(null, can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb() } can.onmotion.clear(can, can.ui.content), can.onimport.layout(can) - if (msg.Option(ctx.INDEX)) { return can.onimport.plugin(can, {index: msg.Option(ctx.INDEX)}, can.ui.content, function(sub) { - can.page.style(can, sub._output, html.MAX_HEIGHT, sub.ConfHeight(can.ui.content.offsetHeight-2*html.ACTION_HEIGHT)) - can.page.style(can, sub._output, html.MAX_WIDTH, sub.ConfWidth(can.ui.content.offsetWidth)) - can.onmotion.delay(can, function() { sub.Focus() }), can.base.isFunc(cb) && cb() - sub.onaction.close = function() { - can.onaction.back({}, can), msg._tab._close() + if (msg.Option(ctx.INDEX)) { + if (msg.Option(nfs.LINE) == web.DREAM) { + if (msg._ui) { + can.page.Select(can, can._output, can.page.Keys("div.content", html.IFRAME), function(item) { + if (can.onmotion.toggle(can, item, item == msg._ui)) { can.ui.content = msg._ui } + }) + return + } + can.ui.content = msg._ui = can.page.insertBefore(can, [{type: html.IFRAME, src: can.misc.MergeURL(can, {pod: msg.Option(nfs.FILE)}, true), width: can.ui.content.offsetWidth, height: can.ui.content.offsetHeight}], can.ui.content) + return can.onimport.layout(can) } - }) } + + can.onmotion.toggle(can, can.ui.content = msg._ui = can.ui._content, true) + return can.onimport.plugin(can, {index: msg.Option(ctx.INDEX)}, can.ui.content, function(sub) { + can.page.style(can, sub._output, html.MAX_HEIGHT, sub.ConfHeight(can.ui.content.offsetHeight-2*html.ACTION_HEIGHT)) + can.page.style(can, sub._output, html.MAX_WIDTH, sub.ConfWidth(can.ui.content.offsetWidth)) + can.onmotion.delay(can, function() { sub.Focus() }), can.base.isFunc(cb) && cb() + + sub.onaction.close = function() { can.onaction.back({}, can), msg._tab._close() } + sub.onimport._open = function(sub, msg, _arg) { var url = can.base.ParseURL(_arg), ls = url.origin.split("/chat/pod/") + if (_arg.indexOf(location.origin) == 0 && ls.length > 1) { + return can.onimport.tabview(can, can.Option(nfs.PATH), ls[1].split("/")[0], web.DREAM), sub.Update() // 显示空间 + } + return can.user.open(_arg), sub.Update() + } + }) + } + can.onmotion.toggle(can, can.ui.content = msg._ui = can.ui._content, true) function init(p) { can.max = 0, can.core.List(can.ls = msg.Result().split(ice.NL), function(item) { can.onaction.appendLine(can, item) }) @@ -327,8 +374,7 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", list: ["keyword", "prefix", "line function wrap(type, str) { return type? ''+str+'': str } var p = can.onsyntax[can.parse]; if (!p) { return line } p = can.onsyntax[p.link]||p, p.split = p.split||{} p.keyword && (line = can.core.List(can.core.Split(line, p.split.space||"\t ", p.split.operator||"{[(.,:;!|<>)]}", {detail: true}), function(item, index, array) { - item = can.base.isObject(item)? item: {text: item} - var text = item.text, type = item.keyword||p.keyword[text] + item = can.base.isObject(item)? item: {text: item}; var text = item.text, type = item.keyword||p.keyword[text] switch (item.type) { case html.SPACE: return text case lang.STRING: return wrap(lang.STRING, item.left+text+item.right) @@ -336,12 +382,8 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", list: ["keyword", "prefix", "line } }).join("")) - p.prefix && can.core.Item(p.prefix, function(pre, type) { - if (can.base.beginWith(line, pre)) { line = wrap(type, line) } - }) - p.suffix && can.core.Item(p.suffix, function(end, type) { - if (can.base.endWith(line, end)) { line = wrap(type, line) } - }) + p.prefix && can.core.Item(p.prefix, function(pre, type) { if (can.base.beginWith(line, pre)) { line = wrap(type, line) } }) + p.suffix && can.core.Item(p.suffix, function(end, type) { if (can.base.endWith(line, end)) { line = wrap(type, line) } }) return line }, }) @@ -372,22 +414,14 @@ Volcanos(chat.ONKEYMAP, {help: "导入数据", }, _engine: {}, }) Volcanos(chat.ONACTION, {help: "控件交互", list: ["搜索", "打开", "添加", "插件", "扩展"], - _trans: {width: "宽度", height: "高度", website: "网页"}, + _trans: {load: "加载", link: "链接", width: "宽度", height: "高度", website: "网页"}, "搜索": function(event, can) { can.user.input(event, can, [mdb.NAME, [ctx.ACTION, nfs.TAGS, nfs.GREP, cli.MAKE]], function(data) { can.ui.search.Update({}, [ctx.ACTION, data.action, data.name]) }) }, - "打开": function(event, can) { - can.user.input(event, can, [nfs.FILE], function(list) { - can.onimport.tabview(can, can.Option(nfs.PATH), list[0]) - }) - }, - "添加": function(event, can) { - can.user.input(event, can, [ctx.INDEX], function(list) { - can.onimport.tabview(can, can.Option(nfs.PATH), list[0], ctx.INDEX) - }) - }, + "打开": function(event, can) { can.user.input(event, can, [nfs.FILE], function(list) { can.onimport.tabview(can, can.Option(nfs.PATH), list[0]) }) }, + "添加": function(event, can) { can.user.input(event, can, [ctx.INDEX], function(list) { can.onimport.tabview(can, can.Option(nfs.PATH), list[0], ctx.INDEX) }) }, "插件": function(event, can) { can.user.input(event, can, [ctx.INDEX], function(list) { var sub = can.toolkit[list[0]]; if (sub) { sub.select(); return } @@ -400,9 +434,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: ["搜索", "打开", "添 can.onimport.exts(can, list[0], function(sub) { can.extentions[list[0]] = sub.select() }) }) }, - sess: function(event, can) { - can.onexport.sess(can), can.user.toastSuccess(can) - }, + sess: function(event, can) { can.onexport.sess(can), can.user.toastSuccess(can) }, load: function(event, can) { var file = can.base.Path("/require/", can.Option(nfs.PATH), can.Option(nfs.FILE)) delete(Volcanos.meta.cache[file]), eval("\n_can_name = \""+file+"\"\n"+can.onexport.content(can)+"\n_can_name = \"\"\nconsole.log(\"once\")") @@ -415,7 +447,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: ["搜索", "打开", "添 can.onimport.profile(can, msg) }) }, - exec: function(event, can) { can.request(event, {_toast: "执行中..."}) + exec: function(event, can) { can.request(event, {_toast: "执行中...", "some": "run"}) can.runAction(event, mdb.ENGINE, [can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.display(can, msg) }) @@ -459,7 +491,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: ["搜索", "打开", "添 } if (s.indexOf("kit.") == 0) { s = s.replace("kit.", "toolkits.") } - if (s.indexOf(".") == 0) { s = s.slice(1) } + if (s.indexOf(ice.PT) == 0) { s = s.slice(1) } can.onaction.searchLine(event, can, s) }} ]}]); return ui.tr @@ -503,7 +535,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: ["搜索", "打开", "添 } var push = can.onimport.history(can, {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()}) - if (can.isCmdMode()) { location.hash = push.file+","+(push.line||1) } + if (can.isCmdMode()) { location.hash = push.file+ice.FS+(push.line||1) } can.onaction._selectLine(event, can) }) }, @@ -521,17 +553,11 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: ["搜索", "打开", "添 }, }) Volcanos(chat.ONEXPORT, {help: "导出数据", list: ["文件数", "解析器", "文件名", "当前行", "跳转数", "标签数"], - sess: function(can) { - can.user.localStorage(can, "web.code.inner.sess", {"plug": can.onexport.plug(can), "exts": can.onexport.exts(can), "tabs": can.onexport.tabs(can)}) - }, - keys: function(can, file, path) { return (path||can.Option(nfs.PATH))+":"+(file||can.Option(nfs.FILE)) }, + sess: function(can) { can.user.localStorage(can, "web.code.inner.sess", {"plug": can.onexport.plug(can), "exts": can.onexport.exts(can), "tabs": can.onexport.tabs(can)}) }, + keys: function(can, file, path) { return (path||can.Option(nfs.PATH))+ice.DF+(file||can.Option(nfs.FILE)) }, tabs: function(can) { return can.core.Item(can.tabview, function(key, msg) { return key+ice.DF+msg.Option(nfs.LINE) }) }, plug: function(can) { return can.core.Item(can.toolkit) }, exts: function(can) { return can.core.Item(can.plugins) }, - position: function(can, index, total) { total = total||can.max - return (parseInt(index))+ice.PS+parseInt(total)+" = "+parseInt((index)*100/total)+"%" - }, - content: function(can) { - return can.page.Select(can, can.ui.content, "td.text", function(item) { return item.innerText }).join(ice.NL) - }, + position: function(can, index, total) { total = total||can.max; return (parseInt(index))+ice.PS+parseInt(total)+" = "+parseInt((index)*100/total)+"%" }, + content: function(can) { return can.page.Select(can, can.ui.content, "td.text", function(item) { return item.innerText }).join(ice.NL) }, }) diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index d11730fd..db741934 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -1,6 +1,6 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) { can.require(["inner.js"], function(can) { can.onimport.inner_init(can, msg, function() { can.undo = [], can.redo = [] - can.onkeymap._build(can), can.onimport._input(can), can.onkeymap._plugin({}, can), can.base.isFunc(cb) && cb(msg) + can.onimport._input(can), can.onkeymap._build(can), can.onkeymap._plugin({}, can), can.base.isFunc(cb) && cb(msg) }, target) }, function(can, name, sub) { name == chat.ONIMPORT && (can.onimport.inner_init = sub._init) if (name == chat.ONACTION) { can._trans = can.base.Copy(can._trans||{}, sub._trans) } @@ -55,7 +55,7 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互", }, }, normal: { - escape: function(event, can) { can.onkeymap._plugin(event, can) }, + Escape: function(event, can) { can.onkeymap._plugin(event, can) }, ArrowLeft: function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) }, ArrowRight: function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) }, ArrowDown: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) }, @@ -174,8 +174,7 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互", Volcanos(chat.ONACTION, {help: "控件交互", list: [nfs.SAVE, code.AUTOGEN, code.COMPILE, nfs.SCRIPT, chat.WEBSITE, web.DREAM, code.PUBLISH], _run: function(event, can, button, args, cb) { can.runAction(event, button, args, cb||function(msg) { - can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option(nfs.FILE)) - can.onimport.project(can, can.Option(nfs.PATH)), can.user.toastSuccess(can, button) + can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option(nfs.FILE)), can.ui.source.refresh() }) }, _runs: function(event, can, button) { var meta = can.Conf(); can.request(event, {action: button}) @@ -184,25 +183,22 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: [nfs.SAVE, code.AUTOGEN, co }) }, save: function(event, can, button) { can.request(event, {file: can.Option(nfs.FILE), content: can.onexport.content(can)}) - can.runAction(event, nfs.SAVE, [can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function() { - can.user.toastSuccess(can, button) - }) + can.onaction._run(event, can, button, [can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)]) }, autogen: function(event, can, button) { can.onaction._runs(event, can, button) }, - compile: function(event, can, button) { var toast0 = can.user.toastProcess(can, "编译中...") - can.runAction(event, button, [], function(msg) { toast0.close() + compile: function(event, can, button) { var toast = can.user.toastProcess(can, "编译中...") + can.runAction(can.request(event), button, [], function(msg) { toast.close() if (msg.Length() == 0) { var toast1 = can.user.toastProcess(can, "重启中...") - can.core.Timer(3000, function() { toast1.close(), can.onaction["展示"]({}, can) }) + can.onmotion.delay(can, function() { toast1.close(), can.onaction[cli.SHOW]({}, can) }, 3000) } else { can.ui.search._show(msg) } + }) }, script: function(event, can, button) { - can.request(event, {file: "hi/hi.js"}) - can.onaction._runs(event, can, button) + can.onaction._runs(can.request(event, {file: "hi/hi.js"}), can, button) }, website: function(event, can, button) { - can.request(event, {file: "hi.zml"}) - can.onaction._runs(event, can, button) + can.onaction._runs(can.request(event, {file: "hi.zml"}), can, button) }, publish: function(event, can, button) { can.runAction(event, button, [], function(msg) { can.user.toastConfirm(can, msg.Result(), button) }) @@ -221,8 +217,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: [nfs.SAVE, code.AUTOGEN, co }) }) }) - can.request(event, {text: can.base.Format(list)}) - can.runAction(event, button) + can.runAction(can.request(event, {text: can.base.Format(list)}), button) }, _complete: function(event, can, target) { target = target||can.ui.complete if (event == undefined) { return } @@ -304,7 +299,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: [nfs.SAVE, code.AUTOGEN, co can.current.line.appendChild(can.ui.current), can.page.style(can, can.ui.current, html.LEFT, td.offsetLeft-1, html.WIDTH, can.ui.content.style.width) if (event) { if (event.type == "click" && can.mode != "insert") { can.onkeymap._insert(event, can) - can.core.Timer(10, function() { can.onaction._complete(event, can) }) + can.onmotion.delay(can, function() { can.onaction._complete(event, can) }) } can.ui.current.focus(), can.ui.content.scrollLeft -= 10000 can.onkeymap.cursorMove(can, can.ui.current, 0, (event.offsetX)/12-1) @@ -316,15 +311,13 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: [nfs.SAVE, code.AUTOGEN, co can.max++, can.page.Select(can, item, "td.line", function(item) { item.innerText = index+1 }) }) }, - insertLine: function(can, value, before) { - var line = can.onaction.appendLine(can, value) + insertLine: function(can, value, before) { var line = can.onaction.appendLine(can, value) before && can.ui.content.insertBefore(line, can.onaction._getLine(can, before)) return can.onaction.rerankLine(can), can.onaction._getLineno(can, line) }, deleteLine: function(can, line) { line = can.onaction._getLine(can, line) var next = line.nextSibling||line.previousSibling - can.page.Remove(can, line), can.onaction.rerankLine(can) - return next + return can.page.Remove(can, line), can.onaction.rerankLine(can), next }, modifyLine: function(can, line, value) { can.page.Select(can, can.ui.content, html.TR, function(item, index) { diff --git a/plugin/local/team/plan.js b/plugin/local/team/plan.js index 874ede33..3ad4c6e3 100644 --- a/plugin/local/team/plan.js +++ b/plugin/local/team/plan.js @@ -86,7 +86,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }]) }), can.onimport._display(can, task) }, _display: function(can, task) { if (!task["extra.cmd"]) { return } - can.onappend.plugin(can, {type: chat.STORY, ctx: task["extra.ctx"], cmd: task["extra.cmd"], arg: task["extra.arg"]}, function(sub, meta) { + can.onappend.plugin(can, {type: "plug", ctx: task["extra.ctx"], cmd: task["extra.cmd"], arg: task["extra.arg"]}, function(sub, meta) { sub.run = function(event, cmds, cb) { var msg = can.request(event, kit.Dict("task.pod", task["pod"], "task.zone", task.zone, "task.id", task.id)) can.runAction(event, ice.RUN, [task[mdb.ZONE], task[mdb.ID]].concat(cmds), cb) } diff --git a/plugin/state.js b/plugin/state.js index 643f123f..2634083e 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -1,7 +1,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, conf, cb, target) {}, _process: function(can, msg) { msg.OptionStatus() && can.onmotion.clear(can, can._status) && can.onappend._status(can, can.base.Obj(msg.OptionStatus())) - return can.core.CallFunc([can.onimport, msg.OptionProcess()], {can: can, msg: msg}) + return can.core.CallFunc([can.onimport, msg.OptionProcess()], {can: can, sub: can, msg: msg}) }, _location: function(can, msg, _arg) { can.user.jumps(_arg); return true }, @@ -111,7 +111,7 @@ Volcanos(chat.ONACTION, {help: "交互操作", list: [ mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input([], true)), ]) }, - "打开链接": function(event, can) { var meta = can.Conf(), args = can.Option() + "打开链接": function(event, can) { var meta = can.Conf(), args = can.Option(); args.river = "", args.storm = "" args.cmd = meta.index||can.core.Keys(meta.ctx, meta.cmd), args.cmd == "web.wiki.word" && (args.cmd = args.path) can.user.isWeiXin? can.user.jumps(can.misc.MergeURL(can, args)): can.user.open(can.misc.MergeURL(can, args)) }, diff --git a/plugin/table.js b/plugin/table.js index ab7dc079..750e2ae2 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -1,7 +1,11 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) { can.user.isMobile && !can.user.isLandscape() && can.onmotion.hidden(can, can._action) - var cbs = can.onimport[can._args[ctx.STYLE]]; if (can.base.isFunc(cbs)) { + var cbs = can.onimport[can.Conf(ctx.STYLE)]; if (can.base.isFunc(cbs)) { can.page.ClassList.add(can, target, can._args[ctx.STYLE]) + can.core.CallFunc(cbs, { + can: can, msg: msg, target: target, + list: msg.Table(), + }) return cbs(can, msg, target) } @@ -38,39 +42,44 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }]); return ui.first }, - zone: function(can, list, target) { var color = ["blue", "red", "cyan"] - return can.page.Append(can, target, can.core.List(list, function(zone, index) { return {view: "zone", list: [ - {view: "name", inner: zone.name, style: {background: color[index%color.length]}, onclick: function() { - can.onmotion.toggle(can, event.target.nextSibling.nextSibling) - can.onmotion.toggle(can, event.target.nextSibling) + zone: function(can, list, target) { var color = ["blue", "red", "green"] + return can.page.Append(can, target, can.core.List(list, function(zone, index) { return {view: html.ZONE, list: [ + {view: html.NAME, inner: zone.name, style: {background: color[index%color.length]}, onclick: function() { + can.onmotion.toggle(can, zone._action), can.onmotion.toggle(can, zone._target) }, onmouseenter: function(event) { - can.user.carteRight(event, can, { + zone._menu? can.user.carteRight(event, can, zone._menu.meta, zone._menu.list, function(event, button, meta) { + meta[button](event, zone) + }): can.user.carteRight(event, can, { "折叠": function() { - can.page.Select(can, event.target.nextSibling.nextSibling, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, false) }) + can.page.Select(can, zone._target, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, false) }) }, "展开": function() { - can.page.Select(can, event.target.nextSibling.nextSibling, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, true) }) + can.page.Select(can, zone._target, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, true) }) }, - }, ["折叠", "展开"]) - }, _init: function(item) { if (list.length > 1 && index > 0) { can.onmotion.delay(can, function() { item.click() }) } }}, - {view: "action", _init: function(item) { - can.onappend._action(can, [{input: "type", onkeyup: function(event) { - can.page.Select(can, item.nextSibling, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, true) }) - can.page.Select(can, item.nextSibling, html.DIV_ITEM, function(item) { + "刷新": function() { can.onmotion.clear(can, zone._target), zone._init(zone._target) }, + }, ["折叠", "展开", "刷新"]) + }}, + {view: html.ACTION, _init: function(target) { zone._action = target + can.onappend._action(can, [{input: html.TEXT, onkeyup: function(event) { + can.page.Select(can, zone._target, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, true) }) + can.page.Select(can, zone._target, html.DIV_ITEM, function(item) { can.page.Select(can, item, "div.name", function(name) { can.onmotion.toggle(can, item, name.innerText.indexOf(event.target.value) > -1) }) }) }, onclick: function(event) { can.onmotion.focus(can, event.target) - },_init: function(item) { + }, _init: function(target) { can.onmotion.delay(can, function() { - can.page.styleWidth(can, item, item.parentNode.parentNode.parentNode.offsetWidth-32) + can.page.styleWidth(can, target, target.parentNode.parentNode.parentNode.offsetWidth-32) }) - }}], item, {}) + }}], target, {}) }}, - {view: "list", _init: function(item) { - can.base.isFunc(zone._init) && zone._init(item) + {view: html.ZONE, _init: function(target) { can.ui[zone.name] = zone + zone._target = target, zone.refresh = function() { + can.onmotion.clear(can, target), zone._init(target) + } + can.base.isFunc(zone._init) && zone._init(target) }} ]} })) }, diff --git a/proto.js b/proto.js index 2c149c1a..5236d0bb 100644 --- a/proto.js +++ b/proto.js @@ -240,16 +240,20 @@ var html = { TOGGLE: "toggle", PAGE: "page", TABS: "tabs", - LIST: "list", ITEM: "item", MENU: "menu", NODE: "node", + ZONE: "zone", NAME: "name", + LIST: "list", ITEM: "item", + HIDE: "hide", SHOW: "show", AUTO: "auto", HEAD: "head", LEFT: "left", MAIN: "main", FOOT: "foot", PLUGIN: "plugin", LAYOUT: "layout", CONTENT: "content", DIV_PAGE: "div.page", DIV_TABS: "div.tabs", + DIV_ZONE: "div.zone", DIV_LIST: "div.list", DIV_ITEM: "div.item", + DIV_NAME: "div.name", DIV_CODE: "div.code", DIV_LAYOUT_HEAD: "div.layout.head", DIV_LAYOUT_LEFT: "div.layout.left",