1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00

opt vimer.js

This commit is contained in:
harveyshao 2022-01-18 17:57:51 +08:00
parent 7692d4069f
commit 0d60be84d0
19 changed files with 220 additions and 414 deletions

View File

@ -16,7 +16,7 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta,
}, target) }, target)
}, function() { can.misc.Log(can.user.title(), ice.RUN, can) }, function() { can.misc.Log(can.user.title(), ice.RUN, can)
can.require([can.volcano], null, function(can, name, sub) { can[name] = sub }) can.require([can.volcano], null, function(can, name, sub) { can[name] = sub })
can.onlayout.topic(can), can.onmotion._init(can, target), can.onkeypop._init(can) can.onlayout.topic(can), can.onmotion._init(can, target), can.onkeymap._init(can)
can.ondaemon._init(can), can.onengine.signal(can, chat.ONMAIN, can.request()) can.ondaemon._init(can), can.onengine.signal(can, chat.ONMAIN, can.request())
can.base.isFunc(cb) && cb() can.base.isFunc(cb) && cb()
}), can.onmotion.float.auto(can, document.body) }), can.onmotion.float.auto(can, document.body)
@ -448,9 +448,9 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
can.onengine.signal(can, "keymap.focus", can.request({}, {cb: function(event) { can.onengine.signal(can, "keymap.focus", can.request({}, {cb: function(event) {
if (event.target.tagName == "INPUT") { return } if (event.target.tagName == "INPUT") { return }
if (event.key == lang.ESCAPE) { ui.close(); return } if (event.key == lang.ESCAPE) { ui.close(); return }
if (event.key == ice.SP) { input.focus(), can.onkeypop.prevent(event) } if (event.key == ice.SP) { input.focus(), can.onkeymap.prevent(event) }
}})) }}))
}, onkeydown: function(event) { can.onkeypop.input(event, can) }, onkeydown: function(event) { can.onkeymap.input(event, can)
if (event.key != lang.ENTER) { return } if (event.key != lang.ENTER) { return }
event.target.setSelectionRange(0, -1) event.target.setSelectionRange(0, -1)
@ -681,7 +681,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
event.target.value == back || cb(event, event.target.value, back) event.target.value == back || cb(event, event.target.value, back)
break break
case lang.ESCAPE: target.innerHTML = back; break case lang.ESCAPE: target.innerHTML = back; break
default: can.onkeypop.input(event, can) default: can.onkeymap.input(event, can)
} }
}, _init: function(target) { }, _init: function(target) {
item && can.onappend.figure(can, item, target), target.value = text item && can.onappend.figure(can, item, target), target.value = text
@ -700,7 +700,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
} }
break break
case lang.ESCAPE: target.innerHTML = back; break case lang.ESCAPE: target.innerHTML = back; break
default: can.onkeypop.input(event, can) default: can.onkeymap.input(event, can)
} }
}, _init: function(target) { }, _init: function(target) {
item && can.onappend.figure(can, item, target) item && can.onappend.figure(can, item, target)
@ -736,7 +736,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
can.page.Modify(can, target, {style: {left: layout.left, top: layout.top}}) can.page.Modify(can, target, {style: {left: layout.left, top: layout.top}})
} }
can.base.isFunc(cb) && cb(target) can.base.isFunc(cb) && cb(target)
can.onkeypop.prevent(event) can.onkeymap.prevent(event)
} }
can.base.isFunc(cb) && cb(target) can.base.isFunc(cb) && cb(target)
}, },
@ -775,12 +775,12 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
case "n": case "n":
var total = select(target._index) var total = select(target._index)
select(target._index = ((target._index)+1) % total) select(target._index = ((target._index)+1) % total)
can.onkeypop.prevent(event) can.onkeymap.prevent(event)
break break
case "p": case "p":
var total = select(target._index) var total = select(target._index)
select(target._index = (target._index-1) < 0? total-1: (target._index-1)) select(target._index = (target._index-1) < 0? total-1: (target._index-1))
can.onkeypop.prevent(event) can.onkeymap.prevent(event)
break break
default: target._index = 0 default: target._index = 0
} }
@ -825,7 +825,7 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
can.Status(kit.Dict(mdb.TOTAL, total, mdb.INDEX, target._index)) can.Status(kit.Dict(mdb.TOTAL, total, mdb.INDEX, target._index))
}, },
}) })
Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) { Volcanos("onkeymap", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) {
document.body.onkeydown = function(event) { var msg = can.request(event) document.body.onkeydown = function(event) { var msg = can.request(event)
msg.Option("model", "normal"); if (event.target.tagName == "SELECT" || 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") msg.Option("model", event.ctrlKey? "insert_ctrl": "insert")
@ -835,16 +835,16 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio
if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }
can.onengine.signal(can, "onkeydown", msg) can.onengine.signal(can, "onkeydown", msg)
if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }
can._keylist = can.onkeypop._parse(event, can, msg.Option("model"), can._keylist||[], can._output) can._keylist = can.onkeymap._parse(event, can, msg.Option("model"), can._keylist||[], can._output)
} }
}, },
_build: function(can) { _build: function(can) {
can.core.Item(can.onkeypop._mode, function(item, value) { var engine = {} can.core.Item(can.onkeymap._mode, function(item, value) { var engine = {}
can.core.Item(value, function(key, cb) { var map = engine can.core.Item(value, function(key, cb) { var map = engine
for (var i = key.length-1; i > -1; i--) { for (var i = key.length-1; i > -1; i--) {
map = map[key[i]] = i == 0? cb: (map[key[i]]||{}) map = map[key[i]] = i == 0? cb: (map[key[i]]||{})
} }
}), can.onkeypop._engine[item] = engine }), can.onkeymap._engine[item] = engine
}) })
}, },
_parse: function(event, can, mode, list, target) { list = list||[], list.push(event.key) _parse: function(event, can, mode, list, target) { list = list||[], list.push(event.key)
@ -854,15 +854,15 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio
function repeat(cb, count) { list = [] function repeat(cb, count) { list = []
for (var i = 1; i <= count; i++) { if (cb(event, can, target, count)) { break } } for (var i = 1; i <= count; i++) { if (cb(event, can, target, count)) { break } }
// can.onkeypop.prevent(event) // can.onkeymap.prevent(event)
} }
var map = can.onkeypop._mode[mode] var map = can.onkeymap._mode[mode]
var cb = map && map[event.key.toLowerCase()]; if (can.base.isFunc(cb) && event.key.length > 1) { var cb = map && map[event.key.toLowerCase()]; if (can.base.isFunc(cb) && event.key.length > 1) {
repeat(cb, count); return list repeat(cb, count); return list
} }
var map = can.onkeypop._engine[mode]||{}; for (var i = list.length-1; i > pre-1; i--) { var map = can.onkeymap._engine[mode]||{}; for (var i = list.length-1; i > pre-1; i--) {
var cb = map[list[i]]||{}; switch (typeof cb) { var cb = map[list[i]]||{}; switch (typeof cb) {
case lang.FUNCTION: repeat(cb, count); return list case lang.FUNCTION: repeat(cb, count); return list
case lang.OBJECT: map = cb; continue case lang.OBJECT: map = cb; continue
@ -878,7 +878,7 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio
target.blur() target.blur()
}, },
jk: function(event, can, target) { jk: function(event, can, target) {
can.onkeypop.DelText(target, target.selectionStart-1, target.selectionStart) can.onkeymap.DelText(target, target.selectionStart-1, target.selectionStart)
target.blur() target.blur()
}, },
enter: function(event, can, target) { enter: function(event, can, target) {
@ -916,16 +916,16 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio
}, },
u: function(event, can, target) { u: function(event, can, target) {
can.onkeypop.DelText(target, 0, target.selectionEnd) can.onkeymap.DelText(target, 0, target.selectionEnd)
}, },
k: function(event, can, target) { k: function(event, can, target) {
can.onkeypop.DelText(target, target.selectionStart) can.onkeymap.DelText(target, target.selectionStart)
}, },
h: function(event, can, target) { h: function(event, can, target) {
can.onkeypop.DelText(target, target.selectionStart-1, target.selectionStart) can.onkeymap.DelText(target, target.selectionStart-1, target.selectionStart)
}, },
d: function(event, can, target) { d: function(event, can, target) {
can.onkeypop.DelText(target, 0, target.selectionStart) can.onkeymap.DelText(target, 0, target.selectionStart)
}, },
w: function(event, can, target) { w: function(event, can, target) {
var start = target.selectionStart-2 var start = target.selectionStart-2
@ -938,14 +938,14 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio
break break
} }
} }
can.onkeypop.DelText(target, i+1, end-i) can.onkeymap.DelText(target, i+1, end-i)
}, },
}, },
}, _engine: {}, }, _engine: {},
input: function(event, can) { var target = event.target input: function(event, can) { var target = event.target
target._keys = can.onkeypop._parse(event, can, event.ctrlKey? "insert_ctrl": mdb.INSERT, target._keys||[], target) target._keys = can.onkeymap._parse(event, can, event.ctrlKey? "insert_ctrl": mdb.INSERT, target._keys||[], target)
if (target._keys.length == 0 && target.tagName == "INPUT") { can.onkeypop.prevent(event) } if (target._keys.length == 0 && target.tagName == "INPUT") { can.onkeymap.prevent(event) }
}, },
DelText: function(target, start, count) { DelText: function(target, start, count) {
target.value = target.value.substring(0, start)+target.value.substring(start+(count||target.value.length), target.value.length) target.value = target.value.substring(0, start)+target.value.substring(start+(count||target.value.length), target.value.length)

View File

@ -114,7 +114,7 @@ Volcanos("page", {help: "用户界面", ClassList: {
type = html.BUTTON, name = name||list[0] type = html.BUTTON, name = name||list[0]
data.innerText = can.user.trans(can, list[0]), data.onclick = function(event) { data.innerText = can.user.trans(can, list[0]), data.onclick = function(event) {
can.base.isFunction(list[1]) && list[1](event, name) can.base.isFunction(list[1]) && list[1](event, name)
can.onkeypop.prevent(event) can.onkeymap.prevent(event)
return true return true
} }

View File

@ -190,7 +190,7 @@ Volcanos("user", {help: "用户操作", agent: {
var input = can.page.Append(can, event.target.parentNode, [{type: html.TEXTAREA, value: text}]).first var input = can.page.Append(can, event.target.parentNode, [{type: html.TEXTAREA, value: text}]).first
can.onmotion.focus(can, input), document.execCommand("Copy") can.onmotion.focus(can, input), document.execCommand("Copy")
can.page.Remove(can, input), can.user.toastSuccess(can) can.page.Remove(can, input), can.user.toastSuccess(can)
can.onkeypop.prevent(event) can.onkeymap.prevent(event)
}, },
carte: function(event, can, meta, list, cb, parent) { 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 } meta = meta||can.ondetail||can.onaction||{}, list = list&&list.length > 0? list: meta.list||[]; if (list.length == 0) { return }
@ -214,9 +214,9 @@ Volcanos("user", {help: "用户操作", agent: {
var carte = {_target: ui._target, _parent: parent} var carte = {_target: ui._target, _parent: parent}
null && can.onmotion.float.add(can, chat.CARTE, carte) null && can.onmotion.float.add(can, chat.CARTE, carte)
ui._target.onmouseover = function(event) { ui._target.onmouseover = function(event) {
can.onkeypop.prevent(event) can.onkeymap.prevent(event)
} }
return can.onkeypop.prevent(event), carte return can.onkeymap.prevent(event), carte
}, },
carteRight: function(event, can, meta, list, cb, parent) { carteRight: function(event, can, meta, list, cb, parent) {
var carte = can.user.carte(event, can, meta, list, cb, parent) var carte = can.user.carte(event, can, meta, list, cb, parent)

View File

@ -49,7 +49,7 @@ Volcanos({name: "chat", panels: [
}}, }},
project: {name: "研发群", storm: { project: {name: "研发群", storm: {
studio: {name: "研发 studio", list: [ studio: {name: "研发 studio", list: [
{name: "vimer", help: "编辑器", index: "web.code.inner", args: ["src/", "main.go"], _action: ["autogen", "compile", "binpack"]}, {name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/", "main.go"], _action: ["autogen", "compile", "binpack"]},
{name: "repos", help: "代码库", index: "web.code.git.status"}, {name: "repos", help: "代码库", index: "web.code.git.status"},
{name: "plan", help: "任务表", index: "web.team.plan"}, {name: "plan", help: "任务表", index: "web.team.plan"},
{name: "ctx", help: "上下文", index: "web.wiki.word", args: ["src/main.shy"]}, {name: "ctx", help: "上下文", index: "web.wiki.word", args: ["src/main.shy"]},

View File

@ -9,7 +9,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg)
can.onappend.plugin(can, item, function(sub, meta, skip) { can.onappend.plugin(can, item, function(sub, meta, skip) {
can.onimport._plugin(can, river, storm, sub, meta), skip || next() can.onimport._plugin(can, river, storm, sub, meta), skip || next()
}) })
}, function() { can.onimport._menu(can, msg), can.onkeypop._init(can) }, function() { can.onimport._menu(can, msg), can.onkeymap._init(can)
can.onaction.layout(can, can.misc.SearchOrConf(can, chat.LAYOUT)) can.onaction.layout(can, can.misc.SearchOrConf(can, chat.LAYOUT))
}) })
}, },
@ -153,9 +153,9 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, cb, t
can.onlayout._init(can) can.onlayout._init(can)
}, },
}) })
Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) { Volcanos("onkeymap", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) {
can.onkeypop._build(can), can.onengine.listen(can, "onkeydown", function(msg, model) { can.onkeymap._build(can), can.onengine.listen(can, "onkeydown", function(msg, model) {
can._keylist = can.onkeypop._parse(msg._event, can, model, can._keylist||[], can._output) can._keylist = can.onkeymap._parse(msg._event, can, model, can._keylist||[], can._output)
}) })
}, },
_mode: { _mode: {

View File

@ -29,7 +29,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
}, },
_cli: function(can, msg, target) { _cli: function(can, msg, target) {
can.onappend.input(can, {type: html.TEXT, name: "cmd", onkeydown: function(event) { can.onappend.input(can, {type: html.TEXT, name: "cmd", onkeydown: function(event) {
can.onkeypop.input(event, can); if (event.key != lang.ENTER) { return } can.onkeymap.input(event, can); if (event.key != lang.ENTER) { return }
switch (event.target.value) { switch (event.target.value) {
case cli.CLEAR: can.cli && can.cli.close(); break case cli.CLEAR: can.cli && can.cli.close(); break
case cli.CLOSE: can.cli && can.cli.close(); break case cli.CLOSE: can.cli && can.cli.close(); break

View File

@ -62,7 +62,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
}, },
_search: function(can, msg, target) { _search: function(can, msg, target) {
var ui = can.onappend.input(can, {type: html.TEXT, name: mdb.SEARCH, onkeydown: function(event) { var ui = can.onappend.input(can, {type: html.TEXT, name: mdb.SEARCH, onkeydown: function(event) {
can.onkeypop.input(event, can); switch (event.key) { can.onkeymap.input(event, can); switch (event.key) {
case lang.ENTER: can.onengine.signal(can, "onopensearch", can.request(event, {type: "*", word: event.target.value})) case lang.ENTER: can.onengine.signal(can, "onopensearch", can.request(event, {type: "*", word: event.target.value}))
} }
}}, "", target, "title search").parentNode }}, "", target, "title search").parentNode

View File

@ -49,10 +49,10 @@ Volcanos("onaction", {help: "交互操作", list: [cli.CLEAR, cli.CLOSE, cli.DON
onlogin: function(can, msg) { onlogin: function(can, msg) {
can.onappend._action(can, can.Conf(html.ACTION)||can.onaction.list) can.onappend._action(can, can.Conf(html.ACTION)||can.onaction.list)
can.ui = can.page.Append(can, can._output, [ can.ui = can.page.Append(can, can._output, [
{input: ["word", function(event) { can.onkeypop.input(event, can) {input: ["word", function(event) { can.onkeymap.input(event, can)
if (event.key == lang.ESCAPE) { can.onmotion.hide(can) } if (event.key == lang.ESCAPE) { can.onmotion.hide(can) }
if (event.key == lang.ENTER) { can.onkeypop.prevent(event) if (event.key == lang.ENTER) { can.onkeymap.prevent(event)
if (event.shiftKey) { var first = can.page.Select(can, can.ui.content, html.TR)[1] 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) return can.onaction[can.type == "*"? chat.PLUGIN: html.SELECT](event, can, first.dataset.index)
} }

View File

@ -20,18 +20,18 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta,
onchange: function(event, can) { onchange: function(event, can) {
if (can.Conf(mdb.TYPE) == html.SELECT) { can.run(event) } if (can.Conf(mdb.TYPE) == html.SELECT) { can.run(event) }
}, },
onkeydown: function(event, can) { can.onkeypop.input(event, can, event.target) onkeydown: function(event, can) { can.onkeymap.input(event, can, event.target)
if (can.Conf(mdb.TYPE) == html.TEXTAREA) { if (!event.ctrlKey) { return } } if (can.Conf(mdb.TYPE) == html.TEXTAREA) { if (!event.ctrlKey) { return } }
if (event.key == lang.ENTER) { if (event.key == lang.ENTER) {
can.run(event), can.onmotion.focus(can, event.target) can.run(event), can.onmotion.focus(can, event.target)
can.onkeypop.prevent(event) can.onkeymap.prevent(event)
} if (!event.ctrlKey) { return } } if (!event.ctrlKey) { return }
switch (event.key) { switch (event.key) {
case "b": can.CloneInput(); break case "b": can.CloneInput(); break
case "m": can.CloneField(); break case "m": can.CloneField(); break
default: return default: return
} can.onkeypop.prevent(event) } can.onkeymap.prevent(event)
}, },
}) })

View File

@ -39,7 +39,7 @@ Volcanos("onfigure", {help: "控件详情", list: [], key: {
} }
if (event.ctrlKey && ["n", "p"].indexOf(event.key) > -1) { if (event.ctrlKey && ["n", "p"].indexOf(event.key) > -1) {
return can.onkeypop.prevent(event) return can.onkeymap.prevent(event)
} }
switch (event.key) { case lang.ESCAPE: event.target.blur(); return } switch (event.key) { case lang.ESCAPE: event.target.blur(); return }
can.base.isFunc(last) && last(event, can) can.base.isFunc(last) && last(event, can)

View File

@ -15,28 +15,23 @@ fieldset.inner>div.action div.tabs.select {
fieldset.inner>div.output { fieldset.inner>div.output {
color:white; color:white;
} }
fieldset.inner table.layout div.toggle.project { fieldset.inner>div.output>table.layout div.toggle.project {
min-width:15px; font-size:24px; min-width:15px; font-size:24px;
} }
fieldset.inner table.layout div.toggle.profile { fieldset.inner>div.output>table.layout div.toggle.profile {
min-width:15px; font-size:24px; min-width:15px; font-size:24px;
} }
fieldset.inner table.layout div.toggle.display { fieldset.inner>div.output>table.layout div.toggle.display {
height:15px; font-size:24px; height:15px; font-size:24px;
margin-top:-17px; margin-top:-17px;
} }
fieldset.inner div.output div.toggle {
/* display:none; */
}
fieldset.inner>div.output div.project { fieldset.inner>div.output div.project {
font-size:14px; font-family:monospace; font-size:14px; font-family:monospace;
max-width:180px; overflow:auto; max-width:180px; overflow:auto;
} }
fieldset.inner>div.output>table.layout div.content { fieldset.inner>div.output div.content {
position:relative; position:relative;
padding-right:25px; padding-right:25px;
}
fieldset.inner>div.output div.content {
font-size:16px; font-family:monospace; font-size:16px; font-family:monospace;
overflow:auto; overflow:auto;
color:white; color:white;
@ -82,9 +77,6 @@ fieldset.inner>div.output div.content td.text span.constant {
fieldset.inner>div.output div.content td.text span.string { fieldset.inner>div.output div.content td.text span.string {
color:magenta; color:magenta;
} }
fieldset.inner>div.output div.display {
/* display:none; */
}
fieldset.inner>div.output div.display>div.action>div.item { fieldset.inner>div.output div.display>div.action>div.item {
float:left; float:left;
} }
@ -107,7 +99,6 @@ fieldset.inner div.output fieldset.toolkit {
} }
fieldset.inner>div.output fieldset.toolkit>div.output>fieldset { fieldset.inner>div.output fieldset.toolkit>div.output>fieldset {
display:none; margin:0;padding:0; display:none; margin:0;padding:0;
/* float:right; */
} }
fieldset.inner>div.output fieldset.toolkit>div.output>fieldset.select { fieldset.inner>div.output fieldset.toolkit>div.output>fieldset.select {
display:block; display:block;

View File

@ -56,9 +56,9 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
plug: can.core.Split(msg.OptionOrSearch("plug")).reverse(), plug: can.core.Split(msg.OptionOrSearch("plug")).reverse(),
tabs: can.core.Split(msg.OptionOrSearch("tabs")), tabs: can.core.Split(msg.OptionOrSearch("tabs")),
}) }) }, }) }) },
_keydown: function(can) { can.onkeypop._build(can) _keydown: function(can) { can.onkeymap._build(can)
can.user.mod.isCmd && can.onengine.listen(can, chat.ONKEYDOWN, function(event) { can.user.mod.isCmd && can.onengine.listen(can, chat.ONKEYDOWN, function(event) {
can._key_list = can.onkeypop._parse(event, can, "normal", can._key_list, can.ui.content) can._key_list = can.onkeymap._parse(event, can, "command", can._key_list, can.ui.content)
}) })
}, },
@ -72,6 +72,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
}, true) }, true)
}, },
tabview: function(can, path, file, line, cb) { var key = path+ice.DF+file tabview: function(can, path, file, line, cb) { var key = path+ice.DF+file
can.onkeymap._command(can)
if (can.tabview[key]) { can.user.mod.isCmd && can.user.title(path+file) if (can.tabview[key]) { can.user.mod.isCmd && can.user.title(path+file)
can._msg && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = 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||can._msg.Option(nfs.LINE)||1}) can.Option({path: path, file: file, line: line||can._msg.Option(nfs.LINE)||1})
@ -142,6 +143,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
can.page.styleHeight(can, can.ui.content, (can.ui.project.offsetHeight||height)-can.ui.display.offsetHeight) can.page.styleHeight(can, can.ui.content, (can.ui.project.offsetHeight||height)-can.ui.display.offsetHeight)
} }
can.page.styleWidth(can, can.ui.content, width-can.ui.project.offsetWidth-can.ui.profile.offsetWidth-25) can.page.styleWidth(can, can.ui.content, width-can.ui.project.offsetWidth-can.ui.profile.offsetWidth-25)
if (can.page.ClassList.has(can, can._fields, "full")) { if (can.page.ClassList.has(can, can._fields, "full")) {
can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight) can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight)
} else { } else {
@ -163,22 +165,20 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
}, [""]) }, [""])
Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], _init: function(can, msg, cb) { Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], _init: function(can, msg, cb) {
if (can.onmotion.cache(can, function(cache_data) { if (can.onmotion.cache(can, function(cache_data) {
can.file && (cache_data[can.file] = { can.file && (cache_data[can.file] = {current: can.current, max: can.max,
current: can.current, max: can.max, profile_display: can.ui.profile.style.display, display_display: can.ui.display.style.display,
profile_display: can.ui.profile.style.display,
display_display: can.ui.display.style.display,
}) })
can.file = can.base.Path(msg.Option(nfs.PATH), msg.Option(nfs.FILE)) can.file = can.base.Path(msg.Option(nfs.PATH), msg.Option(nfs.FILE))
can.parse = can.base.Ext(can.file), can.Status("模式", "command")
var p = cache_data[can.file]; p && (can.current = p.current, can.max = p.max) var p = cache_data[can.file]; p && (can.current = p.current, can.max = p.max)
can.page.Modify(can, can.ui.profile, {style: {display: p? p.profile_display: html.NONE}}) can.page.Modify(can, can.ui.profile, {style: {display: p? p.profile_display: html.NONE}})
can.page.Modify(can, can.ui.display, {style: {display: p? p.display_display: html.NONE}}) can.page.Modify(can, can.ui.display, {style: {display: p? p.display_display: html.NONE}})
can.parse = can.base.Ext(can.file), can.Status("模式", "normal")
can.onmotion.select(can, can._action, chat.DIV_TABS, msg._tab) can.onmotion.select(can, can._action, chat.DIV_TABS, msg._tab)
msg.Option(ctx.INDEX) && can.core.Timer(10, function() { msg.Option(ctx.INDEX) && can.core.Timer(10, function() {
can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]) can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0])
}) })
can.onimport.layout(can) return can.onimport.layout(can), can.file
return can.file
}, can.ui.content, can.ui.profile_output, can.ui.display_output)) { }, 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() return can.onaction.selectLine(can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb()
} }
@ -230,26 +230,29 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
return line return line
}, },
}) })
Volcanos("onkeypop", {help: "导入数据", _init: function(can, msg, cb, target) { Volcanos("onkeymap", {help: "导入数据", _init: function(can, msg, cb, target) {
}, },
_mode: { _mode: {
normal: { command: {
escape: function(event, can, target) { can.onaction["清屏"](event, can) }, escape: function(event, can) { can.onaction["清屏"](event, can) },
g: function(event, can, target) { can.onaction["搜索"](event, can) }, g: function(event, can) { can.onaction["搜索"](event, can) },
f: function(event, can, target) { can.onaction["打开"](event, can) }, f: function(event, can) { can.onaction["打开"](event, can) },
t: function(event, can, target) { can.onaction["添加"](event, can) }, t: function(event, can) { can.onaction["添加"](event, can) },
p: function(event, can, target) { can.onaction["插件"](event, can) }, p: function(event, can) { can.onaction["插件"](event, can) },
e: function(event, can, target) { can.onaction["扩展"](event, can) }, e: function(event, can) { can.onaction["扩展"](event, can) },
q: function(event, can, target) { can.onaction["全屏"](event, can) }, q: function(event, can) { can.onaction["全屏"](event, can) },
r: function(event, can, target) { can.onaction["执行"](event, can) }, r: function(event, can) { can.onaction["执行"](event, can) },
v: function(event, can, target) { can.onaction["展示"](event, can) }, v: function(event, can) { can.onaction["展示"](event, can) },
s: function(event, can, target) { can.onaction["保存"](event, can) }, s: function(event, can) { can.onaction["保存"](event, can) },
j: function(event, can, target) { can.onaction.scrollLine(can, 1) }, j: function(event, can) { can.onaction.scrollLine(can, 1) },
k: function(event, can, target) { can.onaction.scrollLine(can, -1) }, k: function(event, can) { can.onaction.scrollLine(can, -1) },
J: function(event, can, target) { can.onaction.scrollLine(can, 20) }, J: function(event, can) { can.onaction.scrollLine(can, 20) },
K: function(event, can, target) { can.onaction.scrollLine(can, -20) }, K: function(event, can) { can.onaction.scrollLine(can, -20) },
i: function(event, can) { can.onkeymap._insert(event, can) },
n: function(event, can) { can.onkeymap._normal(can) },
}, },
}, _engine: {}, }, _engine: {},
}) })
@ -386,10 +389,10 @@ Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加",
var push = {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()} var push = {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()}
can.base.Eq({path: push.path, file: push.file, line: push.line}, can.history[can.history.length-1]) || can.history.push(push) can.base.Eq({path: push.path, file: push.file, line: push.line}, can.history[can.history.length-1]) || can.history.push(push)
can.Status("跳转数", can.history.length) can.Status("跳转数", can.history.length)
can.onaction._selectLine(event, can)
}) })
},
// can.onkeymap && can.onkeymap._mode(can, "insert") _selectLine: function(event, can) {
// can.onkeymap && can.onkeymap.selectLine(can)
}, },
searchLine: function(event, can, value) { if (!can.ui.search) { return } searchLine: function(event, can, value) { if (!can.ui.search) { return }
can.ui.search.Update(event, [ctx.ACTION, nfs.TAGS, value.trim()]) can.ui.search.Update(event, [ctx.ACTION, nfs.TAGS, value.trim()])

View File

@ -1,51 +1,14 @@
fieldset.inner>div.output td.content { fieldset.vimer>div.output input.current {
position:relative;
}
fieldset.inner>div.output input.current {
position:absolute; padding:0; margin:0;
font-size:16px; font-family:monospace;
padding-left:9px;
background-color:#00000000; color:#00000000; background-color:#00000000; color:#00000000;
font-family:monospace; font-size:16px;
position:absolute; left:0;
margin:0; margin-top:-2px;
padding:0; padding-left:9px;
width:-webkit-fill-available; width:-webkit-fill-available;
} }
fieldset.inner>div.output input.current.insert { fieldset.vimer>div.output input.current.insert {
caret-color:yellow; caret-color:yellow;
} }
fieldset.inner>div.output input.current.normal { fieldset.vimer>div.output input.current.normal {
caret-color:blue; caret-color:blue;
} }
fieldset.inner>div.output input.current.command {
display:none;
}
fieldset.inner>div.output input.command {
font-size:16px; font-family:monospace;
background-color:black; color:white;
caret-color:red;
border:solid 1px red;
border-left:solid 3px green;
width:-webkit-fill-available;
margin:0; padding:0 12px;
}
fieldset.inner>div.output input.command.normal {
display:none;
}
fieldset.inner>div.output input.command.insert {
display:none;
}
fieldset.inner>div.output div.display input.cmd {
font-size:16px; font-family:monospace;
background-color:black; color:white;
min-width:480px; padding-left:5px;
margin-left:2px;
}
fieldset.inner>div.output div.display div.output {
overflow:auto;
}
fieldset.inner>div.output div.display div.output {
/* max-height:160px; */
}

View File

@ -1,290 +1,143 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, cb, target) {
can.require(["/plugin/local/code/inner.js"], function(can) { can.require(["inner.js"], function(can) { can.onimport.inner_init(can, msg, function() {
can.onimport.inner_init(can, msg, list, function() { can.onkeymap._build(can), can.onimport._input(can), can.onkeymap._normal(can), can.base.isFunc(cb) && cb(msg)
can.onimport._input(can), can.onimport._output(can) }, target) }, function(can, name, sub) {
can.keylist = [], can.onkeymap._init(can, "insert") name == chat.ONIMPORT && (can.onimport.inner_init = sub._init)
can.base.isFunc(cb) && cb(msg) name == chat.ONKEYMAP && (can.base.Copy(can.onkeymap._mode, sub._mode))
}, target)
}, function(can, name, sub) {
sub._name == "onimport" && (can.onimport.inner_init = sub._init)
}) })
}, },
_input: function(can) { _input: function(can) {
var ui = can.page.Append(can, can.ui.content.parentNode, [ can.ui.current = can.page.Append(can, can.ui.content.parentNode, [
{view: ["current", "input"], onkeydown: function(event) { {view: ["current", html.INPUT], onkeydown: function(event) { if (event.metaKey) { return }
can.onkeymap.parse(event, can, "insert") can._keylist = can.onkeymap._parse(event, can, can.mode, can._keylist, can.ui.current)
can.core.Timer(10, function() { can.mode != "command" && can.core.Timer(10, function() { can.current.text(can.ui.current.value) })
can.current.text(can.ui.current.value) can.mode == "normal" && can.onkeymap.prevent(event)
}) }, onclick: function(event) { can.onkeymap._insert(event, can) }},
}, onblur: function(event) { ]).first
can.current.text(can.ui.current.value)
}, onfocus: function(event) {
can._output.scrollLeft += -1000
can.current.scroll(-1000, 0)
}, onclick: function(event) {
can.onkeymap._insert(can)
}},
{view: ["command", "input"], onkeydown: function(event) {
can.onkeymap.parse(event, can, "command")
}, onfocus: function(event) {
can._output.scrollLeft += -1000
can.current.scroll(-1000, 0)
}},
]); can.base.Copy(can.ui, ui, "current", "command")
},
_output: function(can) {
var ui = can.page.Appends(can, can.ui.display, [
{view: "action", list: [
{input: ["cmd", function(event) {
can.onkeymap.parse(event, can, "command")
}], value: "", onfocus: function(event) {
event.target.setSelectionRange(0, -1)
can.onkeymap._command(can)
}},
{button: ["run", function(event) {
can.onkeymap.command.Enter(event, can, can.ui.cmd.value)
}]},
{button: ["清空", function(event) {
can.onmotion.clear(can, ui.output)
} ]},
{button: ["关闭", function(event) {
can.onmotion.hidden(can, can.ui.display)
} ]},
]}, {view: "output"},
]); can.base.Copy(can.ui, ui, "output", "cmd")
}, },
}, [""]) }, [""])
Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert"], _init: function(can, mode) { Volcanos("onkeymap", {help: "键盘交互", list: [],
can.core.List(can.onkeymap.list, function(item) { var engine = {} _model: function(can, value) { can.Status("模式", can.mode = value)
can.core.Item(can.onkeymap[item], function(key, cb) { var map = engine return can.page.Modify(can, can.ui.current, {className: "current"+ice.SP+can.mode}), value
for (var i = key.length-1; i > -1; i--) {
map = map[key[i]] = i == 0? cb: (map[key[i]]||{})
}
}), can.onkeymap[item]._engine = engine
}), can.onkeymap._mode(can, mode||"normal")
}, },
_mode: function(can, value) { can.Status("模式", can.mode = value) _command: function(can) { can.onkeymap._model(can, "command")
can.page.Modify(can, can.ui.current, {className: "current "+can.mode}) can.ui.current.blur()
can.page.Modify(can, can.ui.command, {className: "command "+can.mode})
return value
}, },
_command: function(can) { can.onkeymap._mode(can, "command") _normal: function(can) { can.onkeymap._model(can, "normal")
if (can.ui.display.style.display == "none") {
can.page.Modify(can, can.ui.command, {style: {display: ""}})
can.ui.command.focus()
} else {
can.page.Modify(can, can.ui.display, {style: {display: "block"}})
can.ui.cmd.focus()
}
},
_normal: function(can) { can.onkeymap._mode(can, "normal")
can.ui.current.focus() can.ui.current.focus()
}, },
_insert: function(can) { can.onkeymap._mode(can, "insert") _insert: function(event, can) { can.onkeymap._model(can, "insert")
can.ui.current.focus() can.ui.current.focus(), can.onkeymap.prevent(event)
can.ui.content.scrollLeft -= 100
}, },
_remote: function(event, can, key, arg, cb) { can.request(event, {_toast: "执行中..."}) _mode: {
can.run(event, arg||["action", key, can.parse, can.Option("file"), can.Option("path")], cb||function(msg) { normal: {
can.onappend.table(can, msg, function(value, key, index) { return {text: [value, "td"]} }, can.ui.output) jk: function(event, can, target) { can.onkeymap._command(can) },
can.onappend.board(can, msg.Result(), can.ui.output) escape: function(event, can) { can.onkeymap._command(can) },
H: function(event, can, target) { can.onaction.cursorMove(can, target, 0, 0) },
h: function(event, can, target) { can.onaction.cursorMove(can, target, -1) },
l: function(event, can, target) { can.onaction.cursorMove(can, target, 1) },
L: function(event, can, target) { can.onaction.cursorMove(can, target, 0, -1) },
j: function(event, can) { can.onaction.selectLine(can, can.current.next()) },
k: function(event, can) { can.onaction.selectLine(can, can.current.prev()) },
gg: function(event, can, target, count) { return can.onaction.selectLine(can, count||1), true },
G: function(event, can, target, count) { return can.onaction.selectLine(can, count = count > 1? count: can.max), true },
zt: function(event, can, target, count) { count = count||2
var pos = can.current.offset()-target.offsetTop
can.current.scroll(0, -(pos+can.current.height()*count))
return true
},
zz: function(event, can, target, count) { count = count||5
var pos = can.current.offset()-target.offsetTop
can.current.scroll(0, -(pos+can.current.height()*count))
return true
},
zb: function(event, can, target, count) { count = count||3
var pos = can.current.offset()-target.offsetTop
can.current.scroll(0, -(pos+can.current.window()-can.current.height()*count))
return true
},
i: function(event, can) { can.onkeymap._insert(event, can) },
I: function(event, can, target) { can.onkeymap._insert(event, can)
can.onaction.cursorMove(can, target, 0, 0)
},
a: function(event, can, target) { can.onkeymap._insert(event, can)
can.onaction.cursorMove(can, target, 1)
},
A: function(event, can, target) { can.onkeymap._insert(event, can)
can.onaction.cursorMove(can, target, 0, -1)
},
o: function(event, can) { can.onkeymap._insert(event, can)
can.onaction.selectLine(can, can.onaction.insertLine(can, "", can.current.next()))
can.onkeymap._insert(event, can)
},
O: function(event, can) { can.onkeymap._insert(event, can)
can.onaction.selectLine(can, can.onaction.insertLine(can, "", can.current.line))
can.onkeymap._insert(event, can)
},
yy: function(event, can) { can._last_text = can.current.text() },
dd: function(event, can) { can._last_text = can.current.text()
var next = can.current.next()
can.onaction.deleteLine(can, can.current.line)
can.onaction.selectLine(can, next)
},
p: function(event, can) {
can.onaction.insertLine(can, can._last_text, can.current.next())
},
P: function(event, can) {
can.onaction.insertLine(can, can._last_text, can.current.line)
},
},
insert: {
jk: function(event, can, target) { can.onkeymap._normal(can)
can.onkeymap.DelText(target, target.selectionStart-1, 1)
},
escape: function(event, can) { can.onkeymap._normal(can) },
enter: function(event, can, target) {
var left = target.value.slice(event.target.selectionEnd)
can.current.text(target.value.slice(0, event.target.selectionEnd)||"")
can.onaction.selectLine(can, can.onaction.insertLine(can, left, can.current.next()))
},
backspace: function(event, can, target) {
if (target.selectionStart > 0) { return }
can.onkeymap.prevent(event)
if (!can.current.prev()) { return }
var rest = can.current.text()
can.onaction.selectLine(can, can.current.prev())
can.onaction.deleteLine(can, can.current.next())
var pos = can.current.text().length
can.ui.current.value = can.current.text()+rest
can.onaction.cursorMove(can, can.ui.current, 0, pos)
},
arrowdown: function(event, can) {
can.onaction.selectLine(can, can.current.next())
},
arrowup: function(event, can) {
can.onaction.selectLine(can, can.current.prev())
},
},
}, _engine: {},
})
Volcanos("onaction", {help: "控件交互", list: [nfs.SAVE],
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)
}, true) }, true)
}, },
_engine: {
e: function(event, can, line, ls) { can.onimport.tabview(can, can.Option("path"), ls[1]) },
p: function(event, can) { can.onaction["项目"](event, can) },
q: function(event, can) { can.onmotion.hidden(can, can.ui.display) },
w: function(event, can) { can.onaction.save(event, can) },
},
parse: function(event, can, mode) { _selectLine: function(event, can) {
can.keylist.push(event.key); if (can.mode != mode) { can.page.Select(can, can.current.line, "td.text", function(td) { can.current.line.appendChild(can.ui.current)
can.onkeypop.prevent(event) can.page.Modify(can, can.ui.current, {style: kit.Dict(html.LEFT, td.offsetLeft-1, html.WIDTH,td.offsetWidth-12), value: td.innerText})
}; can.mode == "normal" && can.Status("按键", can.keylist.join("")) can.ui.current.focus(), can.onaction.cursorMove(can, can.ui.current, 0, (event.offsetX)/13-1)
can.ui.content.scrollLeft -= td.offsetLeft
for (var pre = 0; pre < can.keylist.length; pre++) { })
if ("0" <= can.keylist[pre] && can.keylist[pre] <= "9") { continue } break
}; can.count = parseInt(can.keylist.slice(0, pre).join(""))||1
function repeat(cb, count) {
for (var i = 1; i <= count; i++) { if (cb(event, can, count)) { break } }
can.keylist.length > 0 && (can.lastcmd = can.keylist), can.keylist = []
can.Status("按键", can.keylist.join(""))
}
var p = can.onsyntax[can.parse]
var cb = (p && p.keymap || can.onkeymap[can.mode])[event.key]; if (can.base.isFunc(cb)) {
return repeat(cb, can.count)
}
var map = can.onkeymap[can.mode]._engine; for (var i = can.keylist.length-1; i > pre-1; i--) {
var cb = map[can.keylist[i]]; if (can.base.isFunc(cb)) {
return repeat(cb, can.count)
}; if (can.base.isObject(cb)) { map = cb; continue }; break
}
},
command: {
Escape: function(event, can) { can.onkeymap._normal(can) },
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.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+" ", " ", ",")
var cb = can.onkeymap._engine[ls[0]]; if (can.base.isFunc(cb)) {
can.onmotion.hidden(can, can.ui.display)
can.onkeymap._normal(can)
cb(event, can, line, ls)
} else {
can.onkeymap._remote(event, can, line, [ctx.ACTION, "engine"].concat(ls))
}
},
jk: function(event, can) { can.keylist = can.keylist.slice(0, -1)
can.onkeymap.command.Enter(event, can)
},
},
normal: {
":": function(event, can) {
can.onkeymap._command(can)
can.ui.command.value = ""
},
".": function(event, can) {
can.keylist = can.lastcmd
can.onkeymap.parse({key: ""}, can, "normal")
},
H: function(event, can) {
can.ui.current.setSelectionRange(0, 0)
},
h: function(event, can) {
can.ui.current.setSelectionRange(can.ui.current.selectionStart-1, can.ui.current.selectionStart-1)
},
l: function(event, can) {
can.ui.current.setSelectionRange(can.ui.current.selectionStart+1, can.ui.current.selectionStart+1)
},
L: function(event, can) {
can.ui.current.setSelectionRange(-1, -1)
},
j: function(event, can) {
can.onaction.selectLine(can, can.current.next())
},
k: function(event, can) {
can.onaction.selectLine(can, can.current.prev())
},
gg: function(event, can, count) { count = count || 1
can.onaction.selectLine(can, count)
var pos = can.current.offset()-can.ui.current.offsetTop
can.current.scroll(0, -(pos+can.current.height()*5))
return true
},
G: function(event, can, count) { count = count > 1? count: can.max
can.onaction.selectLine(can, count)
var pos = can.current.offset()-can.ui.current.offsetTop
can.current.scroll(0, -(pos+can.current.height()*5))
return true
},
zt: function(event, can, count) { count = count || 2
var pos = can.current.offset()-can.ui.current.offsetTop
can.current.scroll(0, -(pos+can.current.height()*count))
return true
},
zz: function(event, can, count) { count = count || 5
var pos = can.current.offset()-can.ui.current.offsetTop
can.current.scroll(0, -(pos+can.current.height()*count))
return true
},
zb: function(event, can, count) { count = count || 3
var pos = can.current.offset()-can.ui.current.offsetTop
can.current.scroll(0, -(pos+can.current.window()-can.current.height()*count))
return true
},
i: function(event, can) { can.onkeymap._insert(can)
},
I: function(event, can) { can.onkeymap._insert(can)
can.ui.current.setSelectionRange(0, 0)
},
a: function(event, can) { can.onkeymap._insert(can)
},
A: function(event, can) { can.onkeymap._insert(can)
can.ui.current.setSelectionRange(-1, -1)
},
o: function(event, can) { can.onkeymap._insert(can)
can.onaction.selectLine(can, can.onkeymap.insertLine(can, "", can.current.next()))
},
O: function(event, can) { can.onkeymap._insert(can)
can.onaction.selectLine(can, can.onkeymap.insertLine(can, "", can.current.line))
},
yy: function(event, can) { can.last = can.current.text() },
dd: function(event, can) { can.last = can.current.text()
var next = can.current.next()
can.onkeymap.deleteLine(can, can.current.line)
can.onaction.selectLine(can, next)
},
p: function(event, can) {
can.onkeymap.insertLine(can, can.last, can.current.next())
},
P: function(event, can) {
can.onkeymap.insertLine(can, can.last, can.current.line)
},
},
insert: {
Escape: function(event, can) { can.onkeymap._normal(can)
can.onaction.modifyLine(can, can.current, can.ui.current.value)
can.onkeypop.prevent(event)
},
Enter: function(event, can) {
var before = can.ui.current.value.slice(0, event.target.selectionEnd)
var left = can.ui.current.value.slice(event.target.selectionEnd)
can.current.text(before||"")
can.onaction.selectLine(can, can.onkeymap.insertLine(can, left, can.current.next()))
can.ui.current && can.ui.current.setSelectionRange(0, 0)
},
Backspace: function(event, can) {
if (can.ui.current.selectionStart > 0) { return }
can.onkeypop.prevent(event)
if (!can.current.prev()) { return }
var rest = can.current.text()
can.onaction.selectLine(can, can.current.prev())
var pos = can.current.text().length
rest = can.current.text()+rest
can.ui.current.value = rest
can.current.text(rest)
can.ui.current.setSelectionRange(pos, pos)
can.onkeymap.deleteLine(can, can.current.next())
},
ArrowDown: function(event, can) {
can.onaction.selectLine(can, can.current.next())
can.ui.current.setSelectionRange(can.ui.current.selectionStart, can.ui.current.selectionEnd)
},
ArrowUp: function(event, can) {
can.onaction.selectLine(can, can.current.prev())
can.ui.current.setSelectionRange(can.ui.current.selectionStart, can.ui.current.selectionEnd)
},
jk: function(event, can) {
can.onkeypop.DelText(can.ui.current, can.ui.current.selectionStart-1, 1)
can.onkeymap.insert.Escape(event, can)
},
},
selectLine: function(can) { var line = can.current.line
can.page.Select(can, can.current.line, "td.text", function(item) { line = item })
can.page.Modify(can, can.ui.current, {className: "current "+can.mode, value: can.current.text(), style: {
left: line.offsetLeft, top: line.offsetTop-can.current.offset()-2,
height: line.offsetHeight, width: line.offsetWidth
}})
// can.ui.current.focus()
can.ui.current.setSelectionRange(event.offsetX/13, event.offsetX/13)
can.page.Modify(can, can.ui.command, {className: "command "+can.mode})
}, },
insertLine: function(can, value, before) { insertLine: function(can, value, before) {
var line = can.onaction.appendLine(can, value) var line = can.onaction.appendLine(can, value)
@ -295,17 +148,9 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert"
can.page.Remove(can, line) can.page.Remove(can, line)
can.onaction.rerankLine(can) can.onaction.rerankLine(can)
}, },
})
Volcanos("onaction", {help: "控件交互", list: ["run"],
save: function(event, can) { var msg = can.request(event, {content: can.onexport.content(can)})
can.run(event, [ctx.ACTION, "save", can.parse, can.Option("file"), can.Option("path")], function(msg) {
can.user.toastSuccess(can)
}, true)
},
modifyLine: function(can, line, value) { modifyLine: function(can, line, value) {
can.page.Select(can, can.ui.content, html.TR, function(item, index) { can.page.Select(can, can.ui.content, html.TR, function(item, index) {
if (item != line && index+1 != line) { return } if (item != line && index+1 != line) { return }
can.page.Select(can, item, "td.text", function(item) { can.page.Select(can, item, "td.text", function(item) {
can.page.Appends(can, item, [can.onsyntax._parse(can, value)]) can.page.Appends(can, item, [can.onsyntax._parse(can, value)])
}) })
@ -318,6 +163,10 @@ Volcanos("onaction", {help: "控件交互", list: ["run"],
}) })
}) })
}, },
cursorMove: function(can, target, count, begin) {
begin != undefined && target.setSelectionRange(begin, begin)
target.setSelectionRange(target.selectionStart+count, target.selectionStart+count)
},
}) })
Volcanos("onexport", {help: "导出数据", list: ["文件数", "模式", "按键", "解析器", "文件名", "当前行", "跳转数"]}) Volcanos("onexport", {help: "导出数据", list: ["文件数", "模式", "按键", "解析器", "文件名", "当前行", "跳转数"]})

View File

@ -1,7 +1,7 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onmotion.clear(can), can.onmotion.hidden(can, can._action) can.onmotion.clear(can), can.onmotion.hidden(can, can._action)
can.onimport._show(can, msg), can.base.isFunc(cb) && cb(msg) can.onimport._show(can, msg), can.base.isFunc(cb) && cb(msg)
can.keylist = [], can.onkeypop._build(can) can.keylist = [], can.onkeymap._build(can)
}, },
_show: function(can, msg) { can.point = [] _show: function(can, msg) { can.point = []
can.svg = null, can.group = null, can.temp = null, can.current = null can.svg = null, can.group = null, can.temp = null, can.current = null
@ -215,7 +215,7 @@ Volcanos("onfigure", {help: "图形绘制", list: [],
show: function(can, target, figure) { return "<("+(target.Val("y2")-target.Val("y1"))+ice.FS+(target.Val("x2")-target.Val("x1"))+")"+can.onexport._position(can, target, figure) }, show: function(can, target, figure) { return "<("+(target.Val("y2")-target.Val("y1"))+ice.FS+(target.Val("x2")-target.Val("x1"))+")"+can.onexport._position(can, target, figure) },
}, },
}, []) }, [])
Volcanos("onkeypop", {help: "键盘交互", list: [], Volcanos("onkeymap", {help: "键盘交互", list: [],
_mode: { _mode: {
normal: { normal: {
gr: function(event, can) { can.Action("go", "run") }, gr: function(event, can) { can.Action("go", "run") },

View File

@ -75,7 +75,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
can.page.Modify(can, target, {width: can.Conf(html.WIDTH)-200}) can.page.Modify(can, target, {width: can.Conf(html.WIDTH)-200})
}, },
}, [""]) }, [""])
Volcanos("onkeypop", {help: "键盘交互", list: [], Volcanos("onkeymap", {help: "键盘交互", list: [],
_mode: { _mode: {
normal: { normal: {
"n": function(event, can) { can.ondetail.next(can.sub) }, "n": function(event, can) { can.ondetail.next(can.sub) },
@ -111,8 +111,8 @@ Volcanos("onaction", {help: "控件交互", list: [],
], sub._action, can.ondetail) ], sub._action, can.ondetail)
can.onengine.signal(can, "keymap.focus", can.request(event, {cb: function(event) { can.onengine.signal(can, "keymap.focus", can.request(event, {cb: function(event) {
can.keylist = can.onkeypop._parse(event, can, "normal", can.keylist) can.keylist = can.onkeymap._parse(event, can, "normal", can.keylist)
}})), can.onkeypop._build(can) }})), can.onkeymap._build(can)
sub.page.style(sub, sub._target, html.BACKGROUND, document.body.style.background) sub.page.style(sub, sub._target, html.BACKGROUND, document.body.style.background)
sub.page.style(sub, sub._output, html.HEIGHT, window.innerHeight-4*html.PLUGIN_MARGIN-2*html.ACTION_HEIGHT) sub.page.style(sub, sub._output, html.HEIGHT, window.innerHeight-4*html.PLUGIN_MARGIN-2*html.ACTION_HEIGHT)

View File

@ -180,7 +180,7 @@ Volcanos("onaction", {help: "交互操作", list: [
listTags: function(event, can, button) { var list = [] listTags: function(event, can, button) { var list = []
can.core.List([can.base, can.core, can.misc, can.page, can.user, can.core.List([can.base, can.core, can.misc, can.page, can.user,
can.onengine, can.ondaemon, can.onappend, can.onlayout, can.onmotion, can.onkeypop, can.onengine, can.ondaemon, can.onappend, can.onlayout, can.onmotion, can.onkeymap,
], function(lib) { ], function(lib) {
can.core.Item(lib, function(key, value) { if (key.indexOf("_") == 0 || !lib.hasOwnProperty(key)) { return } can.core.Item(lib, function(key, value) { if (key.indexOf("_") == 0 || !lib.hasOwnProperty(key)) { return }
list.push({zone: lib._name, type: typeof value, name: key, text: can.base.isObject(value)? "": (value+"").split(ice.NL)[0], list.push({zone: lib._name, type: typeof value, name: key, text: can.base.isObject(value)? "": (value+"").split(ice.NL)[0],

View File

@ -132,7 +132,7 @@ Volcanos("ondetail", {help: "用户交互", list: [],
{x: tree.x-can.margin/4, y: y-can.size/2}, {x: tree.x-can.margin/4, y: y-can.size/2},
{x: tree.x+tree.width+can.margin/8, 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}, ], style: {stroke: cli.RED, fill: html.NONE},
}), can.onkeypop.prevent(event) }), can.onkeymap.prevent(event)
}, },
onclick: function(event, can, tree) { onclick: function(event, can, tree) {
if (tree.list.length > 0 || tree.tags || tree.name.endsWith(can._args.split)) { if (tree.list.length > 0 || tree.tags || tree.name.endsWith(can._args.split)) {

View File

@ -127,7 +127,7 @@ var wiki = {
H3: "h3.story", H3: "h3.story",
DIV_PAGE: "div.page", DIV_PAGE: "div.page",
} }
var chat = { var chat = {ONIMPORT: "onimport", ONACTION: "onaction", ONKEYMAP: "onkeymap", ONEXPORT: "onexport",
LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", OUTPUT: "output", INPUT: "input", UPLOAD: "upload", LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", OUTPUT: "output", INPUT: "input", UPLOAD: "upload",
STORY: "story", FLOAT: "float", CONTEXTS: "contexts", CARTE: "carte", TOAST: "toast", STORY: "story", FLOAT: "float", CONTEXTS: "contexts", CARTE: "carte", TOAST: "toast",
LEGNED: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status", LEGNED: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status",