refactory code

This commit is contained in:
lxsang
2020-05-11 19:52:31 +02:00
parent f5e5d8501b
commit c53fd8bd88
32 changed files with 554 additions and 655 deletions

View File

@ -61,6 +61,8 @@ class BasicDialog extends BaseDialog
init: () ->
@scheme.set "apptitle", @data.title if @data and @data.title
@scheme.set "resizable", false
@scheme.set "minimizable", false
this.OS.GUI.BasicDialog = BasicDialog
@ -343,42 +345,41 @@ AboutDialog.scheme = """
"""
this.OS.register "AboutDialog", AboutDialog
class FileDiaLog extends BaseDialog
class FileDialog extends BasicDialog
constructor: () ->
super "FileDiaLog"
super "FileDialog", FileDialog.scheme
init: () ->
@render "os://resources/schemes/filedialog.html"
main: () ->
super.init()
fileview = @find "fileview"
location = @find "location"
filename = @find "filename"
me = @
@scheme.set "apptitle", @title
fileview.set "fetch", (e, f) ->
return unless e.child
e.child.path.asFileHandle().read (d) ->
return me.error __("Resource not found: {0}", e.child.path) if d.error
f d.result
fileview.set "fetch", (path) ->
new Promise (resolve, reject) ->
path.asFileHandle().read()
.then (d) ->
return reject d if d.error
resolve d.result
.catch (e) -> reject e
setroot = (path) ->
path.asFileHandle().read (d) ->
path.asFileHandle().read().then (d) ->
if(d.error)
return me.error __("Resource not found: {0}", path)
fileview.set "path", path
fileview.set "data", d.result
if not @data or not @data.root
location.set "onlistselect", (e) ->
return unless e and e.data.path
setroot e.data.path
location.set "items", ( i for i in @systemsetting.VFS.mountpoints when i.type isnt "app" )
location.set "selected", 0 unless location.get "selected"
return unless e and e.data.item
setroot e.data.item.get("data").path
location.set "data", ( i for i in @systemsetting.VFS.mountpoints when i.type isnt "app" )
location.set "selected", 0 if location.get("selectedItem") is undefined
else
$(location).hide()
@trigger "calibrate"
@trigger "resize"
setroot @data.root
fileview.set "onfileselect", (f) ->
($ filename).val f.filename if f.type is "file"
fileview.set "onfileselect", (e) ->
($ filename).val e.data.filename if e.data.type is "file"
(@find "bt-ok").set "onbtclick", (e) ->
f = fileview.get "selectedFile"
return me.notify __("Please select a file/fofler") unless f
@ -392,11 +393,9 @@ class FileDiaLog extends BaseDialog
m = true
break
return me.notify __("Only {0} could be selected", me.data.mimes.join(",")) unless m
d = f.path
d = f.path.asFileHandle().parent() if f.type is "file"
me.handle d, ($ filename).val(), f.path, f if me.handle
#sel = if me.data and me.data.selection then me.data.selection else "file"
#me.handle f, ($ filename).val() if me.handle and ((f.type is sel) or (sel is "*"))
name = $(filename).val()
me.handle { file: f, name: name } if me.handle
me.quit()
(@find "bt-cancel").set "onbtclick", (e) ->
@ -406,4 +405,20 @@ class FileDiaLog extends BaseDialog
@trigger "resize"
fileview.set "showhidden", @data.hidden if @data and @data.hidden
this.OS.register "FileDiaLog", FileDiaLog
FileDialog.scheme = """
<afx-app-window width='400' height='300'>
<afx-hbox>
<afx-list-view data-id = "location" dropdown = "false" data-width = "120"></afx-list-view>
<afx-vbox>
<afx-file-view data-id = "fileview" view="tree" status = "false"></afx-file-view>
<input data-height = '26' type = "text" data-id = "filename" style="margin-left:5px; margin-right:5px;display:none;" />
<div data-height = '30' style=' text-align:right;padding:3px;'>
<afx-button data-id = "bt-ok" text = "__(Ok)"></afx-button>
<afx-button data-id = "bt-cancel" text = "__(Cancel)"></afx-button>
</div>
</afx-vbox>
</afx-hbox>
</afx-app-window>
"""
this.OS.register "FileDialog", FileDialog

View File

@ -91,7 +91,7 @@ Ant.OS or=
delete Ant.OS.announcer.observable
($ "#wrapper").empty()
Ant.OS.GUI.clearTheme()
Ant.OS.announcer.observable = riot.observable()
Ant.OS.announcer.observable = new Ant.OS.API.Announcer()
Ant.OS.announcer.quota = 0
Ant.OS.APP = {}
Ant.OS.setting =
@ -128,6 +128,7 @@ Ant.OS or=
.then (r) ->
Ant.OS.cleanup()
Ant.OS.API.handle.logout()
.then (d) -> Ant.OS.boot()
.catch (e) ->
console.error e

