adapt apps

This commit is contained in:
lxsang
2020-05-12 21:08:39 +02:00
parent c53fd8bd88
commit 04e5a4d50c
29 changed files with 416 additions and 479 deletions

View File

@ -72,12 +72,12 @@ Ant.OS.announcer =
Ant.OS.announcer.listeners[a.pid].push { e: e, f: f }
Ant.OS.announcer.observable.on e, f
trigger: (e, d) -> Ant.OS.announcer.observable.trigger e, d
osfail: (m, e, s) ->
Ant.OS.announcer.ostrigger "fail", { m: m, e: e, s: s }
oserror: (m, e, s) ->
Ant.OS.announcer.ostrigger "error", { m: m, e: e, s: s }
osfail: (m, e) ->
Ant.OS.announcer.ostrigger "fail", { m: m, e: e }
oserror: (m, e) ->
Ant.OS.announcer.ostrigger "error", { m: m, e: e }
osinfo: (m) ->
Ant.OS.announcer.ostrigger "info", { m: m, e: null, s: null }
Ant.OS.announcer.ostrigger "info", { m: m, e: null }
ostrigger: (e, d) ->
Ant.OS.announcer.trigger e, { id: 0, data: d, name: "OS" }
unregister: (app) ->

View File

@ -233,7 +233,7 @@ class YesNoDialog extends BasicDialog
init: () ->
super.init()
me = @
@find("lbl").set "text", @data.label if @data and @data.label
@find("lbl").set "*", @data if @data
(@find "btnYes").set "onbtclick", (e) ->
me.handle(true) if me.handle
me.quit()

View File

@ -289,42 +289,47 @@ Ant.OS.API =
libready: (l) ->
return Ant.OS.API.shared[l] || false
require: (l,f) ->
if not Ant.OS.API.shared[l]
if l.match /^(https?:\/\/[^\s]+)/g
Ant.OS.API.script l, () ->
Ant.OS.API.shared[l] = true
Ant.OS.announcer.trigger "sharedlibraryloaded", l
f() if f
, (e, s) ->
Ant.OS.announcer.oserror __("Cannot load 3rd library at: {0}", l), e, r
requires: (l) ->
new Promise (resolve, reject) ->
if not Ant.OS.API.shared[l]
link = l
if not l.match /^(https?:\/\/[^\s]+)/g
path = "os://scripts/"
cssFile = "#{path}#{l}.css".asFileHandle()
cssFile.onready()
.then () ->
$('<link>', {
rel: 'stylesheet',
type: 'text/css',
'href': "#{cssFile.getlink()}"
})
.appendTo 'head'
.catch (e) ->
js = "#{path}#{l}.js"
link = js.asFileHandle().getlink()
Ant.OS.API.script link
.then () ->
Ant.OS.API.shared[l] = true
console.log "loaded:", l
Ant.OS.announcer.trigger "sharedlibraryloaded", l
resolve(l)
.catch (e) ->
reject e
else
path = "os://scripts/"
js = "#{path}#{l}.js"
js.asFileHandle().onready (d) ->
Ant.OS.API.shared[l] = true
el = $ '<script>', { src: "#{Ant.OS.API.handle.get}/#{js}" }
.appendTo 'head'
#load css file
css = "#{path}#{l}.css"
css.asFileHandle().onready (d) ->
el = $ '<link>', { rel: 'stylesheet', type: 'text/css', 'href': "#{Ant.OS.API.handle.get}/#{css}" }
.appendTo 'head'
, () ->
console.log "loaded", l
Ant.OS.announcer.trigger "sharedlibraryloaded", l
f() if f
else
console.log l, "Library exist, no need to load"
f() if f
Ant.OS.announcer.trigger "sharedlibraryloaded", l
console.log l, "Library exist, no need to load"
Ant.OS.announcer.trigger "sharedlibraryloaded", l
resolve()
requires:(libs, f) ->
return f() unless libs.length > 0
Ant.OS.announcer.observable.one "sharedlibraryloaded", (l) ->
libs.splice 0, 1
Ant.OS.API.requires libs, f
Ant.OS.API.require libs[0], null
require: (libs) ->
new Promise (resolve, reject) ->
return resolve() unless libs.length > 0
Ant.OS.announcer.observable.one "sharedlibraryloaded", (l) ->
libs.splice 0, 1
Ant.OS.API.require libs
.catch (e) -> reject e
.then (r) -> resolve(r)
Ant.OS.API.requires libs[0]
.catch (e) -> reject e
packages:
fetch: () ->

