diff --git a/const.js b/const.js index 4c7e77e4..36312c11 100644 --- a/const.js +++ b/const.js @@ -353,6 +353,7 @@ var html = {value: { var icon = { CHEVRON_DOWN: "bi bi-chevron-down", SEARCH: "bi bi-search", TERMINAL: "bi bi-terminal", SUN: "bi bi-sun", MOON: "bi bi-moon-stars", + help: "bi bi-question-square", } var svg = { GROUP: "group", PID: "pid", GRID: "grid", diff --git a/frame.js b/frame.js index 9a9e1ba1..a48f1b19 100644 --- a/frame.js +++ b/frame.js @@ -176,7 +176,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }, [item.display, chat.PLUGIN_INPUT_JS], function(sub) { sub.Conf(item) sub._fields = can if (item.type == html.TEXT) { can.page.Append(can, sub._target.parentNode, [{text: [sub._target.value, html.SPAN, mdb.VALUE]}]) } - if (item.type == html.BUTTON && can.base.isIn(item.name, mdb.CREATE, mdb.INSERT, mdb.PRUNES, mdb.PRUNE)) { + if (item.type == html.BUTTON && can.base.isIn(item.name, mdb.CREATE, mdb.INSERT, mdb.PRUNES, mdb.PRUNE, ice.HELP)) { can.onappend.icons(can, sub._target, item.name, function(event) { can.Update(event, [ctx.ACTION, item.name].concat(can.page.SelectArgs(sub))) }) @@ -194,7 +194,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }) }; var auto; can.core.Next(can.core.Value(can, [chat.ONIMPORT, mdb.LIST])||meta.inputs, add, function() { skip || can.Conf(ice.AUTO) == "delay" || auto && auto.click() - meta._help && add({type: html.BUTTON, name: ice.HELP, onclick: function(event) { can.onappend._float(can, {index: web.WIKI_WORD}, [meta._help]) }}, function() {}) + can.core.Item(can.Option()).length == 0 && meta._help && add({type: html.BUTTON, name: ice.HELP, onclick: function(event) { can.onappend._float(can, {index: web.WIKI_WORD}, [meta._help]) }}, function() {}) }) }, _action: function(can, list, action, meta, hold, limit) { meta = meta||can.onaction||{}, action = action||can._action, hold || can.onmotion.clear(can, action) diff --git a/lib/page.js b/lib/page.js index 973fca43..8e5c8884 100644 --- a/lib/page.js +++ b/lib/page.js @@ -59,7 +59,9 @@ Volcanos("page", { } else if (item.text) { var list = can.core.List(item.text); if (can.base.isArray(list[2])) { list[2] = list[2].join(lex.SP) } data.innerHTML = list[0]||data.innerHTML||"", type = list[1]||item.type||html.SPAN, list[2] && can.page.ClassList.add(can, data, list[2]) } else if (item.icon) { var list = can.core.List(item.icon) - if (can.page.unicode[list[0]]) { + if (icon[item.icon]) { + type = "i", data.className = icon[item.icon] + } else if (can.page.unicode[list[0]]) { type = html.SPAN, name = list[0], data.className = "icon "+list[0], data.innerText = can.page.unicode[list[0]] } else { type = "i", data.className = list[0] @@ -301,7 +303,7 @@ Volcanos("page", { height: function() { return window.innerHeight }, width: function() { return window.innerWidth }, ismodkey: function(event) { return [code.META, code.ALT, code.CONTROL, code.SHIFT].indexOf(event.key) > -1 }, - unicode: { + unicode: { // https://symbl.cc/cn/ refresh: "↻", goback: "↺", play: "▶", create: "+", insert: "+", prunes: "♻︎", prune: "♻︎", select: "▿", remove: "✕", delete: "✕", menu: "☰", open: "▾", close: "▸", @@ -313,6 +315,7 @@ Volcanos("page", { lt: "❮", gt: "❯", inner: "...", favor: "\u2606", + help: "\u2753", }, inputs: function(can, list, type) { var _list = []; for (var i = 0; i < list.length; i++) { switch (list[i]) { case "": _list.push(""); break diff --git a/lib/user.js b/lib/user.js index 64f7f501..03d8dd1c 100644 --- a/lib/user.js +++ b/lib/user.js @@ -144,6 +144,7 @@ Volcanos("user", { }) } var isinput = can.page.tagis(event.target, html.INPUT) var ui = can.page.Append(can, document.body, [{view: [[chat.CARTE, meta._style||msg.Option("_style")||can.base.replaceAll(can.ConfIndex()||"", nfs.PT, lex.SP)||"", chat.FLOAT]], list: can.core.List(list, function(item, index) { + if (typeof item == code.FUNCTION) { item = item(can); if (!item) { return } } if (item === "") { return {type: html.HR} } if (item == web.FILTER) { return { input: [html.FILTER, function(event) { if (event.key == code.ESCAPE) { return carte.close() } can.onkeymap.selectItems(event, can, carte._target) } ], diff --git a/plugin/state.js b/plugin/state.js index 5a7d8509..ef32fb4c 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -77,14 +77,23 @@ Volcanos(chat.ONIMPORT, { can.page.SelectArgs(can, can._action, "", function(target) { target.value = his[i++]||"" }); break } can.Update(event) }, }) -Volcanos(chat.ONACTION, {list: [ - "刷新数据", "刷新界面", "切换浮动", "切换全屏", "共享工具", "打开链接", "生成链接", - ["视图", "参数", "操作", "状态", "专注", "项目", "预览", "演示"], - ["数据", "保存参数", "清空参数", "复制数据", "下载数据", "添加工具", "清空数据"], +Volcanos(chat.ONACTION, {list: ["刷新数据", "刷新界面", "切换浮动", "切换全屏", "共享工具", "生成链接", + function(can) { if (!can.isCmdMode()) { return "打开链接" } }, function(can) { if (can.isCmdMode()) { return "打开首页" } }, + function(can) { if (can.ConfSpace() || can.isCmdMode() && can.misc.Search(can, ice.POD)) { return "打开空间" } }, + ["视图", "参数", + function(can) { if (can._action.innerHTML) { return "操作" } }, + function(can) { if (can._status.innerHTML) { return "状态" } }, + function(can) { if (can.sub.ui.project) { return "专注" } }, + function(can) { if (can.sub.ui.project) { return "项目" } }, + function(can) { if (can.sub.ui.profile) { return "预览" } }, + function(can) { if (can.sub.ui.display) { return "演示" } }, + "插件", + ], + // ["数据", "保存参数", "清空参数", "复制数据", "下载数据", "清空数据"], ["调试", - "查看文档", "查看脚本", "查看源码", - "查看通知", "查看视图", "查看数据", - "会话存储", "本地存储", + function(can) { if (can.Conf("_help")) { return "查看文档" } }, + "查看脚本", "查看源码", + "查看通知", "查看视图", "查看数据", "会话存储", "本地存储", "查看报文", "查看配置", "查看日志", "删除工具", ], @@ -133,6 +142,11 @@ Volcanos(chat.ONACTION, {list: [ "项目": function(event, can) { can.onaction._view(can, function(sub) { sub.ui && sub.ui.project && can.onmotion.toggle(can, sub.ui.project) }) }, "预览": function(event, can) { can.onaction._view(can, function(sub) { sub.ui && sub.ui.project && can.onmotion.toggle(can, sub.ui.profile) }) }, "演示": function(event, can) { can.onaction._view(can, function(sub) { sub.ui && sub.ui.project && can.onmotion.toggle(can, sub.ui.display) }) }, + "插件": function(event, can) { + can.user.input(event, can, [ctx.INDEX, ctx.ARGS], function(data) { + var sub = can.sub; sub.onimport.tool(sub, [data], function(sub) { sub.select() }) + }) + }, "保存参数": function(event, can) { can.search(event, ["River.ondetail.保存参数"]) }, "清空参数": function(event, can) { can.page.SelectArgs(can, can._option, "", function(target) { return target.value = "" }) }, @@ -141,11 +155,9 @@ Volcanos(chat.ONACTION, {list: [ can.user.downloads(can, sub.onexport.table(sub), list[0], nfs.CSV), can.user.downloads(can, sub.onexport.board(sub), list[0], nfs.TXT) }) }, "清空数据": function(event, can) { can.onmotion.clear(can, can._output) }, - "添加工具": function(event, can) { - can.user.input(event, can, [ctx.INDEX, ctx.ARGS], function(data) { - var sub = can.sub; sub.onimport.tool(sub, [data], function(sub) { sub.select() }) - }) - }, + + "打开首页": function(event, can) { can.user.open(location.origin) }, + "打开空间": function(event, can) { can.user.open(can.misc.MergePodCmd(can, {pod: can.ConfSpace()||can.misc.Search(can, ice.POD)})) }, "查看文档": function(event, can) { can.requests(event, {action: ice.HELP}), can.onengine.signal(can, "ondebugs", can.requestPodCmd(event)) }, "查看脚本": function(event, can) { can.onappend._float(can, web.CODE_INNER, can.misc.SplitPath(can, can.sub._path)) }, @@ -179,6 +191,9 @@ Volcanos(chat.ONACTION, {list: [ }, _close: function(event, can) { can.page.Remove(can, can._target) }, clear: function(event, can) { can.onmotion.clear(can, can._output) }, actions: function(event, can) { can.onmotion.toggle(can, can._action) }, + help: function(event, can) { + can.onappend._float(can, {index: web.WIKI_WORD}, [can.Conf("_help")]) + }, full: function(event, can) { can.onaction["切换全屏"](event, can, "切换全屏", can.sub) }, prev: function(event, can) { can.runAction(event, mdb.PREV, [can.Status(mdb.TOTAL)||0, can.Option(mdb.LIMIT)||can.Action(mdb.LIMIT)||can._msg.Option("cache.limit")||"", can.Option(mdb.OFFEND)||can.Action(mdb.OFFEND)||""], function(msg) { can.onimport._process(can, msg) }) }, next: function(event, can) { can.runAction(event, mdb.NEXT, [can.Status(mdb.TOTAL)||0, can.Option(mdb.LIMIT)||can.Action(mdb.LIMIT)||can._msg.Option("cache.limit")||"", can.Option(mdb.OFFEND)||can.Action(mdb.OFFEND)||""], function(msg) { can.onimport._process(can, msg) }) },