diff --git a/frame.js b/frame.js index 92be96d0..e814de62 100644 --- a/frame.js +++ b/frame.js @@ -166,8 +166,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { can.Update(event, can.Input(cmds, !silent), cb, silent) }, can._inputs[item.name] = sub, sub.sup = can - can.core.ItemCB(sub.onaction, function(key, cb) { sub._target[key] = function(event) { cb(can.request(event), sub) } }) - can.core.ItemCB(item, function(key, cb) { sub._target[key] = function(event) { cb(can.request(event), sub) } }) + can.core.ItemCB(sub.onaction, function(key, cb) { sub._target[key] = function(event) { cb(can.request(event)._event, sub) } }) + can.core.ItemCB(item, function(key, cb) { sub._target[key] = function(event) { cb(can.request(event)._event, sub) } }) skip? next(): can.core.CallFunc([sub.onaction, chat._INIT], {can: sub, meta: item, cb: next, target: sub._target}); (item.action||can.core.Value(meta, [ctx.FEATURE, ctx.INPUTS])) && can.onappend.figure(sub, item, sub._target, function(_sub, value) { sub._target.value = value, can.onmotion.focus(can, sub._target), can.onmotion.delay(can, function() { can.Update() }) @@ -330,21 +330,23 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { can.onappend._plugin(can, value, meta, cbs, target, field) }) }); return res }, - figure: function(can, meta, target, cbs) { if ([html.BUTTON, html.SELECT].indexOf(meta.type) > -1) { return } - var input = meta.action||mdb.KEY; input != ice.AUTO && can.require([chat.PLUGIN_INPUT+input+nfs._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) { - function _cbs(sub, value, old) { can.onmotion.hidden(can, sub._target), can.base.isFunc(cbs)? cbs(sub, value, old): target.value = value||"", can.onmotion.delay(can, function() { can.onmotion.focus(can, target) }) } - if (target._can) { return can.onmotion.toggle(can, target._can._target, true), can.base.isFunc(cb) && cb(target._can, _cbs) } - can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT, mode: meta.mode}, [chat.PLUGIN_INPUT+input+nfs._JS], function(sub) { sub.Conf(meta) - sub.run = function(event, cmds, cb) { var msg = can.request(event) - if (meta.range) { for (var i = meta.range[0]; i < meta.range[1]; i += meta.range[2]||1) { msg.Push(mdb.VALUE, i) } cb(msg); return } - (meta.run||can.run)(sub.request(event, can.Option()), cmds, cb, true) - } - can.onlayout.figure({target: target}, can, sub._target), can.page.style(sub, sub._target, meta.style) - target._can = sub, sub.close = function() { can.page.Remove(can, sub._target), delete(target._can) } - can.base.isFunc(cb) && cb(sub, _cbs), can.base.isFunc(meta._init) && meta._init(sub, sub._target) - }, document.body) - }, target, last) } }), can.onfigure[input]._init && can.onfigure[input]._init(can, target) + figure: function(can, meta, target, cb) { if (meta.action == ice.AUTO || can.base.In(meta.type, html.BUTTON, html.SELECT)) { return } + var input = meta.action||mdb.KEY; can.require([chat.PLUGIN_INPUT+input+nfs._JS], function(can) { + function _cb(sub, value, old) { if (value == old) { return } can.base.isFunc(cb)? cb(sub, value, old): target.value = value||"", can.onmotion.focus(can, target) } + can.core.ItemCB(can.onfigure[input], function(key, on) { var last = target[key]; target[key] = function(event) { + can.core.CallFunc(on, {event: event, can: can, meta: meta, target: target, last: last||function(){}, sub: target._can, cb: _cb, cbs: function(cb) { + if (target._can) { return can.onmotion.toggle(can, target._can._target, true), can.base.isFunc(cb) && cb(target._can, _cb) } + can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT, mode: meta.mode}, [chat.PLUGIN_INPUT+input+nfs._JS], function(sub) { sub.Conf(meta) + sub.run = function(event, cmds, cb) { var msg = sub.request(event) + if (meta.range) { for (var i = meta.range[0]; i < meta.range[1]; i += meta.range[2]||1) { msg.Push(mdb.VALUE, i) } cb(msg); return } + (meta.run||can.run)(sub.request(event, can.Option()), cmds, cb, true) + }, target._can = sub, sub.close = function() { can.page.Remove(can, sub._target), delete(target._can) } + can.onlayout.figure({target: target}, can, sub._target), can.page.style(sub, sub._target, meta.style) + can.page.style(can, sub._outupt, html.MAX_HEIGHT, can.page.height()-sub._target.offsetTop-2*html.ACTION_HEIGHT) + can.base.isFunc(cb) && cb(sub, _cb), can.base.isFunc(meta._init) && meta._init(sub, sub._target) + }, document.body) + }}) + } }), can.onfigure[input]._init && can.onfigure[input]._init(can, target, _cb) }) }, }) @@ -479,6 +481,7 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { move: function(can, target, layout, cb) { var begin; layout = layout||{} can.page.style(can, target, layout), target.onmousedown = function(event) { + if (!event.ctrlKey) { return } layout.height = target.offsetHeight, layout.width = target.offsetWidth layout.left = target.offsetLeft, layout.top = target.offsetTop begin = can.base.Copy({x: event.x, y: event.y}, layout) @@ -506,7 +509,8 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { document.body.onclick = function(event) { if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } if (can.page.tagis(event.target, html.A) && can.user.isWebview) { return event.shiftKey? window.outopen(event.target.href): can.user.open(event.target.href) } - can.page.Select(can, document.body, can.page.Keys("div.carte.float", "fieldset.input.key.float"), function(target) { can.page.Remove(can, target) }) + // can.page.Select(can, document.body, can.page.Keys("div.carte.float", "fieldset.input.key.float"), function(target) { can.page.Remove(can, target) }) + can.page.Select(can, document.body, can.page.Keys("div.carte.float"), function(target) { can.page.Remove(can, target) }) } can.onkeymap._build(can), document.body.onkeydown = function(event) { var msg = can.request(event, {"model": "normal"}); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } @@ -597,9 +601,12 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { return target.setSelectionRange(start, start), cut }, + selectCtrlN: function(event, can, target, key, cb) { if (!event.ctrlKey || event.key < "0" || event.key > "9") { return } + return can.page.Select(can, target, key, function(target, index) { if (index+1 == event.key) { return cb(target) } })[0] + }, selectInputs: function(event, can, cb, target) { - if ([lang.META, lang.ALT, lang.CONTROL, lang.SHIFT].indexOf(event.key) > -1) { return } - if (event.ctrlKey) { if (can.base.isUndefined(target._index)) { target._index = -1, target._value = target.value } + if (can.page.ismodkey(event)) { return } + if (event.ctrlKey || event.key == lang.TAB) { if (can.base.isUndefined(target._index)) { target._index = -1, target._value = target.value } function select(order) { if (order == -1) { target.value = target._value } var index = 0; return can.page.Select(can, can._output, [html.TBODY, html.TR], function(tr) { if (can.page.ClassList.has(can, tr, html.HIDDEN)) { return } @@ -609,6 +616,7 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { }).length } var total = select(target._index); switch (event.key) { + case lang.TAB: can.onkeymap.prevent(event) case "n": select(target._index = (target._index+2) % (total+1) - 1); break case "p": select(target._index = (target._index+total+1) % (total+1) - 1); break default: return diff --git a/lib/base.js b/lib/base.js index 630269a3..5024f677 100644 --- a/lib/base.js +++ b/lib/base.js @@ -95,6 +95,10 @@ Volcanos("base", { } return res }, AddUniq: function(list, value) { list = list||[]; return list.indexOf(value) == -1 && list.push(value), list }, + In: function(item) { var args = arguments; for (var i = 1; i < args; i++) { + if (typeof args[i] == lang.OBJECT && args[i].length > 0 && args[i].indexOf(item) > -1) { return true } + if (item == args[i]) { return true } + } }, Date: function(time) { var now = new Date() if (typeof time == lang.STRING && time != "") { var ls = time.split(ice.SP) diff --git a/lib/page.js b/lib/page.js index 6b9110a5..faf10041 100644 --- a/lib/page.js +++ b/lib/page.js @@ -250,4 +250,5 @@ Volcanos("page", {ClassList: { draggable: function(can, item, ok) { item.setAttribute("draggable", ok) }, height: function() { return window.innerHeight }, width: function() { return window.innerWidth }, + ismodkey: function(event) { return [lang.META, lang.ALT, lang.CONTROL, lang.SHIFT].indexOf(event.key) > -1 }, }) diff --git a/plugin/input/key.js b/plugin/input/key.js index 3069866a..e20d3282 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -1,71 +1,24 @@ Volcanos(chat.ONFIGURE, {key: { - _load: function(event, can, cbs, target, name, value) { - can.runAction(event, mdb.INPUTS, [name, value||target.value], function(msg) { - if (name == ctx.INDEX) { - can.core.Item(can.onengine.plugin.meta, function(key, cb) { - msg.Push(ctx.INDEX, can.core.Keys("can", key)) - }) - } - can.onfigure.key._show(can, msg, cbs, target, name) - }) - }, - _select: function(event, can, target) { - if (event.ctrlKey) { var sub = target._can - if (event.key <= "9" && event.key >= "0") { - can.page.Select(can, sub._output, "tr:not(.hidden) td:first-child", function(td, index) { - if (index+1 == event.key) { target.value = td.innerText } - }); return true - } - } return false - }, - _show: function(can, msg, cbs, target, name) { - if (!can.onmotion.toggle(can, can._target, msg.Length() != 0)) { return } + _show: function(can, msg, cb, target, name) { if (!can.onmotion.toggle(can, can._target, msg.Length() != 0)) { return } can.onmotion.clear(can), can.onappend.table(can, msg, function(value, key, index, line) { value = line[key] - return {text: [value, html.TD], style: msg.append && msg.append.length == 1? {"min-width": target.offsetWidth-16}: {}, onclick: function(event) { can.base.isFunc(cbs) && cbs(can, value, target.value) - msg.Option(ice.MSG_PROCESS) == ice.PROCESS_AGAIN && can.onmotion.delay(can, function() { - can.onfigure.key._load(event, can, cbs, target, name, value) - }) + return {text: [value, html.TD], style: msg.append && msg.append.length == 1? kit.Dict(html.MIN_WIDTH, target.offsetWidth-16): {}, onclick: function(event) { + cb(can, value, target.value), msg.Option(ice.MSG_PROCESS) == ice.PROCESS_AGAIN && can.onmotion.delay(can, function() { can.onfigure.key._load(event, can, cb, target, name, value) }) }} }), can.onappend._status(can, [mdb.TOTAL, mdb.INDEX]), can.Status(mdb.TOTAL, msg.Length()) - can.getActionSize(function(left, top, width, height) { left = left||0, top = top||0 - can.page.style(can, can._target, html.MAX_HEIGHT, can.base.Max(can.page.height()-can._target.offsetTop-html.ACTION_HEIGHT, 600)) - }) - }, - _make: function(event, can, meta, cb, target, last) { - var sub = target._can; if (sub && sub._cbs) { return } - cb(function(sub, cbs) { sub._cbs = cbs - if (meta.msg && meta.msg.Length() > 0) { - can.onfigure.key._show(sub, meta.msg, cbs, target, meta.name) - } else { - can.onfigure.key._load(event, sub, cbs, target, meta.name) - } - }) - }, - onclick: function(event, can, meta, cb, target) { - target._can && target._can.close() - can.onfigure.key._make(event, can, meta, cb, target) - }, - onfocus: function(event, can, meta, cb, target, last) { - can.onfigure.key._make(event, can, meta, cb, target) - }, - onkeydown: function(event, can, meta, cb, target, last) { - switch (event.key) { - case "Escape": target._can? target._can.close(): target.blur(); return - case "Tab": target._can && target._can.close(); return - case "n": - case "p": event.ctrlKey && can.onkeymap.prevent(event); break - case "Enter": if (meta._enter && (!can.page.tagis(event.target, html.TEXTAREA) || event.ctrlKey)) { - if (meta._enter(event)) { return } break - } - default: can.base.isFunc(last) && last(event, can) - } - can.onfigure.key._make(event, can, meta, cb, target) - }, - onkeyup: function(event, can, meta, cb, target, last) { var sub = target._can; if (!sub) { return } - if (can.onfigure.key._select(event, can, target)) { return } - switch (event.key) { - case ice.PS: can.onfigure.key._load(event, sub, sub._cbs, target, meta.name, event.target.value); break - } - can.onkeymap.selectInputs(event, sub, function() { can.onfigure.key._load(event, sub, sub._cbs, target, meta.name) }, target) }, + _load: function(event, can, cb, target, name, value) { can.runAction(event, mdb.INPUTS, [name, value||target.value], function(msg) { + name == ctx.INDEX && can.core.Item(can.onengine.plugin.meta, function(key) { msg.Push(ctx.INDEX, can.core.Keys(ice.CAN, key)) }) + can.onfigure.key._show(can, msg, cb, target, name) + }) }, + onfocus: function(event, can, meta, target, cbs) { can.onmotion.delay(can, function() { cbs(function(sub, cb) { if (sub.Status(mdb.TOTAL) > 0) { return } + meta.msg && meta.msg.Length() > 0? can.onfigure.key._show(sub, meta.msg, cb, target, meta.name): can.onfigure.key._load(event, sub, cb, target, meta.name) + }) }, 30) }, + onblur: function(event, can, sub) { can.onmotion.delay(can, function() { can.onmotion.hidden(can, sub._target) }, 10) }, + onkeydown: function(event, can, meta, cb, target, sub, last) { switch (event.key) { + case "n": + case "p": + case lang.TAB: can.onkeymap.selectInputs(event, sub, function() { can.onfigure.key._load(event, sub, cb, target, meta.name) }, target); break + case lang.ENTER: if (meta._enter && (!can.page.tagis(event.target, html.TEXTAREA) || event.ctrlKey) && meta._enter(event)) { break } + default: can.onkeymap.selectCtrlN(event, can, sub._output, "tr:not(.hidden) td:first-child", function(td) { return cb(sub, td.innerText, target.value), td }) || last(event) + } }, }}) diff --git a/proto.js b/proto.js index 5e180a6f..83a9796d 100644 --- a/proto.js +++ b/proto.js @@ -167,12 +167,10 @@ var chat = { "/plugin/local/wiki/word.js", "/plugin/local/team/plan.js", "/plugin/local/mall/goods.js", - ], + ], PLUGIN_INPUT: "/plugin/input/", PLUGIN_STORY: "/plugin/story/", PLUGIN_LOCAL: "/plugin/local/", PLUGIN_STATE_JS: "/plugin/state.js", PLUGIN_INPUT_JS: "/plugin/input.js", PLUGIN_TABLE_JS: "/plugin/table.js", ONENGINE: "onengine", ONDAEMON: "ondaemon", ONAPPEND: "onappend", ONLAYOUT: "onlayout", ONMOTION: "onmotion", ONKEYMAP: "onkeymap", ONIMPORT: "onimport", ONSYNTAX: "onsyntax", ONFIGURE: "onfigure", ONACTION: "onaction", ONDETAIL: "ondetail", ONEXPORT: "onexport", ONPLUGIN: "onplugin", - PLUGIN_INPUT: "/plugin/input/", - PLUGIN_STORY: "/plugin/story/", ONMAIN: "onmain", ONLOGIN: "onlogin", ONSEARCH: "onsearch", ONREMOTE: "onremote", ONSIZE: "onsize", ONTOAST: "ontoast", ONSHARE: "onshare", ONPRINT: "onprint",