View File

@ -56,7 +56,12 @@ Ant.OS or=
Ant.OS.announcer.trigger "srvroutineready", app
if cls.dependencies
libs = (v for v in cls.dependencies)
Ant.OS.API.requires libs, f
Ant.OS.API.require libs
.then () ->
console.log "launch the app"
f()
.catch (e) ->
Ant.OS.announcer.oserror __("Unable to load libraries"), e
else
f()
appByPid: (pid) ->

View File

@ -311,10 +311,10 @@ Ant.OS.GUI =
return unless el.length > 0
Ant.OS.GUI.showTooltip el, ($(el).attr "tooltip"), e
fp = Ant.OS.setting.desktop.path.asFileHandle()
# desktop default file manager
desktop = $ Ant.OS.GUI.workspace
desktop[0].fetch = () ->
fp = Ant.OS.setting.desktop.path.asFileHandle()
fn = () ->
fp.read().then (d) ->
return Ant.OS.announcer.osfail d.error, (Ant.OS.API.throwe "OS.VFS"), d.error if d.error
@ -385,6 +385,7 @@ Ant.OS.GUI =
desktop[0].fetch()
Ant.OS.announcer.observable.on "VFS", (d) ->
return if ["read", "publish", "download"].includes d.data.m
desktop[0].fetch() if d.data.file.hash() is fp.hash() or d.data.file.parent().hash() is fp.hash()
Ant.OS.announcer.ostrigger "desktoploaded"
# mount it

View File

@ -26,6 +26,9 @@ class FileViewTag extends Ant.OS.GUI.BaseTag
return $(@refs.status).show() if v
$(@refs.status).hide()
__showhidden__: (v) ->
@switchView()
__path__: (v) ->
return unless v
me = @
@ -36,7 +39,7 @@ class FileViewTag extends Ant.OS.GUI.BaseTag
me.refs.status.set("text", " ") if me.get "status"
.catch (e) ->
# this should be handled by the OS
console.error e
Ant.OS.announcer.oserror e
__data__: (v) ->
return unless v

View File

