From 2fb7172f2156270f0f2db676a154a220e66b862f Mon Sep 17 00:00:00 2001 From: harveyshao Date: Sun, 16 Jan 2022 16:41:01 +0800 Subject: [PATCH] opt inner.js --- frame.js | 35 +++++++++++++------ lib/page.js | 5 +-- lib/user.js | 8 ++--- panel/search.js | 2 +- plugin/input.js | 6 ++-- plugin/input/key.js | 45 +++++++++++++------------ plugin/local/code/inner.js | 69 ++++++++++++++++++++++++++++++++++---- plugin/local/code/vimer.js | 11 +++--- plugin/local/wiki/feel.css | 1 + plugin/story/spide.js | 2 +- proto.js | 1 + 11 files changed, 130 insertions(+), 55 deletions(-) diff --git a/frame.js b/frame.js index 5dd85e17..50778f20 100644 --- a/frame.js +++ b/frame.js @@ -71,7 +71,7 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, signal: shy("触发事件", function(can, name, msg) { msg = msg||can.request() name == chat.ONREMOTE? can.misc.Log("signal", name, msg.Option("_msg")): can.misc.Log("signal", name, msg) can.core.List(can.onengine.listen.meta[name], function(cb) { - can.core.CallFunc(cb, {msg: msg}) + can.core.CallFunc(cb, {msg: msg, event: msg._event}) }) }), plugin: shy("添加插件", {}, [], function(can, name, command) { name = can.base.trimPrefix(name, "can.") @@ -414,16 +414,21 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, var input = meta.action||mdb.KEY; input != ice.AUTO && can.require(["/plugin/input/"+input+".js"], function(can) { can.core.ItemCB(can.onfigure[input], function(key, on) { var last = target[key]; target[key] = function(event) { on(event, can, meta, function(cb) { can.sub? can.base.isFunc(cb) && cb(can.sub, cbs): can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT}, ["/plugin/input/"+input+".js"], function(sub) { sub.Conf(meta) + can.onmotion.hidden(can, sub._target) sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option()); (meta.run||can.run)(event, cmds, cb, true) }, can.sub = sub sub.close = function() { sub.page.Remove(sub, sub._target), delete(can.sub) } - sub.onappend._action(sub, [cli.CLOSE, cli.CLEAR], sub._action, kit.Dict( + sub.onappend._action(sub, [cli.CLOSE, cli.CLEAR, cli.REFRESH], sub._action, kit.Dict( cli.CLOSE, function(event) { sub.close() }, cli.CLEAR, function(event) { target.value = "" }, + cli.REFRESH, function(event) { can.base.isFunc(cb) && cb(sub) }, )), sub.onappend._status(sub, [mdb.TOTAL, mdb.INDEX]) meta.style && sub.page.Modify(sub, sub._target, {style: meta.style}) - can.base.isFunc(cb) && cb(sub, cbs) + can.base.isFunc(cb) && cb(sub, function() { + can.onmotion.hidden(can, sub._target, true) + can.base.isFunc(cbs) && cbs(sub) + }) }, document.body) }, target, last) } }) }) @@ -441,7 +446,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, can.onengine.signal(can, "keymap.focus", can.request({}, {cb: function(event) { if (event.target.tagName == "INPUT") { return } if (event.key == lang.ESCAPE) { ui.close(); return } - if (event.key == ice.SP) { input.focus(), event.stopPropagation(), event.preventDefault() } + if (event.key == ice.SP) { input.focus(), can.onkeypop.prevent(event) } }})) }, onkeydown: function(event) { can.onkeypop.input(event, can) if (event.key != lang.ENTER) { return } @@ -509,6 +514,9 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight-5; if (right) { var left = event.clientX-event.offsetX+event.target.offsetWidth, top = event.clientY-event.offsetY } + if (!left) { left = window.innerWidth/2-target.offsetWidth/2 } + if (!top) { top = 32 } + layout = {left: left, top: top} if (layout.top < 0) { layout.top = 0 } if (layout.left < 0) { layout.left = 0 } @@ -677,7 +685,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe } }, _init: function(target) { item && can.onappend.figure(can, item, target), target.value = text - target.focus(), target.setSelectionRange(0, -1) + can.onmotion.focus(can, target) }}]) }, modifys: function(can, target, cb, item) { var back = target.innerHTML @@ -696,7 +704,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe } }, _init: function(target) { item && can.onappend.figure(can, item, target) - target.focus(), target.setSelectionRange(0, -1) + can.onmotion.focus(can, target) }}]) }, @@ -728,7 +736,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe can.page.Modify(can, target, {style: {left: layout.left, top: layout.top}}) } can.base.isFunc(cb) && cb(target) - event.stopPropagation(), event.preventDefault() + can.onkeypop.prevent(event) } can.base.isFunc(cb) && cb(target) }, @@ -754,7 +762,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe }) Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) { document.body.onkeydown = function(event) { var msg = can.request(event) - msg.Option("model", "normal"); if (event.target.tagName == "INPUT" || event.target.tagName == "TEXTAREA") { + msg.Option("model", "normal"); if (event.target.tagName == "SELECT" || event.target.tagName == "INPUT" || event.target.tagName == "TEXTAREA") { msg.Option("model", event.ctrlKey? "insert_ctrl": "insert") return } @@ -780,7 +788,7 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio function repeat(cb, count) { list = [] for (var i = 1; i <= count; i++) { if (cb(event, can, target, count)) { break } } - event.stopPropagation(), event.preventDefault() + // can.onkeypop.prevent(event) } var map = can.onkeypop._mode[mode] @@ -810,8 +818,10 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio enter: function(event, can, target) { var his = target._history || [] his.push(target.value) + if (event.target.tagName == "INPUT") { + can.onmotion.focus(can, target) + } - target.setSelectionRange(0, -1) target._current = his.length target._history = his }, @@ -869,11 +879,14 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio input: function(event, can) { var target = event.target target._keys = can.onkeypop._parse(event, can, event.ctrlKey? "insert_ctrl": mdb.INSERT, target._keys||[], target) - if (target._keys.length == 0) { event.stopPropagation(), event.preventDefault() } + if (target._keys.length == 0 && target.tagName == "INPUT") { can.onkeypop.prevent(event) } }, DelText: function(target, start, count) { target.value = target.value.substring(0, start)+target.value.substring(start+(count||target.value.length), target.value.length) target.setSelectionRange(start, start) }, + prevent: function(event) { + event.stopPropagation(), event.preventDefault() + } }) _can_name = "" diff --git a/lib/page.js b/lib/page.js index 2735d7c6..0157390f 100644 --- a/lib/page.js +++ b/lib/page.js @@ -68,7 +68,7 @@ Volcanos("page", {help: "用户界面", ClassList: { return target }), Remove: shy("删除节点", function(can, target) { - target && target.parentNode && target.parentNode.removeChild(target) + return target && target.parentNode && target.parentNode.removeChild(target), target }), Create: shy("创建节点", function(can, key, value) { return can.page.Modify(can, document.createElement(key), value) @@ -114,7 +114,7 @@ Volcanos("page", {help: "用户界面", ClassList: { type = html.BUTTON, name = name||list[0] data.innerText = can.user.trans(can, list[0]), data.onclick = function(event) { can.base.isFunction(list[1]) && list[1](event, name) - event.stopPropagation(), event.preventDefault() + can.onkeypop.prevent(event) return true } @@ -399,6 +399,7 @@ Volcanos("page", {help: "用户界面", ClassList: { return res }, offsetLeft: function(item) { var res = 0 + // if (item.offsetLeft) { return item.offsetLeft } while (item) { res += item.offsetLeft||0, item = item.parentNode } return res }, diff --git a/lib/user.js b/lib/user.js index 1a488cd9..fe4b2757 100644 --- a/lib/user.js +++ b/lib/user.js @@ -189,9 +189,9 @@ Volcanos("user", {help: "用户操作", agent: { } var input = can.page.Append(can, event.target.parentNode, [{type: html.TEXTAREA, value: text}]).first - input.setSelectionRange(0,-1), input.focus(), document.execCommand("Copy") + can.onmotion.focus(can, input), document.execCommand("Copy") can.page.Remove(can, input), can.user.toastSuccess(can) - event.stopPropagation(), event.preventDefault() + can.onkeypop.prevent(event) }, carte: function(event, can, meta, list, cb, parent) { meta = meta||can.ondetail||can.onaction||{}, list = list&&list.length > 0? list: meta.list||[]; if (list.length == 0) { return } @@ -215,9 +215,9 @@ Volcanos("user", {help: "用户操作", agent: { var carte = {_target: ui._target, _parent: parent} null && can.onmotion.float.add(can, chat.CARTE, carte) ui._target.onmouseover = function(event) { - event.stopPropagation(), event.preventDefault() + can.onkeypop.prevent(event) } - return event.stopPropagation(), event.preventDefault(), carte + return can.onkeypop.prevent(event), carte }, carteRight: function(event, can, meta, list, cb, parent) { var carte = can.user.carte(event, can, meta, list, cb, parent) diff --git a/panel/search.js b/panel/search.js index 8f02ec16..1f804ce9 100644 --- a/panel/search.js +++ b/panel/search.js @@ -52,7 +52,7 @@ Volcanos("onaction", {help: "交互操作", list: [cli.CLEAR, cli.CLOSE, cli.DON {input: ["word", function(event) { can.onkeypop.input(event, can) if (event.key == lang.ESCAPE) { can.onmotion.hide(can) } - if (event.key == lang.ENTER) { event.stopPropagation(), event.preventDefault() + if (event.key == lang.ENTER) { can.onkeypop.prevent(event) if (event.shiftKey) { var first = can.page.Select(can, can.ui.content, html.TR)[1] return can.onaction[can.type == "*"? chat.PLUGIN: html.SELECT](event, can, first.dataset.index) } diff --git a/plugin/input.js b/plugin/input.js index d332c975..cd7e5730 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -23,15 +23,15 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, onkeydown: function(event, can) { can.onkeypop.input(event, can, event.target) if (can.Conf(mdb.TYPE) == html.TEXTAREA) { if (!event.ctrlKey) { return } } if (event.key == lang.ENTER) { - can.run(event), event.target.setSelectionRange(0, -1) - event.stopPropagation(), event.preventDefault() + can.run(event), can.onmotion.focus(can, event.target) + can.onkeypop.prevent(event) } if (!event.ctrlKey) { return } switch (event.key) { case "b": can.CloneInput(); break case "m": can.CloneField(); break default: return - } event.stopPropagation(), event.preventDefault() + } can.onkeypop.prevent(event) }, }) diff --git a/plugin/input/key.js b/plugin/input/key.js index fea04c79..76281290 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -9,6 +9,15 @@ Volcanos("onfigure", {help: "控件详情", list: [], key: { }} }) }, + _show: function(can, meta, cbs, target) { + can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { + if (msg.Length() == 0) { return can.close() } + target._can && target._can.close(), target._can = can + can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length()) + target._msg = msg, can.base.isFunc(cbs) && cbs(can) + }) + + }, _select: function(event, can, target) { function select(order) { if (order == 0) { target.value = target._value } var index = 0; return can.page.Select(can, can._output, html.TR, function(tr) { @@ -31,27 +40,17 @@ Volcanos("onfigure", {help: "控件详情", list: [], key: { default: target._index = 0, target._value = "" } }, - onfocus: function(event, can, meta, cb, target) { cb(function(can, cbs) { + onfocus: function(event, can, meta, cb, target) { if (target._figure) { return } target._figure = {}; cb(function(can, cbs) { target._figure = can.onlayout.figure(event, can, can._target, false, {top: can.page.offsetTop(target)+target.offsetHeight, left: can.page.offsetLeft(target)}) - can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { - if (msg.Length() == 0) { return can.close() } - target._msg = msg, can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length()) - can.base.isFunc(cbs) && cbs(can) - }) + can.onfigure.key._show(can, meta, cbs, target) }) }, - onblur: function(event, can, meta, cb, target) { cb(function(can, cbs) { - can.close() - }) }, - onclick: function(event, can, meta, cb, target) { cb(function(can, cbs) { - can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { - if (msg.Length() == 0) { return can.close() } - can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length()) - target._msg = msg, target._figure = can.onlayout.figure(event, can) - can.base.isFunc(cbs) && cbs(can) - }) + onblur: function(event, can, meta, cb, target) { delete(target._figure), target._can && target._can.close() }, + onclick: function(event, can, meta, cb, target) { if (target._figure) { target._figure = can.onlayout.figure(event, can, can.core.Value(target, "_can._target")||{}); return } target._figure = {}; cb(function(can, cbs) { + target._figure = can.onlayout.figure(event, can) + can.onfigure.key._show(can, meta, cbs, target) }) }, onkeydown: function(event, can, meta, cb, target, last) { - var msg = target._msg; msg && cb(function(can, cbs) { + if (target._figure) { can = target._can if (event.ctrlKey) { can.onfigure.key._select(event, can, target) } else { target._index = 0, target._value = "" switch (event.key) { case lang.ENTER: can.close(); return } @@ -62,16 +61,20 @@ Volcanos("onfigure", {help: "控件详情", list: [], key: { }) } - can.onlayout.figure(event, can, can._target, false, target._figure) var total = can.page.Select(can, can._output, html.TR, function(tr) { if (!can.page.ClassList.has(can, tr, html.HIDDEN)) { return tr} }).length-1 + if (total == 0) { + can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { + can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length()) + target._msg = msg + }) + } can.Status(kit.Dict(mdb.TOTAL, total, mdb.INDEX, target._index)) - can.base.isFunc(cbs) && cbs(can) - }) + } if (event.ctrlKey && ["n", "p"].indexOf(event.key) > -1) { - return event.stopPropagation(), event.preventDefault() + return can.onkeypop.prevent(event) } switch (event.key) { case lang.ESCAPE: event.target.blur(); return } can.base.isFunc(last) && last(event, can) diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 96cc503d..d59accb7 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -11,6 +11,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE)) can.onimport.project(can, can.Option(nfs.PATH), function() { can.onimport._toolkit(can, can.ui.toolkit), can.core.Timer(100, function() { + can.onimport.sess(can) can.core.Next(can.core.Split(msg.OptionOrSearch("tool")), function(item, next) { can.onimport.toolkit(can, {index: item}, next) }, function() { @@ -47,6 +48,13 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target ))) { return } run(event, cmds, cb, silent) } + can.user.mod.isCmd && can.onengine.listen(can, chat.ONKEYDOWN, function(event) { + var cb = can.onaction[kit.Dict( + "r", "执行", "v", "展示", "s", "保存", + "t", "添加", "f", "打开", "p", "插件", lang.ESCAPE, "清屏", + )[event.key]] + can.base.isFunc(cb) && cb(event, can) + }) }, _project: function(can, target) { target._toggle = function(event) { can.onmotion.toggle(can, target), can.onimport.layout(can) } @@ -113,14 +121,14 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target tabview: function(can, path, file, line, cb) { var key = path+":"+file if (can.tabview[key]) { can._msg && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.tabview[key] - can.Option({path: path, file: file, line: line||parseInt(can._msg.Option(nfs.LINE))||1}) + can.Option({path: path, file: file, line: line||can._msg.Option(nfs.LINE)||1}) return can._msg.Option(can.Option()), can.onsyntax._init(can, can._msg, cb) } - if (line == ctx.INDEX) { var msg = can.request({}, {index: file}) + if (line == ctx.INDEX) { var msg = can.request({}, {index: file, line: line}) can.tabview[key] = msg msg._tab = can.onappend.tabs(can, [{name: file.split(ice.PS).pop(), text: file}], function(event, meta) { - can.onimport.tabview(can, path, file, "", cb) + can.onimport.tabview(can, path, file, "", cb), cb = null }, function(item) { delete(can.tabview[key]) }) return } @@ -129,7 +137,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target can.Option({path: path, file: file, line: line||1}) can.run({}, [path, file], function(msg) { can.tabview[key] = msg msg._tab = can.onappend.tabs(can, [{name: file.split(ice.PS).pop(), text: file}], function(event, meta) { - can.onimport.tabview(can, path, file, "", cb) + can.onimport.tabview(can, path, file, "", cb), cb = null }, function(item) { delete(can.tabview[key]) }) }, true) }, @@ -161,11 +169,13 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target can.ui.toolkit.status.appendChild(sub._legend), sub._legend.onclick = function(event) { if (can.page.Select(can, can.ui.toolkit.status, ice.PT+html.SELECT)[0] == event.target) { + can.page.ClassList.del(can, event.target, html.SELECT) can.page.ClassList.del(can, sub._target, html.SELECT) return } can.onmotion.select(can, can.ui.toolkit.status, html.DIV_LEGEND, event.target) can.onmotion.select(can, can.ui.toolkit.output, html.FIELDSET, sub._target) + can.page.Select(can, sub._option, html.OPTION_ARGS)[0].focus() } can.base.isFunc(cb) && cb(sub) }, can.ui.toolkit.output) @@ -181,6 +191,14 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target can.page.style(can, can.ui.content, html.WIDTH, width-can.ui.project.offsetWidth-can.ui.profile.offsetWidth-25) can.page.style(can, can.ui.profile_output, html.HEIGHT, can.ui.content.offsetHeight-html.ACTION_HEIGHT) }, + sess: function(can, sess) { sess = sess||can.base.Obj(localStorage.getItem("web.code.inner.sess"), {}) + can.core.Next(sess.tabs, function(item, next) { var ls = item.split(":") + can.onimport.tabview(can, ls[0], ls[1], ls[2], next) + }) + can.core.Next(sess.tool, function(item, next) { + can.onimport.toolkit(can, {index: item}, function(sub) { can.toolkit[item] = sub, next() }) + }) + }, }, [""]) Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], _init: function(can, msg, cb) { if (can.onmotion.cache(can, function(cache_data) { @@ -189,6 +207,11 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], var p = cache_data[can.file]; p && (can.current = p.current, can.max = p.max) can.parse = can.base.Ext(can.file), can.Status("模式", "normal") can.onmotion.select(can, can._action, chat.DIV_TABS, msg._tab) + if (msg.Option(ctx.INDEX)) { + can.core.Timer(100, function() { + var input = can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]; input && input.focus() + }) + } return can.file }, can.ui.content, can.ui.profile_output, can.ui.display_output)) { return can.onaction.selectLine(can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb() @@ -198,6 +221,10 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], sub.run = function(event, cmds, cb) { can.run(event, [ctx.ACTION, ice.RUN, msg.Option(ctx.INDEX)].concat(cmds), cb, true) } + can.core.Timer(100, function() { + var input = can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]; input && input.focus() + }) + can.base.isFunc(cb) && cb() }, can.ui.content) return } @@ -239,7 +266,8 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], return line }, }) -Volcanos("onaction", {help: "控件交互", list: ["打开", "插件", "添加"], +Volcanos("onaction", {help: "控件交互", list: ["打开", "插件", "添加", "保存"], + "保存": function(event, can) { can.onexport.sess(can), can.user.toastSuccess(can) }, "打开": function(event, can) { can.user.input(event, can, [nfs.FILE], function(event, button, data, list, args) { can.onimport.tabview(can, can.Option(nfs.PATH), data.file) @@ -252,7 +280,8 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "插件", "添加"] }, "添加": function(event, can) { can.user.input(event, can, [ctx.INDEX], function(event, button, data, list, args) { - can.onimport.toolkit(can, data, function(sub) { can.toolkit[data.index] = data + var sub = can.toolkit[data.index]; if (sub) { sub._legend.click(); return } + can.onimport.toolkit(can, data, function(sub) { can.toolkit[data.index] = sub sub._legend.click(), sub.page.Select(sub, sub._target, html.OPTION_ARGS)[0].focus() }) }) @@ -263,6 +292,18 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "插件", "添加"] can.onimport.profile(can, msg) }, true) }, + "清屏": function(event, can) { + if (can.page.Select(can, document.body, ".input.float", function(item) { + return can.page.Remove(can, item) + }).length > 0) { return } + + if (can.page.Select(can, can.ui.toolkit.status, "div.select", function(item) { + return item.click(), item + }).length > 0) { return } + can.onmotion.hidden(can, can.ui.profile) + can.onmotion.hidden(can, can.ui.display) + can.onimport.layout(can) + }, "执行": function(event, can) { can.onimport.display(can) can.run(event, [ctx.ACTION, mdb.ENGINE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.display(can, msg) @@ -347,6 +388,22 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "插件", "添加"] }, }) Volcanos("onexport", {help: "导出数据", list: ["文件数", "解析器", "文件名", "当前行", "跳转数", "标签数"], + sess: function(can) { + localStorage.setItem("web.code.inner.sess", JSON.stringify( + { + "tabs": can.onexport.tabs(can), + "tool": can.onexport.tool(can), + } + )) + }, + tabs: function(can) { + return can.core.Item(can.tabview, function(key, msg) { + return key+":"+msg.Option(nfs.LINE) + }) + }, + tool: function(can) { + return can.core.Item(can.toolkit) + }, position: function(can, index, total) { total = total||can.max return (parseInt(index))+ice.PS+parseInt(total)+" = "+parseInt((index)*100/total)+"%" }, diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 11355ba1..30779408 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -101,7 +101,7 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" parse: function(event, can, mode) { can.keylist.push(event.key); if (can.mode != mode) { - event.stopPropagation(), event.preventDefault() + can.onkeypop.prevent(event) }; can.mode == "normal" && can.Status("按键", can.keylist.join("")) for (var pre = 0; pre < can.keylist.length; pre++) { @@ -130,9 +130,8 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" Enter: function(event, can) { can.onmotion.hidden(can, can.ui.command) can.page.Modify(can, can.ui.display, {style: {display: "block"}}) var line = can.ui.command.value || can.ui.cmd.value - can.ui.cmd.value = line, can.ui.cmd.focus() - can.ui.cmd.setSelectionRange(0, -1) - can.ui.command.value = "" + can.ui.command.value = "", can.ui.cmd.value = line + can.onmotion.focus(can, can.ui.cmd) can.onmotion.clear(can, can.ui.output) var ls = can.core.Split(line+" ", " ", ",") @@ -238,7 +237,7 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" insert: { Escape: function(event, can) { can.onkeymap._normal(can) can.onaction.modifyLine(can, can.current, can.ui.current.value) - event.stopPropagation(), event.preventDefault() + can.onkeypop.prevent(event) }, Enter: function(event, can) { var before = can.ui.current.value.slice(0, event.target.selectionEnd) @@ -249,7 +248,7 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" }, Backspace: function(event, can) { if (can.ui.current.selectionStart > 0) { return } - event.stopPropagation(), event.preventDefault() + can.onkeypop.prevent(event) if (!can.current.prev()) { return } var rest = can.current.text() diff --git a/plugin/local/wiki/feel.css b/plugin/local/wiki/feel.css index 5b744bb5..b388dcfd 100644 --- a/plugin/local/wiki/feel.css +++ b/plugin/local/wiki/feel.css @@ -11,4 +11,5 @@ fieldset.feel.float { margin:0 10px; padding:0 10px; background-color:#4eaad0c2; position:absolute; + top:26px; } diff --git a/plugin/story/spide.js b/plugin/story/spide.js index 3f0b3344..d7b51b4d 100644 --- a/plugin/story/spide.js +++ b/plugin/story/spide.js @@ -132,7 +132,7 @@ Volcanos("ondetail", {help: "用户交互", list: [], {x: tree.x-can.margin/4, y: y-can.size/2}, {x: tree.x+tree.width+can.margin/8, y: y+can.size/2}, ], style: {stroke: cli.RED, fill: html.NONE}, - }), event.stopPropagation(), event.preventDefault() + }), can.onkeypop.prevent(event) }, onclick: function(event, can, tree) { if (tree.list.length > 0 || tree.tags || tree.name.endsWith(can._args.split)) { diff --git a/proto.js b/proto.js index 24e38ee4..550a6098 100644 --- a/proto.js +++ b/proto.js @@ -140,6 +140,7 @@ var chat = { ONMAIN: "onmain", ONLOGIN: "onlogin", ONSEARCH: "onsearch", ONSIZE: "onsize", ONTOAST: "ontoast", ONREMOTE: "onremote", + ONKEYDOWN: "onkeydown", HEAD: "head", LEFT: "left", MAIN: "main", AUTO: "auto", HIDE: "hide", FOOT: "foot", SCROLL: "scroll", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom",