mirror of
https://shylinux.com/x/volcanos
synced 2025-04-25 16:58:06 +08:00
add complete
This commit is contained in:
parent
cf3ad56147
commit
77d928bb7e
169
frame.js
169
frame.js
@ -58,11 +58,11 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta,
|
||||
}
|
||||
var p = can.onengine.plugin.meta[cmds[0]]; if (p) {
|
||||
if (p.meta && p.meta[cmds[1]] && cmds[0] == ctx.ACTION) {
|
||||
return can.core.CallFunc(p.meta[cmds[1]], {msg: msg, cmds: cmds.slice(3), cb: cb}), true
|
||||
return can.core.CallFunc(p.meta[cmds[1]], {can: can, msg: msg, cmds: cmds.slice(3), cb: cb}), true
|
||||
} else if (p.meta && p.meta[cmds[0]]) {
|
||||
return can.core.CallFunc(p.meta[cmds[0]], {msg: msg, cmds: cmds.slice(2), cb: cb}), true
|
||||
return can.core.CallFunc(p.meta[cmds[0]], {can: can, msg: msg, cmds: cmds.slice(2), cb: cb}), true
|
||||
}
|
||||
return can.core.CallFunc(p, {msg: msg, cmds: cmds.slice(1), cb: cb}), true
|
||||
return can.core.CallFunc(p, {can: can, msg: msg, cmds: cmds.slice(1), cb: cb}), true
|
||||
}
|
||||
return false
|
||||
},
|
||||
@ -430,6 +430,163 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
|
||||
return (code.scrollBy && code.scrollBy(0, 10000)), code
|
||||
},
|
||||
|
||||
_parse: function(can, text) { var stack = [{_deep: -1, list: []}]
|
||||
can.core.List(can.core.Split(text, ice.NL, ice.NL, ice.NL), function(line) { if (line == "") { return }
|
||||
var deep = 0; for (var i = 0; i < line.length; i++) { if (line[i] == ice.SP) { deep++ } else if (line[i] == ice.TB) { deep += 4 } else { break } }
|
||||
for (var i = stack.length-1; i > 0; i--) { if (deep <= stack[i]._deep) { stack.pop() } }
|
||||
|
||||
var item = {_deep: deep, list: []}; var list = stack[stack.length-1]; list.list.push(item); if (deep > list._deep) { stack.push(item) }
|
||||
var ls = can.core.Split(line); switch (ls[0]) {
|
||||
case html.HEAD:
|
||||
case html.LEFT:
|
||||
case html.MAIN:
|
||||
case html.FOOT:
|
||||
case html.TABS:
|
||||
case html.MENU: item.type = ls[0]; break
|
||||
default: item.name = ls[0]; break
|
||||
}
|
||||
for (var i = 1; i < ls.length; i += 2) { item[ls[i]] = ls[i+1]
|
||||
if (ls[i] == ctx.INDEX) { item.type = item.type||html.PLUGIN }
|
||||
}
|
||||
})
|
||||
return {type: "demo", style: {height: can.ConfHeight()||window.innerHeight}, list: stack[0].list}
|
||||
},
|
||||
parse: function(can, list, target, keys, data, type) { target = target||can._output, data = data||{}
|
||||
if (!list) { return } else if (can.base.isArray(list)) {
|
||||
return can.core.List(list, function(meta, index) {
|
||||
return can.onappend.parse(can, meta, target, keys, data, type)
|
||||
})
|
||||
|
||||
} else if (can.base.isString(list)) {
|
||||
var ls = can.core.Split(list, "", ":=@"); if (ls.length == 1) {
|
||||
var meta = type? {type: type, name: ls[0]}: {type: ls[0]}
|
||||
} else {
|
||||
var meta = {name: ls[0]}; for (var i = 1; i < ls.length; i += 2) { switch (ls[i]) {
|
||||
case ":": meta.type = ls[i+1]; break
|
||||
case "=": meta.value = ls[i+1]; break
|
||||
case "@": meta.action = ls[i+1]; break
|
||||
} }
|
||||
}
|
||||
|
||||
} else if (can.base.isObject(list)) { var meta = list }
|
||||
|
||||
keys = can.core.Keys(keys, meta.name||meta.type)
|
||||
var item = {view: meta.type}, init; switch (meta.type) {
|
||||
case html.HEAD: data = {}
|
||||
init = function(target) { data.head = target
|
||||
can.page.ClassList.add(can, target, html.LAYOUT)
|
||||
}
|
||||
break
|
||||
case html.LEFT:
|
||||
init = function(target) {
|
||||
can.page.ClassList.add(can, target, html.LAYOUT)
|
||||
can.core.Timer(10, function() { var height = target.parentNode.offsetHeight
|
||||
can.page.Select(can, target.parentNode, can.page.Keys(html.DIV_LAYOUT_HEAD, html.DIV_LAYOUT_FOOT), function(item) {
|
||||
height -= item.offsetHeight
|
||||
}), can.page.style(can, target, html.HEIGHT, height)
|
||||
})
|
||||
}
|
||||
break
|
||||
case html.MAIN:
|
||||
init = function(target) { data.main = target
|
||||
can.page.ClassList.add(can, target, html.LAYOUT)
|
||||
can.core.Timer(10, function() { var height = target.parentNode.offsetHeight
|
||||
can.page.Select(can, target.parentNode, can.page.Keys(html.DIV_LAYOUT_HEAD, html.DIV_LAYOUT_FOOT), function(item) {
|
||||
height -= item.offsetHeight
|
||||
}), can.page.style(can, target, html.HEIGHT, height)
|
||||
})
|
||||
|
||||
can.core.Timer(100, function() {
|
||||
var width = target.parentNode.offsetWidth
|
||||
can.page.Select(can, target.parentNode, html.DIV_LAYOUT_LEFT, function(item) {
|
||||
width -= item.offsetWidth+1
|
||||
}), can.page.style(can, target, html.WIDTH, width)
|
||||
})
|
||||
|
||||
}
|
||||
break
|
||||
case html.FOOT:
|
||||
init = function(target) { data.foot = target
|
||||
can.page.ClassList.add(can, target, html.LAYOUT)
|
||||
}
|
||||
break
|
||||
case html.TABS:
|
||||
item.list = [{view: "name"}, {view: html.PAGE}], item._init = function(_target, ui) {
|
||||
can.page.Append(can, ui.page, [{view: html.INPUT, list: [{type: html.INPUT, onkeyup: function(event) {
|
||||
can.page.Select(can, _target, [html.DIV_PAGE, html.DIV_ITEM], function(item) {
|
||||
can.page.ClassList.set(can, item, html.HIDE, item.innerText.indexOf(event.target.value) == -1)
|
||||
})
|
||||
}}]}])
|
||||
can.core.List(meta.list, function(item, index) {
|
||||
can.page.Append(can, ui.name, [{view: [html.ITEM, html.DIV, item.name||item], onclick: function(event) {
|
||||
can.onmotion.select(can, _target, [[html.DIV_PAGE, html.DIV_LIST]], index)
|
||||
can.onmotion.select(can, ui.name, html.DIV_ITEM, index)
|
||||
ui.page.scrollTo(0, 0)
|
||||
}}])
|
||||
can.page.Append(can, ui.page, [{view: [html.ITEM, html.DIV, item.name], onclick: function(event) {
|
||||
can.page.ClassList.neg(can, event.target.nextSibling, html.SELECT)
|
||||
can.onmotion.select(can, ui.name, html.DIV_ITEM, index)
|
||||
}}, {view: [html.LIST], _init: function(target) {
|
||||
can.onappend.parse(can, item.list, target, can.core.Keys(keys, item.name), data, html.ITEM)
|
||||
}}])
|
||||
})
|
||||
can.core.Timer(100, function() { var height = target.offsetHeight
|
||||
can.page.style(can, ui.page, html.HEIGHT, height-10-(meta.style? 0: ui.name.offsetHeight))
|
||||
can.page.style(can, _target, html.HEIGHT, height-10)
|
||||
}), can.page.Select(can, ui.name, html.DIV_ITEM)[0].click()
|
||||
}
|
||||
break
|
||||
}
|
||||
|
||||
item._init = item._init||function(target) {
|
||||
meta.list && can.onappend.parse(can, meta.list, target, keys, data, type)
|
||||
can.base.isFunc(init) && init(target), can.base.isFunc(meta.init) && meta.init(target)
|
||||
}
|
||||
if (can.base.isString(meta.style)) { item.className = meta.style }
|
||||
if (can.base.isObject(meta.style)) { item.style = meta.style }
|
||||
|
||||
if (meta.type == html.MENU) {
|
||||
can.page.Append(can, target, [can.base.Copy({view: [html.MENU, html.DIV, meta.name||meta], onclick: function(event) {
|
||||
if (meta.list && meta.list.length > 0) { return }
|
||||
can.onengine.signal(can, meta.name) || can.onengine.signal(can, html.MENU, can.request(event, {item: meta.name}))
|
||||
}, onmouseenter: function(event) {
|
||||
meta.list && meta.list.length > 0 && can.user.carte(event, can, {}, meta.list, function(event, item) {
|
||||
can.onengine.signal(can, item) || can.onengine.signal(can, meta.name, can.request(event, {item: item}))
|
||||
})
|
||||
}})]).first
|
||||
return
|
||||
}
|
||||
if (type == html.ITEM) { item.view = html.LIST
|
||||
if (meta.action == "auto") {
|
||||
meta.init = meta.init||function(item) { can.core.Timer(100, function() { item.click() }) }
|
||||
}
|
||||
|
||||
var _item = can.page.Append(can, target, [can.base.Copy({view: [html.ITEM, html.DIV, meta.name||meta], onclick: function(event) {
|
||||
switch (meta.type) {
|
||||
case html.PLUGIN:
|
||||
if (can.onmotion.cache(can, function() { return keys }, data.main)) { break }
|
||||
can.onappend.plugin(can, {index: meta.index}, function(sub) {
|
||||
sub.run = function(event, cmds, cb, silent) {
|
||||
can.page.style(can, sub._output, html.MAX_WIDTH, sub.ConfWidth(data.main.offsetWidth-40))
|
||||
can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), function(msg) {
|
||||
cb(msg), can.core.Timer(10, function() {
|
||||
can.page.style(can, sub._table, html.MAX_HEIGHT, data.main.offsetHeight-150)
|
||||
})
|
||||
}, true)
|
||||
}
|
||||
}, data.main)
|
||||
default:
|
||||
meta.list && can.onmotion.toggle(can, event.target.nextSibling)
|
||||
}
|
||||
}})]).first; can.core.ItemCB(meta, function(key, cb) { _item[key] = can.base.isFunc(cb)? cb: function(event) {
|
||||
can.onengine.signal(can, cb, can.request(event))
|
||||
} })
|
||||
can.core.Timer(10, function() { meta.init && meta.init(_item) })
|
||||
if (!meta.list) { return }
|
||||
}
|
||||
return can.page.Append(can, target, [item]).first
|
||||
},
|
||||
|
||||
_plugin: function(can, value, meta, cb, target) {
|
||||
meta.feature = can.base.getValid(meta.feature, can.base.Obj(value.meta))||{}
|
||||
meta.inputs = can.base.getValid(meta.inputs, can.base.Obj(value.list))||[]
|
||||
@ -452,11 +609,11 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
|
||||
p? /* 前端命令 */ can.onappend._plugin(can, {name: meta.index, help: p.help, meta: p.meta, list: p.list}, meta, function(sub, meta, skip) {
|
||||
sub.run = function(event, cmds, cb) {
|
||||
if (p.meta && p.meta[cmds[1]] && cmds[0] == ctx.ACTION) {
|
||||
can.core.CallFunc(p.meta[cmds[1]], {msg: can.request(event), cmds: cmds, cb: cb})
|
||||
can.core.CallFunc(p.meta[cmds[1]], {can: sub, msg: can.request(event), cmds: cmds.slice(2), cb: cb})
|
||||
} else if (p.meta && p.meta[cmds[0]]) {
|
||||
can.core.CallFunc(p.meta[cmds[0]], {msg: can.request(event), cmds: cmds, cb: cb})
|
||||
can.core.CallFunc(p.meta[cmds[0]], {can: sub, msg: can.request(event), cmds: cmds.slice(1), cb: cb})
|
||||
} else {
|
||||
can.core.CallFunc(p, {msg: can.request(event), cmds: cmds, cb: cb})
|
||||
can.core.CallFunc(p, {can: sub, msg: can.request(event), cmds: cmds, cb: cb})
|
||||
}
|
||||
}
|
||||
can.base.isFunc(cbs) && cbs(sub, meta, skip)
|
||||
|
@ -33,7 +33,7 @@ Volcanos("base", {help: "数据类型", Int: function(val, def) { return parseIn
|
||||
|
||||
Ext: function(path) { return (path.split(ice.PS).pop().split(ice.PT).pop()).toLowerCase() },
|
||||
Path: function(path) { var res = ""
|
||||
for (var i = 0; i < arguments.length; i++) {
|
||||
for (var i = 0; i < arguments.length; i++) { if (!arguments[i]) { continue }
|
||||
res += (arguments[i][0]==ice.PS || res=="" || res[res.length-1]==ice.PS? "": ice.PS) + arguments[i].trim()
|
||||
}
|
||||
return res
|
||||
@ -217,7 +217,10 @@ Volcanos("base", {help: "数据类型", Int: function(val, def) { return parseIn
|
||||
return args
|
||||
},
|
||||
trimPrefix: function(str, pre) { if (str.indexOf(pre) == -1) { return str } return str.slice(pre.length) },
|
||||
trimSuffix: function(str, end) { if (str.indexOf(end) == -1) { return str } return str.slice(0, str.indexOf(end)) },
|
||||
trimSuffix: function(str, end) {
|
||||
var index = str.lastIndexOf(end)
|
||||
if (index == -1 || index+end.length != str.length) { return str } return str.slice(0, index)
|
||||
},
|
||||
join: function(list, sp) { return (list||[]).join(sp||ice.SP) },
|
||||
joins: function(list, inner, outer) {
|
||||
for (var i = 0; i < list.length; i++) {
|
||||
|
@ -264,7 +264,7 @@ body.simple fieldset.River>div.output div.list div.item { background-color:white
|
||||
body.simple fieldset.River>div.output div.list div.item.select { background-color:#0152d9; color:white; }
|
||||
body.simple fieldset.River>div.output div.list div.item:hover { background-color:#0152d9; color:white; }
|
||||
|
||||
body.simple fieldset.Action { background-color:white; }
|
||||
body.white.simple fieldset.Action { background-color:white; }
|
||||
body.simple fieldset.Action>div.action { background:white; padding:10px; border-bottom: solid 1px red; height:38px; width:600px; }
|
||||
body.simple fieldset.Action>div.action div.tabs { padding:10px; margin:10px; }
|
||||
body.simple fieldset.Action.tabs>div.output { margin-top:58px; }
|
||||
|
@ -59,8 +59,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg)
|
||||
}) },
|
||||
_cmd: function(can, item, next) {
|
||||
can.base.Copy(item, {
|
||||
height: can.Conf(html.HEIGHT)-can.Conf(html.MARGIN_Y)+(can.user.isWindows? 17: 0),
|
||||
width: can.Conf(html.WIDTH),
|
||||
height: window.innerHeight-can.Conf(html.MARGIN_Y)+(can.user.isWindows? 17: 0),
|
||||
width: window.innerWidth,
|
||||
opts: can.misc.Search(can),
|
||||
})
|
||||
can.onappend.plugin(can, item, function(sub, meta, skip) {
|
||||
@ -100,6 +100,22 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, cb, t
|
||||
}}])
|
||||
}
|
||||
|
||||
can.onengine.plugin(can, "parse", shy("解析", {
|
||||
"show": function(can, msg, cmds) {
|
||||
can.onmotion.hidden(can, can._legend)
|
||||
can.onmotion.hidden(can, can._option)
|
||||
can.onmotion.hidden(can, can._status)
|
||||
|
||||
can.ConfHeight(can.ConfHeight()+can.Conf(html.MARGIN_Y)-(can.user.isWindows? 17: 0))
|
||||
|
||||
can.onengine.listen(can, "menu", function(msg) { can.user.toast(can, msg.Option(html.ITEM)) })
|
||||
can.onengine.listen(can, "高级配置", function(msg) { can.user.toast(can, msg.Option(html.ITEM)) })
|
||||
can.onengine.listen(can, "h1", function(msg) { can.user.toast(can, "h1") })
|
||||
|
||||
can.onappend.parse(can, can.onappend._parse(can, cmds[0]))
|
||||
},
|
||||
}, ["text", "show:button@auto"], function(msg, cmds, cb) { can.run({}, cmds, cb, true) }))
|
||||
|
||||
can.onengine.plugin(can, "cookie", shy("提示", {}, ["text", "list", "back"], function(msg, cmds) {
|
||||
can.core.Item(can.misc.Cookie(can), function(key, value) {
|
||||
msg.Push("key", key)
|
||||
|
143
panel/header.css
143
panel/header.css
@ -9,3 +9,146 @@ fieldset.Header>div.output>div.search { margin-left:20px; float:left; }
|
||||
fieldset.Header>div.output>div.search>input { margin-top:-5px; height:25px; border-radius:0; }
|
||||
fieldset.Header>div.output div.menu { padding:5px; height:21px; cursor:pointer; float:left; }
|
||||
fieldset.Header>div.output div.menu:hover { background-color:#2e515f; border-bottom:solid 2px red; }
|
||||
|
||||
div.head {
|
||||
background-color:#404040; padding:5px; height:42px; clear:both;
|
||||
}
|
||||
div.head div.menu {
|
||||
color:white; cursor:pointer; padding:10px; float:left;
|
||||
}
|
||||
div.head div.menu:hover {
|
||||
background-color:#323232;
|
||||
}
|
||||
div.left {
|
||||
background-color:#323232; overflow:auto; float:left;
|
||||
}
|
||||
div.left:hover {
|
||||
background-color:#323232;
|
||||
}
|
||||
div.left div.item {
|
||||
background-color:#323232;
|
||||
}
|
||||
div.left div.item:hover {
|
||||
background-color:#404040;
|
||||
}
|
||||
div.main {
|
||||
background-color:#cccccc; height:180px; width:180px; overflow:auto; float:left;
|
||||
}
|
||||
div.main fieldset.plugin {
|
||||
background-color:#f8f8f8; padding:10px; margin:10px;
|
||||
}
|
||||
div.main fieldset.plugin form.option div.item {
|
||||
margin:10px;
|
||||
}
|
||||
div.main fieldset.plugin div.action div.item {
|
||||
margin:10px;
|
||||
}
|
||||
div.main fieldset.plugin legend {
|
||||
box-shadow:none;
|
||||
background-color:#e4e4e4;
|
||||
color:black;
|
||||
display:block;
|
||||
float:left;
|
||||
}
|
||||
div.main fieldset.plugin form.option {
|
||||
display:block;
|
||||
clear:both;
|
||||
}
|
||||
div.main fieldset.plugin select {
|
||||
background-color:white; color:black;
|
||||
border:solid 1px gray; outline:none;
|
||||
box-shadow:none;
|
||||
}
|
||||
div.main fieldset.plugin input[type=text] {
|
||||
background-color:white; color:black; padding:2px 10px;
|
||||
border:solid 1px gray; outline:none;
|
||||
border-radius:3px 3px;
|
||||
box-shadow:none;
|
||||
}
|
||||
div.main fieldset.plugin input[type=button] {
|
||||
background-color:blue; color:white; padding:4px 10px;
|
||||
border:none; border-radius:3px 3px;
|
||||
}
|
||||
div.main fieldset.plugin table.content {
|
||||
border-collapse:collapse;
|
||||
display:block;
|
||||
}
|
||||
div.main fieldset.plugin table.content thead {
|
||||
z-index:1;
|
||||
}
|
||||
div.main fieldset.plugin table.content tr {
|
||||
border:solid 1px lightgray;
|
||||
}
|
||||
div.main fieldset.plugin table.content th {
|
||||
background-color:#fbfbfb; color:rgba(0,0,0,.45); font-weight:100; padding:10px;
|
||||
}
|
||||
div.main fieldset.plugin table.content td {
|
||||
background-color:white; color: #5c5c5c; padding:10px;
|
||||
}
|
||||
div.main fieldset.plugin div.status {
|
||||
color:black;
|
||||
}
|
||||
div.foot {
|
||||
background-color:#404040; height:32px; clear:both;
|
||||
}
|
||||
|
||||
div.tabs:hover {
|
||||
background-color:#272727;
|
||||
}
|
||||
div.tabs div.name {
|
||||
height:46px; width:-webkit-fill-available;
|
||||
position:sticky; top:5px;
|
||||
z-index:1;
|
||||
}
|
||||
div.tabs div.name div.item {
|
||||
color:gray; padding:10px; float:left;
|
||||
}
|
||||
div.tabs div.name div.item.select {
|
||||
background-color:#404040; color:white;
|
||||
border-bottom:solid red 2px;
|
||||
}
|
||||
div.tabs div.page {
|
||||
overflow:auto; clear:both;
|
||||
}
|
||||
div.tabs div.page>div.input {
|
||||
padding:5px; position:sticky; top:0px;
|
||||
}
|
||||
div.tabs div.page>div.input input {
|
||||
background-color:#212121; color:white; border:0; outline:none; width:230px;
|
||||
}
|
||||
div.tabs div.page>div.item {
|
||||
background-color:#404040; clear:both; display:none;
|
||||
}
|
||||
div.tabs div.page>div.list {
|
||||
padding-left:20px; display:none; clear:both;
|
||||
}
|
||||
div.tabs div.page>div.list.select {
|
||||
background-color:#323232; display:block;
|
||||
}
|
||||
div.tabs div.list {
|
||||
padding-left:20px;
|
||||
}
|
||||
|
||||
div.tabs.left div.name {
|
||||
float:left;
|
||||
}
|
||||
div.tabs.left div.name div.item {
|
||||
border-bottom:none; float:none;
|
||||
}
|
||||
div.tabs.left div.name div.item.select {
|
||||
border-right:solid red 2px;
|
||||
}
|
||||
div.tabs.left div.page {
|
||||
width:240px; clear:none; float:left;
|
||||
}
|
||||
div.tabs.left div.page>div.item {
|
||||
display:block;
|
||||
}
|
||||
|
||||
div.tabs.void div.name {
|
||||
display:none;
|
||||
}
|
||||
div.tabs.void div.page>div.item {
|
||||
display:block;
|
||||
}
|
||||
|
||||
|
@ -72,7 +72,14 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
|
||||
cli.CLEAR, function(event) { can.onmotion.clear(can, ui.output) },
|
||||
cli.SHOW, function(event) { can.onaction["展示"](event, can) },
|
||||
"加载", function(event) { can.onaction["加载"](event, can), can.user.toastSuccess(can) },
|
||||
"链接", function(event) { can.user.open(can.base.Path("/chat/cmd/", can.Option(nfs.PATH), can.Option(nfs.FILE))) },
|
||||
|
||||
"链接", function(event) { var pod = can.misc.Search(can, "pod")
|
||||
if (pod) {
|
||||
can.user.open(can.base.Path("/chat/", "pod", pod, "cmd", can.Option(nfs.PATH), can.Option(nfs.FILE)))
|
||||
} else {
|
||||
can.user.open(can.base.Path("/chat/", "cmd", can.Option(nfs.PATH), can.Option(nfs.FILE)))
|
||||
}
|
||||
},
|
||||
mdb.PLUGIN, function(event) {
|
||||
can.user.input(event, can, [ctx.INDEX, ctx.ARGS], function(event, button, data) {
|
||||
can.onimport.plugin(can, data, ui.output)
|
||||
|
@ -3,5 +3,31 @@ fieldset.vimer>div.output input.current {
|
||||
padding:0; padding-left:11px; border:none; outline:none; margin:0; margin-top:-1px;
|
||||
height:22px; position:absolute;
|
||||
}
|
||||
fieldset.vimer>div.output div.complete {
|
||||
height:20px; position:absolute; left:32px; margin-top:20px;
|
||||
}
|
||||
fieldset.vimer>div.output div.complete div.pre {
|
||||
font-size:1.1rem; margin-left:5px; float:left;
|
||||
color:#f0f8ff00;
|
||||
}
|
||||
fieldset.vimer>div.output div.complete table {
|
||||
background:lightblue; float:left;
|
||||
max-height:200px;
|
||||
display:block;
|
||||
overflow:auto;
|
||||
}
|
||||
fieldset.vimer>div.output div.complete table.content th {
|
||||
display:none;
|
||||
}
|
||||
fieldset.vimer>div.output div.complete table.content td {
|
||||
font-size:1.1rem;
|
||||
}
|
||||
fieldset.vimer>div.output input.current.insert { caret-color:black; }
|
||||
fieldset.vimer>div.output input.current.normal { caret-color:lightgray; }
|
||||
|
||||
body.simple fieldset.vimer>div.output div.complete div.pre {
|
||||
font-size:1rem;
|
||||
}
|
||||
body.simple fieldset.vimer>div.output div.complete table.content td {
|
||||
font-size:1rem;
|
||||
}
|
||||
|
@ -17,22 +17,25 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
|
||||
})
|
||||
},
|
||||
_input: function(can) {
|
||||
can.ui.current = can.page.Append(can, can.ui.content.parentNode, [
|
||||
var ui = can.page.Append(can, can.ui.content.parentNode, [
|
||||
{view: ["current", html.INPUT], spellcheck: false, onkeydown: function(event) { if (event.metaKey) { return }
|
||||
can.misc.Debug("key", event.key)
|
||||
can._keylist = can.onkeymap._parse(event, can, can.mode+(event.ctrlKey? "_ctrl": ""), can._keylist, can.ui.current)
|
||||
can.mode == "insert" && can.core.Timer(10, function() { can.current.text(can.ui.current.value) })
|
||||
can.mode == "normal" && can.Status("按键", can._keylist.join(""))
|
||||
can.mode == "normal" && can.onkeymap.prevent(event)
|
||||
}, onfocus: function(event) {
|
||||
}, onkeyup: function(event) { can.onaction._complete(event, can, can.ui.complete)
|
||||
|
||||
}, onfocus: function(event) { can.onaction._complete(event, can, can.ui.complete)
|
||||
can.page.styleWidth(can, can.ui.current, can.ui.content.style.width)
|
||||
}, onclick: function(event) { can.onkeymap._insert(event, can) },
|
||||
ondblclick: function(event) { var target = event.target
|
||||
}, onclick: function(event) { can.onkeymap._insert(event, can)
|
||||
|
||||
}, ondblclick: function(event) { var target = event.target
|
||||
return
|
||||
can.onaction.searchLine(event, can, target.value.slice(target.selectionStart, target.selectionEnd))
|
||||
},
|
||||
},
|
||||
]).first
|
||||
}, {view: ["complete"]},
|
||||
]); can.ui.current = ui.current, can.ui.complete = ui.complete
|
||||
},
|
||||
}, [""])
|
||||
Volcanos("onkeymap", {help: "键盘交互", list: [],
|
||||
@ -177,6 +180,35 @@ Volcanos("onaction", {help: "控件交互", list: [nfs.SAVE, "dream", code.AUTOG
|
||||
}, true)
|
||||
})
|
||||
},
|
||||
_complete: function(event, can, target) {
|
||||
var pre = event.target.value.slice(0, event.target.selectionStart)
|
||||
var end = event.target.value.slice(event.target.selectionStart)
|
||||
var key = can.core.Split(pre, "\t ", "\t ").pop()||""
|
||||
var word = can.core.Split(key, "\t ", ".").pop()||""
|
||||
key = can.base.trimSuffix(key, word)
|
||||
key = can.base.trimSuffix(key, ".")
|
||||
|
||||
function update(target) { can.request(event, {pre: pre, end: end, key: key, word: word})
|
||||
can.run(event, [ctx.ACTION, "complete"], function(msg) {
|
||||
can.page.Appends(can, target, [{view: ["pre", html.DIV, pre]}])
|
||||
can.onappend.table(can, msg, null, target)
|
||||
}, true)
|
||||
}
|
||||
function select() {
|
||||
return can.page.Select(can, target, html.TR, function(tr) {
|
||||
if (!can.page.ClassList.set(can, tr, html.HIDE, can.page.Select(can, tr, html.TD, function(td) {
|
||||
if (td.innerText.indexOf(word) > -1) { return td }
|
||||
}).length == 0)) { return tr }
|
||||
}).length > 0
|
||||
}
|
||||
|
||||
switch (event.key) {
|
||||
case "Enter": can.onmotion.clear(can, target); break
|
||||
case ice.TB: update(target); break
|
||||
case ice.SP: update(target); break
|
||||
default: select() || update(target); break
|
||||
}
|
||||
},
|
||||
compile: function(event, can, button) { var msg = can.ui.search.request(event, {_handle: ice.TRUE, _toast: "编译中..."}, can.Option())
|
||||
can.run(event, [ctx.ACTION, button], function(msg) {
|
||||
if (msg.Length() == 0) { var toast = can.user.toast(can, "重启中...", "", -1)
|
||||
@ -218,8 +250,9 @@ hi
|
||||
},
|
||||
|
||||
_selectLine: function(event, can) {
|
||||
can.page.Select(can, can.current.line, "td.text", function(td) { can.current.line.appendChild(can.ui.current)
|
||||
can.page.Modify(can, can.ui.current, {style: kit.Dict(html.LEFT, td.offsetLeft-1, html.WIDTH,td.offsetWidth-12), value: td.innerText})
|
||||
can.page.Select(can, can.current.line, "td.text", function(td) {
|
||||
can.current.line.appendChild(can.ui.current), can.page.Modify(can, can.ui.current, {style: kit.Dict(html.LEFT, td.offsetLeft-1, html.WIDTH, td.offsetWidth-12), value: td.innerText})
|
||||
can.current.line.appendChild(can.ui.complete), can.page.Modify(can, can.ui.complete, {style: kit.Dict(html.LEFT, td.offsetLeft-1, "margin-top", can.ui.current.offsetHeight+4)})
|
||||
if (event) { if (can.mode == "plugin") { can.onkeymap._insert(event, can) }
|
||||
can.ui.current.focus(), can.onkeymap.cursorMove(can, can.ui.current, 0, (event.offsetX)/13-1)
|
||||
can.ui.content.scrollLeft -= 10000
|
||||
|
Loading…
x
Reference in New Issue
Block a user