View File

@ -26,27 +26,6 @@ Ant.OS.GUI =
CTRL: {}
SHIFT: {}
META: {}
SYS_MENU: [
{
text: "",
iconclass: "fa fa-eercast",
dataid: "sys-menu-root",
children: [
{
text: "__(Applications)",
children: [],
dataid: "sys-apps"
iconclass: "fa fa-adn",
onchildselect: (d) ->
Ant.OS.GUI.launch d.data.item.get("data").name
}
],
onchildselect: (d) ->
id = d.data.item.get("data").dataid
return Ant.OS.exit() if id is "sys-logout"
return Ant.OS.GUI.toggleFullscreen() if id is "os-fullsize"
}
]
htmlToScheme: (html, app, parent) ->
scheme = $.parseHTML html
@ -80,20 +59,21 @@ Ant.OS.GUI =
Ant.OS.GUI.pushServices srvs
Ant.OS.GUI.pushService srvs[0]
openDialog: (d, f, title, data) ->
if Ant.OS.GUI.dialog
Ant.OS.GUI.dialog.show()
return
if not Ant.OS.GUI.subwindows[d]
ex = Ant.OS.API.throwe "Dialog"
return Ant.OS.announcer.oserror __("Dialog {0} not found", d), ex, null
Ant.OS.GUI.dialog = new Ant.OS.GUI.subwindows[d]()
Ant.OS.GUI.dialog.parent = Ant.OS.GUI
Ant.OS.GUI.dialog.handle = f
Ant.OS.GUI.dialog.pid = -1
Ant.OS.GUI.dialog.data = data
Ant.OS.GUI.dialog.title = title
Ant.OS.GUI.dialog.init()
openDialog: (d, data) ->
new Promise (resolve, reject) ->
if Ant.OS.GUI.dialog
Ant.OS.GUI.dialog.show()
return resolve()
if not Ant.OS.GUI.subwindows[d]
ex = Ant.OS.API.throwe "Dialog"
return reject(ex)
Ant.OS.GUI.dialog = new Ant.OS.GUI.subwindows[d]()
Ant.OS.GUI.dialog.parent = Ant.OS.GUI
Ant.OS.GUI.dialog.handle = resolve
Ant.OS.GUI.dialog.reject = reject
Ant.OS.GUI.dialog.pid = -1
Ant.OS.GUI.dialog.data = data
Ant.OS.GUI.dialog.init()
pushService: (ph) ->
arr = ph.split "/"
@ -213,7 +193,7 @@ Ant.OS.GUI =
app.applySetting m.data.m if (m.name is app.name)
toggleFullscreen: () ->
el = ($ "body")[0]
el = document.documentElement
if Ant.OS.GUI.fullscreen
return document.exitFullscreen() if document.exitFullscreen
return document.mozCancelFullScreen() if document.mozCancelFullScreen
@ -263,10 +243,11 @@ Ant.OS.GUI =
showTooltip: (el, text, e) ->
el = el[0]
label = ($ "#systooltip")[0]
$("#workspace").on "mousemove", (ev) ->
cb = (ev) ->
if $(ev.target).closest(el).length is 0
$(label).hide()
$("#workspace").off "mousemove"
$(document).off "mousemove", cb
$(document).on "mousemove", cb
arr = text.split /:(.+)/
tip = text
tip = arr[1] if arr.length > 1
@ -279,167 +260,139 @@ Ant.OS.GUI =
when "cr" # center right of the element
left = offset.left + w + 5
top = offset.top + h / 2 - $(label).height() / 2
$(label).css "top", top + "px"
.css "left", left + "px"
when "ct" #ceter top
left = offset.left + w / 2 - $(label).width() / 2
top = offset.top - $(label).height() - 5
else
return unless e
$(label).css "top", e.clientY + 5 + "px"
.css "left", e.clientX + 5 + "px"
top = e.clientY + 5
left = e.clientX + 5
$(label).css "top", top + "px"
.css "left", left + "px"
initDM: ->
# check login first
Ant.OS.API.resource("schemes/dm.html")
.then (x) ->
return null unless x
scheme = $.parseHTML x
($ "#wrapper").append scheme
scheme = $.parseHTML Ant.OS.GUI.schemes.ws
($ "#wrapper").append scheme
Ant.OS.announcer.observable.one "sysdockloaded", () ->
($ window).bind 'keydown', (event) ->
dock = ($ "#sysdock")[0]
return unless dock
app = dock.get "selectedApp"
#return true unless app
c = String.fromCharCode(event.which).toUpperCase()
fnk = undefined
if event.ctrlKey
fnk = "CTRL"
else if event.metaKey
fnk = "META"
else if event.shiftKey
fnk = "SHIFT"
else if event.altKey
fnk = "ALT"
Ant.OS.announcer.observable.one "sysdockloaded", () ->
($ window).bind 'keydown', (event) ->
dock = ($ "#sysdock")[0]
return unless dock
app = dock.get "selectedApp"
#return true unless app
c = String.fromCharCode(event.which).toUpperCase()
fnk = undefined
if event.ctrlKey
fnk = "CTRL"
else if event.metaKey
fnk = "META"
else if event.shiftKey
fnk = "SHIFT"
else if event.altKey
fnk = "ALT"
return unless fnk
r = if app then app.shortcut fnk, c, event else true
return event.preventDefault() if not r
return unless Ant.OS.GUI.shortcut[fnk]
return unless Ant.OS.GUI.shortcut[fnk][c]
Ant.OS.GUI.shortcut[fnk][c](event)
event.preventDefault()
# system menu and dock
$("#syspanel")[0].uify()
$("#sysdock")[0].uify()
$("#systooltip")[0].uify()
$("#contextmenu")[0].uify()
#riot.mount ($ "#syspanel", $ "#wrapper")
#riot.mount ($ "#sysdock", $ "#workspace"), { items: [] }
#riot.mount ($ "#systooltip", $ "#wrapper")
# context menu
#riot.mount ($ "#contextmenu", $ "#wrapper")
($ "#workspace").contextmenu (e) -> Ant.OS.GUI.bindContextMenu e
# tooltip
($ "#workspace").mouseover (e) ->
el = $(e.target).closest "[tooltip]"
return unless el.length > 0
Ant.OS.GUI.showTooltip el, ($(el).attr "tooltip"), e
# 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
items = []
$.each d.result, (i, v) ->
return if v.filename[0] is '.' and not Ant.OS.setting.desktop.showhidden
v.text = v.filename
#v.text = v.text.substring(0,9) + "..." ifv.text.length > 10
v.iconclass = v.type
items.push(v)
desktop[0].set "data", items
desktop[0].refresh()
return unless fnk
r = if app then app.shortcut fnk, c, event else true
return event.preventDefault() if not r
return unless Ant.OS.GUI.shortcut[fnk]
return unless Ant.OS.GUI.shortcut[fnk][c]
Ant.OS.GUI.shortcut[fnk][c](event)
event.preventDefault()
# system menu and dock
$("#syspanel")[0].uify()
$("#sysdock")[0].uify()
$("#systooltip")[0].uify()
$("#contextmenu")[0].uify()
($ "#workspace").contextmenu (e) -> Ant.OS.GUI.bindContextMenu e
# tooltip
($ document).mouseover (e) ->
el = $(e.target).closest "[tooltip]"
return unless el.length > 0
Ant.OS.GUI.showTooltip el, ($(el).attr "tooltip"), e
# 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
items = []
$.each d.result, (i, v) ->
return if v.filename[0] is '.' and not Ant.OS.setting.desktop.showhidden
v.text = v.filename
#v.text = v.text.substring(0,9) + "..." ifv.text.length > 10
v.iconclass = v.type
items.push(v)
desktop[0].set "data", items
desktop[0].refresh()
fp.onready()
.then () -> fn()
.catch ( e ) -> # try to create the path
console.log "#{fp.path} not found"
name = fp.basename
fp.parent().asFileHandle().mk(name).then (r) ->
ex = Ant.OS.API.throwe "OS.VFS"
if r.error then Ant.OS.announcer.osfail d.error, ex, d.error else fn()
desktop[0].ready = (e) ->
e.observable = Ant.OS.announcer
window.onresize = () ->
Ant.OS.announcer.trigger "desktopresize"
e.refresh()
fp.onready()
.then () -> fn()
.catch ( e ) -> # try to create the path
console.log "#{fp.path} not found"
name = fp.basename
fp.parent().asFileHandle().mk(name).then (r) ->
ex = Ant.OS.API.throwe "OS.VFS"
if r.error then Ant.OS.announcer.osfail d.error, ex, d.error else fn()
desktop[0].ready = (e) ->
e.observable = Ant.OS.announcer
window.onresize = () ->
Ant.OS.announcer.trigger "desktopresize"
e.refresh()
desktop[0].set "onlistselect", (d) ->
($ "#sysdock").get(0).set "selectedApp", null
desktop[0].set "onlistdbclick", ( d ) ->
($ "#sysdock").get(0).set "selectedApp", null
it = desktop[0].get "selectedItem"
Ant.OS.GUI.openWith it.get("data")
desktop[0].set "onlistselect", (d) ->
($ "#sysdock").get(0).set "selectedApp", null
desktop[0].set "onlistdbclick", ( d ) ->
($ "#sysdock").get(0).set "selectedApp", null
it = desktop[0].get "selectedItem"
Ant.OS.GUI.openWith it.get("data")
#($ "#workingenv").on "click", (e) ->
# desktop[0].set "selected", -1
#($ "#workingenv").on "click", (e) ->
# desktop[0].set "selected", -1
desktop.on "click", (e) ->
return unless e.target.tagName.toUpperCase() is "UL"
desktop[0].unselect()
($ "#sysdock").get(0).set "selectedApp", null
desktop[0].contextmenuHandle = (e, m) ->
desktop[0].unselect() if e.target.tagName.toUpperCase() is "UL"
($ "#sysdock").get(0).set "selectedApp", null
menu = [
{ text: __("Open"), dataid: "desktop-open" },
{ text: __("Refresh"), dataid: "desktop-refresh" }
]
menu = menu.concat ( v for k, v of Ant.OS.setting.desktop.menu)
m.set "items", menu
m.set "onmenuselect", (evt) ->
item = evt.data.item.get("data")
switch item.dataid
when "desktop-open"
it = desktop[0].get "selectedItem"
return Ant.OS.GUI.openWith it.get("data") if it
it = Ant.OS.setting.desktop.path.asFileHandle()
it.mime = "dir"
Ant.OS.GUI.openWith it
when "desktop-refresh"
desktop[0].fetch()
else
Ant.OS.GUI.launch item.app, item.args if item.app
m.show(e)
desktop[0].fetch()
Ant.OS.announcer.observable.on "VFS", (d) ->
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
desktop[0].uify()
# riot.mount desktop
.catch (e) ->
console.log e
alert __("System fail: Cannot init desktop manager")
desktop.on "click", (e) ->
return unless e.target.tagName.toUpperCase() is "UL"
desktop[0].unselect()
($ "#sysdock").get(0).set "selectedApp", null
desktop[0].contextmenuHandle = (e, m) ->
desktop[0].unselect() if e.target.tagName.toUpperCase() is "UL"
($ "#sysdock").get(0).set "selectedApp", null
menu = [
{ text: __("Open"), dataid: "desktop-open" },
{ text: __("Refresh"), dataid: "desktop-refresh" }
]
menu = menu.concat ( v for k, v of Ant.OS.setting.desktop.menu)
m.set "items", menu
m.set "onmenuselect", (evt) ->
item = evt.data.item.get("data")
switch item.dataid
when "desktop-open"
it = desktop[0].get "selectedItem"
return Ant.OS.GUI.openWith it.get("data") if it
it = Ant.OS.setting.desktop.path.asFileHandle()
it.mime = "dir"
Ant.OS.GUI.openWith it
when "desktop-refresh"
desktop[0].fetch()
else
Ant.OS.GUI.launch item.app, item.args if item.app
m.show(e)
desktop[0].fetch()
Ant.OS.announcer.observable.on "VFS", (d) ->
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
desktop[0].uify()
refreshDesktop: () ->
($ Ant.OS.GUI.workspace)[0].fetch()
refreshSystemMenu: () ->
Ant.OS.GUI.SYS_MENU[0].children.length = 1
Ant.OS.GUI.SYS_MENU[0].children[0].children.length = 0
Ant.OS.GUI.SYS_MENU[0].children[0].children.push v for k, v of Ant.OS.setting.system.packages when (v and v.app)
Ant.OS.GUI.SYS_MENU[0].children.push v for k, v of Ant.OS.setting.system.menu
Ant.OS.GUI.SYS_MENU[0].children.push
text: "__(Toggle Full screen)",
dataid: "os-fullsize",
iconclass: "fa fa-tv"
Ant.OS.GUI.SYS_MENU[0].children.push
text: "__(Log out)",
dataid: "sys-logout",
iconclass: "fa fa-user-times"
# Ant.OS.GUI.buildSystemMenu()
buildSystemMenu: () ->
($ "[data-id = 'osmenu']", "#syspanel")[0].set "items", Ant.OS.GUI.SYS_MENU
#console.log menu
mkdialog: (conf) ->
return new Ant.OS.GUI.BasicDialog conf.name, conf.layout
@ -455,7 +408,8 @@ Ant.OS.GUI =
password: ($ "#txtpass").val()
Ant.OS.API.handle.login data
.then (d) ->
if d.error then ($ "#login_error").html d.error else Ant.OS.GUI.startAntOS d.result
return ($ "#login_error").html d.error if d.error
Ant.OS.GUI.startAntOS d.result
.catch (e) ->
($ "#login_error").html "Login: server error"
($ "#txtpass").keyup (e) ->
@ -489,8 +443,8 @@ Ant.OS.GUI =
v.icon = "#{v.path}/#{v.icon}" if v.icon
v.iconclass = "fa fa-adn" unless v.iconclass or v.icon
Ant.OS.setting.system.packages = if r.result then r.result else
Ant.OS.GUI.refreshSystemMenu()
Ant.OS.GUI.buildSystemMenu()
# Ant.OS.GUI.refreshSystemMenu()
# Ant.OS.GUI.buildSystemMenu()
# push startup services
# TODO: get services list from user setting
Ant.OS.GUI.pushServices (v for v in Ant.OS.setting.system.startup.services)
@ -499,4 +453,19 @@ Ant.OS.GUI =
# initDM
Ant.OS.API.setLocale Ant.OS.setting.system.locale
.then () ->
Ant.OS.GUI.initDM()
Ant.OS.GUI.initDM()
Ant.OS.GUI.schemes = {}
Ant.OS.GUI.schemes.ws = """
<afx-sys-panel id = "syspanel"></afx-sys-panel>
<div id = "workspace">
<afx-apps-dock id="sysdock"></afx-apps-dock>
<afx-float-list id = "desktop" dir="vertical" ></afx-float-list>
</div>
<afx-menu id="contextmenu" data-id="contextmenu" context="true" style="display:none;"></afx-menu>
<afx-label id="systooltip" data-id="systooltip" style="display:none;position:absolute;"></afx-label>
"""
Ant.OS.GUI.schemes.login = """
"""

