diff --git a/frame.js b/frame.js index 45624d6f..df24becd 100644 --- a/frame.js +++ b/frame.js @@ -60,7 +60,7 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, var names = msg.Option("_names")||panel._names||((can.Conf("iceberg")||"/chat/")+panel._name) can.misc.Run(event, can, {names: names, daemon: can.core.Keys(can.ondaemon._list[0], msg._daemon)}, cmds, function(msg) { Volcanos.meta.pack[key] = msg, delete(msg._handle), delete(msg._toast) - if (msg.result && msg.result[0] == ice.ErrWarn) { can.user.toast(can, msg.Result(), "", 10000); return } + // if (msg.result && msg.result[0] == ice.ErrWarn) { can.user.toast(can, msg.Result(), "", 10000); return } can.base.isFunc(cb) && cb(msg) }) }, @@ -234,9 +234,9 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")||{}; can._msg = msg, sub._msg = msg toast && toast.close() var process = msg._can == can || msg._can == sub + if (can.base.isFunc(cb)) { can.core.CallFunc(cb, {can: can, msg: msg}); return } if (process && can.core.CallFunc([sub, "onimport._process"], {can: sub, msg: msg})) { return } if (process && can.core.CallFunc([can, "onimport._process"], {can: can, msg: msg})) { return } - if (can.base.isFunc(cb) && can.core.CallFunc(cb, {can: can, msg: msg})) { return } if (silent) { return } can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY)||meta.display||meta.feature.display) @@ -246,12 +246,17 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, Volcanos(display, {_follow: can.core.Keys(can._follow, display), _display: display, _target: output, _fields: can._target, _option: can._option, _action: can._action, _output: can._output, _status: can._status, _legend: can._legend, Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status, + _inputs: {}, }, [display, chat.PLUGIN_TABLE_JS], function(table) { table.Conf(can.Conf()) table.run = function(event, cmds, cb, silent) { var msg = can.request(event) if (msg.RunAction(event, table, cmds)) { return } return can.Update(event, can.Input(cmds, silent), cb, silent) }, can._outputs.push(table), table.sup = can, table._msg = msg + if (msg.result && msg.result[0] == "can.code.inner.plugin" && table.onimport && table.onimport.list.length > 0) { + can.onmotion.clear(can, can._option) + can.onappend._option(can, {inputs: table.onimport.list, args: msg.result.slice(1)}) + } table.onimport && can.core.CallFunc(table.onimport._init, {can: table, msg: msg, list: msg.result||msg.append||[], cb: function(msg) { table.onappend._action(table, msg.Option(ice.MSG_ACTION)||can.Conf(ice.MSG_ACTION)) table.onappend._status(table, msg.Option(ice.MSG_STATUS)) @@ -341,7 +346,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, var br = input.type == html.TEXTAREA? [{type: html.BR, style: {clear: html.BOTH}}]: [] var title = can.Conf([ctx.FEATURE, chat.TITLE, item.name].join(ice.PT))||""; title && (input.title = title) return can.page.Append(can, target, ([{view: style||can.base.join([html.ITEM, item.type]), onkeydown: function(event) { - item.type == "text" && can.onkeymap.input(event, can) + item.type == "text" && can.onkeymap.input(event, can), can.onmotion.selectField(event, can) }, list: [input]}]).concat(br))[item.name] }, table: function(can, msg, cb, target, sort) { @@ -767,6 +772,17 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe }) }, + selectField: function(event, can) { + if (event.ctrlKey && event.key >= "0" && event.key <= "9") { + if (event.key == "0") { return can.onimport._back(can) } + + can.page.Select(can, can._output, html.TR, function(tr, index) { if (index == event.key) { + var head = can.page.Select(can, can._output, html.TH, function(th, order) { return th.innerText }) + can.page.Select(can, tr, html.TD, function(td, index) { can.Option(head[index], td.innerText) }) + can.Update(event) + } }) + } + }, selectTable: function(event, can, target, cb) { if (event.ctrlKey) { function select(order) { diff --git a/lib/user.js b/lib/user.js index 34bff8f1..ab94d56c 100644 --- a/lib/user.js +++ b/lib/user.js @@ -68,6 +68,7 @@ Volcanos("user", {help: "用户操作", agent: { "list": "查看", "back": "返回", "run": "执行", "done": "完成", "share": "共享", "edit": "编辑", "save": "保存", "copy": "复制", "show": "显示", "hide": "隐藏", "project": "项目", "profile": "详情", "actions": "参数", + "plugin": "插件", "open": "打开", "close": "关闭", "start": "启动", "stop": "停止", @@ -258,11 +259,11 @@ Volcanos("user", {help: "用户操作", agent: { })}, {view: chat.ACTION}, ]}]); var layout = can.onlayout.figure(event, can, ui._target) - if (!layout.left) { if (!layout.top) { layout.top = 32 } + if (layout.left == undefined) { if (!layout.top) { layout.top = 32 } layout.left = window.innerWidth/2-ui._target.offsetWidth/2 + layout.right = "" can.page.style(can, ui._target, layout) } - can.page.ClassList.add(can, ui._target, chat.FLOAT) var action = can.onappend._action(can, button||[html.SUBMIT, html.CANCEL], ui.action, { diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index db877964..5502244c 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -58,6 +58,7 @@ fieldset.inner>div.output div.content td.text { text-align:left; height:20px; padding-left:10px; white-space:pre; + tab-size:4; } fieldset.inner>div.output div.content td.text span.comment { color:cyan; background-color:blue; @@ -86,6 +87,12 @@ fieldset.inner>div.output div.profile>div.action>div.item { fieldset.inner>div.output div.profile>div.output { clear:both; overflow:auto; } +fieldset.inner>div.output div.profile>div.output>fieldset { + margin:0; padding:0; +} +fieldset.inner>div.output div.profile>div.output>fieldset>legend { + display:none; +} fieldset.inner>div.output div.display>div.output { clear:both; overflow:auto; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 0876910a..17dd7a55 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -1,6 +1,11 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target) { + can.onengine.plugin(can, "can.code.inner.plugin", shy("插件", {}, [{type: "button", name: "list", action: "auto"}, "back"], function(msg, cmds) { + msg.Echo("can.code.inner.plugin") + msg.result = msg.result.concat(cmds||[]) + })) + can.tabview = can.tabview||{}, can.tabview[can.Option(nfs.PATH)+ice.DF+can.Option(nfs.FILE)] = msg - can.history = can.history||[], can.toolkit = {}, can.extentions = {} + can.history = can.history||[], can.toolkit = {}, can.extentions = {}, can.profile_size = {} can.onmotion.clear(can), can.onlayout.profile(can) can.onimport._project(can, can.ui.project) @@ -22,10 +27,16 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target }, _profile: function(can, target) { var ui = can.page.Append(can, target, [{view: html.ACTION}, {view: html.OUTPUT}]); can.ui.profile_output = ui.output - var action = can.onappend._action(can, [cli.SHOW, cli.CLEAR, mdb.PLUGIN, cli.CLOSE], ui.action, kit.Dict( + var action = can.onappend._action(can, [cli.SHOW, cli.CLEAR, mdb.PLUGIN, cli.CLOSE, "size"], ui.action, kit.Dict( cli.SHOW, function(event) { can.onaction["展示"](event, can) }, cli.CLEAR, function(event) { can.onmotion.clear(can, ui.output) }, cli.CLOSE, function(event) { can.onmotion.hidden(can, target), can.onimport.layout(can) }, + "size", function(event) { + can.user.input(event, can, ["size"], function(event, button, data) { + can.profile_size[can.Option(nfs.PATH)+":"+can.Option(nfs.FILE)] = can.ConfWidth()*parseInt(data.size)/100 + can.onaction["展示"](event, can) + }) + }, mdb.PLUGIN, function(event) { can.user.input(event, can, [ctx.INDEX], function(event, button, data) { can.onimport.plugin(can, data, ui.output) @@ -88,20 +99,13 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target line == ctx.INDEX? show(can.request({}, {index: file, line: line})): can.run({}, [path, file], show, true) }, profile: function(can, msg) { - if (msg) { can.onmotion.clear(can, can.ui.profile_output) - // can.onappend.table(can, msg, null, can.ui.profile_output) - can.onappend.board(can, msg.Result(), can.ui.profile_output) - can.user.toastSuccess(can) - } - can.page.styleWidth(can, can.ui.profile_output, (can.ConfWidth()-can.ui.project.offsetWidth)/2) + var width = can.profile_size[can.Option(nfs.PATH)+":"+can.Option(nfs.FILE)]||(can.ConfWidth()-can.ui.project.offsetWidth)/2 + msg && can.onimport.process(can, msg, can.ui.profile_output, width-32) + can.page.styleWidth(can, can.ui.profile_output, width) can.onmotion.hidden(can, can.ui.profile, true), can.onimport.layout(can) }, display: function(can, msg) { - if (msg) { can.onmotion.clear(can, can.ui.display_output) - // can.onappend.table(can, msg, null, can.ui.display_output) - can.onappend.board(can, msg.Result(), can.ui.display_output) - can.user.toastSuccess(can) - } + msg && can.onimport.process(can, msg, can.ui.display_output, can.ConfWidth()) can.page.style(can, can.ui.display_output, html.MAX_HEIGHT, can.ConfHeight()/4) can.onmotion.hidden(can, can.ui.display, true), can.onimport.layout(can) }, @@ -126,6 +130,22 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target }, can.base.isFunc(cb) && cb(sub) }) }, + process: function(can, msg, target, width) { + can.user.toastSuccess(can) + can.onmotion.clear(can, target) + if (msg.Option("_process") == "_field") { + msg.Table(function(meta) { meta.display = msg.Option("_display") + // delete(Volcanos.meta.cache[meta.display]) + can.onimport.plugin(can, meta, target, function(sub) { + can.onmotion.focus(can, can.page.Select(can, sub._option, html.OPTION_ARGS)[0]) + width && sub.ConfWidth(width) + }) + }) + } else { + can.onappend.table(can, msg, null, target) + can.onappend.board(can, msg.Result(), target) + } + }, plugin: function(can, meta, target, cb) { can.onappend.plugin(can, meta, function(sub) { sub.run = function(event, cmds, cb) { diff --git a/plugin/local/code/inner/search.js b/plugin/local/code/inner/search.js index 9a3fc074..f2a06174 100644 --- a/plugin/local/code/inner/search.js +++ b/plugin/local/code/inner/search.js @@ -1,5 +1,6 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { var history = []; const SEARCH = "can.code.inner.search" function show(msg, word) { if (!msg) { return } history.push(msg); var sub = msg._can; sub.Option("word", word||msg._word) + !sub.page.ClassList.has(sub, sub._legend, "select") && can.ui.search.select() sub.onmotion.clear(sub), sub.onappend.table(sub, msg, function(value, key, index, line) { return {text: ["", html.TD], list: [{text: [can.page.replace(can, value, ice.PWD, ""), html.DIV]}], onclick: function(event) { line.line && can.onimport.tabview(can, can.Option(nfs.PATH), line.file.replace(ice.PWD, ""), parseInt(line.line)) @@ -52,6 +53,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { var ))) { return } can.run(msg._event, cmds, function(msg) { show(msg) }, true) })) can.onimport.toolkit(can, {index: SEARCH}, function(sub) { can.ui.search = sub, can.base.isFunc(cb) && cb(sub) + can.ui.search._show = show }) }}) diff --git a/plugin/local/code/vimer.css b/plugin/local/code/vimer.css index 18a0d583..26d28331 100644 --- a/plugin/local/code/vimer.css +++ b/plugin/local/code/vimer.css @@ -5,6 +5,7 @@ fieldset.vimer>div.output input.current { margin:0; margin-top:-2px; padding:0; padding-left:9px; width:-webkit-fill-available; + tab-size:4; } fieldset.vimer>div.output input.current.insert { caret-color:yellow; diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 1d6ea59c..86ede5be 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -2,7 +2,15 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.require(["inner.js"], function(can) { can.onimport.inner_init(can, msg, function() { can.onkeymap._build(can), can.onimport._input(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) - name == chat.ONKEYMAP && (can.base.Copy(can.onkeymap._mode, sub._mode)) + if (name == chat.ONKEYMAP) { + can.base.Copy(can.onkeymap._mode, sub._mode) + can.core.Item(can.onkeymap._mode.normal, function(k, v) { + if (!sub._mode.plugin[k]) { sub._mode.plugin[k] = v } + }) + can.core.Item(sub._mode.plugin, function(k, v) { + if (!can.onkeymap._mode.normal[k]) { can.onkeymap._mode.normal[k] = v } + }) + } }) }, _input: function(can) { @@ -80,9 +88,8 @@ Volcanos("onkeymap", {help: "键盘交互", list: [], P: function(event, can) { can.onaction.insertLine(can, can._last_text, can.current.line) }, s: function(event, can) { can.onaction.save(event, can) }, - ":": function(event, can) { can.onimport.toolkit(can, {index: "cli.system"}, function(sub) { can.toolkit["cli.system"] = sub.select() }) }, - r: function(event, can) { can.onaction["执行"](event, can) }, - v: function(event, can) { can.onaction["展示"](event, can) }, + m: function(event, can) { can.onaction.autogen(event, can, "autogen") }, + c: function(event, can) { can.onaction.compile(event, can, "compile") }, }, insert: { jk: function(event, can, target) { can.onkeymap._normal(event, can), @@ -117,7 +124,32 @@ Volcanos("onkeymap", {help: "键盘交互", list: [], }, }, _engine: {}, }) -Volcanos("onaction", {help: "控件交互", list: [nfs.SAVE, "autogen", "compile", "binpack"], +Volcanos("onaction", {help: "控件交互", list: [nfs.SAVE, "autogen", "compile", "binpack", "加载"], + "加载": function(event, can) { + var file = "/share/local/"+can.Option(nfs.PATH)+can.Option(nfs.FILE) + delete(Volcanos.meta.cache[file]) + var script = `\n_can_name = "`+file+`"\n`+ + can.onexport.content(can)+ + `\n_can_name = ""\nconsole.log("once")` + eval(script) + }, + autogen: function(event, can, button) { var meta = can.Conf(), msg = can.request(event, {_handle: ice.TRUE}) + can.user.input(event, can, meta.feature[button], function(ev, btn, data, list, args) { + can.run(event, [ctx.ACTION, button].concat(args), function(msg) { + can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option(nfs.FILE)) + can.onimport.project(can, can.Option(nfs.PATH)) + }, true) + }) + }, + compile: function(event, can, button) { var msg = can.ui.search.request(event, {_handle: ice.TRUE, _toast: "编译中..."}) + can.run(event, [ctx.ACTION, button], function(msg) { + if (msg.Length() == 0) { var toast = can.user.toast(can, "重启中...", "", -1) + can.core.Timer(3000, function() { toast.close(), can.onaction["展示"]({}, can) }) + } else { + can.ui.search._show(msg) + } + }, true) + }, save: function(event, can) { var msg = can.request(event, {content: can.onexport.content(can)}) can.run(event, [ctx.ACTION, nfs.SAVE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.user.toastSuccess(can)