mirror of
https://shylinux.com/x/volcanos
synced 2025-04-25 08:48:06 +08:00
opt feel
This commit is contained in:
parent
f3c7e1fe62
commit
4d6784cf8a
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +1,2 @@
|
||||
*.swp
|
||||
.DS_Store
|
||||
|
@ -6,7 +6,7 @@
|
||||
</head>
|
||||
<body>
|
||||
<script src="/proto.js"></script>
|
||||
<script src="/plugin/chrome/chrome.js"></script>
|
||||
<script src="/chrome/chrome.js"></script>
|
||||
</body>
|
||||
<html>
|
||||
|
||||
|
@ -114,15 +114,7 @@ var can = Volcanos("chrome", {
|
||||
can.run = function(event, cmd, cb, silent) { var msg = can.request(event)
|
||||
can.misc.Run(event, can, {names: "code/chrome/crx"}, cmd, cb)
|
||||
},
|
||||
|
||||
chrome.history.onVisited.addListener(function(item) {
|
||||
can.run({}, ["history", item.id, item.url, item.title], function(msg) {
|
||||
can.user.toast(item.url, item.title)
|
||||
})
|
||||
})
|
||||
return
|
||||
|
||||
can.misc.WSS(can, "ws://localhost:9020/space/", {node: "chrome", name: chrome.runtime.id}, function(event, msg) {
|
||||
can.misc.WSS(can, "ws://localhost:9020/space/", {name: "chrome", type: "chrome"}, function(event, msg) {
|
||||
if (msg.Option("_handle")) {return can.user.toast(msg.result.join(""))}
|
||||
|
||||
can.user.toast(msg.detail.join(" "))
|
||||
@ -136,10 +128,14 @@ var can = Volcanos("chrome", {
|
||||
msg.Reply(msg)
|
||||
}, function() {can.user.toast("wss connect", "iceberg")})
|
||||
|
||||
can.run(can, {cmd: ["login", can.sid||""]}, function(msg) {
|
||||
can.sid = msg.Result()
|
||||
chrome.history.onVisited.addListener(function(item) {
|
||||
can.run({}, ["history", item.id, item.title, item.url], function(msg) {
|
||||
can.user.toast(item.url, item.title)
|
||||
})
|
||||
})
|
||||
|
||||
return
|
||||
|
||||
chrome.bookmarks.onCreated.addListener(function(id, item) {
|
||||
chrome.bookmarks.get(item.parentId, function(root) {
|
||||
can.run(can, {cmd: ["bookmark", item.id, item.url, item.title, root[0].title]}, function(msg) {
|
||||
|
24
frame.js
24
frame.js
@ -2,6 +2,9 @@
|
||||
// FMS: a fieldset manager system
|
||||
|
||||
Volcanos("onengine", { _init: function(can, meta, list, cb, target) {
|
||||
can.run = function(event, cmds, cb) {
|
||||
return (can.onengine[cmds[0]]||can.onengine[meta.main.engine])(event, can, can.request(event), can, cmds, cb)
|
||||
}
|
||||
can.core.Next(meta.panes, function(item, next) {
|
||||
can.onappend._init(can, item, meta.libs.concat(item.list), function(pane) {
|
||||
pane.Conf(item), pane.run = function(event, cmds, cb) {
|
||||
@ -28,9 +31,11 @@ Volcanos("onengine", { _init: function(can, meta, list, cb, target) {
|
||||
can.onengine && getRiver(can.onengine.river)
|
||||
|
||||
// 应用入口
|
||||
can.onappend.daemon(can, can.user.title())
|
||||
can.user.title(can.user.Search(can, "title"))
|
||||
var pane = can[meta.main.name], msg = can.request({});
|
||||
pane.onaction && pane.onaction._init(pane, msg, msg.option||[], cb, target);
|
||||
|
||||
})
|
||||
}, target) });
|
||||
},
|
||||
@ -229,9 +234,9 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met
|
||||
var table = Volcanos(display, { _help: display, _follow: can._follow+"."+meta.name+"."+display,
|
||||
_target: output, Option: sub.Option, Action: sub.Action, Status: sub.Status,
|
||||
_option: option, _action: action, _output: output,
|
||||
}, Volcanos.meta.libs.concat(["/frame.js", display]), function(table) { table.Conf(sub.Conf())
|
||||
}, Volcanos.meta.libs.concat(["/frame.js", display]), function(table) { table.Conf(sub.Conf()), table._msg = msg
|
||||
table.onimport && table.onimport._init && table.onimport._init(table, msg, msg.result||[], function() {}, output)
|
||||
table._msg = msg, table.run = function(event, cmds, cb, silent) { cmds = cmds || []
|
||||
table.run = function(event, cmds, cb, silent) { cmds = cmds || []
|
||||
var last = sub._history[sub._history.length-1]; !can.core.Eq(last, cmds) && !silent && sub._history.push(cmds)
|
||||
return run(event, cmds, cb, silent)
|
||||
}
|
||||
@ -549,6 +554,21 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { met
|
||||
|
||||
}}]); ui.input.focus(), ui.input.setSelectionRange(0, -1)
|
||||
},
|
||||
daemon: function(can, name) {
|
||||
can.misc.WSS(can, "", {name: name, type: "chrome"}, function(event, msg) {
|
||||
if (msg.Option("_handle")) {return can.onappend.toast(can, msg.result.join(""))}
|
||||
|
||||
can.onappend.toast(can, msg.detail.join(" ")); switch (msg.detail[0]) {
|
||||
case "pwd": msg.Echo("hello world"); break
|
||||
default:
|
||||
can.run(event, ["search"].concat(msg.detail), function(msg) {
|
||||
msg.Reply(msg)
|
||||
}); return
|
||||
|
||||
msg.Reply(msg)
|
||||
}
|
||||
}, function() {can.user.toast("wss connect", "iceberg")})
|
||||
},
|
||||
}, [], function(can) {})
|
||||
Volcanos("onlayout", { _init: function(can, meta, list, cb, target) {
|
||||
var width = can._width, height = can._height;
|
||||
|
11
lib/misc.js
11
lib/misc.js
@ -82,7 +82,7 @@ var misc = Volcanos("misc", {help: "工具模块",
|
||||
|
||||
delete(can._socket), setTimeout(function() {
|
||||
// 断线重连
|
||||
can.misc.WSS(can, url, args, cb, onerror, onclose, onopen)
|
||||
can.misc.WSS(can, url, args, cb, onopen, onerror, onclose)
|
||||
}, 1000)
|
||||
}, can._socket.onerror = onerror || function() {if (!can._socket) {return}
|
||||
console.log("socket error")
|
||||
@ -105,15 +105,18 @@ var misc = Volcanos("misc", {help: "工具模块",
|
||||
|
||||
msg = (can.request||can.Event)(event, msg), msg.Reply = function() {
|
||||
// 回复命令
|
||||
delete(msg._can)
|
||||
delete(msg._event)
|
||||
msg.Option("_handle", true)
|
||||
msg.Option("_target", msg.Option("_source"))
|
||||
can.Log(["wss", order, "result"].concat(msg.result).concat([msg]))
|
||||
delete(msg.event), can._socket.send(JSON.stringify(msg))
|
||||
console.log(["wss", order, "result"].concat(msg.result).concat([msg]))
|
||||
can._socket.send(JSON.stringify(msg))
|
||||
}
|
||||
|
||||
try {
|
||||
// 执行命令
|
||||
can.Log(["wss", order].concat(msg.detail).concat([msg]))
|
||||
// c
|
||||
console.log(["wss", order].concat(msg.detail).concat([msg]))
|
||||
typeof cb == "function" && cb(event, msg, msg.detail[0], msg.detail.slice(1))
|
||||
} catch (e) {
|
||||
// 执行失败
|
||||
|
@ -1,5 +1,9 @@
|
||||
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) {
|
||||
},
|
||||
demo: function(can, msg, cmd, cb) {
|
||||
msg.Echo("hello demo world")
|
||||
cb(msg)
|
||||
},
|
||||
})
|
||||
Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) {
|
||||
function init() {
|
||||
|
9
plugin/local/wiki/feel.css
Normal file
9
plugin/local/wiki/feel.css
Normal file
@ -0,0 +1,9 @@
|
||||
fieldset.feel div.action {
|
||||
clear:none;
|
||||
}
|
||||
|
||||
fieldset.feel div.output div.content {
|
||||
max-height:200px;
|
||||
overflow:auto;
|
||||
}
|
||||
|
@ -1,157 +1,56 @@
|
||||
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb) {
|
||||
can._target.innerHTML = "", can.ui = can.page.Append(can, can._target, [
|
||||
{view: "content"}, {view: "display"},
|
||||
{view: "content"}, {view: "control"}, {view: "display"},
|
||||
])
|
||||
|
||||
can.table = can.onappend.table(can, can.ui.content, "table", msg, function(value, key, index, line) {
|
||||
return {text: [value, "td"], oncontextmenu: function(event) {
|
||||
can.onappend.carte(can, can.ondetail, can.ondetail.list, function(ev, cmd, meta) {
|
||||
var cb = meta[cmd]; cb && cb(event, can, cmd, value, key, index, line)
|
||||
})
|
||||
}, ondblclick: function(event) {
|
||||
can.page.Modify(can, event.target, {contenteditable: true})
|
||||
return {text: [value, "td"], onclick: function(event) {
|
||||
can.onimport.file(can, line.path)
|
||||
}}
|
||||
})
|
||||
|
||||
can.core.List(msg.result, function(item) {
|
||||
var ls = item.split("/")
|
||||
var ls = ls[ls.length-1].split(".")
|
||||
var ext = ls[ls.length-1].toLowerCase()
|
||||
can.page.Append(can, can.ui.content, [can.onfigure[ext](can, item)])
|
||||
})
|
||||
},
|
||||
init: function(can, msg, cb, output, action, option) {output.innerHTML = "";
|
||||
if (!msg.append || msg.append.length == 0) {return}
|
||||
|
||||
var list = msg.Table()
|
||||
function view(index, width, auto, cb) {var item = list[can.page.Select(can, table, "tr")[index+1].dataset.index];
|
||||
function menu(event) {var target = event.target;
|
||||
can.user.carte(event, shy("", can.ondetail, can.feature.detail || can.ondetail.list, function(event, cmd, meta) {var cb = meta[cmd];
|
||||
typeof cb == "function" && cb(event, can, item, index, "path", cmd, target);
|
||||
}))
|
||||
}
|
||||
|
||||
var items = item.path.split(".");
|
||||
switch (items[items.length-1]) {
|
||||
case "png":
|
||||
case "jpg":
|
||||
case "JPG":
|
||||
return {className: "preview", img: "/share/local/web.wiki.feel/"+item.path, width: width, oncontextmenu: menu}
|
||||
case "MOV":
|
||||
case "m4v":
|
||||
default:
|
||||
return
|
||||
}
|
||||
var list = msg.Table(), begin = 0, limit = 3; function page() {
|
||||
can.ctrl.offset.innerHTML = begin+"-"+(begin+limit)
|
||||
can.onimport.page(can, list, begin, limit)
|
||||
}
|
||||
|
||||
var table = can.page.AppendTable(can, output, msg, msg.append);
|
||||
|
||||
var begin = 0, limit = 3;
|
||||
var rate = 1, width = 600;
|
||||
var control = can.page.Append(can, output, [{view: ["control"], list: [
|
||||
{select: [["width", 100, 200, 400, 600, 800], function(event, value) {width = parseInt(value), page(begin, limit)}]},
|
||||
{select: [["rate", 0.1, 0.2, 0.5, 1, 2, 3, 5, 10], function(event, value) {rate = value}]},
|
||||
can.ctrl = can.page.Append(can, can.ui.control, [
|
||||
{button: ["clear", function() {
|
||||
can.ui.display.innerHTML = ""
|
||||
}]},
|
||||
{select: [["height", 100, 200, 400, 600, 800], function(event, value) {
|
||||
can.height = parseInt(value), page()
|
||||
}]},
|
||||
{select: [["rate", 0.1, 0.2, 0.5, 1, 2, 3, 5, 10], function(event, value) {
|
||||
can.rate = value, page()
|
||||
}]},
|
||||
{button: ["prev", function() {
|
||||
begin > 0 && (begin -= limit, page(begin, limit));
|
||||
begin > 0 && (begin -= limit, can.onimport.page(can, list, begin, limit))
|
||||
}]},
|
||||
{text: [begin+"-"+(begin+limit)], name: "offset"},
|
||||
{button: ["next", function() {
|
||||
begin < msg[msg.append[0]].length && (begin += limit, page(begin, limit));
|
||||
begin < msg[msg.append[0]].length && (begin += limit, page())
|
||||
}]},
|
||||
{select: [["limit", 1, 3, 6, 9, 12, 15], function(event, value) {
|
||||
limit = parseInt(value), page()
|
||||
}]},
|
||||
{text: [list.length]},
|
||||
{select: [["limit", 3, 6, 9, 12, 15], function(event, value) {limit = parseInt(value), page(begin, limit)}]},
|
||||
]}])
|
||||
control.rate.value = rate
|
||||
control.width.value = width
|
||||
])
|
||||
|
||||
var preview = can.page.Append(can, output, [{view: ["preview"]}]).last
|
||||
function page(begin, limit) {
|
||||
control.offset.innerHTML = begin+"-"+(begin+limit);
|
||||
can.page.Appends(can, preview, msg.Table(function(item, index) {
|
||||
if (begin <= index && index < begin+limit) {return view(index, width, false, function(event) {var video = event.target;
|
||||
switch (event.type) {
|
||||
case "loadeddata": video.playbackRate = rate; break
|
||||
case "timeupdate": video.playbackRate = rate; break
|
||||
}
|
||||
})}
|
||||
}));
|
||||
}
|
||||
page(begin, limit);
|
||||
|
||||
function show(index) {var item = list[can.page.Select(can, table, "tr")[index+1].dataset.index];
|
||||
var video = {};
|
||||
var timer = can.user.toast({text: "", list: [{view: "control", list: [
|
||||
{button: ["close", function(event) {video.pause(), timer.toast.Hide()}]},
|
||||
{select: [["width", 100, 200, 400, 600, 800], function(event, value) {timer.toast.Show(event, parseInt(value)+20),
|
||||
width = value
|
||||
timer.toast.preview.setAttribute("width", value)
|
||||
// video.width = value
|
||||
}]},
|
||||
{select: [["rate", 0.1, 0.2, 0.5, 1, 2, 3, 5, 10], function(event, value) {rate = video.playbackRate = value}]},
|
||||
{button: ["prev", function(event) {show(index-1)}]},
|
||||
{text: index+"/"+list.length},
|
||||
{button: ["next", function(event) {show(index+1)}]},
|
||||
{type: "br"}, {text: item.path},
|
||||
{type: "br"}, {text: item.label},
|
||||
]}].concat([view(index, 600, true, function(event) {video = event.target;
|
||||
switch (event.type) {
|
||||
case "loadeddata": video.playbackRate = rate; break
|
||||
case "ended": show(index+1); break
|
||||
}
|
||||
})]), width: 600+20, height: 620, duration: -1})
|
||||
timer.toast.width.value = 600;
|
||||
timer.toast.rate.value = rate;
|
||||
}
|
||||
|
||||
table.onclick = function(event) {switch (event.target.tagName) {
|
||||
case "TD":
|
||||
can.onimport.which(event, table, msg.append, function(index, key) {
|
||||
var name = event.target.innerHTML.trim()
|
||||
if (name.endsWith("/")) {
|
||||
can.Option("name", name), can.run(event, [name])
|
||||
} else {
|
||||
show(index);
|
||||
}
|
||||
})
|
||||
break
|
||||
case "TH":
|
||||
break
|
||||
case "TR":
|
||||
case "TABLE":
|
||||
}}
|
||||
table.oncontextmenu = function(event) {var target = event.target;
|
||||
switch (event.target.tagName) {
|
||||
case "TD":
|
||||
can.onimport.which(event, table, msg.append, function(index, key) {
|
||||
can.user.carte(event, shy("", can.ondetail, can.feature.detail || can.ondetail.list, function(event, cmd, meta) {var cb = meta[cmd];
|
||||
var id = msg.Ids(index);
|
||||
var sub = can.Event(event);
|
||||
msg.append.forEach(function(key) {sub.Option(key, msg[key][index].trim())})
|
||||
typeof cb == "function"? cb(event, can, msg, index, key, cmd, target):
|
||||
// can.run(event, [id, typeof cb == "string"? cb: cmd, key, target.innerHTML], function(msg) {
|
||||
can.run(event, ["action", typeof cb == "string"? cb: cmd, key, target.innerHTML], function(msg) {
|
||||
can.onimport.init(can, msg, cb, output, option)
|
||||
}, true)
|
||||
}))
|
||||
})
|
||||
event.stopPropagation()
|
||||
event.preventDefault()
|
||||
break
|
||||
case "TH":
|
||||
case "TR":
|
||||
case "TABLE":
|
||||
}
|
||||
}
|
||||
return typeof cb == "function" && cb(msg), table;
|
||||
can.rate = can.ctrl.rate.value = 1
|
||||
limit = can.ctrl.limit.value = parseInt(msg.Option("limit"))||1
|
||||
can.height = can.ctrl.height.value = parseInt(msg.Option("height"))||400
|
||||
can.onimport.page(can, list, begin, limit)
|
||||
},
|
||||
which: function(event, table, list, cb) {if (event.target == table) {return cb(-1, "")}
|
||||
can.page.Select(can, table, "tr", function(tr, index) {if (event.target == tr) {return cb(index-1, "")}
|
||||
can.page.Select(can, tr, "th,td", function(td, order) {
|
||||
if (event.target == td) {return cb(index-1, list[order])}
|
||||
})
|
||||
})
|
||||
page: function(can, list, begin, limit) { can.ui.display.innerHTML = ""
|
||||
for (var i = begin; i < begin+limit; i++) { can.onimport.file(can, list[i].path) }
|
||||
},
|
||||
})
|
||||
|
||||
file: function(can, item) { item = (can._msg.Option("prefix")||"")+"/"+item
|
||||
var ls = item.split("/")
|
||||
var ls = ls[ls.length-1].split(".")
|
||||
var ext = ls[ls.length-1].toLowerCase()
|
||||
can.page.Append(can, can.ui.display, [can.onfigure[ext](can, item)])
|
||||
},
|
||||
}, ["/plugin/local/wiki/feel.css"])
|
||||
Volcanos("onfigure", {help: "组件菜单", list: [],
|
||||
image: function(can, path) {
|
||||
return {img: "/share/local/"+path}
|
||||
@ -159,39 +58,27 @@ Volcanos("onfigure", {help: "组件菜单", list: [],
|
||||
jpg: function(can, path) { return can.onfigure.image(can, path) },
|
||||
qrc: function(can, path) { return can.onfigure.image(can, path) },
|
||||
|
||||
video: function(can, path) {
|
||||
function cb(event) {
|
||||
video: function(can, path) { var auto = true, loop = true, total = 0
|
||||
var p = location.href.startsWith("https")? "": "http://localhost:9020"
|
||||
function cb(event) { console.log(event) }
|
||||
return {className: "preview", type: "video", style: {height: can.height},
|
||||
data: {src: p+"/share/local/"+path, controls: "controls", autoplay: auto, loop: loop, playbackRate: can.rate},
|
||||
oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb,
|
||||
onloadedmetadata: function(event) { total = event.timeStamp
|
||||
event.target.currentTime = can._msg.currentTime || 0
|
||||
}, onloadeddata: cb, ontimeupdate: function(event) {
|
||||
can.Status("当前行", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration))
|
||||
},
|
||||
}
|
||||
return {className: "preview", type: "video", width: width, oncontextmenu: menu,
|
||||
onplay: cb, onpause: cb,
|
||||
onloadedmetadata: cb,
|
||||
onloadeddata: cb,
|
||||
ontimeupdate: cb,
|
||||
onended: cb,
|
||||
data: {src: "/share/local/"+path, controls: "controls", autoplay: auto, loop: false,
|
||||
}}
|
||||
},
|
||||
m4v: function(can, path) { return can.onfigure.image(can, path) },
|
||||
m4v: function(can, path) { return can.onfigure.video(can, path) },
|
||||
})
|
||||
|
||||
Volcanos("onaction", {help: "组件菜单", list: ["上传"],
|
||||
Volcanos("onaction", {help: "组件菜单", list: ["", "上传"],
|
||||
"上传": function(event, can) { can.onappend.upload(can) },
|
||||
})
|
||||
Volcanos("ondetail", {help: "组件详情", list: ["标签"],
|
||||
"标签": function(event, can, msg, index, key, cmd, target) {
|
||||
can.user.prompt("目标", function(kind) {
|
||||
can.run(event, ["action", "标签", msg.path, kind], function() {
|
||||
}, true)
|
||||
})
|
||||
Volcanos("onexport", {help: "导出数据", list: ["当前行"],
|
||||
position: function(can, index, total) { total = total || can.max
|
||||
return parseInt((index+1)*100/total)+"%"+" = "+(parseInt(index)+1)+"/"+parseInt(total)
|
||||
},
|
||||
})
|
||||
Volcanos("onstatus", {help: "组件状态", list: ["begin", "width", "point", "which"],
|
||||
"begin": function(event, can, value, cmd, target) {target.innerHTML = value? value.x+","+value.y: ""},
|
||||
"width": function(event, can, value, cmd, target) {target.innerHTML = value? value.width+","+value.height: ""},
|
||||
"point": function(event, can, value, cmd, target) {target.innerHTML = value.x+","+value.y},
|
||||
"which": function(event, can, value, cmd, target) {var figure = can.onfigure[value.tagName];
|
||||
target.innerHTML = figure? figure.show(event, can, value, target): value.tagName;
|
||||
},
|
||||
})
|
||||
Volcanos("onexport", {help: "导出数据", list: []})
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user