View File

@ -1,11 +0,0 @@
<afx-app-window data-id = 'about-window' width='300' height='200'>
<afx-vbox>
<div style="text-align:center; margin-top:10px;" data-height="50">
<h3 style = "margin:0;padding:0;">
<afx-label data-id = 'mylabel'></afx-label>
</h3>
<i><p style = "margin:0; padding:0" data-id = 'mydesc'></p></i>
</div>
<afx-grid-view data-id = 'mygrid'></afx-grid-view>
</afx-vbox>
</afx-app-window>

View File

@ -1,10 +1,8 @@
<afx-sys-panel id = "syspanel"></afx-sys-panel>
<!--div class = "afx-clear"></div-->
<div id = "workspace">
<afx-apps-dock id="sysdock"></afx-apps-dock>
<afx-float-list id = "desktop" dir="vertical" ></afx-float-list>
<!--div id = "workingenv"></div-->
</div>
<afx-menu id="contextmenu" data-id="contextmenu" context="true" style="display:none;"></afx-menu>
<afx-label id="systooltip" data-id="systooltip" style="display:none;position:absolute;"></afx-label>

View File

@ -1,13 +0,0 @@
<afx-app-window data-id = 'file-dialog-window' width='400' height='300'>
<afx-hbox>
<afx-list-view data-id = "location" dropdown = "false" data-width = "120"></afx-list-view>
<afx-vbox>
<afx-file-view data-id = "fileview" view='tree' status = false></afx-file-view>
<input data-height = '26' type = "text" data-id = "filename" style="margin-left:5px; margin-right:5px;display:none;" />
<div data-height = '30' style=' text-align:right;padding:3px;'>
<afx-button data-id = "bt-ok" text = "__(Ok)"></afx-button>
<afx-button data-id = "bt-cancel" text = "__(Cancel)"></afx-button>
</div>
</afx-vbox>
</afx-hbox>
</afx-app-window>

