diff --git a/frame.js b/frame.js index e278d703..7f7c6a77 100644 --- a/frame.js +++ b/frame.js @@ -120,6 +120,14 @@ Volcanos(chat.ONDAEMON, {help: "推荐引擎", _init: function(can, name) { if ( pwd: function(can, msg, arg) { can._wss_name = can.ondaemon._list[0] = arg[0] }, toast: function(can, msg, arg) { can.core.CallFunc(can.user.toast, {can: can, msg: msg, cmds: arg}) }, refresh: function(can, msg, sub) { sub.Update() }, + action: function(can, msg, sub, arg) { + var _sub = can.core.Value(sub, chat._OUTPUTS_CURRENT) + if (_sub && _sub.onaction) { + _sub.onaction && _sub.onaction._daemon({}, _sub, arg) + return + } + sub.runAction({}, arg[0], arg.slice(1)) + }, grow: function(can, msg, sub, arg) { sub.onimport._grow(sub, msg, can.page.Color(arg.join(""))) }, exit: function(can, msg, sub) { can.user.close() }, }) @@ -344,6 +352,7 @@ Volcanos(chat.ONAPPEND, {help: "渲染引擎", _init: function(can, meta, list, }, list: [input]}]).concat(br))[item.name] }, table: function(can, msg, cb, target, sort) { if (msg.Length() == 0) { return } + var meta = can.base.Obj(msg.Option("meta")) var table = can.page.AppendTable(can, msg, target||can._output, msg.append, cb||function(value, key, index, line, array) { if (msg.append.length == 2 && msg.append[0] == mdb.KEY && msg.append[1] == mdb.VALUE) { if (key == mdb.VALUE) { key = line.key } @@ -372,7 +381,15 @@ Volcanos(chat.ONAPPEND, {help: "渲染引擎", _init: function(can, meta, list, } return {text: [value, html.TD], onclick: function(event) { var target = event.target - if (can.page.tagis(target, html.INPUT) && target.type == html.BUTTON) { return run([ctx.ACTION, target.name]) } + if (can.page.tagis(target, html.INPUT) && target.type == html.BUTTON) { + if (meta && meta[target.name]) { + var msg = can.request(event, {action: target.name}) + return can.user.input(event, can, meta[target.name], function(args) { var msg = can.request(event, {_handle: ice.TRUE}, line, can.Option()) + can.runAction(event, target.name, args) + }) + } + return run([ctx.ACTION, target.name]) + } if (key == mdb.HASH && can.user.mod.isDiv) { return can.user.jumps("/chat/div/"+value) } if (can.sup.onaction.change(event, can.sup, key, event.target.innerText).length == 0) { can.sup && can.sup._item_click && can.sup._item_click(value, key) @@ -383,6 +400,10 @@ Volcanos(chat.ONAPPEND, {help: "渲染引擎", _init: function(can, meta, list, can.onmotion.modifys(can, event.target, function(event, value, old) { run([ctx.ACTION, mdb.MODIFY, key, value]) }, item) }} }); table && can.page.styleClass(can, table, chat.CONTENT) + + meta && meta._trans && can.page.Select(can, table, "input", function(target) { + target.value = meta._trans[target.value]||target.value + }) if (msg.append && msg.append[msg.append.length-1] == ctx.ACTION) { can.page.ClassList.add(can, table, ctx.ACTION) } can._table = table, can.sup && (can.sup._table = table) return sort && can.page.RangeTable(can, table, sort), table diff --git a/plugin/input/key.js b/plugin/input/key.js index 878d2cfd..372339b7 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -1,4 +1,4 @@ -Volcanos(chat.ONFIGURE, {help: "控件详情", key: { +Volcanos(chat.ONFIGURE, {help: "控件详情", keyboard: { _init: function(event, can, cbs, target, name, value) { can.runAction(event, mdb.INPUTS, [name, value||target.value], function(msg) { can.onfigure.key._show(can, msg, cbs, target, name) diff --git a/plugin/input/keyboard.css b/plugin/input/keyboard.css new file mode 100644 index 00000000..f592d8f8 --- /dev/null +++ b/plugin/input/keyboard.css @@ -0,0 +1,72 @@ +fieldset.input.keyboard div.output div.small.key { + font-size:16px; white-space:pre; +} +fieldset.input.keyboard div.output div.key { + color:white; + margin:5px; + background-color:green; + font-size:24px; text-align:center; + height:40px; width:40px; float:left; + padding:0; +} +fieldset.input.keyboard div.output div.key.Tab { + width:60px; + background-color:red; +} +fieldset.input.keyboard div.output div.key.CapsLock { + width:70px; + background-color:red; +} +fieldset.input.keyboard div.output div.key.Ctrl { + width:70px; + background-color:red; +} +fieldset.input.keyboard div.output div.key.Win { + width:60px; + background-color:red; +} +fieldset.input.keyboard div.output div.key.special { + font-size:16px; +} +fieldset.input.keyboard div.output div.key span { + display:block; + margin-top:2px; +} +fieldset.input.keyboard div.output div.key.special span { + display:block; + margin-top:10px; +} +fieldset.input.keyboard div.output div.key.Alt { + width:60px; + background-color:red; +} +fieldset.input.keyboard div.output div.key.Shift { + width:90px; + background-color:red; +} +fieldset.input.keyboard div.output div.key.tail { + width:70px; + background-color:red; +} +fieldset.input.keyboard div.output div.key.Shift.tail { + width:140px; + background-color:red; +} +fieldset.input.keyboard div.output div.key.Enter { + width:110px; + background-color:red; +} +fieldset.input.keyboard div.output div.key.Space { + width:300px; + background-color:red; +} +fieldset.input.keyboard div.output div.key.Backspace { + width:90px; + background-color:red; +} +fieldset.input.keyboard div.output br { + clear:both; +} +fieldset.input.keyboard div.output div.key:hover { + background-color:green; +} diff --git a/plugin/input/keyboard.js b/plugin/input/keyboard.js new file mode 100644 index 00000000..a960f18f --- /dev/null +++ b/plugin/input/keyboard.js @@ -0,0 +1,126 @@ +Volcanos(chat.ONFIGURE, {help: "控件详情", keyboard: { + onclick: function(event, can, meta, cb, target) { + can.onfigure.keyboard._make(event, can, meta, cb, target) + }, + onfocus: function(event, can, meta, cb, target, last) { + can.onfigure.keyboard._make(event, can, meta, cb, target) + }, + _make: function(event, can, meta, cb, target, last) { + var sub = target._can; if (sub && sub._cbs) { return } + cb(function(sub, cbs) { sub._cbs = cbs + can.require(["/plugin/input/keyboard.css"]) + var msg = can.request({}); can.onfigure.keyboard._normal(can, msg) + var keys = {} + msg.Table(function(value) { value.type == "head" && can.page.Append(can, can._output, "br") + var t = value.type+" "+value.name+(value.name.indexOf("\n")>-1? " small": value.name.length>1? " special": "") + var div = can.page.Append(can, sub._output, [{view: t, list: [{text: [value.name]}], onclick: function(event) { + switch (value.name) { + case "Ctrl": + can._ctrl = !can._ctrl + keys[value.name] = div + can.page.style(can, div, "background-color", "green") + break + case "Shift": + can._shift = !can._shift + keys[value.name] = div + can.page.style(can, div, "background-color", "green") + break + case "Backspace": + target.value = target.value.slice(0, -1) + break + case "Enter": + break + case "Esc": + break + default: + can._shift = can._shift||event.shiftKey + if (value.name == "Space") { + target.value += " " + } else if (value.name.indexOf("\n") > -1) { + var ls = can.core.Split(value.name, "\n", "\n", "\n") + target.value += can._shift? ls[0]: ls[1] + } else if (can._shift) { + target.value += value.name.toUpperCase() + } else { + target.value += value.name + } + can.core.Item(keys, function(key, target) { + can.page.style(can, target, "background-color", "") + }), can._ctrl = false, can._shift = false + } + target.focus(), can.user.toast(can, value.name) + } }]).first + }) + }) + }, + _normal: function(can, msg) { + msg.Push({type: "key head", name: "Esc"}) + + msg.Push({type: "key head", name: "~\n`"}) + msg.Push({type: "key", name: "!\n1"}) + msg.Push({type: "key", name: "@\n2"}) + msg.Push({type: "key", name: "#\n3"}) + msg.Push({type: "key", name: "$\n4"}) + msg.Push({type: "key", name: "%\n5"}) + msg.Push({type: "key", name: "^\n6"}) + msg.Push({type: "key", name: "&\n7"}) + msg.Push({type: "key", name: "*\n8"}) + msg.Push({type: "key", name: "(\n9"}) + msg.Push({type: "key", name: ")\n0"}) + msg.Push({type: "key", name: "_\n-"}) + msg.Push({type: "key", name: "+\n="}) + msg.Push({type: "key", name: "Backspace"}) + + msg.Push({type: "key head", name: "Tab"}) + msg.Push({type: "key", name: "q"}) + msg.Push({type: "key", name: "w"}) + msg.Push({type: "key", name: "e"}) + msg.Push({type: "key", name: "r"}) + msg.Push({type: "key", name: "t"}) + msg.Push({type: "key", name: "y"}) + msg.Push({type: "key", name: "u"}) + msg.Push({type: "key", name: "i"}) + msg.Push({type: "key", name: "o"}) + msg.Push({type: "key", name: "p"}) + msg.Push({type: "key", name: "{\n["}) + msg.Push({type: "key", name: "}\n]"}) + msg.Push({type: "key tail", name: "|\n\\"}) + + // msg.Push({type: "key head", name: "CapsLock"}) + msg.Push({type: "key head", name: "Ctrl"}) + msg.Push({type: "key", name: "a"}) + msg.Push({type: "key", name: "s"}) + msg.Push({type: "key", name: "d"}) + msg.Push({type: "key", name: "f"}) + msg.Push({type: "key", name: "g"}) + msg.Push({type: "key", name: "h"}) + msg.Push({type: "key", name: "j"}) + msg.Push({type: "key", name: "k"}) + msg.Push({type: "key", name: "l"}) + msg.Push({type: "key", name: ":\n;"}) + msg.Push({type: "key", name: "\"\n'"}) + msg.Push({type: "key", name: "Enter"}) + + msg.Push({type: "key head", name: "Shift"}) + msg.Push({type: "key", name: "z"}) + msg.Push({type: "key", name: "x"}) + msg.Push({type: "key", name: "c"}) + msg.Push({type: "key", name: "v"}) + msg.Push({type: "key", name: "b"}) + msg.Push({type: "key", name: "n"}) + msg.Push({type: "key", name: "m"}) + msg.Push({type: "key", name: "<\n,"}) + msg.Push({type: "key", name: ">\n."}) + msg.Push({type: "key", name: "?\n/"}) + msg.Push({type: "key tail", name: "Shift"}) + + msg.Push({type: "key head", name: "Ctrl"}) + msg.Push({type: "key", name: "Win"}) + msg.Push({type: "key", name: "Alt"}) + msg.Push({type: "key", name: "Space"}) + msg.Push({type: "key", name: "Alt"}) + msg.Push({type: "key", name: "Win"}) + msg.Push({type: "key", name: "Ctrl"}) + + } +}}) diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 278037e1..e595bcae 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -16,6 +16,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", function show() { if (can.isCmdMode()) { can.onimport._title(can, path+file) } can._msg && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.tabview[key] can.Option(can.onimport.history(can, {path: path, file: file, line: line||can._msg.Option(nfs.LINE)||1})) + if (isCommand()||isDream()) { can._msg.Option(ctx.INDEX, file) } can.onsyntax._init(can, can._msg, function(content) { var msg = can._msg can.ui._path && (can.ui._path.innerHTML = isDream()? can.page.Format(html.A, can.misc.MergePodCmd(can, {pod: can.Option(nfs.FILE)})): isCommand()? can.Option(nfs.FILE): can.base.Path(can.Option(nfs.PATH), can.Option(nfs.FILE))) @@ -23,14 +24,13 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", can.page.Select(can, can.ui._content.parentNode, can.page.Keys(html.DIV_CONTENT, html.IFRAME), function(item) { if (can.onmotion.toggle(can, item, item == msg._content)) { can.ui.content = msg._content } - }) + }), can.ui.content._plugin = msg._plugin can.page.Select(can, can.ui._profile_output.parentNode, can.page.Keys(html.DIV_OUTPUT, html.IFRAME), function(item) { if (can.onmotion.toggle(can, item, item == msg._profile_output)) { can.ui.profile_output = msg._profile_output } }) can.onexport.hash(can), can.onimport.layout(can), can.base.isFunc(cb) && cb(), cb = null - isCommand() && can.onmotion.delay(can, function() { - can.onmotion.focus(can, can.page.Select(can, can.ui._content, html.OPTION_ARGS)[0]) - }), can.onengine.signal(can, "tabview.view.show", msg) + msg._plugin && can.onmotion.delay(can, function() { msg._plugin.Focus() }) + can.onengine.signal(can, "tabview.view.show", msg) }) } function load(msg) { can.tabview[key] = msg @@ -46,7 +46,9 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", }, can.ui._tabs) } - if (can.tabview[key]) { return can.isCmdMode() && !can._msg._tab? load(can.tabview[key]): show() } + if (can.tabview[key]) { + return can.isCmdMode() && !can._msg._tab? load(can.tabview[key]): show() + } isCommand()||isDream()? load(can.request({}, {index: file, line: line})): can.run({}, [path, file], load, true) }, history: function(can, push) { @@ -109,14 +111,15 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", _init: function(can, msg, cb) { } return can.onimport.plug(can, {index: msg.Option(ctx.INDEX), args: can.Option(nfs.PATH) == ctx.COMMAND && can.Option(nfs.LINE) != ctx.INDEX? [can.Option(nfs.LINE)]: []}, 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(msg._content = can.ui._content) + 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)) + msg._plugin = sub, can.base.isFunc(cb) && cb(msg._content = can.ui._content) + can.onmotion.delay(can, function() { sub.Focus() }) 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.onimport.tabview(can, can.Option(nfs.PATH), ls[1].split(ice.PS)[0], web.DREAM), sub.Update() } return can.user.open(_arg), sub.Update() } @@ -270,14 +273,14 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", if (msg.Result().indexOf(" -1) { var width = can.profile_size[can.onexport.keys(can)]||(can.ConfWidth()-can.ui.project.offsetWidth)/4*3 if (sup._profile_output != can.ui._profile_output) { can.page.Remove(can, sup._profile_output) } - can.ui.profile_output = sup._profile_output = can.page.Append(can, can.ui._profile_output.parentNode, [{view: "output", inner: msg.Result()}]).output + can.ui.profile_output = sup._profile_output = can.page.Append(can, can.ui._profile_output.parentNode, [{view: html.OUTPUT, inner: msg.Result()}]).output can.profile_size[can.onexport.keys(can)] = width } else { - var width = can.profile_size[can.onexport.keys(can)]||(can.ConfWidth()-can.ui.project.offsetWidth)/3 + var width = can.profile_size[can.onexport.keys(can)]||(can.ConfWidth()-can.ui.project.offsetWidth)/2 can.ui.profile_output = sup._profile_output = can.ui._profile_output can.onimport.process(can, msg, can.ui._profile_output, width, can.ui.profile.offsetHeight) - can.onappend._status(can, msg.Option(ice.MSG_STATUS), can.page.Append(can, can.ui._profile_output, ["status"]).first) - can.page.Select(can, can.ui._profile_output, "table.content", function(target) { can.page.style(can, target, "max-height", "1000px") }) + can.onappend._status(can, msg.Option(ice.MSG_STATUS), can.page.Append(can, can.ui._profile_output, [html.STATUS]).first) + can.page.Select(can, can.ui._profile_output, "table.content", function(target) { can.page.style(can, target, html.MAX_HEIGHT, "1000px") }) } } can.onmotion.toggle(can, can.ui.profile_output, true) @@ -394,7 +397,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar can.onmotion.clear(can), can.onlayout.profile(can) can.onimport._profile(can, can.ui.profile) can.onimport._display(can, can.ui.display) - if (msg.Result() == "") { return } + if (msg.Result() == "" && can.Option(nfs.LINE) == "1") { return } if (msg.Option(nfs.FILE)) { msg.Option(nfs.PATH) && can.Option(nfs.PATH, msg.Option(nfs.PATH)) @@ -454,12 +457,12 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar var height = can.user.isMobile && can.isFloatMode()? window.innerHeight-2*html.ACTION_HEIGHT: can.ConfHeight() var width = can.ConfWidth()+(can.user.isMobile && can.isCmdMode() && can.user.isLandscape()? 16: 0)-(can.user.isWindows && !can.isCmdMode()? 20: 0) - can.page.styleWidth(can, can.ui.profile_output, can.profile_size[can.onexport.keys(can)]||(width-can.ui.project.offsetWidth)/3) + can.page.styleWidth(can, can.ui.profile_output, can.profile_size[can.onexport.keys(can)]||(width-can.ui.project.offsetWidth)/2) can.page.styleWidth(can, can.ui.content, width-can.ui.project.offsetWidth-can.ui.profile.offsetWidth) - can.page.styleWidth(can, can.ui.display, width-can.ui.project.offsetWidth) + can.page.styleWidth(can, can.ui.display_output, width-can.ui.project.offsetWidth) var displayHeight = can.display_size[can.onexport.keys(can)] - can.page.style(can, can.ui.display, html.HEIGHT, displayHeight||200) + can.page.style(can, can.ui.display_output, html.HEIGHT, displayHeight||200) if (can.isCmdMode()) { if (can.ui.display.display != html.NONE) { @@ -484,6 +487,10 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar can.page.Select(can, can.ui.profile, html.IFRAME, function(iframe) { can.page.Modify(can, iframe, {height: can.ui.profile.offsetHeight-html.ACTION_HEIGHT-4, width: can.ui.profile.offsetWidth}) }) + var sub = can.ui.content._plugin; if (sub) { + sub.ConfHeight(can.ui.content.offsetHeight-2*html.ACTION_HEIGHT), sub.ConfWidth(can.ui.content.offsetWidth) + sub && sub.onaction.refresh({}, sub) + } }, toolkit: function(can, meta, cb) { meta.msg = true can.onimport.plug(can, meta, can.ui.toolkit.output, function(sub) { diff --git a/plugin/local/code/vimer.css b/plugin/local/code/vimer.css index 932673c8..a2dfab9d 100644 --- a/plugin/local/code/vimer.css +++ b/plugin/local/code/vimer.css @@ -19,6 +19,9 @@ fieldset.vimer>div.output div.complete div.pre { fieldset.vimer>div.output div.complete table { background:darkblue; max-height:400px; max-width:800px; overflow:auto; display:block; float:left; } +body.white fieldset.vimer>div.output div.complete table { + background:aliceblue; max-height:400px; max-width:800px; overflow:auto; display:block; float:left; +} fieldset.vimer>div.output div.complete table.content th { display:none; } diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 0fe586fa..c9b1779d 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -1,9 +1,8 @@ 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.onengine.listen(can, "tabview.line.select", function(msg) { can.onaction._selectLine(msg._event, can) }) - can.core.Item(can.onkeymap._mode.plugin, function(key, value) { - can.onkeymap._mode.normal[key] = can.onkeymap._mode.normal[key]||value - }), can.onimport._input(can), can.onkeymap._build(can), can.onkeymap._plugin({}, can) + can.core.Item(can.onkeymap._mode.plugin, function(key, value) { can.onkeymap._mode.normal[key] = can.onkeymap._mode.normal[key]||value }) + can.onimport._input(can), can.onkeymap._build(can), can.onkeymap._plugin({}, can) can.page.ClassList.add(can, can._fields, code.VIMER), can.base.isFunc(cb) && cb(msg) can.onengine.plugin(can, can.onplugin) }, target) }, function(can, name, sub) { name == chat.ONIMPORT && (can.onimport.inner_init = sub._init) @@ -100,7 +99,7 @@ Volcanos(chat.ONFIGURE, {help: "索引导航", Volcanos(chat.ONKEYMAP, {help: "键盘交互", _model: function(can, value) { can.Status("模式", can.mode = value) can.page.styleClass(can, can.ui.current, ["current", can.mode]), value - can.page.styleClass(can, can.ui.complete, ["complete", can.mode]), value + can.page.styleClass(can, can.ui.complete, [code.COMPLETE, can.mode]), value }, _plugin: function(event, can) { can.onkeymap._model(can, "plugin") can.ui.current.blur() @@ -159,8 +158,12 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互", h: shy("光标左移", function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) }), l: shy("光标右移", function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) }), L: shy("跳到行尾", function(event, can, target) { can.onkeymap.cursorMove(can, target, 0, -1) }), - j: shy("光标下移", function(event, can) { can.onaction.selectLine(event, can, can.current.next()) }), - k: shy("光标上移", function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) }), + j: shy("光标下移", function(event, can) { + can.onaction.selectLine(event, can, can.current.next()) + }), + k: shy("光标上移", function(event, can) { + can.onaction.selectLine(event, can, can.current.prev()) + }), gg: shy("跳到某行", function(event, can, target, count) { return can.onaction.selectLine(event, can, count), true }), G: shy("跳到某行", function(event, can, target, count) { return can.onaction.selectLine(event, can, count = count>1? count: can.max), true }), @@ -242,6 +245,24 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互", }) Volcanos(chat.ONACTION, {help: "控件交互", _trans: {source: "源码", module: "模块", dreams: "空间", website: "网页"}, + _daemon: function(event, can, arg) { + switch (arg[0]) { + case "dream": + can.runAction({}, arg[0], arg.slice(1), function(msg) { + can.onimport.tabview(can, can.Option(nfs.PATH), can.core.Keys(can.misc.Search(can, ice.POD), msg.Option(mdb.NAME)), web.DREAM) + }) + break + case "xterm": + can.runAction({}, arg[0], arg.slice(1), function(msg) { + can.onimport.tabview(can, ctx.COMMAND, code.XTERM, msg.Result()) + }) + break + default: + can.runAction({}, arg[0], arg.slice(1), function(msg) { + can.onimport.tabview(can, msg.Option(nfs.PATH)||can.Option(nfs.PATH), msg.Option(nfs.FILE)), can.ui.source.refresh() + }) + } + }, _run: function(event, can, button, args, cb) { can.runAction(event, button, args, cb||function(msg) { can.onimport.tabview(can, msg.Option(nfs.PATH)||can.Option(nfs.PATH), msg.Option(nfs.FILE)), can.ui.source.refresh() @@ -273,7 +294,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", can.onaction._runs(can.request(event, {file: can.base.trimSuffix(can.Option(nfs.FILE), can.base.Ext(can.Option(nfs.FILE)))+nfs.JS}), can, button) }, website: function(event, can, button) { - can.onaction._runs(can.request(event, {path: "src/", file: (can.base.trimSuffix(can.Option(nfs.FILE), can.base.Ext(can.Option(nfs.FILE)))+nfs.ZML).split(ice.PS).pop()}), can, button) + can.onaction._runs(can.request(event, {path: "src/website/", file: (can.base.trimSuffix(can.Option(nfs.FILE), can.base.Ext(can.Option(nfs.FILE)))+nfs.ZML).split(ice.PS).pop()}), can, button) }, dream: function(event, can, button) { can.onaction._runs(can.request(event, {name: can.base.trimSuffix(can.Option(nfs.FILE).split(ice.PS).pop(), ice.PT+can.base.Ext(can.Option(nfs.FILE)))}), can, button, function(msg) { can.ui.dream.refresh() @@ -366,14 +387,16 @@ Volcanos(chat.ONACTION, {help: "控件交互", } }, _selectLine: function(event, can) { - can.page.Select(can, can.current.line, "td.text", function(td) { can.ui.current.value = td.innerText - 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) + can.page.Select(can, can.current.line, "td.text", function(td) { var target = can.ui.current; target.value = td.innerText + can.current.line.appendChild(target), can.page.style(can, target, html.LEFT, td.offsetLeft-1, html.WIDTH, can.ui.content.style.width) if (event && event.type) { if (event.type == "click" && can.mode != "insert") { can.onkeymap._insert(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) + target.focus(), can.ui.content.scrollLeft -= 10000 + if (event.type == "click") { + can.onkeymap.cursorMove(can, target, 0, (event.offsetX)/12-1) + } } }) }, diff --git a/plugin/local/code/xterm.js b/plugin/local/code/xterm.js index 33f023ec..34ae54c2 100644 --- a/plugin/local/code/xterm.js +++ b/plugin/local/code/xterm.js @@ -4,7 +4,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) { can.o item.text && can.onmotion.delay(can, function() { can.onimport._input(can, item.text+ice.NL) }) can.onimport.layout(can), can.onappend._status(can), can.onappend.tools(can, msg, function(sub) { sub._item_click = function(value, key) { can.onimport._input(can, value+ice.NL) } - }), can.isCmdMode() && can.misc.Search(can, mdb.HASH) && can.sup.onaction.full({}, can.sup) + }), can.isCmdMode() && can.Option(mdb.HASH) && can.Option(mdb.HASH) == can.misc.Search(can, mdb.HASH) && can.runAction({}, "full") can.onimport._connect(can, item) }) }, @@ -15,7 +15,13 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) { can.o term.onTitleChange(function(title) { can.isCmdMode() && can.user.title(title) }) term.onResize(function(size) { can.onimport._resize(can, size) }) - term.onData(function(data) { can.onimport._input(can, data) }) + term.onData(function(data) { + console.log(data) + can.onimport._input(can, data) + }) + term.onKey(function(data) { + console.log(data) + }) term.onCursorMove(function() { can.onexport.term(can) }) can._current = term, term._item = item @@ -38,6 +44,13 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) { can.o }, grow: function(can, msg) { can._current.write(msg.Option(mdb.TEXT)) }, }) +Volcanos(chat.ONACTION, {help: "操作数据", + refresh: function(event, can, button) { + can.onimport.layout(can), can._current.focus() + }, + "波浪线": function(event, can, button) { can.onimport._input(can, "~"), can._current.focus() }, + "反引号": function(event, can, button) { can.onimport._input(can, "`"), can._current.focus() }, +}) Volcanos(chat.ONEXPORT, {help: "导出数据", list: [mdb.TYPE, mdb.NAME, "rows", "cols", "cursorY", "cursorX"], term: function(can) { var term = can._current, item = term._item can.core.List(can.onexport.list, function(key) { diff --git a/plugin/state.js b/plugin/state.js index 7249000c..9dc4ec09 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -96,7 +96,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _process: function(can, msg) { }, }) Volcanos(chat.ONACTION, {help: "交互操作", list: [ - "刷新数据", "切换全屏", "共享工具", "打开链接", "生成链接", "生成脚本", "生成图片", [ + "刷新数据", "切换全屏", "keyboard", "共享工具", "打开链接", "生成链接", "生成脚本", "生成图片", [ "其它", "刷新页面", "保存参数", "清空参数", "扩展参数", "复制数据", "下载数据", "清空数据", "查看文档", "查看脚本", "查看源码", "查看配置", "删除配置", "删除工具", ], @@ -122,6 +122,17 @@ Volcanos(chat.ONACTION, {help: "交互操作", list: [ mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input([], true)), ]) }, + "keyboard": function(event, can) { + can.base.isUndefined(can._daemon) && can.ondaemon._list[0] && (can._daemon = can.ondaemon._list.push(can)-1) + can.request(event, kit.Dict(ctx.INDEX, can._index, ice.MSG_DAEMON, can.core.Keys(can.ondaemon._list[0], can._daemon))) + + can.runAction(event, "keyboard", [], function(msg) { + can.user.toast(can, { + title: msg.Append(mdb.NAME), duration: -1, + content: msg.Append(mdb.TEXT), action: [cli.CLOSE, cli.OPEN], + }), can.user.copy(msg._event, can, msg.Append(mdb.NAME)) + }, true) + }, "打开链接": 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)) @@ -201,6 +212,10 @@ Volcanos(chat.ONACTION, {help: "交互操作", list: [ can.onaction["切换全屏"](event, can) } }, + refresh: function(event, can) { var sub = can.core.Value(can, chat._OUTPUTS_CURRENT) + if (!sub) { return } + sub.ConfHeight(can.ConfHeight()), sub.ConfWidth(can.ConfWidth()), sub.onimport.layout(sub) + }, clear: function(event, can, name) { can.onmotion.clear(can, can._output) }, close: function(event, can) { if (can.isFullMode()) { diff --git a/plugin/table.js b/plugin/table.js index d87830d1..d9335fb0 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -143,10 +143,10 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }, plug: function(can, meta, target, cb) { if (!meta || !meta.index) { return } meta.type = "plug", can.onappend.plugin(can, meta, function(sub) { sub.sup = can + sub.ConfHeight(target.offsetHeight-2*html.ACTION_HEIGHT), sub.ConfWidth(target.offsetWidth) sub.run = function(event, cmds, cb) { can.runActionCommand(can.request(event, can.Option()), meta.index, cmds, cb) } sub.onaction.close = function() { can.ui && target == can.ui.profile? can.onmotion.hidden(sub, target): can.onmotion.hidden(sub, sub._target) } - can.page.style(can, sub._output, html.MAX_HEIGHT, can.ConfHeight()-2*html.ACTION_HEIGHT, html.MAX_WIDTH, can.ConfWidth()) - can.base.isFunc(cb) && cb(sub) + can.base.isFunc(cb) && cb(sub), can.page.style(can, sub._output, html.MAX_HEIGHT, sub.ConfHeight(), html.MAX_WIDTH, sub.ConfWidth()) }, target) }, tool: function(can, list, cb, target) { target = target||can._output