diff --git a/frame.js b/frame.js index 631af5df..5879cc31 100644 --- a/frame.js +++ b/frame.js @@ -232,6 +232,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }) }, + style: function(can, style, target) { can.page.ClassList.add(can, target||can._fields||can._target, style) }, field: function(can, type, item, target) { type = type||html.STORY, item = item||{} var name = (item.nick||item.name||"").split(ice.SP)[0], title = !item.help || can.user.language(can) == "en"? name: name+"("+item.help.split(ice.SP)[0]+")" return can.page.Append(can, target||can._output, [{view: [can.base.join([type||"", item.name||"", item.pos||""]), html.FIELDSET], list: [ diff --git a/lib/user.js b/lib/user.js index adfbc7d5..7cb757ec 100644 --- a/lib/user.js +++ b/lib/user.js @@ -96,18 +96,17 @@ Volcanos("user", {info: {}, agent: { can.onmotion.focus(can, input), document.execCommand("Copy"), can.page.Remove(can, input) return can.user.toastSuccess(can, text, "copy success"), can.misc.Log(nfs.COPY, text), text }, - carte: function(event, can, meta, list, cb, parent) { + carte: function(event, can, meta, list, cb, parent, trans) { meta = meta||can.ondetail||can.onaction||{}, list = can.base.getValid(list, meta.list, can.core.Item(meta))||[]; if (list.length == 0) { return } cb = cb||function(event, button, meta) { var cb = meta[button]||meta[chat._ENGINE]; can.base.isFunc(cb) && cb(event, can, button) } parent || can.page.Select(can, document.body, "div.carte.float", function(target) { can.onmotion.delay(can, function () { can.page.Remove(can, target) }) }) function remove_sub(carte) { carte._sub && can.page.Remove(can, carte._sub._target), delete(carte._sub) } - function click(event, item) { - meta[item]? meta[item](event, can, item): can.base.isFunc(cb) && cb(event, item, meta), can.onkeymap.prevent(event), can.user.isMobile && can.page.Remove(can, ui._target) } + function click(event, item) { meta[item]? meta[item](event, can, item): can.base.isFunc(cb) && cb(event, item, meta), can.onkeymap.prevent(event), can.user.isMobile && can.page.Remove(can, ui._target) } var ui = can.page.Append(can, document.body, [{view: [[chat.CARTE, chat.FLOAT]], list: can.core.List(list, function(item, index) { - return can.base.isString(item)? item ==""? /* space */ {view: html.SPACE}: /* string */ {view: [html.ITEM, html.DIV, can.user.trans(can, item)], onclick: function(event) { click(event, item) }, onmouseenter: function(event) { remove_sub(carte) } }: - can.base.isArray(item)? /* array */ {view: html.ITEM, list: [{text: can.user.trans(can, item[0])+" -> "}], onmouseenter: function(event) { - var sub = can.user.carte(event, can, meta, item.slice(1), cb, carte); can.onlayout.figure(event, can, sub._target, true), remove_sub(carte), carte._sub = sub - } }: /* object */ {view: html.ITEM, list: [{text: can.user.trans(can, item.name), onclick: function(event) { click(event, item.name) }, onmouseenter: function(event) { remove_sub(carte) } }] } + return can.base.isString(item)? item ==""? /* space */ {view: html.SPACE}: /* string */ {view: [html.ITEM, html.DIV, can.user.trans(can, item, trans)], onclick: function(event) { click(event, item) }, onmouseenter: function(event) { remove_sub(carte) } }: + can.base.isArray(item)? /* array */ {view: html.ITEM, list: [{text: can.user.trans(can, item[0], trans)+" -> "}], onmouseenter: function(event) { + var sub = can.user.carte(event, can, meta, item.slice(1), cb, carte, trans); can.onlayout.figure(event, can, sub._target, true), remove_sub(carte), carte._sub = sub + } }: /* object */ {view: html.ITEM, list: [{text: can.user.trans(can, item.name, trans), onclick: function(event) { click(event, item.name) }, onmouseenter: function(event) { remove_sub(carte) } }] } }), onmouseover: function(event) { can.onkeymap.prevent(event) } }]); can.onkeymap.prevent(event) var carte = {_target: ui._target, _parent: parent, layout: can.onlayout.figure(event, can, ui._target)}; return carte }, diff --git a/panel/header.js b/panel/header.js index ab760657..00dc71a2 100644 --- a/panel/header.js +++ b/panel/header.js @@ -50,9 +50,9 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { menu: function(can, cmds, cb, trans) { can.base.isString(cmds) && (cmds = [cmds]) return can.page.Append(can, can._output, [{type: cmds[0], list: can.core.List(can.base.getValid(cmds.slice(1), [cmds[0]]), function(item) { if (can.base.isString(item)) { return {view: [html.MENU, html.DIV, can.user.trans(can, item, trans)], onclick: function(event) { can.base.isFunc(cb) && cb(event, item, [item]) }} } - if (can.base.isArray(item)) { var list = can.core.List(item, function(value, index) { return can.user.trans(can, value, trans) }) - return {view: [html.MENU, html.DIV, can.user.trans(can, list[0], trans)], onmouseenter: function(event) { - can.onaction.carte(event, can, list.slice(1), function(event, button, meta, index) { can.base.isFunc(cb) && cb(event, item[index+1], item) }, trans) + if (can.base.isArray(item)) { + return {view: [html.MENU, html.DIV, can.user.trans(can, item[0], trans)], onmouseenter: function(event) { + can.onaction.carte(event, can, item.slice(1), function(event, button, meta, index) { can.base.isFunc(cb) && cb(event, button, item) }, trans) }} } if (can.base.isObject(item)) { return item } }) }])._target @@ -94,7 +94,7 @@ Volcanos(chat.ONACTION, { webpack: function(event, can) { can.onengine.signal(can, "onwebpack", can.request(event)) }, toimage: function(event, can) { can.onmotion.clearCarte(can), can.user.toimage(can, can.user.title(), can._target.parentNode) }, - carte: function(event, can, list, cb) { can.user.carte(event, can, can.onaction, list, cb) }, + carte: function(event, can, list, cb, trans) { can.user.carte(event, can, can.onaction, list, cb, null, trans) }, share: function(event, can, args) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE].concat(args||[])) }, usernick: function(event, can) { if (can.user.mod.isPod || can.user.isExtension || can.user.isLocalFile) { return } diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index ed8c319f..ab3e19c8 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -62,20 +62,10 @@ body.mobile fieldset.inner.cmd>div.output div.toggle.display { background-color: div.project div.zone.create>div.action { display:none; } div.project div.zone.create>div.list div.item { padding:2px; float:left; clear:none; } div.project div.zone.create>div.list div.item input { font-family:monospace; } -fieldset.word fieldset.inner>form.option input[name=path] { width:240px; } body.webview div.project div.zone.create>div.list div.item { padding:2px; } body.white.simple fieldset.plugin div.output.json div.item span.nonce { color:lightgray; } +fieldset.word fieldset.inner>form.option input[name=path] { width:240px; } fieldset>div.output>fieldset.plug { position:absolute; bottom:0px; right:0px; } fieldset>div.output>fieldset.plug { display:none; } fieldset>div.output>fieldset.plug.select { background-color:#0e3369b3; color:white; display:block; z-index:10; } -fieldset>div.status legend { float:right; height:30px; } -fieldset>div.status legend.select { background-color:green; } -fieldset>div.status legend:hover { background-color:green; } -fieldset.inner>div.status { height:30px; overflow:auto; } -fieldset.inner div.output fieldset.toolkit { position:absolute; bottom:0px; right:0px; } -fieldset.inner>div.output fieldset.toolkit>div.output>fieldset { display:none; } -fieldset.inner>div.output fieldset.toolkit>div.output>fieldset.select { background-color:#0e3369b3; color:white; display:block; z-index:10; } -fieldset.inner>div.output fieldset.toolkit>div.output fieldset { display:none; } -fieldset.inner>div.output fieldset.toolkit>div.output fieldset.select { background-color:#0e3369b3; color:white; display:block; z-index:10; } -fieldset.inner div.output fieldset.toolkit>div.output { position:unset; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index c89aa4a1..e4c16900 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -1,13 +1,12 @@ -Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.clear(can), can.page.ClassList.add(can, can._fields, code.INNER) +Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.clear(can), can.onappend.style(can, code.INNER) if (msg.Option(nfs.FILE)) { can.Option(nfs.FILE, msg.Option(nfs.FILE)) msg.Option(nfs.PATH) && can.Option(nfs.PATH, msg.Option(nfs.PATH)) msg.Option(nfs.LINE) && can.Option(nfs.LINE, msg.Option(nfs.LINE)) } if (msg.Result() == "" && can.Option(nfs.LINE) == "1") { return } 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(msg.modules||[], can.core.Split(msg.Option(nfs.REPOS)), can.sup.paths||[]), function(p) { if (p && paths.indexOf(p) == -1 && p[0] != ice.PS) { paths.push(p) } }), can.sup.paths = paths - can.toolkit = {}, can.extentions = {}, can.onengine.plugin(can, can.onplugin) - can.tabview = can.tabview||{}, can.history = can.history||[], can.profile_size = {}, can.display_size = {} + 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: {}, extentions: {}}, 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]]) can.ui._content = can.ui.content, can.ui._profile = can.ui.profile, can.ui._display = can.ui.display switch (can.Mode()) { @@ -23,29 +22,29 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl 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]) }) }) }) } - var hash = location.hash; can.tabview[can.onexport.keys(can)] = msg + var hash = location.hash; 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 (can.isCmdMode() && hash) { var args = can.core.Split(decodeURIComponent(hash).slice(1)) + if (can.isCmdMode() && hash) { var args = can.core.Split(decodeURIComponent(hash).slice(1), ice.DF) 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.base.isFunc(cb) && cb(msg) + } can.base.isFunc(cb) && cb(msg) + }) }, _keydown: function(can) { can.onkeymap._build(can), can._root.onengine.listen(can, chat.ONKEYDOWN, function(event) { if (can.onkeymap.selectCtrlN(event, can, can.ui.tabs, html.DIV_TABS)) { return } - can._key_list = can.onkeymap._parse(event, can, mdb.PLUGIN, can._key_list, can.ui.content) + 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: [[mdb.TIME, html.SELECT]], _init: function(target) { can.core.Timer({interval: 100}, function() { can.page.Modify(can, target, can.base.Time()) }) - can.onappend.figure(can, {action: "date", _hold: true}, target, function(sub, value) { can.onimport.tabview(can, can.Option(nfs.PATH), "web.team.plan", ctx.INDEX) }) + can.onappend.figure(can, {action: "date", _hold: true}, target, function(sub, value) {}) }}]) can.page.Append(can, can.ui.tabs, [{view: [aaa.AVATAR], list: [{img: can.user.info.avatar}]}]) }, - _tabInputs: function(can, ps, key, value, cb) { + _tabInputs: function(can, ps, key, value, cb, target) { can.core.List(can.core.Split(value, ps), function(value, index, array) { - can.page.Append(can, can.ui.path, [{text: [value, html.SPAN, html.ITEM], onclick: function(event) { + can.page.Append(can, target, [{text: [value, html.SPAN, html.ITEM], onclick: function(event) { can.onimport.tabInputs(event, can, ps, key, array.slice(0, index).join(ps)+ps, cb) }}, index < array.length-1? {text: ps}: null]) }) @@ -53,36 +52,34 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl tabInputs: function(event, can, ps, key, pre, cb, parent) { can.runAction(event, mdb.INPUTS, [key, pre], function(msg) { var _trans = {} var carte = can.user[parent? "carteRight": "carte"](event, can, {}, msg.Table(function(value) { - var p = can.core.Split(value[key], ice.PS).pop()+(can.base.endWith(value[key], ice.PS)? ice.PS: ""); return _trans[p] = value[key], p + var p = can.core.Split(value[key], ps).pop()+(can.base.endWith(value[key], ps)? ps: ""); return _trans[p] = value[key], p }), function(event, button) { can.base.endWith(button, ps)? can.onimport.tabInputs(event, can, ps, key, pre+button, cb, carte): cb(can.core.Split(_trans[button], ps)) - }, parent)._target, _p = can.core.Split(event.target.innerHTML.trim(), ice.PT)[0] - can.page.Select(can, carte, html.DIV_ITEM, function(target) { target.innerHTML.trim() != event.target.innerHTML.trim() && can.base.beginWith(target.innerHTML, _p) && carte.insertBefore(target, carte.firstChild) }) + }, parent)._target, file = can.core.Split(event.target.innerHTML.trim(), ice.PT)[0] + can.page.Select(can, carte, html.DIV_ITEM, function(target) { target.innerHTML.trim() != event.target.innerHTML.trim() && can.base.beginWith(target.innerHTML, file+ice.PT) && carte.insertBefore(target, carte.firstChild) }) function remove(p) { if (p && p._sub) { remove(p._sub), can.page.Remove(can, p._sub), delete(p._sub) } } if (parent) { remove(parent), parent._sub = carte } }) }, tabview: function(can, path, file, line, cb) { var key = can.onexport.keys(can, path, file) - function isCommand() { return path == ctx.COMMAND || line == ctx.INDEX } + function isCommand() { return line == ctx.INDEX || path == ctx.COMMAND } function isDream() { return line == web.DREAM } function show(skip) { if (can.isCmdMode()) { can.onimport._title(can, 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.db.tabview[key] can.Option(can.onimport.history(can, {path: path, file: file, line: line||can.misc.localStorage(can, "web.code.vimer:selectLine:"+path+file)||can._msg.Option(nfs.LINE)||1})) can.onsyntax._init(can, can._msg, function(content) { var msg = can._msg can.onexport.hash(can), can.onmotion.select(can, can.ui.tabs, html.DIV_TABS, msg._tab) - if (can.ui.path) { can.ui.path.innerHTML = "" - if (isCommand()) { - can.ui.path.innerHTML = can.Option(nfs.FILE) - } else if (isDream()) { - can.ui.path.innerHTML = can.page.Format(html.A, can.misc.MergePodCmd(can, {pod: can.Option(nfs.FILE)})) - } else { - can.onimport._tabInputs(can, ice.PS, nfs.PATH, can.base.Path(can.Option(nfs.PATH), can.Option(nfs.FILE)), function(ls) { - if (ls[0] == ice.SRC) { - 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)) - } - }) - } + if (isCommand()) { + can.ui.path.innerHTML = can.Option(nfs.FILE) + } else if (isDream()) { + can.ui.path.innerHTML = can.page.Format(html.A, can.misc.MergePodCmd(can, {pod: can.Option(nfs.FILE)})) + } else { can.ui.path.innerHTML = "" + can.onimport._tabInputs(can, ice.PS, nfs.PATH, can.base.Path(can.Option(nfs.PATH), can.Option(nfs.FILE)), function(ls) { + if (ls[0] == ice.SRC) { + 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.ui.path) } can.page.SelectChild(can, can.ui._content.parentNode, can.page.Keys(html.DIV_CONTENT, [[[html.IFRAME, html.CONTENT]]]), function(item) { if (can.onmotion.toggle(can, item, item == msg._content)) { can.ui.content = msg._content } @@ -92,62 +89,57 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl }), can.ui.current && can.onmotion.toggle(can, can.ui.current, !isCommand() && !isDream()) var ls = can.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.parse)), can.onimport.layout(can) - skip || can.onaction.selectLine(can, can.Option(nfs.LINE)), can.base.isFunc(cb) && cb(), cb = null + if (!skip) { can.onaction.selectLine(can, can.Option(nfs.LINE)), can.onaction.scrollIntoView(can) } can.base.isFunc(cb) && cb(), cb = null }) } - function load(msg) { can.tabview[key] = msg + 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}], function(event) { - can._tab = msg._tab = event.target, show(true) + can._tab = msg._tab = event.target, show(skip), skip = true }, function(item) { can.onengine.signal(can, "tabview.view.delete", 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.tabview[key]) + delete(can._cache_data[key]), delete(can.db.tabview[key]) }, can.ui.tabs) } - if (can.tabview[key]) { return !can._msg._tab && !can.isSimpleMode()? load(can.tabview[key]): show() } + 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) }, history: function(can, record) { - can.base.Eq(record, can.history[can.history.length-1]) || can.history.push(record) - return can.Status("跳转数", can.history.length), 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 }, project: function(can, path) { can.onimport.zone(can, can.core.Item(can.onfigure, function(name, cb) { if (can.base.isFunc(cb)) { return {name: 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.tabview[can.onexport.keys(can)] + profile: function(can, msg) { var sup = can.db.tabview[can.onexport.keys(can)] if (msg.Result().indexOf("