View File

@ -44,9 +44,7 @@
Ant.OS.setting.system.startup = {
services: [
"CoreServices/PushNotification",
"CoreServices/UserService",
"CoreServices/Calendar",
"CoreServices/Spotlight"
"CoreServices/Calendar"
],
apps: []
} if not Ant.OS.setting.system.startup

View File

@ -109,7 +109,6 @@ class CalendarTag extends Ant.OS.GUI.BaseTag
for i in [ 0..7 - row.length ]
row.push { text: "" }
rows.push(row)
console.log rows
@refs.grid.set "rows", rows
@refs.mlbl.set "text", "#{months[@month]} #{@year}"

View File

@ -4,12 +4,12 @@ class FileViewTag extends Ant.OS.GUI.BaseTag
@setopt "onfileselect", ()->
@setopt "onfileopen", () ->
@setopt "selectedFile", undefined
@setopt "view", "list"
@setopt "data", []
@setopt "status", true
@setopt "showhidden", false
@setopt "fetch", undefined
@setopt "path", undefined
@setopt "view", "list"
@preventUpdate = false
@header = [
{ text: "__(File name)" },
@ -22,6 +22,10 @@ class FileViewTag extends Ant.OS.GUI.BaseTag
__view__: (v) ->
@switchView()
__status__: (v) ->
return $(@refs.status).show() if v
$(@refs.status).hide()
__path__: (v) ->
return unless v
me = @
@ -147,6 +151,7 @@ class FileViewTag extends Ant.OS.GUI.BaseTag
e.filename,
if e.size then e.size else "0" )
evt = { id: @aid(), data: e }
@set "selectedFile", e
@get("onfileselect") evt
@observable.trigger "fileselect", evt
@ -183,78 +188,14 @@ class FileViewTag extends Ant.OS.GUI.BaseTag
@refs.treeview.set "ontreedbclick", (e) ->
me.filedbclick e.data.item.get("data")
@switchView()
### self.refs.listview.onlistselect = function(data)
{
data.id = self.rid
self.root.observable.trigger("fileselect",data)
}
self.refs.listview.onlistdbclick = function(data)
{
data.id = self.rid
self.root.observable.trigger("filedbclick",data)
}
self.refs.gridview.root.observable = self.root.observable
self.refs.gridview.ongridselect = function(d)
{
var data = {id:self.rid, data:self.data[d.data.child[3].idx], idx:d.data.child[3].idx}
self.root.observable.trigger("fileselect",data)
}
self.refs.gridview.ongriddbclick = function(d)
{
var data = {id:self.rid, data:self.data[d.data.child[3].idx], idx:d.data.child[3].idx}
self.root.observable.trigger("filedbclick",data)
}
self.refs.treeview.ontreeselect = function(d)
{
if(!d) return;
var data;
var el = d;
if(d.treepath == 0)// select the root
{
el = self.path.asFileHandler()
el.size = 0
el.filename = el.path
}
var data = {id:self.rid, data:el}
self.root.observable.trigger("fileselect",data)
}
self.refs.treeview.ontreedbclick = function(d)
{
if(!d || d.treepath == 0) return;
var data = {id:self.rid, data:d}
self.root.observable.trigger("filedbclick",data)
}
self.root.observable.on("fileselect", function(e){
if(e.id != self.rid) return
self.selectedFile = e.data
if(self.onfileselect)
self.onfileselect(e.data)
if(self.refs.stbar)
self.refs.stbar.root.set("text", __("Selected: {0} ({1} bytes)", e.data.filename, e.data.size?e.data.size:"0"))//.html()
})
self.root.observable.on("filedbclick", function(e){
if(e.id != self.rid ) return
if(e.data.type != "dir" && self.onfileopen)
self.onfileopen(e.data)
else if(self.chdir && e.data.type == "dir")
self.chdir(e.data.path)
})
calibre_size()
self.root.observable.on("resize", function(e){
calibre_size()
})
self.root.observable.on("calibrate", function(e){
calibre_size()
})
}) ###
layout: () ->
[
{ el: "afx-list-view", ref: "listview" },
{ el: "afx-grid-view", ref: "gridview" },
{ el: "div", class: "treecontainer", ref: "treecontainer", children: [
{ el: "afx-tree-view", ref: "treeview" }
] },
{ el: "afx-grid-view", ref: "gridview" },
{ el: "afx-label", class: "status", ref: "status" }
]

