diff --git a/frame.js b/frame.js index 97ebd16b..9ca13a24 100644 --- a/frame.js +++ b/frame.js @@ -3,7 +3,7 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, can.core.Next(list, function(item, next) { item.type = "pane" can.onappend._init(can, item, item.list, function(pane) { pane.Status = pane.Status || function(key, value) { pane.run({}, ["search", "Footer.onimport."+key, value]) } - pane.onaction && pane.onappend._action(pane, pane._action, item.action||pane.onaction.list) + pane.onaction && pane.onappend._action(pane, item.action||pane.onaction.list) pane.run = function(event, cmds, cb, silent) { var msg = pane.request(event); cmds = cmds || [] return (can.onengine[cmds[0]]||can.onengine[meta.main.engine]||can.onengine.remote)(event, can, msg, pane, cmds, cb) @@ -162,7 +162,7 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, }, }) Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, list, cb, target, field) { - meta.name = meta.name.split(" ")[0] + meta.name = meta.name || "", meta.name = meta.name.split(" ")[0] field = field || can.onappend.field(can, target, meta.type, meta).first var legend = can.page.Select(can, field, "legend")[0] var option = can.page.Select(can, field, "form.option")[0] @@ -195,8 +195,10 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, Status: function(key, value) { if (typeof key == "object") { return sub.core.Item(key, sub.Status), key } sub.page.Select(sub, status, "div."+key+">span", function(item) { - value == undefined? (value = item.innerHTML): (item.innerHTML = value) - }); return value + return value == undefined? (value = item.innerHTML): (item.innerHTML = value) + }).length == 0 && value != undefined && sub.page.Append(sub, status, [{view: "item "+key, list: [ + {text: [key, "label"]}, {text: [": ", "label"]}, {text: [value+"", "span", key]}, + ]}]); return value }, Clone: function() { meta.args = sub.page.Select(sub, option, "textarea.args,input.args,select.args", function(item) { @@ -246,17 +248,17 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }); return can._inputs[item.name] = input }; can.core.Next(can.base.Obj(meta.inputs, []), add) }, - _action: function(can, action, list) { + _action: function(can, list, action, meta) { action = action || can._action, meta = meta || can.onaction can.onmotion.clear(can, action), can.core.List(list, function(item) { item === ""? /*空白*/ can.page.Append(can, action, [{view: "item space"}]): typeof item == "string"? /*按键*/ can.onappend.input(can, action, "input", {type: "button", value: item, onclick: function(event) { - var cb = can.onaction[item] || can.onaction["_engine"] || can.onkeymap && can.onkeymap._remote + var cb = meta[item] || meta["_engine"] || can.onkeymap && can.onkeymap._remote typeof cb == "function"? cb(event, can, item): can.run(event, ["action", item], function(msg) {}, true) }}): item.length > 0? /*列表*/ can.onappend.input(can, action, "input", {type: "select", name: item[0], values: item.slice(1), title: item[0], onchange: function(event) { var which = item[event.target.selectedIndex+1] - var cb = can.onaction[which] + var cb = meta[which] typeof cb == "function" && cb(event, can, which) - var cb = can.onaction[item[0]] + var cb = meta[item[0]] typeof cb == "function" && cb(event, can, item[0], which) }}): item.input? /*文本*/ can.page.Append(can, action, [{view: "item", list: [{type: "input", name: item.input[0], onkeydown: function(event) { item.input[1](event, can) @@ -269,7 +271,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, item.name && item.value && msg.Option(item.name, item.value) }) - can.run(event, cmds||[], function(msg) { + return can.run(event, cmds||[], function(msg) { if (can.onimport._process(can, msg, cmds, cb)) { return } typeof cb == "function" && cb(msg) if (silent) { return } @@ -290,9 +292,9 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }, table._msg = msg msg && table.onimport && table.onimport._init && table.onimport._init(table, msg, msg.result||[], function(msg) { - table.onaction && table.onappend._action(table, table._action, msg._action||meta._action||table.onaction.list) + table.onaction && table.onappend._action(table, msg._action||meta._action||table.onaction.list, table._action) table.ondetail && table.onappend._detail(table, table._output, msg._detail||meta._detail||table.ondetail.list) - table.onexport && table.onappend._status(table, table._status, msg._export||meta._export||table.onexport.list) + table.onexport && table.onappend._status(table, msg._export||meta._export||table.onexport.list, table._status) }, can._output) }); can._outputs.push(output) }, silent) @@ -304,7 +306,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }) }) }, - _status: function(can, status, list) { + _status: function(can, list, status) { status = status || can._status can.onmotion.clear(can, status), can.core.List(list, function(item) { can.page.Append(can, status, [{view: "item "+item, title: item, list: [ {text: [item, "label"]}, {text: [": ", "label"]}, {text: ["", "span"]}, @@ -336,7 +338,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }) }) }, - field: function(can, target, type, item) { + field: function(can, target, type, item) { type = type || "input", item = item || {} return can.page.Append(can, target, [{view: [(type||"")+" "+(item.name||"")+" "+(item.pos||""), "fieldset"], list: [ item.pos? undefined: {text: [(item.nick||item.name||"").split(" ")[0]+"("+(item.help||"").split(" ")[0]+")", "legend"]}, {view: ["option", "form"]}, {view: ["action"]}, {view: ["output"]}, {view: ["status"]}, @@ -440,6 +442,32 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe topic: function(can, topic) { topic && (can._topic = topic) can.user.topic(can, can._topic || can.user.Search(can, "topic") || ((can.user.Search(can, "pod")||can.base.isNight())? "black": "white")) }, + + profile: function(can, target) { + can.ui = can.page.Append(can, target, [{type: "table", list: [{type: "tr", list: [ + {type: "td", list: [{view: ["project", "div", "project"]}]}, + {type: "td", list: [{type: "tr", list: [{type: "table", list: [ + {type: "td", list: [{view: ["content", "div", "content"]}]}, + {type: "td", list: [{view: ["profile", "div", "profile"]}]}, + ]}]}, {type: "tr", list: [ + {type: "td", list: [{view: ["display", "div", "display"]}]} + ]}]} + ]}] }]) + }, + project: function(can, target) { + can.ui = can.page.Append(can, target, [{type: "table", list: [{type: "tr", list: [ + {type: "td", list: [{view: "project"}]}, {type: "td", list: [ + {type: "tr", list: [{view: "content"}]}, + {type: "tr", list: [{view: "display"}]}, + ]} + ]}] }]) + }, + display: function(can, target) { + can.ui = can.page.Appends(can, target, [{type: "table", list: [ + {type: "tr", list: [{view: "content"}]}, + {type: "tr", list: [{view: "display"}]}, + ]}]) + }, }) Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can, target) { can.core.Item(can.onkeypop._mode, function(item, value) { var engine = {} diff --git a/lib/user.js b/lib/user.js index fb09768b..e9838c78 100644 --- a/lib/user.js +++ b/lib/user.js @@ -74,7 +74,9 @@ Volcanos("user", {help: "用户模块", agent: { var timer = can.core.Timer({value: 100, length: (meta.duration||1000)/100}, function(event, interval, index) { if (index > 20) { ui.duration.innerHTML = parseInt(index/10)+"."+(index%10)+"s..." } - }, function() { can.page.Remove(can, ui.first), timer.stop = true }) + }, function() { + can.page.Remove(can, ui.first), timer.stop = true + }) ui.Close = function() { can.page.Remove(can, ui.first), timer.stop = true } return ui diff --git a/page/index.css b/page/index.css index 28bc4a6a..3136c12e 100644 --- a/page/index.css +++ b/page/index.css @@ -43,6 +43,11 @@ body { fieldset { margin:0; border:0; padding:0; } +fieldset.plugin { + box-shadow:2px 2px 10px 4px #626bd0; + background-color:#061c3c9e; + margin:10px; padding:10px; +} legend { box-shadow:4px 4px 20px 4px #626bd0; } @@ -184,6 +189,9 @@ fieldset>div.output div.project div.list { margin-left:10px; } +body>fieldset.input { + position:fixed; left:0; top:32px; +} fieldset.input { background-color:#30a7a93d; position:fixed; @@ -252,7 +260,7 @@ body.black a { color:yellow; } body.white { - background-color:#2f3638; + background-color:#052238bf; color:white; } body.white input[type=button] { @@ -280,11 +288,11 @@ body.white select { } body.white fieldset.Action { - background-color:#81b3c1c9; + background-color:#a2dceab3; + color:black; } body.white fieldset.Action fieldset.plugin { background-color:#ffffff9c; - color:black; } body.white fieldset.Action fieldset.plugin legend { background-color:#339999; color:white; @@ -294,6 +302,9 @@ body.white fieldset.Action fieldset.plugin legend:hover { background-color:#6ee4e4; } +body.white fieldset.plugin { + background-color:#d0dfe49e; +} body.white fieldset.plugin table { color:black; } @@ -314,6 +325,9 @@ body.white fieldset.plugin table td { body.white fieldset.plugin table td:hover { background-color:#98ecd4; } +body.white fieldset.story { + background-color:#7c8ea5ab; +} body.white table input[type=button][value=结束] { background:red; diff --git a/pane/Action.css b/pane/Action.css index 0ccace5f..82567000 100644 --- a/pane/Action.css +++ b/pane/Action.css @@ -1,6 +1,6 @@ fieldset.Action { - background-color:#051625; color:white; min-width:160px; + background-color:#a2dceab3; } fieldset.Action div.action { display:none; @@ -53,18 +53,13 @@ fieldset.Action div.output.free fieldset.plugin.select { display:block; } -fieldset.Action div.output fieldset.plugin { - box-shadow:2px 2px 10px 4px #626bd0; - background-color:#113c4a9e; - margin:10px; padding:10px; -} fieldset.Action div.output fieldset.plugin:hover { box-shadow:4px 4px 12px 6px #626bd0; } fieldset.Action div.output fieldset.plugin legend { - background-color:#477182; color:white; font-size:16px; font-family:monospace; margin-top:4px 5px; padding:2px 20px; + background-color:#0c739cd9; } fieldset.Action div.output fieldset.plugin legend:hover { background:red; diff --git a/pane/Action.js b/pane/Action.js index f7aadb08..57b90d7b 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -22,7 +22,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.onappend._init(can, value, ["/plugin/state.js"], function(plugin) { plugin._option.dataset.id = value.action, value.target = plugin._target plugin.run = function(event, cmds, cb, silent) { var msg = plugin.request(event); cmds = cmds || [] - can.run(event, can.onengine[cmds[0]]? cmds: [river, storm, value.action].concat(cmds), function(msg) { + return can.run(event, can.onengine[cmds[0]]? cmds: [river, storm, value.action].concat(cmds), function(msg) { typeof cb == "function" && cb(msg) }, silent) } diff --git a/pane/Footer.css b/pane/Footer.css index 7db0554e..49c69e91 100644 --- a/pane/Footer.css +++ b/pane/Footer.css @@ -2,6 +2,10 @@ fieldset.Footer { height:32px; padding:0 5px; clear:both; } +fieldset.Footer div.toast { + position:static; + float:left; +} fieldset.Footer>div.output>div { height:22px; padding:5px; cursor:pointer; diff --git a/pane/Footer.js b/pane/Footer.js index 9ab32b72..eb2d0746 100644 --- a/pane/Footer.js +++ b/pane/Footer.js @@ -1,6 +1,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { can.onmotion.clear(can) can.onimport._title(can, msg, target) + can.onimport._toast(can, msg, target) can.onimport._state(can, msg, target) typeof cb == "function" && cb(msg) }, @@ -9,6 +10,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, can.page.Append(can, target, [{view: ["title", "div", title]}]) }) }, + _toast: function(can, msg, target) { + can.toast = can.page.Append(can, target, [{view: ["toast", "div", ""]}]).first + }, _state: function(can, msg, target) { can.core.List(can.Conf("state"), function(item) { can.page.Append(can, target, [{view: ["state "+item, "div", can.Conf(item)], @@ -17,6 +21,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }) }, + toast: function(can, msg, text) { + can.page.Modify(can, can.toast, {innerHTML: text}) + }, keys: function(can, msg, list, cb, target) { can.page.Select(can, target, "span.keys", function(item) { item.innerHTML = list[0]||"" @@ -36,5 +43,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, }) }, }) -Volcanos("onexport", {help: "导出数据", list: []}) +Volcanos("onexport", {help: "导出数据", list: [], + height: function(can) { return can._target.offsetHeight }, +}) diff --git a/pane/Header.css b/pane/Header.css index 62eed618..5b7f5ea5 100644 --- a/pane/Header.css +++ b/pane/Header.css @@ -1,5 +1,6 @@ fieldset.Header { height:32px; padding:0 5px; + z-index:1; } fieldset.Header>div.output>div { height:22px; padding:5px; diff --git a/pane/Header.js b/pane/Header.js index 3e7558bf..aa005ec1 100644 --- a/pane/Header.js +++ b/pane/Header.js @@ -8,7 +8,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, "white": "白色主题", "black": "黑色主题", "print": "打印主题", - "background": "背景图片", + "background": "清除背景", "logout": "退出", } can.onmotion.clear(can) @@ -21,10 +21,11 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, typeof cb == "function" && cb(msg) }, _background: function(can, msg, target) { if (!msg.Option("background")) { return } - can.page.Modify(can, document.body, {style: {background: 'url("'+msg.Option("background")+'")'}}) - can.page.Select(can, document.body, "fieldset.pane.Action", function(item) { - can.page.Modify(can, item, {style: {background: 'url("'+msg.Option("background")+'")'}}) - }) + if (msg.Option("background") == "void") { + can.page.Modify(can, document.body, {style: {background: ''}}) + } else { + can.page.Modify(can, document.body, {style: {background: 'url("'+msg.Option("background")+'")'}}) + } }, _title: function(can, msg, target) { can.user.title(can.user.Search(can, TITLE) || can.user.Search(can, POD)) @@ -104,6 +105,11 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, target.innerHTML = can.base.Time(null, "%w %H:%M:%S") can.onlayout.topic(can) }, + background: function(event, can, url) { + can.run(event, ["action", "background", url], function(msg) { + can.onimport._background(can, msg) + }) + }, menu: function(can, cmds, cb) { // type item... can.page.Append(can, can._output, [{type: cmds[0], list: can.core.List(cmds.slice(1), function(item) { @@ -178,14 +184,15 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, black: function(event, can, button) { can.onlayout.topic(can, button) }, white: function(event, can, button) { can.onlayout.topic(can, button) }, print: function(event, can, button) { can.onlayout.topic(can, "white print") }, - background: function(event, can, button) { can.user.input(event, can, ["url"], function(ev, button, data, list) { - can.run(event, ["action", "background", list[0]], function(msg) { - can.onimport._background(can, msg) - }) - }) }, + background: function(event, can, button) { + can.onimport.background(event, can, "void") + }, River: function(can) { can.run({}, ["search", "River.onmotion.toggle"]) }, Footer: function(can) { can.run({}, ["search", "River.onmotion.autosize"]) }, }) -Volcanos("onexport", {help: "导出数据", list: []}) +Volcanos("onexport", {help: "导出数据", list: [], + height: function(can) { return can._target.offsetHeight }, +}) + })() diff --git a/pane/River.js b/pane/River.js index ec9afe91..740b02ee 100644 --- a/pane/River.js +++ b/pane/River.js @@ -237,5 +237,8 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户 can.user.select(event, can, "github", "time,type,name,text") }, }) -Volcanos("onexport", {help: "导出数据", list: []}) +Volcanos("onexport", {help: "导出数据", list: [], + width: function(can) { return can._target.offsetWidth }, + height: function(can) { return can._target.offsetHeight }, +}) })() diff --git a/plugin/local/wiki/feel.js b/plugin/local/wiki/feel.js index 850bbc1a..1d65744b 100644 --- a/plugin/local/wiki/feel.js +++ b/plugin/local/wiki/feel.js @@ -1,18 +1,13 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.ui = can.page.Appends(can, can._target, [ - {view: "project"}, {view: "profile", style: {clear: "both"}}, - ]) - can.path = can.request({}), can.list = [] msg.Table(function(value) { if (value.path.startsWith("/local")) { return } value.path.endsWith("/")? can.path.Push(value): can.list.push(value) }) - can.onappend.table(can, can.path, can.ui.project, "table", function(value, key, index, line, array) { - return {type: "td", inner: value, click: function(event) { - can.sup.onaction.change(event, can.sup, key, value, function(msg) { - can.run(event) - }) + can.onlayout.display(can, target) + can.onappend.table(can, can.path, can.ui.content, "table", function(value, key, index, line, array) { + return {type: "td", inner: value, onclick: function(event) { + can.sup.onaction.change(event, can.sup, key, value) }} }) @@ -21,43 +16,65 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, typeof cb == "function" && cb(msg) can.Action("倍速", can.rate = 1) + can.Action("起始", can.begin = parseInt(msg.Option("begin"))||feature["begin"]||0) can.Action("数量", can.limit = parseInt(msg.Option("limit"))||feature["limit"]||6) can.Action("高度", can.height = parseInt(msg.Option("height"))||feature["height"]||100) - can.Option("path") != "最近/" && can.onimport._page(can, can.list, can.begin = 0, can.limit) + can.Option("path") != "最近/" && can.onimport._page(can, can.list, can.begin, can.limit) + }, - _page: function(can, list, begin, limit) { can.ui.profile.innerHTML = "" + _page: function(can, list, begin, limit) { can.onmotion.clear(can, can.ui.display) if (!list || list.length == 0) { return } - for (var i = begin; i < begin+limit; i++) { list && list[i] && can.onimport.file(can, list[i].path) } + for (var i = begin; i < begin+limit; i++) { list && list[i] && can.onimport.file(can, list[i].path, i) } can.Status("begin", begin), can.Status("limit", limit), can.Status("total", can.list.length) }, - file: function(can, path) { can.Status("文件", path) + _file: function(can, path, index) { var p = location.href.startsWith("http")? "": "http://localhost:9020" path = path.startsWith("http")? path: p+can.base.Path("/share/local", " "+(can._msg.Option("prefix")||""), path) - - var ls = path.split("/") - var ls = ls[ls.length-1].split(".") - var ext = ls[ls.length-1].toLowerCase() - ext && can.page.Append(can, can.ui.profile, [can.onfigure[ext](can, path)]) + return path + }, + file: function(can, path, index) { path = can.onimport._file(can, path, index) + var cb = can.onfigure[can.base.Ext(path)]; can.Status("文件", path) + typeof cb == "function" && can.page.Append(can, can.ui.display, [cb(can, path, index)]) }, }, ["/plugin/local/wiki/feel.css"]) Volcanos("onfigure", {help: "组件菜单", list: [], - qrc: function(can, path) { return can.onfigure.image(can, path) }, - png: function(can, path) { return can.onfigure.image(can, path) }, - jpg: function(can, path) { return can.onfigure.image(can, path) }, - jpeg: function(can, path) { return can.onfigure.image(can, path) }, - image: function(can, path) { return {img: path, height: can.height, onclick: function(event) { - can.Status("文件", path) - can.page.Append(can, document.body, [{img: path, style: { - position: "fixed", left: 0, top: 40, - height: window.innerHeight-40, - }, onclick: function(event) { - can.page.Remove(can, event.target) - }, }]) - }, onmouseover: function(event) { - can.user.toast(can, path, "image") - }, _init: function(target) { - can.Status("文件", path) - } + qrc: function(can, path, index) { return can.onfigure.image(can, path, index) }, + png: function(can, path, index) { return can.onfigure.image(can, path, index) }, + jpg: function(can, path, index) { return can.onfigure.image(can, path, index) }, + jpeg: function(can, path, index) { return can.onfigure.image(can, path, index) }, + image: function(can, path, index) { return {img: path, height: can.height, onclick: function(event) { + can.onappend._init(can, {}, [], function(sub) { + sub.run = function(event, cmds, cb, silent) { + return can.run(event, cmds, cb, true) + } + + var header = sub.run({}, ["search", "Header.onexport.height"]) + var footer = sub.run({}, ["search", "Footer.onexport.height"]) + var river = sub.run({}, ["search", "River.onexport.width"]) + var height = window.innerHeight-header-footer + + sub.page.Remove(sub, sub._legend), sub.page.Modify(sub, sub._target, {style: { + left: river, top: header, height: height, background: "#4eaad0c2", + margin: "0 10px", padding: "0 10px", + }}) + + var order = index; function show(order) { + path = can.onimport._file(can, can.list[order].path) + sub.page.Appends(sub, sub._output, [{img: path, height: height-55}]) + sub.core.Timer(100, function() { sub.Status("位置", order+1+"/"+can.list.length), sub.Status("文件", path) }) + }; show(order) + + sub.onappend._action(sub, ["关闭", "上一个", "设置背景", "下一个"], sub._action, { + "关闭": function(event) { sub.page.Remove(sub, sub._target) }, + "上一个": function(event) { order > 0? show(--order): show(order = can.list.length-1) }, + "设置背景": function(event) { var msg = can.request(event, {url: can.onimport._file(can, can.list[order].path)}) + sub.run(event, ["search", "Header.onimport.background"]) + }, + "下一个": function(event) { order < can.list.length-1? show(++order): show(order = 0) }, + }), sub.onappend._status(can, ["文件"], sub._status) + }, document.body) + }, _init: function(target) { can.Status("文件", path) }, + onmouseover: function(event) { can.Status("文件", path) }, } }, video: function(can, path) { var auto = true, loop = true, total = 0 diff --git a/plugin/state.js b/plugin/state.js index cff86cbc..7fe52d26 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -70,11 +70,11 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, }): can.run(event, ["action", name], function(msg) { typeof cb == "function" && cb(msg) }, true) }, change: function(event, can, name, value, cb) { - can.page.Select(can, can._option, "input.args", function(input) { if (input.name == name) { var data = input.dataset || {} - if (value != input.value) { input.value = value; - data.action == "auto" && typeof cb == "function" && cb() + can.page.Select(can, can._option, "input.args", function(input) { + if (input.name == name && value != input.value) { input.value = value; + var data = input.dataset || {}; data.action == "auto" && can.run(event) } - } }) + }) }, getLocation: function(event, can, cmd) { var msg = can.request(can) diff --git a/publish/chrome/popup.html b/publish/chrome/popup.html index 5e065001..97618eb9 100644 --- a/publish/chrome/popup.html +++ b/publish/chrome/popup.html @@ -6,6 +6,7 @@
+