diff --git a/frame.js b/frame.js index 1a9f05aa..a1f21362 100644 --- a/frame.js +++ b/frame.js @@ -220,7 +220,7 @@ Volcanos(chat.ONAPPEND, {help: "渲染引擎", _init: function(can, meta, list, can.onmotion.delay(can, function() { can.Update() }) }) }) - }; can.core.Next(can.base.getValid(can.core.Value(can, [chat.ONIMPORT, mdb.LIST]), can.base.Obj(meta.inputs)).concat([{type: html.BUTTON, name: cli.CLOSE}]), add) + }; can.core.Next(can.base.getValid(can.core.Value(can, [chat.ONIMPORT, mdb.LIST]), can.base.Obj(meta.inputs, [])).concat([{type: html.BUTTON, name: cli.CLOSE}]), add) }, _action: function(can, list, action, meta) { list = can.base.Obj(can.base.getValid(list, can.core.Item(meta)), can.core.Value(can, [chat.ONACTION, mdb.LIST])); if (!list) { return } var _list = can.page.inputs(can, list); action = action||can._action, can.onmotion.clear(can, action), meta = meta||can.onaction||{} @@ -577,8 +577,8 @@ Volcanos(chat.ONLAYOUT, {help: "页面布局", _init: function(can, target) { ta return show } - // var gt = "❯", lt = "❮", down = "˅", up = "˄" - var gt = "❯", lt = "❮", down = lt, up = gt + // var gt = "❯", lt = "❮", down = "˅", up = "˄" + var gt = "❯", lt = "❮", down = lt, up = gt var ui = can.page.Append(can, target, [{view: [chat.LAYOUT, html.TABLE], list: [ {view: [chat.PROJECT, html.TD], list: [{view: [chat.PROJECT]}]}, {type: html.TD, list: [ @@ -663,7 +663,8 @@ Volcanos(chat.ONMOTION, {help: "动态特效", _init: function(can, target) { if (pos) { item.scrollTo && item.scrollTo(0, pos-1); return item } }).length > 0 }, - delay: function(can, cb, interval) { can.core.Timer(interval||300, cb) }, + delay: function(can, cb, interval) { can.core.Timer(interval||30, cb) }, + delayLong: function(can, cb, interval) { can.core.Timer(interval||300, cb) }, focus: function(can, target) { if (!target) { return } target.setSelectionRange && target.setSelectionRange(0, -1), target.focus() }, diff --git a/page/index.css b/page/index.css index d24e2f40..924f481a 100644 --- a/page/index.css +++ b/page/index.css @@ -52,7 +52,7 @@ div.output div.project div.zone>div.action>div.item { float:right; clear:none; p div.output div.project div.zone>div.action>div.item input[type=text] { background-color:#ff000000; padding-left:10px; color:white; } fieldset.plugin { background-color:#061c3c9e; padding:10px; margin:10px; } -fieldset.float { background-color:#0e3369; color:white; position:absolute; } +fieldset.float { background-color:#0e3369; color:white; padding:0; margin:0; } fieldset.full { background-color:#0e3369; color:white; padding:0; margin:0; left:0; top:0; overflow:auto; } fieldset.story>legend { float:left; margin:0px; margin-right:5px; } @@ -72,7 +72,6 @@ fieldset.output>div.action { display:none; } fieldset.output>div.status { display:none; } fieldset.output div.toggle { display:none; } -fieldset.plugin.word fieldset.story { margin-top:10px; } fieldset.story.full { margin-top:0px; } fieldset.input.key { overflow:auto; } diff --git a/plugin/input/key.js b/plugin/input/key.js index 878d2cfd..2f956013 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -4,6 +4,15 @@ Volcanos(chat.ONFIGURE, {help: "控件详情", 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 } can.onmotion.clear(can), can.onappend.table(can, msg, function(value, key, index, line) { value = line[key] @@ -46,6 +55,7 @@ Volcanos(chat.ONFIGURE, {help: "控件详情", key: { 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._init(event, sub, sub._cbs, target, meta.name, event.target.value); break } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 0012d28a..542adc8e 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -30,6 +30,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", }) can.onexport.hash(can), can.onimport.layout(can), can.base.isFunc(cb) && cb(), cb = null msg._plugin && can.onmotion.delay(can, function() { msg._plugin.Focus() }) + can.onmotion.select(can, msg._tab.parentNode, "div.tabs", msg._tab) can.onengine.signal(can, "tabview.view.show", msg) }) } @@ -84,11 +85,12 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", _init: function(can, msg, cb) { can.page.style(can, can.ui.profile, {display: p? p.profile_display: html.NONE}) can.page.style(can, can.ui.display, {display: p? p.display_display: html.NONE}) can.parse = can.base.Ext(can.file), can.Status("模式", "plugin") - can.onengine.signal(can, "tabview.data.load", msg) + p && p.scrollTop && can.ui.content.scrollTo(0, p.scrollTop) return can.file }, can.ui._content, can.ui._profile_output, can.ui.display_output)) { - can.onengine.signal(can, "tabview.view.load", msg) + // can.onengine.signal(can, "tabview.view.load", msg) + // var scrollTop = can.ui.content.scrollTop; can.onmotion.delay(can, function() { can.ui.content.scrollTo(0, scrollTop) }, 10) return can.onaction.selectLine(null, can, can.Option(nfs.LINE)), can.base.isFunc(cb) && cb(msg._content) } @@ -280,6 +282,11 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", var width = can.profile_size[can.onexport.keys(can)]||(can.ConfWidth()-can.ui.project.offsetWidth)/2 can.ui.profile_output = sup._profile_output = can.ui._profile_output can.onimport.process(can, msg, can.ui._profile_output, width, can.ui.profile.offsetHeight) + can.page.Select(can, can.ui._profile_output, html.TABLE, function(target) { can.onmotion.delay(can, function() { + if (target.offsetWidth < can.ui._profile_output.offsetWidth) { + can.profile_size[can.onexport.keys(can)] = target.offsetWidth, can.onimport.layout(can) + } + }, 10) }) can.onappend._status(can, msg.Option(ice.MSG_STATUS), can.page.Append(can, can.ui._profile_output, [html.STATUS]).first) can.page.Select(can, can.ui._profile_output, "table.content", function(target) { can.page.style(can, target, html.MAX_HEIGHT, "1000px") }) } @@ -288,22 +295,34 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", can.onmotion.toggle(can, can.ui.profile, true), can.onimport.layout(can) }, display: function(can, msg) { - var height = can.display_size[can.onexport.keys(can)]||{sh: can.ConfHeight()/2}[can.parse]||can.ConfHeight()/4 + var height = can.display_size[can.onexport.keys(can)]||{sh: can.ConfHeight()/2}[can.parse]||can.ConfHeight()/2 if (msg) { can.onimport.process(can, msg, can.ui.display_output, can.ui.display.offsetWidth, height) can.onappend._status(can, msg.Option(ice.MSG_STATUS), can.ui.display_status) + can.onmotion.delay(can, function() { + can.page.Select(can, can.ui.display_output, html.TABLE, function(target) { + if (target.offsetHeight < can.ui.display_output.offsetHeight-3*html.ACTION_HEIGHT) { + can.display_size[can.onexport.keys(can)] = target.offsetHeight-3*html.ACTION_HEIGHT, can.onimport.layout(can) + } + }) + }) } can.onmotion.toggle(can, can.ui.display, true), can.onimport.layout(can) }, process: function(can, msg, target, width, height) { can.onmotion.clear(can, target), can.user.toastSuccess(can) if (msg.Option(ice.MSG_PROCESS) == "_field") { msg.Table(function(item) { item.display = msg.Option(ice.MSG_DISPLAY) - can.onimport.plug(can, item, target, function(sub) { width && sub.ConfWidth(width), height && sub.ConfHeight(height), sub.Focus() }) + can.onimport.plug(can, item, target, function(sub) { width && sub.ConfWidth(width) + , height && sub.ConfHeight(height-3*html.ACTION_HEIGHT), sub.Focus() }) }) } else if (msg.Option(ice.MSG_DISPLAY) != "") { can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY), target, false, function(msg) { can.onmotion.delay(can, function() { can.onimport.layout(can) }) }) } else { - can.onappend.table(can, msg, null, target), can.onappend.board(can, msg, target) + can.onappend.table(can, msg, function(value, key, index, line, array) { + return {text: [value, html.TD], onclick: function(event) { + if (line.line || line.file) { can.onimport.tabview(can, line.path||can.Option(nfs.PATH), line.file||can.Option(nfs.FILE), line.line||can.Option(nfs.LINE)) } + }} + }, target), can.onappend.board(can, msg, target) } }, }, [""]) @@ -313,10 +332,16 @@ Volcanos(chat.ONACTION, {help: "控件交互", _trans: {link: "链接", width: " can.ui.search.Update({}, [ctx.ACTION, data.action, data.name]) }) }, - "打开": function(event, can) { - can.request() - can.request(event, {path: can.sup.paths.join(",")}) - can.user.input(event, can, [nfs.FILE], function(list) { can.onimport.tabview(can, can.Option(nfs.PATH), list[0]) }) + "打开": function(event, can) { var msg = can.request(event, {paths: can.sup.paths.join(ice.FS)}) + can.user.input(event, can, [nfs.FILE], function(list) { + if (list[0].indexOf("line:") == 0) { var ls = can.core.Split(list[0], ice.DF, ice.DF) + can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), ls[1]) + return + } + can.core.List(can.sup.paths, function(path) { + if (list[0].indexOf(path) == 0) { can.onimport.tabview(can, path, list[0].slice(path.length)) } + }) + }) }, show: function(event, can) { can.request(event, {_toast: "渲染中..."}) if (can.base.endWith(can.Option(nfs.FILE), ".js")) { @@ -464,8 +489,8 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar can.page.styleWidth(can, can.ui.display_output, width-project_width) var height = can.user.isMobile && can.isFloatMode()? window.innerHeight-2*html.ACTION_HEIGHT: can.base.Min(can.ConfHeight(), 320)-1 - var display_height = can.ui.display.style.display == html.NONE? 0: (can.display_size[can.onexport.keys(can)]||120) - if (can.isCmdMode()) { height += html.ACTION_HEIGHT + var display_height = can.ui.display.style.display == html.NONE? 0: (can.display_size[can.onexport.keys(can)]||height/2) + if (can.isCmdMode()) { // height += html.ACTION_HEIGHT var content_height = height-display_height - can.ui._tabs.offsetHeight - can.ui._path.offsetHeight - 4 can.page.style(can, can._output, html.MAX_HEIGHT, "") } else { diff --git a/plugin/local/code/inner/syntax.js b/plugin/local/code/inner/syntax.js index f8fd7594..b1d5c1d4 100644 --- a/plugin/local/code/inner/syntax.js +++ b/plugin/local/code/inner/syntax.js @@ -173,6 +173,9 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", }, go: { render: {}, + split: { + operator: "{([:.,*])}", + }, prefix: { "//": code.COMMENT, }, @@ -218,6 +221,7 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", "bool": code.DATATYPE, "error": code.DATATYPE, "chan": code.DATATYPE, "map": code.DATATYPE, "msg": code.FUNCTION, "m": code.FUNCTION, + "ice": code.FUNCTION, "kit": code.FUNCTION, "init": code.FUNCTION, "main": code.FUNCTION, "print": code.FUNCTION, "println": code.FUNCTION, "panic": code.FUNCTION, "recover": code.FUNCTION, "new": code.FUNCTION, "make": code.FUNCTION, "len": code.FUNCTION, "cap": code.FUNCTION, "copy": code.FUNCTION, "append": code.FUNCTION, "delete": code.FUNCTION, "close": code.FUNCTION, "complex": code.FUNCTION, "real": code.FUNCTION, "imag": code.FUNCTION, @@ -271,6 +275,8 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", "if": code.KEYWORD, "else": code.KEYWORD, + "for": code.KEYWORD, + "while": code.KEYWORD, "switch": code.KEYWORD, "case": code.KEYWORD, "default": code.KEYWORD, @@ -295,6 +301,8 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", "false": code.CONSTANT, "function": code.FUNCTION, + "arguments": code.FUNCTION, + "this": code.FUNCTION, "Volcanos": code.FUNCTION, "shy": code.FUNCTION, "cb": code.FUNCTION, diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 0d62656b..2374fcb4 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -117,6 +117,7 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互", t: shy("添加命令", function(event, can) { can.onaction["添加"](event, can) }), p: shy("添加插件", function(event, can) { can.onaction["插件"](event, can) }), e: shy("添加扩展", function(event, can) { can.onaction["扩展"](event, can) }), + f: shy("打开文件", function(event, can) { can.onaction["打开"](event, can) }), i: shy("插入模式", function(event, can) { can.onkeymap._insert(event, can) }), n: shy("命令模式", function(event, can) { can.onkeymap._normal(event, can) }), diff --git a/plugin/local/wiki/word.css b/plugin/local/wiki/word.css index 71c72ea8..28010615 100644 --- a/plugin/local/wiki/word.css +++ b/plugin/local/wiki/word.css @@ -19,6 +19,7 @@ fieldset.word p.story[data-name=inner]:hover { background-color:#c10c8a; cursor: fieldset.word table.content { display:block; max-height:400px; } fieldset.word fieldset.story { margin:10px; } fieldset.word fieldset.story.full { margin:0px; } +fieldset.word fieldset.story.float { margin:0px; } body.white fieldset.word svg.story.auto defs marker { stroke:red; fill:red; } body.white fieldset.word svg.story.auto rect { stroke:blue; fill:yellow; } diff --git a/plugin/story/spide.js b/plugin/story/spide.js index 98ed99bc..0cae80c1 100644 --- a/plugin/story/spide.js +++ b/plugin/story/spide.js @@ -157,7 +157,7 @@ Volcanos(chat.ONDETAIL, {help: "用户交互", can.getActionSize(function(left, top, width, height) { left = left||0 var top = can.Mode() == undefined? 120: 0; if (can.user.isMobile) { top = can.user.isLandscape()? 0: 48 } sub.ConfHeight(height-top-2*html.ACTION_HEIGHT-(can.user.isMobile&&!can.user.isLandscape()? 2*html.ACTION_HEIGHT: 0)), sub.ConfWidth(width) - can.onmotion.move(can, sub._target, {position: html.FIXED, left: left, top: top}) + can.onmotion.move(can, sub._target, {left: left, top: top}) }) }) }, diff --git a/plugin/table.js b/plugin/table.js index 5c54e823..d451661a 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -23,7 +23,11 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar cli.CLEAR, function(event) { can.onmotion.clear(can, ui.output) }, cli.SHOW, function(event) { can.onaction[cli.SHOW](event, can) }, action, - mdb.PLUGIN, function(event) { can.user.input(event, can, [ctx.INDEX, ctx.ARGS], function(data) { can.onimport.plug(can, data, ui.output) }) }, + mdb.PLUGIN, function(event) { can.user.input(event, can, [ctx.INDEX, ctx.ARGS], function(data) { + can.onimport.plug(can, data, ui.output, function(sub) { + sub.ConfHeight(target.offsetHeight-4*html.ACTION_HEIGHT) + }) + }) }, )); target._toggle = function(event, show) { action[show? cli.SHOW: cli.CLOSE](event) } return ui }, @@ -69,7 +73,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar node = node||{"": target}; can.core.List(list, function(item) { item[field] && can.core.List(item[field].split(split), function(value, index, array) { if (!value) { return } var last = array.slice(0, index).join(split), name = array.slice(0, index+1).join(split); if (node[name]) { return } - var ui = can.page.Append(can, node[last], [{view: "item", list: [{view: ["switch", "div", (index==array.length-1?"":"⌃")]}, {view: ["name", html.DIV, value+(index==array.length-1?"":"")], _init: item._init, onmouseenter: function(event) { if (!item._menu) { return } + var ui = can.page.Append(can, node[last], [{view: "item", list: [{view: ["switch", "div", (index==array.length-1?"":"⌃")]}, {view: ["name", html.DIV, value+(index==array.length-1?"":"")], _init: item._init, onmouseenter: function(event) { if (!item._menu) { return } can.user.carteRight(event, can, item._menu.meta, item._menu.list||can.core.Item(item._meta.meta), function(event, button) { (item._menu.meta[button]||item._menu)(event, can, button) })