View File

@ -172,8 +172,6 @@ class GridViewTag extends Ant.OS.GUI.BaseTag
me = @
$(@root)
.css "overflow", "hidden"
.css "display", "block"
.css "padding", "5px"
$(@refs.grid).css "display", "grid"
$(@refs.header).css "display", "grid"

View File

@ -4,12 +4,17 @@ class LabelTag extends Ant.OS.GUI.BaseTag
@setopt "color", undefined
@setopt "icon", undefined
@setopt "iconclass", undefined
@setopt "class", undefined
@refs.text = document.createTextNode ""
$(@refs.container).append @refs.text
@setopt "text", ""
mount: () ->
__class__: (v) ->
$(@root).removeClass()
$(@root).addClass v if v
__color__: (v) ->
return unless v
$(@refs.container).css "color", v
@ -29,6 +34,7 @@ class LabelTag extends Ant.OS.GUI.BaseTag
$(@refs.iclass).removeClass()
if v
$(@refs.iclass).addClass v
$(@refs.iclass).css "margin-right", "5px"
$(@refs.iclass).show()
else
$(@refs.iclass).hide()

View File

@ -76,6 +76,7 @@ class ListViewTag extends Ant.OS.GUI.BaseTag
@setopt "multiselect", false
@setopt "selectedItem", undefined
@setopt "selectedItems", []
@setopt "selected", -1
$(@root)
.css "display", "flex"
.css "flex-direction", "column"
@ -84,6 +85,8 @@ class ListViewTag extends Ant.OS.GUI.BaseTag
@root.remove = (e) -> me.remove e
@root.unshift = (e) -> me.unshift e
@root.unselect = () -> me.unselect()
@root.selectNext = () -> me.selectNext()
@root.selectPrev = () -> me.selectPrev()
multiselect: () ->
return false if @get "dropdown"
@ -130,6 +133,26 @@ class ListViewTag extends Ant.OS.GUI.BaseTag
data.splice data.indexOf(el), 1
$(item).remove()
selectNext: () ->
return if @multiselect()
el = @get "selectedItem"
idx = 0
idx = $(el).index() + 1 if el
@set "selected", idx
selectPrev: () ->
return if @multiselect()
el = @get "selectedItem"
idx = 0
idx = $(el).index() - 1 if el
@set "selected", idx
__selected__: (idx) ->
return @unselect() if idx < 0
data = @get "data"
return if idx >= data.length
data[idx].domel.set "selected", true
__buttons__: (v) ->
return if @get "dropdown"

