From 31548441470d1b73cf26f0f9666513c1e831ffbb Mon Sep 17 00:00:00 2001 From: shylinux Date: Tue, 7 Mar 2023 03:44:23 +0800 Subject: [PATCH] opt code --- frame.js | 20 +++++++++++--------- index.css | 26 ++++++++++++++++++-------- lib/page.js | 11 +++++++---- lib/user.js | 2 +- panel/action.js | 2 +- plugin/local/code/inner.css | 8 ++++---- plugin/local/code/inner.js | 26 +++++++++++++++++++------- plugin/local/code/vimer.js | 25 ++++++++++++------------- plugin/local/wiki/word.js | 2 +- plugin/state.js | 9 ++++++--- plugin/table.js | 4 ++-- proto.js | 11 +++++++---- 12 files changed, 89 insertions(+), 57 deletions(-) diff --git a/frame.js b/frame.js index 55c9198d..0544ee47 100644 --- a/frame.js +++ b/frame.js @@ -168,20 +168,22 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { _option: function(can, meta, option, skip) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []), opts = can.base.Obj(meta.opts, {}) can.core.List([""].concat(meta.inputs), function(item) { var icon = { - refresh: {name: "refresh", cb: function(event) { can.Update(event) }}, - run: {name: "refresh", cb: function(event) { can.Update(event) }}, - list: {name: "refresh", cb: function(event) { can.Update(event) }}, + run: {name: web.PLAY, cb: function(event) { can.Update(event) }}, + list: {name: web.REFRESH, cb: function(event) { can.Update(event) }}, + refresh: {name: web.REFRESH, cb: function(event) { can.Update(event) }}, back: {name: "goback", cb: function(event) { can.onimport._back(can) }}, - create: {name: "create", cb: function(event) { can.Update(event, [ctx.ACTION, mdb.CREATE]) }}, - insert: {name: "create", cb: function(event) { can.Update(event, [ctx.ACTION, mdb.INSERT]) }}, - "": {name: "delete", cb: function(event) { can.onaction.close(event, can) }}, - }[item.name||""]; icon && can.page.Append(can, option, [{view: [[html.ITEM, html.ICON, icon.name, item.name], html.DIV, can.page.unicode[icon.name]], onclick: icon.cb}]) + create: {name: mdb.CREATE, cb: function(event) { can.Update(event, [ctx.ACTION, mdb.CREATE]) }}, + insert: {name: mdb.CREATE, cb: function(event) { can.Update(event, [ctx.ACTION, mdb.INSERT]) }}, + play: {name: web.PLAY, cb: function(event) { can.Update(event, [ctx.ACTION, web.PLAY]) }}, + "": {name: mdb.DELETE, cb: function(event) { can.onaction.close(event, can) }}, + }[item.name||""]; icon && can.page.Append(can, option, [{view: [[html.ITEM, html.ICON, icon.name, item.name], html.DIV, can.page.unicode[icon.name]], title: item.name, onclick: icon.cb}]) }) function add(item, next) { item = can.base.isString(item)? {type: html.TEXT, name: item}: item, item.type != html.BUTTON && index++ return Volcanos(item.name, {_root: can._root, _follow: can.core.Keys(can._follow, item.name), _target: can.onappend.input(can, item, args[index]||opts[item.name], option||can._option), _option: option||can._option, _action: can._action, _output: can._output, _status: can._status, CloneField: can.Clone, CloneInput: function() { can.onmotion.focus(can, add(item)._target) }, Input: can.Input, Option: can.Option, Action: can.Action, Status: can.Status, }, [item.display, chat.PLUGIN_INPUT_JS], function(sub) { sub.Conf(item) + if (item.type == html.TEXT) { can.page.Append(can, sub._target.parentNode, [{text: [sub._target.value, html.SPAN, mdb.VALUE]}]) } sub.run = function(event, cmds, cb, silent) { var msg = can.request(event, kit.Dict(chat._TOAST, ice.PROCESS))._caller() msg.RunAction(event, sub, cmds) || msg.RunAction(event, can.core.Value(can, chat._OUTPUTS_CURRENT), cmds) || can.Update(event, can.Input(cmds, !silent), cb, silent) }, can._inputs = can._inputs||{}, can._inputs[item.name] = sub, sub.sup = can @@ -209,7 +211,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }), item), "", action) }), meta }, - _output0: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event); if (msg.RunAction(event, can, cmds)) { return } + _output0: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event); if (msg.RunAction(event, can, cmds) || msg.RunAction(event, can.core.Value(can, chat._OUTPUTS_CURRENT), cmds)) { return } if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { var msg = can.request(event, {action: cmds[1]}) var action = meta.feature[cmds[1]]; if (can.base.isFunc(action)) { cb = cb||function() { can.Update() } return action.list && action.list.length > 0? can.user.input(event, can, action.list, function(data) { @@ -363,7 +365,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { return {text: [value, html.TD], onclick: function(event) { var target = event.target if (can.page.tagis(target, html.INPUT) && target.type == html.BUTTON) { meta && meta[target.name]? can.user.input(can.request(event, {action: target.name}), can, meta[target.name], function(args) { run(event, target.name, args) }): run(event, target.name) - } else { can.sup.onimport.change(event, can.sup, key, event.target.innerText) || can.sup.onexport.record(can.sup, value, key, line) } + } else { can.sup.onimport.change(event, can.sup, key, event.target.innerText) || can.sup.onexport.record(can.sup, value, key, line, event) } }, ondblclick: function(event) { if ([mdb.KEY, mdb.HASH, mdb.ID].indexOf(key) > -1) { return } var item = can.core.List(can.Conf([ctx.FEATURE, mdb.INSERT]), function(item) { if (item.name == key) { return item } })[0]||{name: key, value: value} item.run = function(event, cmds, cb) { can.run(can.request(event, line, can.Option()), cmds, cb, true) } diff --git a/index.css b/index.css index 86d114f2..7ce9f166 100644 --- a/index.css +++ b/index.css @@ -99,7 +99,7 @@ body>div.toast div.action>div.item { float:right; } body>div.carte { padding:0; } body>div.carte input[name=filter] { margin:5px; width:calc(100% - 10px); position:sticky; top:5px; } body>div.carte div.item { white-space:pre; padding:5px 10px; } -body>div.carte div.item span.icon.gt { float:right; } +body>div.carte div.item span.icon.next { float:right; } body>div.input td { padding:5px; } body>div.input td span.icon { font-size:14px; margin-left:-25px; margin-right:10px; visibility:hidden; } body>div.input td:hover span.icon { visibility:visible; } @@ -138,7 +138,7 @@ fieldset.plugin:not(.float):not(.full):not(.cmd)>legend { float:none; } fieldset.auto, fieldset.full, fieldset.float, div.float { position:fixed; z-index:10; } fieldset.plug { position:absolute; bottom:0; right:0; } fieldset.cmd fieldset.plug { position:fixed; bottom:32px; right:0; } fieldset.plug div.output table.content { width:100%; } -fieldset.plugin>div.output>fieldset.story { position:sticky; left:0; } +// fieldset.plugin>div.output>fieldset.story { position:sticky; left:0; } div.output { position:relative; } div.tabs { position:relative; } div.tabs span.icon { margin-left:5px; visibility:hidden; } @@ -154,12 +154,27 @@ form.option>div.icon:first-child { margin-left:-5px; } form.option>div.icon { line-height:30px; font-size:26px; padding:0 5px; height:32px; display:none; } form.option>div.icon.refresh { line-height:28px; } form.option>div.icon.goback { line-height:28px; } +form.option>div.icon.play { line-height:28px; } form.option>div.icon.lt { font-size:20px; line-height:30px; } form.option>div.icon:hover { background-color:white; } +fieldset:not(.float)>form.option>div.text>span.value { display:none; } +fieldset.float div.item.text:hover>span.icon.delete { visibility:hidden; } +fieldset.float>form.option>div.text>input { display:none; } +fieldset.float>form.option>div.text>span.value { padding:7px; display:block; } fieldset.float>form.option>div.item.button { display:none; } -fieldset.story>form.option>div.icon.delete { display:block; } fieldset.float>form.option>div.icon { display:block; } fieldset.full>form.option>div.icon.delete { display:block; } +fieldset.cmd>form.option>div.icon { display:block; } +fieldset.cmd>form.option>div.item.button.run { display:none; } +fieldset.cmd>form.option>div.item.button.list { display:none; } +fieldset.cmd>form.option>div.item.button.back { display:none; } +fieldset.cmd>form.option>div.item.button.create { display:none; } +fieldset.story>form.option>div.icon { display:block; } +fieldset.story>form.option>div.item.button.run { display:none; } +fieldset.story>form.option>div.item.button.list { display:none; } +fieldset.story>form.option>div.item.button.back { display:none; } +fieldset.story>form.option>div.item.button.create { display:none; } +fieldset.story>form.option>div.item.button.insert { display:none; } fieldset.plug>form.option>div.icon { margin-left:5px; } div.carte.select.float { border-radius:0; } div.carte.select.float>div.item { text-align:center; } @@ -287,11 +302,6 @@ fieldset.plugin.parse.cmd>div.status { display:none; } fieldset.plugin.inner.cmd>legend { display:none; } fieldset.plugin.inner.cmd>div.action { display:none; } fieldset.plugin.inner.cmd>form.option { display:none; } -fieldset.plugin.inner.cmd fieldset.story>form.option>div.icon { display:block; } -fieldset.plugin.inner.cmd fieldset.story>form.option>div.item.button.list>input { display:none; } -fieldset.plugin.inner.cmd fieldset.story>form.option>div.item.button.back>input { display:none; } -fieldset.plugin.inner.cmd fieldset.story>form.option>div.item.button.create>input { display:none; } -fieldset.plugin.inner.cmd fieldset.story>form.option>div.item.button.insert>input { display:none; } fieldset.plugin.inner.cmd fieldset.xterm>form.option>div.item.text>input { width:320px; } fieldset.plan div.output table.content { height:100%; width:100%; } fieldset.xterm div.toggle { display:none; } diff --git a/lib/page.js b/lib/page.js index e9daa2c6..1d11fbad 100644 --- a/lib/page.js +++ b/lib/page.js @@ -17,6 +17,7 @@ Volcanos("page", { if (can.base.isObject(key)) { return can.core.Item(key, function(key, value) { can.page.SelectArgs(can, target, key, value) }), [key] } if (!can.base.isFunc(cb)) { var value = cb; cb = function(item) { return item.name && (can.base.isUndefined(value)? item.value: (item.value = value))||"" } } if (key.indexOf(ice.PT) > -1) { return [""] } + key && can.base.isString(cb) && can.page.Select(can, target, "div.item."+key+">span.value", cb) return can.page.Select(can, target, key? "select[name="+key+"],"+"input.select[type=button][name="+key+"],"+"input[name="+key+"],"+"textarea[name="+key+"]": ".args", cb) }, SelectInput: function(can, target, name, cb) { return can.page.Select(can, target, "input[name="+name+"]", cb)[0] }, @@ -245,10 +246,12 @@ Volcanos("page", { width: function() { return window.innerWidth }, ismodkey: function(event) { return [lang.META, lang.ALT, lang.CONTROL, lang.SHIFT].indexOf(event.key) > -1 }, unicode: { - create: "+", - menu: "☰", back: "◀", refresh: "↻", reback: "▶", delete: "✕", lt: "❮", gt: "❯", open: "▾", close: "▸", select: "▿", inner: "..", - push: "\u21C8", pull: "\u21CA", - goback: "\u21BA", + menu: "☰", prev: "❮", next: "❯", play: "▸", + push: "⇈", pull: "⇊", refresh: "↻", goback: "↺", + create: "+", delete: "✕", open: "▾", close: "▸", + select: "▿", inner: "..", + back: "◀", reback: "▶", + lt: "❮", gt: "❯", }, inputs: function(can, list, type) { var _list = []; for (var i = 0; i < list.length; i++) { switch (list[i]) { case "": _list.push(""); break diff --git a/lib/user.js b/lib/user.js index e46f4e50..fded319e 100644 --- a/lib/user.js +++ b/lib/user.js @@ -126,7 +126,7 @@ Volcanos("user", { can.onimport && can.onimport[item[0]] && can.onimport[item[0]](can, button) }, carte, trans); can.onlayout.figure(event, can, sub._target, true), remove_sub(carte), carte._sub = sub } return item === ""? /* 0.space */ {type: html.HR}: can.base.isString(item)||can.base.isNumber(item)? /* 1.string */ {view: [html.ITEM, html.DIV, can.user.trans(can, item, trans)], onclick: function(event) { click(event, item) }, onmouseenter: function(event) { remove_sub(carte) } }: - can.base.isArray(item)? /* 2.array */ {view: html.ITEM, list: [{text: can.user.trans(can, item[0], trans)}, {text: [ice.SP+can.page.unicode.gt, "", [html.ICON, "gt"]]}], onmouseenter: subs, onclick: subs}: /* 3.object */ item + can.base.isArray(item)? /* 2.array */ {view: html.ITEM, list: [{text: can.user.trans(can, item[0], trans)}, {text: [ice.SP+can.page.unicode.next, "", [html.ICON, "next"]]}], onmouseenter: subs, onclick: subs}: /* 3.object */ item })}]); can.onkeymap.prevent(event), can.page.Select(can, ui._target, html.IMG, function(target) { target.onload = function() { can.onlayout.figure(event, can, ui._target) } }) var carte = {_target: ui._target, _parent: parent, layout: can.onlayout.figure(event, can, ui._target, false, 0.8), close: function() { can.page.Remove(can, ui._target) }}; return carte }, diff --git a/panel/action.js b/panel/action.js index aa5a9b39..0dcfb1ed 100644 --- a/panel/action.js +++ b/panel/action.js @@ -33,7 +33,7 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { onsize: function(can, msg, height, width) { can.Conf({height: height-can.Conf(html.MARGIN_Y), width: width-can.Conf(html.MARGIN_X)}) }, onmain: function(can, msg) { can.onimport._share(can, can.misc.Search(can, web.SHARE)) }, onlogin: function(can, msg) { can.ondaemon._init(can), can.onimport._menu(can, msg), can.onkeymap._build(can) - can._root.River && can.onmotion.delay(can, function() { if (can.Mode()) { return } var gt = can.page.unicode.gt, lt = can.page.unicode.lt, river = can._root.River._target + can._root.River && can.onmotion.delay(can, function() { if (can.Mode()) { return } var gt = can.page.unicode.next, lt = can.page.unicode.prev, river = can._root.River._target var target = can.page.Append(can, can._target, [{view: [[html.TOGGLE, chat.PROJECT], "", can.page.isDisplay(river)? lt: gt], onclick: function(event) { can.page.Modify(can, target, (can._river_show = can.onmotion.toggle(can, river))? lt: gt) can.onaction.layout(can) diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 3af23554..2fa61f61 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -10,8 +10,8 @@ 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 div.content td.text span.object { color:cyan; } fieldset.inner>div.output>div.layout>div.layout>div.content * { font-family:monospace; font-size:14px; outline:none; } -fieldset.inner>div.output>div.layout>div.path { font-family:monospace; font-size:14px; } fieldset.inner>div.output>div.layout>div.tabs { font-family:monospace; font-size:14px; } +fieldset.inner>div.output>div.layout>div.path { font-family:monospace; font-size:14px; } fieldset.inner>div.output>div.project { width:230px; } fieldset.inner>div.output>div.project * { font-family:monospace; font-size:14px; outline:none; } fieldset.inner>div.output>div.project div.action { width:100%; } @@ -27,9 +27,9 @@ fieldset.inner>div.output>div.project>div.zone fieldset.plug { position:static; fieldset.inner>div.output>div.layout.flow { position:relative; } fieldset.inner>div.output>div.layout.flow>div.tabs { display:none; } fieldset.inner>div.output>div.layout.flow>div.path { display:none; } -fieldset.inner.cmd>div.output>div.project { border-right:solid 2px gray; } -fieldset.inner.cmd>div.output div.profile { border-left:solid 2px gray; } -fieldset.inner.cmd>div.output div.display { border-top:solid 2px gray; } +fieldset.inner.cmd>div.output>div.project { border-right:dimgray solid 1px; } +fieldset.inner.cmd>div.output div.profile { border-left:dimgray solid 1px; } +fieldset.inner.cmd>div.output div.display { border-top:dimgray solid 1px; } fieldset.inner.cmd>div.output>div.project>div.zone>div.item { font-style:italic; font-weight:bold; line-height:32px; } fieldset.inner.cmd>div.output>div.project>div.zone>div.item>span.icon { font-style:normal; font-weight:normal; line-height:32px; } fieldset.inner.cmd>div.output>div.layout.flow>div.tabs { height:38px; display:block; overflow:hidden; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index de123744..bc77366b 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -1,5 +1,7 @@ -(function() { const CURRENT_FILE = "web.code.inner:currentFile", SELECT_LINE = "web.code.inner.selectLine" -const VIEW_CREATE = "tabview.view.create", VIEW_REMOVE = "tabview.view.remove", LINE_SELECT = "tabview.line.select" +(function() { + const PROJECT_HIDE = "web.code.inner:project" + const CURRENT_FILE = "web.code.inner:currentFile", SELECT_LINE = "web.code.inner:selectLine" + const VIEW_CREATE = "tabview.view.create", VIEW_REMOVE = "tabview.view.remove", LINE_SELECT = "tabview.line.select" Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.clear(can), can.onappend.style(can, code.INNER) if (msg.Option(nfs.FILE)) { can.Option(nfs.FILE, msg.Option(nfs.FILE)) msg.Option(nfs.PATH) && can.Option(nfs.PATH, msg.Option(nfs.PATH)) @@ -18,6 +20,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl case chat.SIMPLE: // no break case chat.FLOAT: can.onmotion.hidden(can, can.ui.project); break case chat.CMD: can.onimport._keydown(can), can.onmotion.hidden(can, can._status) + can.misc.sessionStorage(can, "web.code.inner:project") == html.HIDE && can.onmotion.hidden(can, can.ui.project) // var plug = can.base.Obj(msg.Option(html.PLUG), []).concat(can.misc.Search(can, log.DEBUG) == ice.TRUE? ["can.debug", "log.debug"]: []) // plug.length > 0 && can.run({}, [ctx.ACTION, ctx.COMMAND].concat(plug.reverse()), function(msg) { msg.Table(function(value) { can.onimport.toolkit(can, value) }) }) case chat.FULL: // no break @@ -134,7 +137,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl } function load(msg) { var skip = false; can.db.tabview[key] = msg can.onimport.tabs(can, [{name: can.base.beginWith(file, "http://")? file.split(ice.QS)[0]: file.split(isIndex()? ice.PT: ice.PS).pop(), text: file, _menu: shy([ - nfs.SAVE, nfs.TRASH, + nfs.SAVE, nfs.TRASH, web.REFRESH, ], function(event, button, meta) { can.onaction[button](event, can, button) })}], function(event, tabs) { @@ -180,7 +183,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl var height = can.onexport.size(can, can.db.display_size[can.onexport.keys(can)]||0.5, can.ui.content.offsetHeight||can.ConfHeight()) can.page.style(can, can.ui.display, html.MAX_HEIGHT, can.ConfHeight()/2) can.onimport.process(can, msg, can.ui.display, height, width, function(sub) { - var _height = can.base.Max(sub._target.offsetHeight, height); if (_height == sub.ConfHeight()) { return } + var _height = can.base.Max(sub._target.offsetHeight, height) + // ; if (_height == sub.ConfHeight()) { return } if (sub.ConfHeight() < can.ui.content.offsetHeight-100) { can.page.style(can, sub._output, html.MAX_HEIGHT, "") } can.db.display_size[can.onexport.keys(can)] = _height, can.onimport.layout(can), sub.onimport.size(sub, _height, width, true) }) @@ -193,9 +197,9 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl sub.onaction.close = function() { can.onmotion.hidden(can, target), can.onimport.layout(can) } sub.onexport.output = function(_sub, _msg) { can.onmotion.delay(can, function() { can.base.isFunc(cb) && cb(_sub, _msg) }) } sub.run = function(event, cmds, cb) { can.runActionCommand(can.request(event, can.Option()), item.index, cmds, function(msg) { - if (sub == (msg._can._fields? msg._can.sup: msg._can)) { - if (cmds && cmds[0] == ctx.ACTION) { if (can.base.isIn(cmds[1], mdb.IMPORT, mdb.EXPORT, "imports", "exports")) { return can.user.toastSuccess(can, cmds[1]), sub.Update() } } - } can.base.isFunc(cb) && cb(msg) + if (sub == (msg._can._fields? msg._can.sup: msg._can)) { if (cmds && cmds[0] == ctx.ACTION) { + if (can.base.isIn(cmds[1], mdb.IMPORT, mdb.EXPORT, "imports", "exports")) { return can.user.toastSuccess(can, cmds[1]), sub.Update() } + } } can.base.isFunc(cb) && cb(msg) }) } }, target) }) @@ -235,6 +239,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl }, layout: function(can) { if (can.isSimpleMode()) { return can.page.style(can, can.ui.content, html.WIDTH, can.ConfWidth()) } if (can.isCmdMode()) { can.ConfHeight(can.page.height()), can.ConfWidth(can.page.width()) } + can.isCmdMode() && can.misc.sessionStorage(can, "web.code.inner:project", can.page.isDisplay(can.ui.project)? "": html.HIDE) // can.ui.size = {profile: can.db.profile_size[can.onexport.keys(can)]||0.5, display: can.db.display_size[can.onexport.keys(can)]||3*html.ACTION_HEIGHT} can.ui.size = {profile: can.db.profile_size[can.onexport.keys(can)]||0.5, display: can.db.display_size[can.onexport.keys(can)]} can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(content_height, content_width) { @@ -407,6 +412,13 @@ Volcanos(chat.ONACTION, {list: ["调试", "首页", "官网", "源码", "百度" if (can.page.isDisplay(can.ui.display)) { return can.onmotion.hidden(can, can.ui.display), can.onimport.layout(can) } if (can.page.isDisplay(can.ui.profile)) { return can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can) } }, + refresh: function(event, can, button) { + can.run(event, [can.Option(nfs.PATH), can.Option(nfs.FILE)], function(msg) { can._msg.result = msg.result + can.onmotion.clear(can, can.ui.content) + can.db.max = 0, can.core.List(msg.Result().split(ice.NL), function(item) { can.onaction.appendLine(can, item) }) + can.user.toastSuccess(can) + }) + }, reback: function(can) { var last = can.db._history.pop(); last && can.onimport.tabview(can, last.path, last.file, last.line) }, diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 5e9443c5..6face954 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -44,8 +44,8 @@ Volcanos(chat.ONFIGURE, { )) }) }, favor: function(can, target, zone) { can.onimport._zone(can, zone, web.CHAT_FAVOR, function(sub, msg) { - sub.onexport.record = function(sub, value, key, item) { switch (item.type) { - case mdb.LINK: can.onimport.tabview(can, "", item.text, web.DREAM); break + sub.onexport.record = function(sub, value, key, item, event) { switch (item.type) { + case mdb.LINK: event.shiftKey? can.user.open(item.text): can.onimport.tabview(can, "", item.text, web.DREAM); break case nfs.FILE: var ls = can.onexport.split(can, item.text); can.onimport.tabview(can, ls[0], ls[1]); break case ctx.INDEX: can.onimport.tabview(can, "", item.text, ctx.INDEX); break case ssh.SHELL: can.onimport.tabview(can, "", [web.CODE_XTERM, item.text].join(","), ctx.INDEX); break @@ -60,7 +60,7 @@ Volcanos(chat.ONFIGURE, { sub.onexport.record = function(sub, value, key) { can.onimport.tabview(can, can.Option(nfs.PATH), value, web.DREAM) } }) }, }) -Volcanos(chat.ONACTION, {list: ["编译", "调试", "首页", "收藏", "提交", "计划"], +Volcanos(chat.ONACTION, {list: ["编译", "调试", "首页", "提交", "收藏", "计划"], _daemon: function(event, can, arg) { switch (arg[0]) { case web.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 code.XTERM: can.runAction({}, arg[0], arg.slice(1), function(msg) { can.onimport.tabview(can, ctx.COMMAND, code.XTERM, msg.Result()) }); break @@ -112,12 +112,12 @@ Volcanos(chat.ONACTION, {list: ["编译", "调试", "首页", "收藏", "提交" var sub = can.db.toolkit[list[0]]; sub? sub.select(): can.onimport.exts(can, list[0]) }) }, - "编译": function(event, can) { can.onaction.compile(event, can, "compile") }, - "调试": function(event, can) { can.user.opens(location.href.replace("debug=true", "debug=false")) }, - "首页": function(event, can) { can.user.open(location.origin+(can.misc.Search(can, log.DEBUG) == ice.TRUE? "?debug=true": "")) }, - "收藏": function(event, can) { can.onimport.tabview(can, can.Option(nfs.PATH), "web.chat.favor", ctx.INDEX) }, - "提交": function(event, can) { can.onimport.tabview(can, can.Option(nfs.PATH), "web.code.git.status", ctx.INDEX) }, - "计划": function(event, can) { can.onimport.tabview(can, can.Option(nfs.PATH), "web.team.plan", ctx.INDEX) }, + "编译": function(event, can) { can.onaction.compile(event, can, code.COMPILE) }, + "调试": function(event, can) { can.onimport.tabview(can, "", can.base.MergeURL(location.href, log.DEBUG, ice.TRUE), web.DREAM) }, + "首页": function(event, can) { can.onimport.tabview(can, "", location.origin+(can.misc.Search(can, log.DEBUG) == ice.TRUE? "?debug=true": ""), web.DREAM) }, + "提交": function(event, can) { can.onimport.tabview(can, "", web.CODE_GIT_STATUS, ctx.INDEX) }, + "收藏": function(event, can) { can.onimport.tabview(can, "", web.CHAT_FAVOR, ctx.INDEX) }, + "计划": function(event, can) { can.onimport.tabview(can, "", web.TEAM_PLAN, ctx.INDEX) }, "全屏": function(event, can) { can._target.requestFullScreen() }, "录屏": function(event, can) { window.openapp("QuickTime Player") }, @@ -275,9 +275,8 @@ Volcanos(chat.ONKEYMAP, { }), J: shy("合并两行", function(can) { var next = can.current.next(); if (!next) { return } var line = can.onaction.selectLine(can), text = can.current.text(), rest = can.onexport.text(can, next) - can.ui.current.value = can.current.text(text.trimRight()+( - can.base.endWith(text.trim(), "(", "[")||can.base.beginWith(rest.trim(), ",", "]", ")")? - "": ice.SP)+rest.trimLeft()), can.onaction.deleteLine(can, next) + can.ui.current.value = can.current.text(text.trimRight()+(can.base.endWith(text.trim(), "(", "[")||can.base.beginWith(rest.trim(), ",", "]", ")")? "": ice.SP)+rest.trimLeft()) + can.onkeymap.cursorMove(can.ui.current, text.length, 0), can.onaction.deleteLine(can, next) can.db.undo.push(function() { can.onaction.modifyLine(can, line, text), can.onaction.insertLine(can, rest, line+1) }) }), ".": shy("重复操作", function(can) { var cb = can.db.redo.pop(); cb && cb() }), @@ -300,7 +299,7 @@ Volcanos(chat.ONKEYMAP, { insert_ctrl: { f: shy("光标右移", function(can, target) { can.user.isWindows && can.onkeymap.cursorMove(target, 1) }), b: shy("光标左移", function(can, target) { can.user.isWindows && can.onkeymap.cursorMove(target, -1) }), - a: shy("光标行首", function(can, target) { can.user.isWindows && can.onkeymap.cursorMove(target, 0, 0) }), + a: shy("光标行首", function(can, target) { for (var i = 0; i < target.value.length; i++) { if (target.value[i] != "\t") { break } } can.onkeymap.cursorMove(target, i, 0), can.onkeymap.prevent(event) }), e: shy("光标行尾", function(can, target) { can.user.isWindows && can.onkeymap.cursorMove(target, 0, -1) }), d: shy("删除字符", function(can, target) { can.user.isWindows && can.onkeymap.deleteText(target, target.selectionStart, 1) }), }, diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index f41bb6fa..5e362b6a 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -84,7 +84,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( sub.run = function(event, cmds, cb, silent) { var msg = sub.request(event) if (msg.Option(nfs.PATH) == can.Option(nfs.PATH)) { msg.Option(nfs.PATH, "") } can.runAction(event, chat.STORY, [meta.type, meta.name, meta.text].concat(cmds), function(msg) { - cb(msg), can.sup.onexport.output(can.sup, msg) + cb(msg), can.sup.onexport.output && can.sup.onexport.output(can.sup, msg) }, true) }, can._plugins = (can._plugins||[]).concat([sub]) diff --git a/plugin/state.js b/plugin/state.js index a8c414b2..7082ac5e 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -31,7 +31,9 @@ Volcanos(chat.ONIMPORT, { }, document.body) }) }, _hold: function(can, msg, arg) { arg && can.user.toast(can, arg) }, _back: function(can) { can._history.pop(); for (var index = 0, his = can._history.pop(); his; his = can._history.pop()) { if (his[0] == ctx.ACTION) { continue } - can.page.SelectArgs(can, can._option, "", function(item) { item.value = his[index++]||"" }) + can.page.SelectArgs(can, can._option, "", function(item) { item.value = his[index++]||"" + can.page.Select(can, item.parentNode, "span.value", function(target) { target.innerText = target.value||"" }) + }) can.page.SelectArgs(can, can._action, "", function(item) { item.value = his[index++]||"" }) can.Update(); break } !his && can.Update() }, @@ -52,8 +54,9 @@ Volcanos(chat.ONIMPORT, { var sub = can.core.Value(can, chat._OUTPUTS_CURRENT); if (!sub) { return auto } sub.ConfHeight(can.ConfHeight()), sub.ConfWidth(can.ConfWidth()) if (mode) { sub.Mode(can.Mode(mode)), sub.onlayout[mode](sub) } else { sub.onlayout._init(sub) } return auto }, - change: function(event, can, name, value, cb) { return can.page.SelectArgs(can, can._option, "", function(input) { - if (input.name != name || value == input.value) { return } return input.value = value, can.Update(event, can.Input([], true), cb), input + change: function(event, can, name, value, cb) { return can.page.SelectArgs(can, can._option, "", function(input) { if (input.name != name || value == input.value) { return } + can.page.Select(can, input.parentNode, "span.value", function(target) { target.innerText = value }) + return input.value = value, can.Update(event, can.Input([], true), cb), input })[0] }, }) Volcanos(chat.ONACTION, {list: [ diff --git a/plugin/table.js b/plugin/table.js index 25dbb8b4..b578ec70 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -8,8 +8,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( can.page.Select(can, can.page.Create(can, html.DIV, value.action), html.INPUT, function(target) { action.push(target.name), target.name != target.value && can.user.trans(can, kit.Dict(target.name, target.value)) }) - can.onimport.item(can, {name: can.page.Color(value[can.Conf(mdb.FIELD)||mdb.VIEW]||value[mdb.NAME]||value[mdb.TEXT]), title: value[mdb.TEXT]}, function() { - can.sup.onexport.record(can, value.name, mdb.NAME, value) + can.onimport.item(can, {name: can.page.Color(value[can.Conf(mdb.FIELD)||mdb.VIEW]||value[mdb.NAME]||value[mdb.TEXT]), title: value[mdb.TEXT]}, function(event) { + can.sup.onexport.record(can, value.name, mdb.NAME, value, event) }, function() { return shy(action, function(event, button, meta, carte) { can.misc.Event(event, can, function(msg) { can.sup.onexport.action(can, button, value) || can.run(event, [ctx.ACTION, button], function(msg) { can.sup.onimport._process(can.sup, msg) || can.Update() }), carte.close() }, value) }) }) diff --git a/proto.js b/proto.js index 4cca8912..2b15e76a 100644 --- a/proto.js +++ b/proto.js @@ -72,7 +72,7 @@ var mdb = { } var web = {CHAT: "chat", SHARE: "share", SPACE: "space", DREAM: "dream", - WEBSITE: "website", DRAW: "draw", CLEAR: "clear", REFRESH: "refresh", RESIZE: "resize", FILTER: "filter", + WEBSITE: "website", DRAW: "draw", PLAY: "play", CLEAR: "clear", REFRESH: "refresh", RESIZE: "resize", FILTER: "filter", CANCEL: "cancel", SUBMIT: "submit", UPLOAD: "upload", DOWNLOAD: "download", TOIMAGE: "toimage", SHARE_CACHE: "/share/cache/", SHARE_LOCAL: "/share/local/", @@ -80,11 +80,13 @@ var web = {CHAT: "chat", Accept: "Accept", ContentType: "Content-Type", ContentJSON: "application/json", ContentFORM: "application/x-www-form-urlencoded", VIDEO_WEBM: "video/webm", - CODE_INNER: "web.code.inner", - CODE_VIMER: "web.code.vimer", + CODE_XTERM: "web.code.git.status", CODE_XTERM: "web.code.xterm", - WIKI_WORD: "web.wiki.word", + CODE_VIMER: "web.code.vimer", + CODE_INNER: "web.code.inner", CHAT_FAVOR: "web.chat.favor", + WIKI_WORD: "web.wiki.word", + TEAM_PLAN: "web.team.plan", } var aaa = { LOGIN: "login", LOGOUT: "logout", INVITE: "invite", TOKEN: "token", @@ -124,6 +126,7 @@ var cli = { COLOR: "color", BLACK: "black", WHITE: "white", BLUE: "blue", RED: "red", GRAY: "gray", CYAN: "cyan", GREEN: "green", PURPLE: "purple", YELLOW: "yellow", MAGENTA: "magenta", SILVER: "silver", ALICEBLUE: "aliceblue", TRANSPARENT: "transparent", MAKE: "make", MAIN: "main", EXEC: "exec", DONE: "done", COST: "cost", FROM: "from", CLEAR: "clear", + PLAY: "play", } var log = { INFO: "info", WARN: "warn", ERROR: "error", DEBUG: "debug", TRACE: "trace",