diff --git a/frame.js b/frame.js index 8a99bbbd..5e71d831 100644 --- a/frame.js +++ b/frame.js @@ -58,7 +58,7 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { can.requ listen: shy(function(can, name, cb) { arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb) }), signal: function(can, name, msg) { msg = msg||can.request(); var _msg = name == chat.ONREMOTE? msg.Option("_msg"): msg _msg.Option(ice.LOG_DISABLE) == ice.TRUE || can.misc.Log(name, can._name, (msg._cmds||[]).join(ice.SP), name == chat.ONMAIN? can: _msg, _msg._can._target) - return can.core.List(can.onengine.listen.meta[name], function(cb) { can.core.CallFunc(cb, {event: msg._event, msg: msg}) }).length + return can.core.List(can.onengine.listen.meta[name], function(cb) { can.core.CallFunc(cb, {event: msg._event, msg: msg}) }).length, msg }, }) Volcanos(chat.ONDAEMON, {_init: function(can, name) { if (can.user.isLocalFile) { return } diff --git a/index.css b/index.css index 07ac4df2..8e4c33b1 100644 --- a/index.css +++ b/index.css @@ -93,9 +93,11 @@ body>div.toast div.progress { border:green solid 1px; margin-left:0px; height:20 body>div.toast div.progress div.current { background-color:red; height:18px; } body>div.toast div.action { display:block; } body>div.carte { padding:0; } -body>div.carte input[name=filter] { margin:5px; width:calc(100% - 10px); position:sticky; top:0; } +body>div.carte input[name=filter] { margin:5px; width:calc(100% - 10px); position:sticky; top:5px; } body>div.carte div.item { padding:5px 10px; } body>div.input td { padding:5px; } +body>div.input td span.icon { font-size:14px; margin-left:-25px; margin-right:10px; visibility:hidden; } +body>div.input td:hover span.icon { visibility:visible; } body>div.input select { width:200px; } body>div.input textarea { height:120px; width:200px; } body>div.input input:not([type=button]) { width:200px; } @@ -141,6 +143,7 @@ form.option>div.item>span.icon { font-size:20px; position:absolute; top:2px; rig form.option>div.item:hover>span.icon { visibility:visible; } form.option>div.icon { font-size:26px; margin-right:5px; display:none; } form.option>div.icon:hover { background-color:white; } +fieldset.story>form.option>div.icon { display:block; } fieldset.float>form.option>div.icon { display:block; } fieldset.full>form.option>div.icon { display:block; } fieldset.plug>form.option>div.icon { margin-left:5px; } diff --git a/lib/user.js b/lib/user.js index 758d7acf..4a4bc6c1 100644 --- a/lib/user.js +++ b/lib/user.js @@ -129,7 +129,12 @@ Volcanos("user", {info: {}, agent: { can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) { item.name && item.value && _msg.Option(item.name, item.value) }) ;(item.run||can.run)(event, cmds, cb, true) }, _enter: function(event) { return action.submit(event, can, html.SUBMIT), true }}, item), target) - }; return {type: html.TR, list: [{type: html.TD, list: [{text: [item.name||"", html.LABEL]}, {text: item.need == "must"? "*": "", style: {color: cli.RED}}]}, {type: html.TD, list: [can.page.input(can, item)]}]} + }; return {type: html.TR, list: [ + {type: html.TD, list: [{text: [item.name||"", html.LABEL]}, + {text: item.need == "must"? "*": "", style: {color: cli.RED}}]}, + {type: html.TD, list: [can.page.input(can, item), item.type == html.TEXT && {view: [html.ICON, html.SPAN, can.page.unicode.delete], onclick: function(event) { + event.target.previousSibling.value = "" + }}]}]} })}]}, html.ACTION, ]}]) var action = can.onappend._action(can, button||[html.SUBMIT, html.CANCEL], ui.action, { diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index b6f6ae45..83a52b37 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -26,8 +26,8 @@ fieldset.inner.cmd>div.output>div.layout.flow>div.tabs.hide { display:none; } fieldset.inner.cmd>div.output>div.layout.flow>div.tabs>div { padding:10px; height:38px; float:left; } fieldset.inner.cmd>div.output>div.layout.flow>div.tabs>div>span { font-style:italic; } fieldset.inner.cmd>div.output>div.layout.flow>div.tabs>div>span.icon { padding:0 5px; } +fieldset.inner.cmd>div.output>div.layout.flow>div.tabs div.website.icon { font-size:18px; line-height:32px; padding:2px 5px; margin-top:2px; } fieldset.inner.cmd>div.output>div.layout.flow>div.tabs div.avatar { padding:0; height:38px; float:right; } -fieldset.inner.cmd>div.output>div.layout.flow>div.tabs div.create.icon { font-size:18px; line-height:32px; padding:2px 5px; margin-top:2px; } fieldset.inner.cmd>div.output>div.layout.flow>div.tabs div.avatar>img { height:38px; } fieldset.inner.cmd>div.output>div.layout.flow>div.tabs div.time { float:right; } fieldset.inner.cmd>div.output>div.layout.flow>div.path { font-style:italic; padding:5px; display:block; } @@ -35,7 +35,10 @@ fieldset.inner.cmd>div.output>div.layout.flow>div.path.hide { display:none; } fieldset.inner.cmd>div.output>div.layout.flow>div.path span.func { margin-left:20px; } fieldset.inner.cmd>div.output>div.layout.flow>div.path span.view { font-size:22px; line-height:12px; padding:0 4px; float:right; cursor:pointer; } fieldset.inner.cmd>div.output>div.layout.flow>div.plug { height:31px; clear:both; } -fieldset.inner.cmd>div.output>div.layout.flow>div.plug>legend { float:right; } +fieldset.inner.cmd>div.output>div.layout.flow>div.plug>legend { font-size:1rem; padding:0 10px; float:right; } +div.vimer.find.float div.item>span.icon { margin-left:-20px; margin-right:10px; visibility:hidden; } +div.vimer.find.float div.item:hover>span.icon { visibility:visible; } +div.vimer.open.float td:first-child { display:none; } body.black fieldset.inner>div.output div.content td.text span.comment { background-color:blue; color:cyan; } body.white fieldset.inner.cmd>div.output { background-color:aliceblue; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index b1c58878..309c4db9 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -6,28 +6,26 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl var files = can.core.Split(can.Option(nfs.FILE), ice.FS); can.Option(nfs.FILE, files[0]) var paths = can.core.Split(can.Option(nfs.PATH), ice.FS); can.Option(nfs.PATH, paths[0]) can.core.List(paths.concat(can.core.Split(msg.Option(nfs.REPOS))), function(p) { if (p && paths.indexOf(p) == -1 && p[0] != ice.PS) { paths.push(p) } }) - can.db = {paths: paths, tabview: {}, history: [], profile_size: {}, display_size: {}, toolkit: {}, extentions: {}}, can.onengine.plugin(can, can.onplugin) + can.db = {paths: paths, tabview: {}, history: [], profile_size: {}, display_size: {}, toolkit: {}}, can.onengine.plugin(can, can.onplugin) can.ui = can.onappend.layout(can, can._output, "", [html.PROJECT, [html.TABS, nfs.PATH, [html.CONTENT, html.PROFILE], html.DISPLAY, html.PLUG]]) can.ui._content = can.ui.content, can.ui._profile = can.ui.profile, can.ui._display = can.ui.display, can.onmotion.hidden(can, can.ui.plug) switch (can.Mode()) { case chat.SIMPLE: // no break case chat.FLOAT: can.onmotion.hidden(can, can.ui.project); break - case chat.CMD: can.onmotion.hidden(can, can._status), can.onimport._keydown(can) - var plug = can.base.Obj(msg.Option("plug"), []).concat(can.misc.Search(can, log.DEBUG) == ice.TRUE? ["can.debug", "log.debug"]: []) + case chat.CMD: can.onimport._keydown(can), can.onmotion.hidden(can, can._status) + var plug = can.base.Obj(msg.Option(html.PLUG), []).concat(can.misc.Search(can, log.DEBUG) == ice.TRUE? ["can.debug", "log.debug"]: []) plug.length > 0 && can.run({}, [ctx.ACTION, ctx.COMMAND].concat(plug.reverse()), function(msg) { msg.Table(function(value) { can.onimport.toolkit(can, value) }) }) - // no break case chat.FULL: // no break default: can.onimport.project(can, paths), can.onimport._tabs(can) - can.onmotion.delay(can, function() { can.core.Next(files.slice(1), function(file, next) { - can.onimport._tabview(can, can.Option(nfs.PATH), file, "", next) - }, function() { files.length > 1 && can.onimport._tabview(can, paths[0], files[0], "") - if (can.user.isWebview) { var last = can.misc.localStorage(can, "web.code.inner:currentFile"); if (!last) { return } } - var ls = can.core.Split(last, ice.DF); ls.length > 0 && can.onmotion.delayLong(can, function() { can.onimport._tabview(can, ls[0], ls[1], ls[2]) }) - can.core.List(can.base.Obj(msg.Option("tabs")), function(item) { can.onimport.tabview(can, can.Option(nfs.PATH), item, ctx.INDEX) }) + can.onmotion.delay(can, function() { can.core.Next(files.slice(1), function(file, next) { can.onimport._tabview(can, paths[0], file, "", next) }, function() { + can.core.List(can.base.Obj(msg.Option(html.TABS)), function(item) { can.onimport.tabview(can, paths[0], item, ctx.INDEX) }) + if (can.user.isWebview) { var last = can.misc.localStorage(can, "web.code.inner:currentFile"); if (last) { + var ls = can.core.Split(last, ice.DF); ls.length > 0 && can.onimport._tabview(can, ls[0], ls[1], ls[2]) + } } }) }) } var args = can.misc.SearchHash(can); can.db.tabview[can.onexport.keys(can)] = msg - can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE), function() { if (args.length > 0) { - can.onmotion.delayLong(can, function() { can.onimport._tabview(can, args[args.length-3]||can.Option(nfs.PATH), args[args.length-2]||can.Option(nfs.FILE), args[args.length-1]) }) + can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE), function() { if (!can.user.isWebview || args.length > 0) { + can.onimport._tabview(can, args[args.length-3]||can.Option(nfs.PATH), args[args.length-2]||can.Option(nfs.FILE), args[args.length-1]) } }), can.base.isFunc(cb) && cb(msg) }, _keydown: function(can) { can.onkeymap._build(can), can._root.onengine.listen(can, chat.ONKEYDOWN, function(event) { @@ -35,102 +33,103 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl can.db._key_list = can.onkeymap._parse(event, can, mdb.PLUGIN, can.db._key_list, can.ui.content) }) }, _tabs: function(can) { if (!can.isCmdMode()) { return can.ui.tabs = can._action } - can.page.Append(can, can.ui.tabs, [{view: [[html.ICON, mdb.CREATE], html.DIV, can.page.unicode.menu], onclick: function() { can.user.carte(event, can, can.onaction, can.onaction.list) }}]) - can.page.Append(can, can.ui.tabs, [{view: [[html.ICON, mdb.CREATE], html.DIV, "\u25C0"], style: {"font-size": "14px", "margin-top": "3px"}, onclick: function() { history.back() }}]) - can.page.Append(can, can.ui.tabs, [{view: [[html.ICON, mdb.CREATE], html.DIV, "\u21BB"], style: {"font-size": "24px", "margin-top": "0px"}, onclick: function() { location.reload() }}]) - can.page.Append(can, can.ui.tabs, [{view: [[html.ICON, mdb.CREATE], html.DIV, "\u25B6"], style: {"font-size": "14px", "margin-top": "3px"}, onclick: function() { history.forward() }}]) - can.user.isMobile || can.page.Append(can, can.ui.tabs, [{view: [mdb.TIME], _init: function(target) { + can.core.List([{name: can.page.unicode.menu, onclick: function() { can.user.carte(event, can, can.onaction, can.onaction.list) }}, + {name: "\u25C0", style: {"font-size": "14px", "margin-top": "3px"}, onclick: function() { history.back() }}, + {name: "\u21BB", style: {"font-size": "24px", "margin-top": "0px"}, onclick: function() { location.reload() }}, + {name: "\u25B6", style: {"font-size": "14px", "margin-top": "3px"}, onclick: function() { history.forward() }}, + ], function(item) { can.page.Append(can, can.ui.tabs, [{view: [[html.ICON, web.WEBSITE], html.DIV, item.name], style: item.style, onclick: item.onclick}]) }) + can.user.isMobile || can.page.Append(can, can.ui.tabs, [{view: mdb.TIME, _init: function(target) { can.core.Timer({interval: 100}, function() { can.page.Modify(can, target, can.user.time(can, null, "%y-%m-%d %H:%M:%S %w")) }) can.onappend.figure(can, {action: "date", _hold: true}, target, function(sub, value) {}) - }}]), can.user.info.avatar && can.page.Append(can, can.ui.tabs, [{view: [aaa.AVATAR], list: [{img: can.user.info.avatar}]}]) + }}]), can.user.info.avatar && can.page.Append(can, can.ui.tabs, [{view: aaa.AVATAR, list: [{img: can.user.info.avatar}]}]) }, - _tabInputs: function(can, ps, key, value, cb, target) { can.core.List(can.core.Split(value, ps), function(value, index, array) { + _tabPath: function(can, ps, key, value, cb, target) { can.core.List(can.core.Split(value, ps), function(value, index, array) { can.page.Append(can, target, [{text: [value+(index 2) { + can.onimport.tabview(can, ls.slice(0, 2).join(ice.PS)+ice.PS, ls.slice(2).join(ice.PS)) + } else if (ls.length > 1) { can.onimport.tabview(can, ls.slice(0, 1).join(ice.PS)+ice.PS, ls.slice(1).join(ice.PS)) } else { - can.onimport.tabview(can, ls.slice(0, 2).join(ice.PS)+ice.PS, ls.slice(2).join(ice.PS)) + can.onimport.tabview(can, nfs.PWD, ls[0]) } }, can.ui.path), can.onimport._tabFunc(can, can.ui.path) } - can.page.SelectChild(can, can.ui._content.parentNode, can.page.Keys(html.DIV_CONTENT, "fieldset.story", [[[html.IFRAME, html.CONTENT]]]), function(item) { - if (can.onmotion.toggle(can, item, item == msg._content)) { can.ui.content = msg._content } + can.page.SelectChild(can, can.ui._content.parentNode, can.page.Keys(html.DIV_CONTENT, html.FIELDSET_STORY, [[[html.IFRAME, html.CONTENT]]]), function(target) { + if (can.onmotion.toggle(can, target, target == msg._content)) { can.ui.content = msg._content } }), can.ui.content._plugin = msg._plugin - can.page.SelectChild(can, can.ui._content.parentNode, can.page.Keys(html.DIV_PROFILE, [[[html.IFRAME, html.PROFILE]]]), function(item) { - if (can.onmotion.toggle(can, item, item == msg._profile)) { can.ui.profile = msg._profile } - }), can.ui.current && can.onmotion.toggle(can, can.ui.current, !isCommand() && !isDream()) + can.page.SelectChild(can, can.ui._content.parentNode, can.page.Keys(html.DIV_PROFILE, [[[html.IFRAME, html.PROFILE]]]), function(target) { + if (can.onmotion.toggle(can, target, target == msg._profile)) { can.ui.profile = msg._profile } + }), can.onimport.layout(can), can.ui.current && can.onmotion.toggle(can, can.ui.current, !isIndex() && !isDream()) + skip || can.onaction.selectLine(can, can.Option(nfs.LINE), true), can.base.isFunc(cb) && cb(), cb = null var ls = can.db.file.split(ice.PS); if (ls.length > 4) { ls = [ls.slice(0, 2).join(ice.PS)+"/.../"+ls.slice(-2).join(ice.PS)] } - can.Status(kit.Dict("文件", ls.join(ice.PS), "类型", can.db.parse)), can.onimport.layout(can) - if (!skip) { can.onaction.selectLine(can, can.Option(nfs.LINE), true) } - can.base.isFunc(cb) && cb(), cb = null + can.Status(kit.Dict("文件", ls.join(ice.PS), "类型", can.db.parse)) }) } function load(msg) { var skip = false; can.db.tabview[key] = msg - can.onimport.tabs(can, [{name: file.split(isCommand()? ice.PT: ice.PS).pop(), text: file, _menu: shy([nfs.SAVE, "compile"], function(event, button, meta) { + can.onimport.tabs(can, [{name: file.split(isIndex()? ice.PT: ice.PS).pop(), text: file, _menu: shy([nfs.SAVE, code.COMPILE], function(event, button, meta) { can.onaction[button](event, can, button) })}], function(event, tabs) { can._tab = msg._tab = tabs._target, show(skip), skip = true - }, function(tabs) { can.onengine.signal(can, "tabview.view.delete", msg) + }, function(tabs) { can.onengine.signal(can, "tabview.view.remove", msg) msg._content != can.ui._content && can.page.Remove(can, msg._content), msg._profile != can.ui._profile && can.page.Remove(can, msg._profile) delete(can.ui._content._cache[key]), delete(can.ui._profile._cache[key]), delete(can.ui.display._cache[key]) delete(can._cache_data[key]), delete(can.db.tabview[key]) }, can.ui.tabs) } if (can.db.tabview[key]) { return !can._msg._tab && !can.isSimpleMode()? load(can.db.tabview[key]): show() } - isCommand()||isDream()? load(can.request({}, {index: file, line: line})): can.run({}, [path, file], load, true) + isIndex()||isDream()? load(can.request({}, {index: file, line: line})): can.run({}, [path, file], load, true) }, history: function(can, record) { can.base.Eq(record, can.db.history[can.db.history.length-1]) || can.db.history.push(record) return can.Status("跳转", can.db.history.length), record @@ -140,44 +139,43 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl if (can.base.isFunc(cb)) { return {name: name, _trans: can.onfigure._trans? can.onfigure._trans[name]||"": "", _init: function(target, zone) { return cb(can, target, zone, path) }} } }), can.ui.project), can.user.isMobile && !can.user.isLandscape() && can.onmotion.hidden(can, can.ui.project) }, - profile: function(can, msg) { var sup = can.db.tabview[can.onexport.keys(can)] - if (msg.Result().indexOf("