View File

@ -1,24 +1,34 @@
class OverlayTag extends Ant.OS.GUI.BaseTag
constructor: (r, o) ->
super r, o
@setopt "width", 200
@setopt "height", 400
@setopt "width", undefined
@setopt "height", undefined
$(@refs.yield)
.css("position", "relative")
.css("width", "100%" )
.css("height", "100%")
$(@root)
.css("position", "absolute")
.css "z-index", 1000000
#.css "display", "flex"
#.css "flex-direction", "column"
#$(@refs.yield).css "flex", "1"
__width__: (v) ->
return unless v
@calibrate()
__height__: (v) ->
return unless v
@calibrate()
mount: () ->
$(@root)
.css("position", "absolute")
@calibrate()
calibrate: () ->
$(@root)
.css("width", @get("width") + "px")
.css("height", @get("height") + "px")
.css("width", @get("width") )
.css("height", @get("height"))
@observable.trigger "resize", {
id: @aid(),
data: {
@ -28,6 +38,7 @@ class OverlayTag extends Ant.OS.GUI.BaseTag
}
layout: () ->
@refs.yield = @roots
[]
[{
el: "afx-vbox", ref: "yield"
}]
Ant.OS.GUI.define "afx-overlay", OverlayTag

View File

@ -2,11 +2,15 @@ class SystemPanelTag extends Ant.OS.GUI.BaseTag
constructor: (r, o) ->
super r, o
me = @
@setopt "osmenu", { children: [] }
@setopt "osmenu", {
text: __("Start"),
iconclass: "fa fa-eercast"
}
@setopt "appmenu", []
@setopt "systray", []
@root.attachservice = (s) -> me.attachservice s
@root.detachservice = (s) -> me.detachservice s
@view = false
__osmenu__: (v) ->
@refs.osmenu.set "items", [v]
@ -15,28 +19,144 @@ class SystemPanelTag extends Ant.OS.GUI.BaseTag
@refs.appmenu.set "items", v
__systray__: (v) ->
@refs.systray.set "items", [v]
@refs.systray.set "items", v
attachservice: (s) ->
@refs.systray.unshift s
s.attach @refs.systray
open: () ->
el = @refs.applist.get "selectedItem"
return unless el
data = el.get("data")
return if not data or data.dataid is "header"
@toggle false
# launch the app or open the file
Ant.OS.GUI.openWith data
search: (e) ->
switch e.which
when 37
e.preventDefault()
when 38
@refs.applist.selectPrev()
e.preventDefault()
when 39
e.preventDefault()
when 40
@refs.applist.selectNext()
e.preventDefault()
when 13
e.preventDefault()
@open()
else
text = @refs.search.value
return @refreshAppList() unless text.length >= 3
result = Ant.OS.API.search text
return if result.length is 0
@refs.applist.set "data", result
detachservice: (s) ->
@refs.systray.remove s
@refs.systray.remove s.domel
layout: () ->
[{
el: "div", children: [
{ el: "afx-menu", id: "osmenu", ref: "osmenu", class: "afx-panel-os-menu" },
{ el: "afx-menu", id: "appmenu", ref: "appmenu", class: "afx-panel-os-app" },
{ el: "afx-menu", id: "systray", ref: "systray", class: "afx-panel-os-stray" }
]
}]
[
{
el: "div", ref: "panel", children: [
{ el: "afx-menu", ref: "osmenu", class: "afx-panel-os-menu" },
{ el: "afx-menu", id: "appmenu", ref: "appmenu", class: "afx-panel-os-app" },
{ el: "afx-menu", id: "systray", ref: "systray", class: "afx-panel-os-stray" }
]
},
{
el: "afx-overlay", id: "start-panel", ref: "overlay", children: [
{
el: "afx-hbox", height: 30, children: [
{ el: "div", width: 30, id: "searchicon" },
{ el: "input", ref: "search" }
]
},
{ el: "afx-list-view", id: "applist", ref: "applist" },
{
el: "afx-hbox", id: "btlist", height: 30, children: [
{
el: "afx-button",
ref: "btscreen",
tooltip: __("ct:Toggle fullscreen")
},
{
el: "afx-button",
ref: "btuser",
tooltip: __("ct:User: {0}", Ant.OS.setting.user.username)
},
{ el: "afx-button", ref: "btlogout", tooltip: __("ct:Logout") }
]
}
]
}
]
refreshAppList: () ->
list = []
list.push v for k, v of Ant.OS.setting.system.packages when (v and v.app)
list.push v for k, v of Ant.OS.setting.system.menu
@refs.applist.set "data", list
toggle: (flag) ->
if flag
@refreshAppList()
$(@refs.overlay).show()
@calibrate()
$(document).on "click", @cb
@refs.search.value = ""
$(@refs.search).focus()
else
$(@refs.overlay).hide()
$(document).unbind "click", @cb
calibrate: () ->
@refs.overlay.set "height", "#{$(window).height() - $(@refs.panel).height()}px"
mount: () ->
$(@refs.osmenu).css("z-index", 1000000)
me = @
@cb = (e) ->
if not ($ e.target).closest($ me.refs.overlay).length and not ($ e.target).closest(me.refs.osmenu).length
me.toggle false
else
$(me.refs.search).focus()
$(@refs.appmenu).css("z-index", 1000000)
$(@refs.systray).css("z-index", 1000000)
@refs.btscreen.set "*", {
iconclass: "fa fa-tv",
onbtclick: (e) ->
me.toggle false
Ant.OS.GUI.toggleFullscreen()
}
@refs.btuser.set "*", {
iconclass: "fa fa-user-circle-o",
onbtclick: (e) ->
me.toggle false
Ant.OS.GUI.openDialog("InfoDialog", Ant.OS.setting.user)
}
@refs.btlogout.set "*", {
iconclass: "fa fa-power-off",
onbtclick: (e) ->
me.toggle false
Ant.OS.exit()
}
@refs.osmenu.set "onmenuselect", (e) ->
me.toggle true
($ @refs.overlay).css "left", 0
.css "top", "#{$(@refs.panel).height()}px"
.css "bottom", "0"
.hide()
($ @refs.search).keyup (e) ->
me.search e
$(@refs.applist).click (e) ->
me.open()
Ant.OS.announcer.trigger("syspanelloaded")
Ant.OS.GUI.define "afx-sys-panel", SystemPanelTag

View File

@ -15,9 +15,10 @@ class Ant.OS.GUI.BaseTag
@root.sync = () -> me.sync()
@refs = {}
@setopt "data-id", (Math.floor(Math.random() * 100000) + 1).toString()
@setopt "tooltip", undefined
#$(@root).attr "data-id", @get("data-id")
@children = $(@root).children()
for obj in @layout()
dom = @mkui obj
if dom
@ -32,6 +33,10 @@ class Ant.OS.GUI.BaseTag
@set k, v if v
@get k
__tooltip__: (v) ->
return unless v
$(@root).attr "tooltip", v
setopt: (name, val) ->
value = val
if ($(@root).attr name)
@ -78,6 +83,9 @@ class Ant.OS.GUI.BaseTag
dom = $("<#{tag.el}>")
$(dom).addClass tag.class if tag.class
$(dom).attr "data-id", tag.id if tag.id
$(dom).attr "data-height", tag.height if tag.height
$(dom).attr "data-width", tag.width if tag.width
$(dom).attr "tooltip", tag.tooltip if tag.tooltip
if tag.children
$(@mkui(v)).appendTo(dom) for v in tag.children
if tag.ref