diff --git a/frame.js b/frame.js index b2073e5c..005aac05 100644 --- a/frame.js +++ b/frame.js @@ -1098,7 +1098,7 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { }, 300) }, cacheClear: function(can, key) { delete(can._cache_data[key]) - can.core.List(arguments, function(target, index) { index > 1 && delete(target._cache[key]) }) + can.core.List(arguments, function(target, index) { index > 1 && target && target._cache && delete(target._cache[key]) }) }, cache: function(can, next) { var list = can.base.getValid(can.base.Obj(can.core.List(arguments).slice(2)), [can._output]) var data = can._cache_data = can._cache_data||{}, old = list[0]._cache_key diff --git a/index.css b/index.css index 562d1174..b82249fd 100644 --- a/index.css +++ b/index.css @@ -665,7 +665,7 @@ div.item.text.id>input { width:80px; } div.item.text.url>input { width:var(--river-width); } div.item.text.port>input { width:80px; } div.item.text.line>input { width:80px; } -div.item.text.path>input { width:var(--project-width); } +fieldset.plugin>form.option>div.item.text.path>input { width:var(--project-width); } div.item.text.limit>input { width:var(--button-width); } div.item.text.offend>input { width:var(--button-width); } body:not(.width2):not(.mobile) fieldset.plugin>form.option>div.item.text.path>input { width:var(--project-width); } diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 427d9719..d5b89d4f 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -16,19 +16,20 @@ fieldset.inner>div.output>div.project div.zone.space>div.list div.output>div.ite fieldset.inner>div.output>div.layout>div.tabs { font-size:var(--code-font-size); display:none; } fieldset.inner>div.output>div.layout>div.tabs>div:hover { background-color:unset; color:unset; box-shadow:unset; } fieldset.inner>div.output>div.layout>div.tabs>div.tabs>div.tabs { padding-right:0; } -fieldset.inner>div.output>div.layout>div.tabs>div.tabs>div.tabs.select { background-color:var(--output-bg-color); color:unset; border-top:var(--box-border3); box-shadow:var(--legend-box-shadow);} +fieldset.inner>div.output>div.layout>div.tabs>div.tabs>div.tabs.select { background-color:var(--output-bg-color); color:unset; border-top:var(--box-notice3); box-shadow:var(--legend-box-shadow);} +fieldset.vimer>div.output>div.layout>div.tabs>div.tabs>div.tabs.select { border-top:var(--box-border3); } fieldset.inner>div.output>div.layout>div.tabs>div.tabs>div.tabs:hover { background-color:var(--output-bg-color); color:unset; box-shadow:var(--legend-box-shadow); } fieldset.inner>div.output>div.layout>div.path { font-size:var(--code-font-size); display:none; } fieldset.inner.cmd>div.output>div.layout>div.path:not(.hide) { display:flex; } -fieldset.inner>div.output>div.layout>div.path:not(.hide) { font-style:italic; box-shadow:var(--legend-box-shadow); cursor:pointer; justify-content:flex-start; } +fieldset.inner>div.output>div.layout>div.path:not(.hide) { box-shadow:var(--legend-box-shadow); font-style:italic; cursor:pointer; justify-content:flex-start; align-items:center; } fieldset.inner>div.output>div.layout>div.path>a { padding:var(--input-padding) var(--button-padding); } fieldset.inner>div.output>div.layout>div.path>a:hover { background-color:var(--hover-bg-color); } fieldset.inner>div.output>div.layout>div.path>span { padding:var(--input-padding); white-space:pre; } fieldset.inner>div.output>div.layout>div.path>span:hover { background-color:var(--hover-bg-color); } fieldset.inner>div.output>div.layout>div.path span.func { padding:var(--input-padding); } fieldset.inner>div.output>div.layout>div.path span.mode { padding:var(--input-padding); } -fieldset.inner>div.output>div.layout>div.path span.space { flex-grow:1; } -fieldset.inner>div.output>div.layout>div.path span.space:hover { background-color:unset; cursor:normal; } +fieldset.inner>div.output>div.layout>div.path span._space { flex-grow:1; } +fieldset.inner>div.output>div.layout>div.path span._space:hover { background-color:unset; cursor:normal; } fieldset.inner>div.output>div.layout>div.path span.view { font-size:22px; font-style:normal; padding:0 var(--input-padding); margin-top:-5px; float:right; } fieldset.inner>div.output>div.layout>div.display h1 { border-bottom:var(--box-border); margin:var(--title-margin) 0; } fieldset.inner>div.output>div.layout>div.display h2 { border-bottom:var(--box-border); margin:var(--title-margin) 0; } @@ -43,16 +44,18 @@ fieldset.inner>div.output>div.layout>div.layout>div.profile pre>code { padding-l fieldset.inner>div.output>div.layout>div.layout>div.profile>div.code { white-space:unset; padding:var(--table-padding); } fieldset.inner>div.output>div.layout>div.layout>div.profile div.status>div { padding:var(--input-padding); float:left; } fieldset.inner>div.output>div.layout>div.layout div.content div.tips { color:var(--disable-fg-color); font-style:italic; line-height:var(--code-line-height); position:absolute; top:0; right:10px; } +fieldset.inner>div.output>div.layout>div.layout>fieldset.story { margin:var(--plugin-margin) 0; } fieldset.inner.cmd>div.output>div.layout>div.tabs:not(.hide) { background-color:var(--plugin-bg-color); height:var(--code-tabs-height); display:flex; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div { height:var(--code-tabs-height); } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.icon>div.icon { font-size:26px; line-height:32px; padding:2px 5px; position:sticky; top:0; } -fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs { justify-content:flex-start; flex-grow:1; flex-wrap:wrap; overflow:auto; } +fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs { justify-content:flex-start; flex-grow:1; flex-wrap:wrap; overflow:auto; display:flex; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs:hover { background-color:unset; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.tabs>div.tabs { padding:var(--input-padding) var(--button-padding); margin-right:var(--button-margin); height:var(--code-tabs-height); display:flex; align-items:center; } -fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head { flex-direction:row-reverse; } +fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head { flex-direction:row-reverse; display:flex; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div { white-space:pre; padding:0 var(--input-padding); height:var(--code-tabs-height); display:flex; align-items:center; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.online { margin-left:0 !important; margin-right:0 !important; flex-direction: row-reverse; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.online img { height:24px; } +fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.qrocde { padding-top:5px; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.avatar { padding:0; } fieldset.inner.cmd>div.output>div.layout>div.tabs>div.head>div.avatar>img { height:32px; clip-path:circle(40%); } fieldset.inner.cmd>div.output>div.layout>div.plug { box-shadow:var(--th-box-shadow); height:var(--action-height); overflow:auto; } @@ -64,6 +67,8 @@ fieldset.inner.cmd>div.output>div.layout>div.plug>legend:not(:hover)>span.remove fieldset.inner fieldset.plug.can._plugin.search>form.option>div.item.value input { width:var(--project-width); } fieldset.inner fieldset.plug.can._plugin.search>form.option>div.item.filter input { width:var(--project-width); } fieldset.inner:not(.monaco)>div.output div.content>tr.line * { font-family:var(--code-font-family); font-size:var(--code-font-size); } +fieldset.inner>div.output>div.layout>div.layout div.content tr.line.select>td.line { background-color:var(--notice-bg-color); color:white; } +fieldset.vimer>div.output>div.layout>div.layout div.content tr.line.select>td.line { background-color:unset; color:unset; } fieldset.inner.float>div.output>div.layout>div.path { font-size:var(--code-font-size); display:flex; } fieldset.Action.tabview fieldset.plugin.inner>div.output>div.layout>div.path { font-size:var(--code-font-size); display:flex; } div.input.vimer.find div.action div.item { margin:var(--input-margin); } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 5e52c155..601f7ef6 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -5,66 +5,77 @@ const PROFILE_ARGS = "profile:args:", DISPLAY_ARGS = "display:args:" const CURRENT_FILE = "web.code.inner:currentFile", SELECT_LINE = "selectLine" const VIEW_CREATE = "tabview.view.create", VIEW_REMOVE = "tabview.view.remove", LINE_SELECT = "tabview.line.select" Volcanos(chat.ONIMPORT, { - _init: function(can, msg, cb) { can.onappend.style(can, code.INNER) - var paths = can.core.Split(can.Option(nfs.PATH), mdb.FS); can.Option(nfs.PATH, paths[0]) - can.core.List([nfs.PATH, nfs.FILE, nfs.LINE], function(key) { msg.Option(key) && can.Option(key, msg.Option(key)) }) - can.Mode(msg.Option("mode")||can.Mode()) + _init: function(can, msg, cb) { can.onappend.style(can, code.INNER), can.Mode(msg.Option("mode")||can.Mode()) if (can.Mode() == ice.MSG_RESULT) { msg.result = msg.result||[can._output.innerHTML], can.Mode(chat.SIMPLE), can.sup.Mode(chat.SIMPLE) } can.onmotion.clear(can, can._output), msg.result = msg.result||[""] - - can.db = {paths: paths, tabview: {}, history: [], _history: [], toolkit: {}}, can.db.tabview[can.onexport.keys(can)] = msg + var paths = can.core.Split(can.Option(nfs.PATH), mdb.FS); can.Option(nfs.PATH, paths[0]) + can.core.List([nfs.PATH, nfs.FILE, nfs.LINE], function(key) { msg.Option(key) && can.Option(key, msg.Option(key)) }) + var hash = can.misc.SearchHash(can); if (can.Option(nfs.PATH) == hash[0] && can.Option(nfs.FILE) == hash[1]) { can.Option(nfs.LINE, hash[2]) } + can.db = {tabview: {}, history: [], _history: [], toolkit: {}}, can.db.tabview[can.onexport.keys(can)] = msg can.ui = can.onappend.layout(can, [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.project), can.onmotion.hidden(can, can.ui.profile), can.onmotion.hidden(can, can.ui.display) - can.onmotion.toggle(can, can.ui.tabs, true), can.onmotion.hidden(can, can.ui.plug) - can.onimport._tabs(can) - - var args = can.misc.SearchHash(can) - var tool = (can.base.Obj(msg.Option(ice.MSG_TOOLKIT), []).reverse()); msg.Option(ice.MSG_TOOLKIT, "[]") - // var tool = can.onexport.session(can, RECOVER_TOOL)||(can.base.Obj(msg.Option(ice.MSG_TOOLKIT), []).reverse()); msg.Option(ice.MSG_TOOLKIT, "[]") - can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE), function() { cb && cb(msg) - switch (can.Mode()) { - case chat.SIMPLE: // no break - case chat.FLOAT: ; break - case chat.CMD: can.onappend.style(can, html.OUTPUT) - can.onexport.session(can, PROJECT_HIDE) == html.HIDE && can.onmotion.hidden(can, can.ui.project) - if (can.onexport.session(can, TABVIEW_HIDE) == html.HIDE) { can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.tabs) } - case chat.FULL: // no break - default: - can.run({}, [ctx.ACTION, nfs.REPOS], function(msg) { - can.core.List(paths.concat(msg.Table(function(value) { return value.path })), function(p) { - if (can.base.beginWith(p, nfs.USR_LOCAL_WORK) || can.base.isIn(p, nfs.USR_WEBSOCKET, nfs.USR_GO_QRCODE, nfs.USR_GO_GIT, nfs.USR_ICONS, nfs.USR_GEOAREA, nfs.USR_PROGRAM, nfs.USR_NODE_MODULES)) { return } - if (p && paths.indexOf(p) == -1 && p[0] != nfs.PS) { paths.push(p) } - }), can.onmotion.toggle(can, can.ui.project), can.onimport.project(can, paths), can.onkeymap._build(can) - can.user.isMobile && can.onmotion.hidden(can, can.ui.project) - tool && can.core.Next(tool, function(item, next) { can.onimport.toolkit(can, item, next) }) - }) - } - args && args.length > 1 && can.onmotion.delay(can, function() { - can.onimport.tabview(can, args[args.length-3], args[args.length-2]||can.Option(nfs.FILE), args[args.length-1]) - }, 300) + can.onmotion.clear(can, can.ui.project), can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.tabs), can.onmotion.hidden(can, can.ui.plug) + var show = !can.user.isMobile + switch (can.Mode()) { + case chat.SIMPLE: // no break + case chat.FLOAT: break + case chat.CMD: can.onappend.style(can, html.OUTPUT) + if (can.onexport.session(can, PROJECT_HIDE) == html.HIDE) { show = false } + if (can.onexport.session(can, TABVIEW_HIDE) == html.HIDE) { show = false } else { can.onmotion.toggle(can, can.ui.tabs, true), can.onmotion.toggle(can, can.ui.plug, true) } + var tool = (can.base.Obj(msg.Option(ice.MSG_TOOLKIT), []).reverse()); msg.Option(ice.MSG_TOOLKIT, "[]") + can.onimport._tabs(can), tool && tool.length > 0? can.core.Next(tool, function(item, next) { can.onimport.toolkit(can, item, next) }): can.onmotion.hidden(can, can.ui.plug) + case chat.FULL: // no break + default: can.onmotion.toggle(can, can.ui.project, show), can.onimport.project(can, can.db.paths = paths), can.onkeymap._build(can) + } can.onimport.layout(can), can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE), function() { cb && cb(msg) + can.isCmdMode() && hash.length > 1 && can.onimport.tabview(can, hash[0], hash[1], hash[2]) }) }, _tabs: function(can) { if (!can.isCmdMode()) { return can.ui._tabs = can._action } - var ui = can.page.Append(can, can.ui.tabs, ["icon", "tabs", "head"]); can.ui._tabs = ui.tabs - false && can.page.Append(can, ui.icon, can.core.List([ - {name: can.page.unicode.menu, onclick: function() { can.user.carte(event, can, can.onaction, can.onaction.list) }}, - {name: can.page.unicode.refresh, style: {"font-size": 26, "padding-top": 2}, onclick: function() { location.reload() }}, - ], function(item) { return can.base.Copy(item, {view: [[html.ITEM, html.ICON], "", item.name]}) })) - can.onappend.style(can, html.FLEX, ui.head) - can.onappend.style(can, html.FLEX, ui.tabs) - can.onappend.style(can, html.FLEX, ui.icon) - can.page.Append(can, ui.head, can.user.header(can)) + var ui = can.page.Append(can, can.ui.tabs, ["tabs", "head"]); can.ui._tabs = ui.tabs, can.page.Append(can, ui.head, can.user.header(can)) }, - __tabPath: function(can, cache) { var target = can.ui.path; can.onappend.style(can, html.FLEX, can.ui.path) + _tabIcon: function(can) { + can.page.Append(can, can.ui.path, can.core.Item({ + "\u271A": shy({transform: "translate(0 2px)"}, function(event) { can.onaction.open(event, can, "open") }), + "\u2756": shy({}, function(event) { can.onaction.plug(event, can, "plug") }), + "\u25E7": function(event) { var show = can.onmotion.toggle(can, can.ui.project); can.onimport.layout(can), can.isCmdMode() && can.onexport.session(can, PROJECT_HIDE, show? "": html.HIDE) }, + "\u25E8": shy({transform: "rotate(90deg) translate"+(can.user.isWindows? "(-2px)": "(1px,-2px)")}, function(event) { + if (can.page.isDisplay(can.ui.display)) { + return can.onmotion.hidden(can, can.ui.display), can.onimport.layout(can) } can.onaction.exec(event, can) }), + "\u25E8 ": function(event) { if (can.page.isDisplay(can.ui.profile)) { + can._msg._profile_hidden = true + return can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can) } can.onaction.show(event, can) }, + }, function(text, cb) { return cb && {text: [text, html.SPAN, html.VIEW], style: cb.meta, onclick: cb} })) + }, + _tabMode: function(can) { + var mode = can.db.mode||"", target = can.ui.current; if (target && mode != mdb.PLUGIN) { mode += lex.SP+target.selectionStart+nfs.PS+target.value.length } + can.page.Append(can, can.ui.path, [{text: [mode, "", [ice.MODE, can.db.mode||""]], onclick: function(event) { + var list = {}; can.core.Item(can.onkeymap._mode[can.db.mode], function(k, cb) { list[cb.help+lex.TB+k] = function(event, can, button) { can.core.CallFunc(cb, {event: event, can: can}) } }) + can.core.Item(can.onkeymap._mode[can.db.mode+"_ctrl"], function(k, cb) { list[cb.help+lex.TB+"C-"+k] = function(event, can, button) { can.core.CallFunc(cb, {event: event, can: can}) } }) + can.user.carte(event, can, list, []) + }}]) + }, + _tabFunc: function(can, target, cache) { + if (cache) { var func = can.db._func||{list: []} } else { var func = can.onexport.func(can); can.db._func = func } + if (func.list.length > 0) { can.db.tabFunc = can.db.tabFunc||{} + var last = can.db.tabFunc[can.Option(nfs.PATH)+can.Option(nfs.FILE)]||{}; can.db.tabFunc[can.Option(nfs.PATH)+can.Option(nfs.FILE)] = last + var carte, list = [web.FILTER]; can.core.Item(last, function(key) { list.push(key) }), list = list.concat(func.list) + } + can.page.Append(can, target, [{view: [[html.ITEM, "func"], html.SPAN, (func.current||"func")+nfs.PS+can.ui.content._max+func.percent+lex.SP+can.base.Size(can._msg.result[0].length)], onclick: function(event) { + carte = can.user.carte(event, can, {_style: nfs.PATH}, list, function(ev, button) { last[button] = true, carte.close() + can.onimport.tabview(can, "", can.Option(nfs.FILE), can.core.Split(button, nfs.DF, nfs.DF).pop()) + }) + can.onmotion.delay(can, function() { can.page.Select(can, carte._target, html.DIV_ITEM, function(target) { + can.onappend.style(can, can.base.beginWith(target.innerText, "- ")? aaa.PRIVATE: aaa.PUBLIC, target) + }) }) + }}]) + }, + __tabPath: function(can, cache) { var target = can.ui.path + function _space(grow) { can.page.Append(can, target, [{view: ["_space", html.SPAN], style: {"flex-grow": grow||"1"}}]) } can.onimport._tabPath(can, nfs.PS, nfs.PATH, can.base.Path(can.Option(nfs.PATH), can.Option(nfs.FILE)), function(p) { var ls = can.onexport.split(can, p); can.onimport.tabview(can, ls[0], ls[1]) - }, target), can.page.Append(can, target, [{view: [["item", "space"], html.SPAN]}]) - can.onimport._tabFunc(can, target, cache), can.page.Append(can, target, [{view: [["item", "space"], html.SPAN]}]) - can.onimport._tabMode(can), can.page.Append(can, target, [{view: [["item", "space"], html.SPAN], style: {"flex-grow": "4"}}]) - can.onimport._tabIcon(can) - target.ondblclick = function(event) { if (event.target != target) { return } - var show = can.onmotion.toggle(can, can.ui.tabs); can.onmotion.toggle(can, can.ui.project, show), can.onimport.layout(can) + }, target), _space(), can.onimport._tabFunc(can, target, cache), _space(), can.onimport._tabMode(can), _space("4"), can.onimport._tabIcon(can) + target.ondblclick = function(event) { if (event.target != target && !can.page.tagis(event.target, "span._space")) { return } + var show = can.onmotion.toggle(can, can.ui.tabs); can.onmotion.toggle(can, can.ui.plug, show), can.onmotion.toggle(can, can.ui.project, show), can.onimport.layout(can) can.isCmdMode() && can.onexport.session(can, TABVIEW_HIDE, show? "": html.HIDE) } }, @@ -73,12 +84,7 @@ Volcanos(chat.ONIMPORT, { can.page.Append(can, target, [{text: [value+(index 10? [web.FILTER]: []).concat(msg.Table(function(value) { @@ -91,63 +97,24 @@ Volcanos(chat.ONIMPORT, { target.innerHTML.trim() == event.target.innerHTML.trim() && can.onappend.style(can, html.SELECT, target) }) }) }, - _tabFunc: function(can, target, cache) { - if (cache) { var func = can.db._func||{list: []} } else { var func = can.onexport.func(can); can.db._func = func } - if (func.list.length > 0) { can.db.tabFunc = can.db.tabFunc||{} - var last = can.db.tabFunc[can.Option(nfs.PATH)+can.Option(nfs.FILE)]||{}; can.db.tabFunc[can.Option(nfs.PATH)+can.Option(nfs.FILE)] = last - var carte, list = [web.FILTER]; can.core.Item(last, function(key) { list.push(key) }), list = list.concat(func.list) - } - can.page.Append(can, target, [{view: [[html.ITEM, "func"], html.SPAN, (func.current||"func")+nfs.PS+can.ui.content._max+func.percent+lex.SP+can.base.Size(can._msg.result[0].length)], onclick: function(event) { - carte = can.user.carte(event, can, {_style: nfs.PATH}, list, function(ev, button) { last[button] = true, carte.close() - can.onimport.tabview(can, "", can.Option(nfs.FILE), can.core.Split(button, nfs.DF, nfs.DF).pop()) - }) - can.onmotion.delay(can, function() { - can.page.Select(can, carte._target, html.DIV_ITEM, function(target) { - can.onappend.style(can, can.base.beginWith(target.innerText, "- ")? aaa.PRIVATE: aaa.PUBLIC, target) - }) - }) - }}]) - }, - _tabMode: function(can) { - var mode = can.db.mode||"", target = can.ui.current; if (target && mode != mdb.PLUGIN) { mode += lex.SP+target.selectionStart+nfs.PS+target.value.length } - can.page.Append(can, can.ui.path, [{text: [mode, "", [ice.MODE, can.db.mode||""]], onclick: function(event) { - var list = {}; can.core.Item(can.onkeymap._mode[can.db.mode], function(k, cb) { list[cb.help+lex.TB+k] = function(event, can, button) { can.core.CallFunc(cb, {event: event, can: can}) } }) - can.core.Item(can.onkeymap._mode[can.db.mode+"_ctrl"], function(k, cb) { list[cb.help+lex.TB+"C-"+k] = function(event, can, button) { can.core.CallFunc(cb, {event: event, can: can}) } }) - can.user.carte(event, can, list, []) - }}]) - }, - _tabIcon: function(can) { - can.page.Append(can, can.ui.path, can.core.Item({ - "\u271A": shy({transform: "translate(0 2px)"}, function(event) { can.onaction.open(event, can, "open") }), - "\u2756": shy({}, function(event) { can.onaction.plug(event, can, "plug") }), - "\u25E7": function(event) { var show = can.onmotion.toggle(can, can.ui.project); can.onimport.layout(can), can.isCmdMode() && can.onexport.session(can, PROJECT_HIDE, show? "": html.HIDE) }, - "\u25E8": shy({transform: "rotate(90deg) translate"+(can.user.isWindows? "(-2px)": "(1px,-2px)")}, function(event) { if (can.page.isDisplay(can.ui.display)) { return can.onmotion.hidden(can, can.ui.display), can.onimport.layout(can) } can.onaction.exec(event, can) }), - "\u25E8 ": function(event) { if (can.page.isDisplay(can.ui.profile)) { return can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can) } can.onaction.show(event, can) }, - }, function(text, cb) { return cb && {text: [text, html.SPAN, html.VIEW], style: cb.meta, onclick: cb} })) - }, tabview: function(can, path, file, line, cb) { path = path||can.Option(nfs.PATH); var key = can.onexport.keys(can, path, file) function isIndex() { return line == ctx.INDEX } function isSpace() { return line == web.SPACE } function show(skip) { can._msg && can._msg.Option && 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.onexport.session(can, SELECT_LINE+nfs.DF+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.toggle(can, can.ui.path, true) - can.isCmdMode() && can.onexport.title(can, (isIndex()||isSpace()? "": path)+file), can.onmotion.select(can, can.ui._tabs, html.DIV_TABS, msg._tab), can.isCmdMode() && msg._tab.scrollIntoView() - if (isSpace()) { - can.ui.path.innerHTML = can.page.Format(html.A, can.base.trimPrefix(can.misc.MergePodCmd(can, {pod: can.Option(nfs.FILE)}), location.origin)) + can.Option(can.onimport.history(can, {path: path, file: file, line: line||can._msg.Option(nfs.LINE)||can.onexport.session(can, SELECT_LINE+nfs.DF+path+file)||1})) + can.onsyntax._init(can, can._msg, function(content) { var msg = can._msg; can.onexport.hash(can), can.isCmdMode() && can.onexport.title(can, (isIndex()||isSpace()? "": path)+file) + can.onmotion.select(can, can.ui._tabs, html.DIV_TABS, msg._tab), can.isCmdMode() && msg._tab.scrollIntoView(), can.onmotion.toggle(can, can.ui.path, true) + if (isSpace()) { can.ui.path.innerHTML = can.page.Format(html.A, can.base.trimPrefix(can.misc.MergePodCmd(can, {pod: can.Option(nfs.FILE)}), location.origin)) } else if (isIndex()) { can.onmotion.hidden(can, can.ui.path) - can.onimport._tabPath(can, nfs.PT, ice.CMD, can.Option(nfs.FILE), function(p, pre) { - can.onimport.tabview(can, "", can.core.Keys(can.base.trimSuffix(pre, nfs.PT), p), ctx.INDEX) - }, can.ui.path) } else { can.onimport.__tabPath(can) } - can.page.SelectChild(can, can.ui._profile.parentNode, can.page.Keys(html.DIV_LAYOUT, html.DIV_CONTENT, html.FIELDSET_STORY, [[[html.IFRAME, html.CONTENT]]]), function(target) { + can.page.SelectChild(can, can.ui._content.parentNode, can.page.Keys(html.DIV_CONTENT, html.DIV_LAYOUT, html.FIELDSET_STORY, [[[html.IFRAME, html.CONTENT]]]), function(target) { can.onmotion.toggle(can, target, target == content) - }), can.ui.content._plugin = msg._plugin, can.ui.profile._plugin = msg._profile + }), can.ui.content._plugin = msg._plugin can.page.SelectChild(can, can.ui._profile.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 } - }) + if (target == msg._profile) { can.ui.profile = msg._profile, msg._profile_hidden || can.onmotion.toggle(can, target, true) } + }), can.ui.profile._plugin = msg._profile can.onimport.layout(can), can.ui.current && can.onmotion.toggle(can, can.ui.current, !isIndex() && !isSpace()) skip || can.onmotion.delay(can, function() { can.onaction.selectLine(can, can.Option(nfs.LINE), true) }), can.base.isFunc(cb) && cb(), cb = null - var ls = can.onexport.path(can).split(nfs.PS); if (ls.length > 4) { ls = [ls.slice(0, 2).join(nfs.PS)+"/.../"+ls.slice(-2).join(nfs.PS)] } - can.Status(kit.Dict(nfs.FILE, ls.join(nfs.PS))) + var ls = can.onexport.path(can).split(nfs.PS); if (ls.length > 4) { ls = [ls.slice(0, 2).join(nfs.PS)+"/.../"+ls.slice(-2).join(nfs.PS)] } can.Status(kit.Dict(nfs.FILE, ls.join(nfs.PS))) }) } function load(msg) { var skip = false; can.db.tabview[key] = msg; var name = file @@ -160,15 +127,13 @@ Volcanos(chat.ONIMPORT, { var tabs = can.onimport.tabs(can, [{name: name, text: file, _menu: shy([nfs.SAVE, nfs.TRASH, web.REFRESH], function(event, button, meta) { can.request(event, msg), can.onaction[button](event, can, button) })}], function(event, tabs) { can._tab = msg._tab = tabs._target, show(skip), skip = true - can.onmotion.delay(can, function() { - var item = can.ui.zone && can.ui.zone.source && can.ui.zone.source[path+file]; if (!item) { return } - item._tabs = tabs._target, can.page.ClassList.has(can, item, html.SELECT) || can.ui.zone.source[path+file].click() }) - }, function(tabs) { can.onengine.signal(can, VIEW_REMOVE, msg) // , can.ui.zone.source.refresh() - msg.__content || can.page.Remove(can, msg._content), msg._profile != can.ui._profile && can.page.Remove(can, msg._profile) - can.ui._profile._cache && delete(can.ui._profile._cache[key]), can.ui._display._cache && delete(can.ui._display._cache[key]) - delete(can.db.tabview[key]), can._cache_data && delete(can._cache_data[key]) - can.onmotion.delay(can, function() { can.user.isWebview && can.onexport.recover(can) }) - }, can.ui._tabs); tabs._list = [path, file, line], can.user.isWebview && can.onexport.recover(can) + can.onmotion.delay(can, function() { var item = can.ui.zone && can.ui.zone.source && can.ui.zone.source[path+file]; if (!item) { return } + item._tabs = tabs._target, can.page.ClassList.has(can, item, html.SELECT) || can.ui.zone.source[path+file].click() + }) + }, function(tabs) { can.onengine.signal(can, VIEW_REMOVE, msg), delete(can.db.tabview[key]) + msg._content != can.ui._content && can.page.Remove(can, msg._content), msg._profile != can.ui._profile && can.page.Remove(can, msg._profile) + can.onmotion.cacheClear(can, key, can.ui._content, can.ui._profile, can.ui._display) + }, can.ui._tabs) } if (can.db.tabview[key]) { return !can._msg._tab && !can.isSimpleMode()? load(can.db.tabview[key]): show() } isIndex()||isSpace()? load(can.request({}, {index: file, line: line})): can.run({}, [path, file], load, true) @@ -176,11 +141,11 @@ Volcanos(chat.ONIMPORT, { history: function(can, record) { can.base.Eq(record, can.db.history[can.db.history.length-1], mdb.TEXT) || can.db.history.push(record) return can.Status(ice.BACK, can.db.history.length), record }, - project: function(can, path) { if (can.Conf(ctx.STYLE) == html.OUTPUT) { return can.onmotion.hidden(can, can.ui.project) } - can.onmotion.clear(can, can.ui.project), can.onimport.zone(can, can.core.Item(can.onfigure, function(name, cb) { - if (can.base.isFunc(cb)) { return {name: name, icon: cb.meta? cb.meta.icon: "", _trans: can.onfigure._trans? can.onfigure._trans[name]||"": "", _toggle: function() { can.onimport.layout(can) }, _init: function(target, zone) { return cb(can, target, zone, path) }} } - }), can.ui.project) - }, + project: function(can) { can.onimport.zone(can, can.core.Item(can.onfigure, function(name, cb) { if (can.base.isFunc(cb)) { + return {name: name, _toggle: function(zone) { var target = can.page.isDisplay(zone._target)? zone._target: can.ui.zone.source._target + can.core.Item(can.ui.zone, function(key, zone) { key.indexOf("/") > 0 || zone.toggle(zone._target == target) }), can.onimport.layout(can) + }, _init: function(target, zone) { return cb(can, target, zone) }} + } }), can.ui.project) }, profile: function(can, msg) { var _msg = can.db.tabview[can.onexport.keys(can)]; _msg.Option(html.WIDTH, msg.Option(html.WIDTH)), border = 1 var height = (can.ui.content._root||can.ui.content).offsetHeight, width = can.onexport.size(can, _msg.Option(html.WIDTH)||0.5, can.ConfWidth()-can.ui.project.offsetWidth)+border if (msg.Result().indexOf("