@ -1,3 +1,9 @@
class GridRowTag extends Ant.OS.GUI.BaseTag
constructor: (r, o) ->
super r, o
@setopt "data", []
@refs.yield = @root
class GridCellPrototype extends Ant.OS.GUI.BaseTag
constructor: (r, o) ->
super r, o
@ -10,12 +16,15 @@ class GridCellPrototype extends Ant.OS.GUI.BaseTag
__data__: (v) ->
return unless v.selected
@set "selected", v.selected
delete v.selected
__selected__: (v) ->
@get("data").selected = v
return unless v
@cellseleck {}, false
update: () ->
@set "data", @get("data")
mount: () ->
me = @
$(@root).css "display", "block"
@ -34,7 +43,7 @@ class GridCellPrototype extends Ant.OS.GUI.BaseTag
__class__: (v) ->
$(@root).removeClass().addClass @get("class")
class SimpleGridCell extends GridCellPrototype
class SimpleGridCellTag extends GridCellPrototype
constructor: (r, o) ->
super r, o
@setopt "header", false
@ -64,6 +73,10 @@ class GridViewTag extends Ant.OS.GUI.BaseTag
@setopt "onrowselect", (e) ->
@setopt "oncelldbclick", (e) ->
@setopt "multiselect", false
me = @
@root.push = (r) -> me.push r, false
@root.unshift = (r) -> me.unshift r
@root.remove = (r) -> me.remove r
__header__: (v) ->
return $(@refs.header).hide() if not v or v.length is 0
@ -79,17 +92,43 @@ class GridViewTag extends Ant.OS.GUI.BaseTag
me = @
$(@refs.grid).empty()
for row in rows
div = $("<div>")
.addClass("afx-grid-row")
.css "display", "contents"
.appendTo @refs.grid
for cell in row
el = $("<#{@get("cellitem")}>").appendTo div
el[0].uify undefined
cell.domel = el[0]
el[0].set "oncellselect", (e) -> me.cellselect e, false
el[0].set "oncelldbclick", (e) -> me.cellselect e, true
el[0].set "data", cell
@push row, false
remove: (row) ->
return unless row
rowdata = row.get "data"
data = @get "rows"
@set "selectedRow", undefined if @get("selectedRow") is row
@set "selectedCell", undefined if $(@get("selectedCell")).parent()[0] is row
list = @get("selectedRows")
list.splice(list.indexOf(row), 1) if list.includes(row)
if data.includes rowdata
data.splice data.indexOf(rowdata), 1
$(row).remove()
push: (row, flag) ->
me = @
rowel = $("<afx-grid-row>")
.css "display", "contents"
rowel[0].uify undefined
rowel[0].set "data", row
row.domel = rowel[0]
for cell in row
el = $("<#{@get("cellitem")}>").appendTo rowel
cell.domel = el[0]
el[0].uify undefined
el[0].set "oncellselect", (e) -> me.cellselect e, false
el[0].set "oncelldbclick", (e) -> me.cellselect e, true
el[0].set "data", cell
if flag
$(@refs.grid).prepend rowel[0]
else
rowel.appendTo @refs.grid
unshift: (row) ->
@push row, true
multiselect: () ->
@get "multiselect"
@ -114,23 +153,23 @@ class GridViewTag extends Ant.OS.GUI.BaseTag
selectedRow = @get "selectedRow"
selectedRows = @get "selectedRows"
evt = { id: @aid(), data: {} }
div = $(e.data.item).parent()[0]
row = $(e.data.item).parent()[0]
if @multiselect()
if selectedRows.includes div
selectedRows.splice selectedRows.indexOf(div) , 1
$(div).removeClass()
if selectedRows.includes row
selectedRows.splice selectedRows.indexOf(row) , 1
$(row).removeClass()
else
selectedRows.push div
$(div).removeClass().addClass("afx-grid-row-selected")
selectedRows.push row
$(row).removeClass().addClass("afx-grid-row-selected")
evt.data.items = @get "selectedRows"
else
return if selectedRow is div
return if selectedRow is row
$(selectedRow).removeClass()
@set "selectedRow", div
@set "selectedRows", [div]
evt.data.item = div
evt.data.items = [ div ]
$(div).removeClass().addClass("afx-grid-row-selected")
@set "selectedRow", row
@set "selectedRows", [row]
evt.data.item = row
evt.data.items = [ row ]
$(row).removeClass().addClass("afx-grid-row-selected")
@get("onrowselect") evt
@observable.trigger "rowselect", evt
@ -190,5 +229,6 @@ class GridViewTag extends Ant.OS.GUI.BaseTag
] }
]
Ant.OS.GUI.define "afx-grid-view", GridViewTag
Ant.OS.GUI.define "afx-grid-cell", SimpleGridCell
Ant.OS.GUI.define "afx-grid-cell", SimpleGridCellTag
Ant.OS.GUI.define "afx-grid-row", GridRowTag
Ant.OS.GUI.define "afx-grid-cell-proto", GridCellPrototype

View File

@ -49,7 +49,6 @@ class MenuEntryTag extends Ant.OS.GUI.BaseTag
mount: () ->
me = @
@refs.switch.set "enable", false
$(@refs.entry).click (e) -> me.select e
submenuoff: () ->
@ -99,6 +98,7 @@ class SimpleMenuEntryTag extends MenuEntryTag
$(@refs.switch).hide()
__checked__: (v) ->
@get("data").checked = v
return unless @get("radio") or @get("switch")
@refs.switch.set "swon", v
@ -124,7 +124,7 @@ class SimpleMenuEntryTag extends MenuEntryTag
$(@refs.shortcut).hide()
return unless v
$(@refs.shortcut).show()
$(@refs.shortcut).val v
$(@refs.shortcut).text v
reset_radio: () ->
return unless @has_children()
@ -132,15 +132,19 @@ class SimpleMenuEntryTag extends MenuEntryTag
return unless v.domel.get "radio"
v.domel.set "checked", false
mount: () ->
super.mount()
me = @
@refs.switch.set "enable", false
select: (e) ->
super.select(e)
if @get "switch"
@set "checked", !@get "checked"
else if @get "radio"
p = @get "parent"
p.reset_radio() if p
@set "checked", !@get "checked"
super.select(e)
itemlayout: () ->
[

View File

@ -156,7 +156,12 @@ class SystemPanelTag extends Ant.OS.GUI.BaseTag
$(@refs.applist).click (e) ->
me.open()
Ant.OS.GUI.bindKey "CTRL- ", (e) ->
if me.view is false
me.toggle true
else
me.toggle false
me.view = not me.view
Ant.OS.announcer.trigger("syspanelloaded")
Ant.OS.GUI.define "afx-sys-panel", SystemPanelTag

View File

@ -11,6 +11,7 @@ class Ant.OS.GUI.BaseTag
@root.get = (k) -> me.get k
@root.aid = () -> me.aid()
@root.calibrate = () -> me.calibrate()
@root.update = () -> me.update()
@mounted = false
@root.sync = () -> me.sync()
@refs = {}
@ -60,6 +61,7 @@ class Ant.OS.GUI.BaseTag
@get "data-id"
calibrate: () ->
update: () ->
get: (opt) ->
return @opts if opt is "*"

View File

@ -50,8 +50,9 @@ class BaseFileHandle
@genealogy = re.split("/")
@basename = @genealogy[@genealogy.length - 1] unless @isRoot()
@ext = @basename.split( "." ).pop() unless @basename.lastIndexOf(".") is 0 or @basename.indexOf( "." ) is -1
asFileHandle: () ->
@
asFileHandle: () -> @
isRoot: () -> (not @genealogy) or (@genealogy.size is 0)
child: (name) ->
@ -92,6 +93,7 @@ class BaseFileHandle
parent: () ->
return @ if @isRoot()
return (@protocol + "://" + (@genealogy.slice 0 , @genealogy.length - 1).join "/")
.asFileHandle()
onready: () ->
# read meta data
@ -112,15 +114,19 @@ class BaseFileHandle
me.onready()
.then (r) ->
me._rd(t)
.then (d) -> resolve d
.then (d) ->
# Ant.OS.announcer.ostrigger "VFS", { m: "read", file: me }
resolve d
.catch (e) -> reject e
.catch (e) -> reject e
write: (d, t) ->
write: (t) ->
me = @
new Promise (resolve, reject) ->
me._wr(d, t)
.then (r) -> resolve r
me._wr(t)
.then (r) ->
Ant.OS.announcer.ostrigger "VFS", { m: "write", file: me }
resolve r
.catch (e) -> reject e
mk: (d) ->
@ -129,7 +135,9 @@ class BaseFileHandle
me.onready()
.then (r) ->
me._mk(d)
.then (d) -> resolve d
.then (d) ->
Ant.OS.announcer.ostrigger "VFS", { m: "mk", file: me }
resolve d
.catch (e) -> reject e
.catch (e) -> reject e
@ -139,7 +147,9 @@ class BaseFileHandle
me.onready()
.then (r) ->
me._rm()
.then (d) -> resolve d
.then (d) ->
Ant.OS.announcer.ostrigger "VFS", { m: "remove", file: me }
resolve d
.catch (e) -> reject e
.catch (e) -> reject e
@ -149,7 +159,9 @@ class BaseFileHandle
me.onready()
.then (r) ->
me._up()
.then (d) -> resolve d
.then (d) ->
Ant.OS.announcer.ostrigger "VFS", { m: "upload", file: me }
resolve d
.catch (e) -> reject e
.catch (e) -> reject e
@ -159,7 +171,9 @@ class BaseFileHandle
me.onready()
.then (r) ->
me._pub()
.then (d) -> resolve d
.then (d) ->
Ant.OS.announcer.ostrigger "VFS", { m: "publish", file: me }
resolve d
.catch (e) -> reject e
.catch (e) -> reject e
@ -169,7 +183,9 @@ class BaseFileHandle
me.onready()
.then (r) ->
me._down()
.then (d) -> resolve d
.then (d) ->
Ant.OS.announcer.ostrigger "VFS", { m: "download", file: me }
resolve d
.catch (e) -> reject e
.catch (e) -> reject e
@ -178,8 +194,10 @@ class BaseFileHandle
new Promise (resolve, reject) ->
me.onready()
.then (r) ->
me._mv()
.then (d) -> resolve d
me._mv(d)
.then (data) ->
Ant.OS.announcer.ostrigger "VFS", { m: "move", file: me }
resolve data
.catch (e) -> reject e
.catch (e) -> reject e
@ -189,7 +207,9 @@ class BaseFileHandle
me.onready()
.then (r) ->
me._exec()
.then (d) -> resolve d
.then (d) ->
Ant.OS.announcer.ostrigger "VFS", { m: "execute", file: me }
resolve d
.catch (e) -> reject e
.catch (e) -> reject e
@ -232,22 +252,23 @@ class RemoteFileHandle extends Ant.OS.API.VFS.BaseFileHandle
return Ant.OS.API.handle.fileblob @path if t is "binary"
Ant.OS.API.handle.readfile @path, if t then t else "text"
_wr: (d, t) ->
_wr: (t) ->
# t is base64 or undefined
return Ant.OS.API.handle.write me.path, me.cache if p is "base64"
return Ant.OS.API.handle.write me.path, me.cache if t is "base64"
me = @
new Promise (resolve, reject) ->
me.b64(t)
.then (r) ->
Ant.OS.API.handle.write me.path, d
resolve r
Ant.OS.API.handle.write me.path, r
.then (result) -> resolve result
.catch (e) -> reject e
.catch (e) -> reject e
_mk: (d) ->
me = @
if @info.type is "file"
return new Promise (resolve, reject) ->
reject { error: __("{0} is not a directory", me.path) }
reject Ant.OS.API.throwe __("{0} is not a directory", me.path)
Ant.OS.API.handle.mkdir "#{@path}/#{d}"
_rm: () ->
@ -259,17 +280,17 @@ class RemoteFileHandle extends Ant.OS.API.VFS.BaseFileHandle
_up: () ->
me = @
if @info.type isnt "file"
if @info.type isnt "dir"
return new Promise (resolve, reject) ->
reject { error: __("{0} is not a file", me.path) }
reject Ant.OS.API.throwe __("{0} is not a file", me.path)
Ant.OS.API.handle.upload @path
_down: () ->
me = @
new Promise (resolve, reject) ->
if me.info.type is "dir"
return reject { error: __("{0} is not a file", me.path) }
Ant.OS.API.handle.fileblob(@path)
return Ant.OS.API.throwe __("{0} is not a file", me.path)
Ant.OS.API.handle.fileblob(me.path)
.then (d) ->
blob = new Blob [d], { type: "octet/stream" }
Ant.OS.API.saveblob me.basename, blob
@ -293,7 +314,7 @@ class ApplicationHandle extends Ant.OS.API.VFS.BaseFileHandle
me = @
new Promise (resolve, reject) ->
return resolve { result: me.info } if me.info
return reject { error: __("Application meta data isnt found") } unless me.isRoot()
return reject Ant.OS.API.throwe(__("Application meta data isnt found")) unless me.isRoot()
resolve { result: ( v for k, v of Ant.OS.setting.system.packages ) }
@ -341,7 +362,7 @@ class URLFileHandle extends Ant.OS.API.VFS.BaseFileHandle
_rd: (t) ->
Ant.OS.API.get @path, if t then t else "text"
Ant.OS.API.VFS.register "^(http|https)$", URLFileHandle
Ant.OS.API.VFS.register "^(http|https|ftp)$", URLFileHandle
class SharedFileHandle extends Ant.OS.API.VFS.BaseFileHandle
@ -368,12 +389,13 @@ class SharedFileHandle extends Ant.OS.API.VFS.BaseFileHandle
me = @
new Promise (resolve, reject) ->
if me.info.type is "dir"
return reject { error: __("{0} is not a file", me.path) }
Ant.OS.API.handle.fileblob me.path, (d) ->
blob = new Blob [d], { type: "octet/stream" }
Ant.OS.API.saveblob me.basename, blob
resolve()
return reject Ant.OS.API.throwe __("{0} is not a file", me.path)
Ant.OS.API.handle.fileblob me.path
.then (data) ->
blob = new Blob [data], { type: "octet/stream" }
Ant.OS.API.saveblob me.basename, blob
resolve()
.catch (e) -> reject e
_pub: () ->
me = @
return new Promise (resolve, reject) -> resolve { result: me.basename }