adapt more apps

This commit is contained in:
lxsang 2020-05-13 19:03:39 +02:00
parent 04e5a4d50c
commit e1591087d5
66 changed files with 985 additions and 865 deletions

View File

@ -54,13 +54,13 @@ coffees= src/core/core.coffee \
packages = CoreServices ActivityMonitor Files Setting ShowCase MarkOn# Files MarketPlace Preview NotePad wTerm packages = CoreServices ActivityMonitor Files Setting ShowCase MarkOn# Files MarketPlace Preview NotePad wTerm
main: initd build_coffees build_themes schemes libs build_packages languages main: initd build_coffees build_themes libs build_packages languages
- cp src/index.html $(BUILDDIR)/ - cp src/index.html $(BUILDDIR)/
initd: initd:
- mkdir -p $(BUILDDIR) - mkdir -p $(BUILDDIR)
lite: build_coffees build_themes schemes build_packages lite: build_coffees build_themes build_packages
#%.js: %.coffee #%.js: %.coffee
# coffee --compile $< # coffee --compile $<
@ -78,11 +78,6 @@ libs:
@echo "$(BLUE)Copy lib files$(NC)" @echo "$(BLUE)Copy lib files$(NC)"
cp -rf src/libs/* $(BUILDDIR)/scripts/ cp -rf src/libs/* $(BUILDDIR)/scripts/
schemes:
@echo "$(BLUE)Copy schemes files$(NC)"
- mkdir -p $(BUILDDIR)/resources/schemes
cp src/core/schemes/* $(BUILDDIR)/resources/schemes/
testdata: testdata:
@echo "$(BLUE)Copy JSON test files$(NC)" @echo "$(BLUE)Copy JSON test files$(NC)"
- mkdir -p $(BUILDDIR)/resources/jsons - mkdir -p $(BUILDDIR)/resources/jsons
@ -97,7 +92,11 @@ genlang:
read -r -p "Enter locale: " LOCAL;\ read -r -p "Enter locale: " LOCAL;\
./src/core/languages/gen.sh ./src ./src/core/languages/$$LOCAL.json ./src/core/languages/gen.sh ./src ./src/core/languages/$$LOCAL.json
build_themes: antos_themes_build build_themes: antos_themes_build
cp -r src/themes/system $(BUILDDIR)/resources/themes/ -rm -rf $(BUILDDIR)/resources/themes/system/*
-mkdir -p $(BUILDDIR)/resources/themes/system
cp -r src/themes/system/fonts $(BUILDDIR)/resources/themes/system
cp -r src/themes/system/wp $(BUILDDIR)/resources/themes/system
for f in src/themes/system/*.css; do (cat "$${f}"; echo) >> $(BUILDDIR)/resources/themes/system/system.css;done
antos_themes_build: antos_themes_build:
@echo "$(BLUE)Building themes name: antos$(NC)" @echo "$(BLUE)Building themes name: antos$(NC)"
@ -106,7 +105,6 @@ antos_themes_build:
for f in src/themes/antos/*.css; do (cat "$${f}"; echo) >> $(BUILDDIR)/resources/themes/antos/antos.css;done for f in src/themes/antos/*.css; do (cat "$${f}"; echo) >> $(BUILDDIR)/resources/themes/antos/antos.css;done
-mkdir -p $(BUILDDIR)/resources/themes/antos/fonts -mkdir -p $(BUILDDIR)/resources/themes/antos/fonts
cp -rf src/themes/antos/fonts/* $(BUILDDIR)/resources/themes/antos/fonts cp -rf src/themes/antos/fonts/* $(BUILDDIR)/resources/themes/antos/fonts
cp src/themes/antos/wp* $(BUILDDIR)/resources/themes/antos/
build_packages: build_packages:
@ -142,7 +140,7 @@ uglify:
# npm install uglifycss -g # npm install uglifycss -g
# uglify the css # uglify the css
uglifycss --output $(BUILDDIR)/resources/themes/antos/antos.css $(BUILDDIR)/resources/themes/antos/antos.css uglifycss --output $(BUILDDIR)/resources/themes/antos/antos.css $(BUILDDIR)/resources/themes/antos/antos.css
uglifycss --output $(BUILDDIR)/resources/themes/system/font-awesome.css $(BUILDDIR)/resources/themes/system/font-awesome.css uglifycss --output $(BUILDDIR)/resources/themes/system/system.css $(BUILDDIR)/resources/themes/system/system.css
#uglify each packages #uglify each packages
for d in $(packages); do\ for d in $(packages); do\

View File

@ -52,10 +52,10 @@ class Announcer
for evt in names for evt in names
continue unless me.observable[evt] continue unless me.observable[evt]
me.observable[evt].one.forEach (f) -> me.observable[evt].one.forEach (f) ->
f data f d
me.observable[evt].one = new Set() me.observable[evt].one = new Set()
me.observable[evt].many.forEach (f) -> me.observable[evt].many.forEach (f) ->
f data f d
if evtName is "*" if evtName is "*"
trig k, data for k, v of me.observable when k isnt "*" trig k, data for k, v of me.observable when k isnt "*"

View File

@ -274,7 +274,7 @@ class SelectionDialog extends BasicDialog
(@find "btnOk").set "onbtclick", (e) -> (@find "btnOk").set "onbtclick", (e) ->
data = (me.find "list").get "selectedItem" data = (me.find "list").get "selectedItem"
return me.notify __("Please select an item") unless data return me.notify __("Please select an item") unless data
me.handle(data) if me.handle me.handle(data.get("data")) if me.handle
me.quit() me.quit()
(@find "btnCancel").set "onbtclick", (e) -> (@find "btnCancel").set "onbtclick", (e) ->
@ -357,6 +357,7 @@ class FileDialog extends BasicDialog
me = @ me = @
fileview.set "fetch", (path) -> fileview.set "fetch", (path) ->
new Promise (resolve, reject) -> new Promise (resolve, reject) ->
return resolve() unless path
path.asFileHandle().read() path.asFileHandle().read()
.then (d) -> .then (d) ->
return reject d if d.error return reject d if d.error

View File

@ -36,12 +36,12 @@ Ant.OS.GUI =
app.main() app.main()
app.show() app.show()
loadScheme: (path, app, parent) -> loadScheme: (path, app, parent) ->
path.asFileHandle().read().then (x) -> path.asFileHandle().read()
return null unless x .then (x) ->
Ant.OS.GUI.htmlToScheme x, app, parent return null unless x
#, (e, s) -> Ant.OS.GUI.htmlToScheme x, app, parent
# Ant.OS.announcer.osfail "Cannot load scheme file: #{path} for #{app.name} (#{app.pid})", e, s .catch (e) ->
Ant.OS.announcer.oserror __("Cannot load scheme: {0}", path), e
clearTheme: () -> clearTheme: () ->
$ "head link#ostheme" $ "head link#ostheme"
.attr "href", "" .attr "href", ""
@ -83,9 +83,9 @@ Ant.OS.GUI =
Ant.OS.GUI.loadApp app Ant.OS.GUI.loadApp app
.then (a) -> .then (a) ->
return Ant.OS.PM.createProcess srv, Ant.OS.APP[srv] if Ant.OS.APP[srv] return Ant.OS.PM.createProcess srv, Ant.OS.APP[srv] if Ant.OS.APP[srv]
.catch (e, s) -> .catch (e) ->
Ant.OS.announcer.trigger "srvroutineready", srv Ant.OS.announcer.trigger "srvroutineready", srv
Ant.OS.announcer.osfail __("Cannot read service script: {0}", srv), e, s Ant.OS.announcer.osfail __("Cannot read service script: {0}", srv), e
appsByMime: (mime) -> appsByMime: (mime) ->
metas = ( v for k, v of Ant.OS.setting.system.packages when v and v.app ) metas = ( v for k, v of Ant.OS.setting.system.packages when v and v.app )
@ -101,7 +101,7 @@ Ant.OS.GUI =
return false return false
return false return false
catch e catch e
Ant.OS.announcer.osfail __("Error find app by mimes {0}", mime), e, mime Ant.OS.announcer.osfail __("Error find app by mimes {0}", mime), e
( f m, i if m ) for m, i in mimes ( f m, i if m ) for m, i in mimes
return apps return apps
@ -315,8 +315,9 @@ Ant.OS.GUI =
# desktop default file manager # desktop default file manager
desktop = $ Ant.OS.GUI.workspace desktop = $ Ant.OS.GUI.workspace
desktop[0].fetch = () -> desktop[0].fetch = () ->
file = Ant.OS.setting.desktop.path.asFileHandle()
fn = () -> fn = () ->
fp.read().then (d) -> file.read().then (d) ->
return Ant.OS.announcer.osfail d.error, (Ant.OS.API.throwe "OS.VFS"), d.error if d.error return Ant.OS.announcer.osfail d.error, (Ant.OS.API.throwe "OS.VFS"), d.error if d.error
items = [] items = []
$.each d.result, (i, v) -> $.each d.result, (i, v) ->
@ -328,12 +329,12 @@ Ant.OS.GUI =
desktop[0].set "data", items desktop[0].set "data", items
desktop[0].refresh() desktop[0].refresh()
fp.onready() file.onready()
.then () -> fn() .then () -> fn()
.catch ( e ) -> # try to create the path .catch ( e ) -> # try to create the path
console.log "#{fp.path} not found" console.log "#{file.path} not found"
name = fp.basename name = file.basename
fp.parent().asFileHandle().mk(name).then (r) -> file.parent().asFileHandle().mk(name).then (r) ->
ex = Ant.OS.API.throwe "OS.VFS" ex = Ant.OS.API.throwe "OS.VFS"
if r.error then Ant.OS.announcer.osfail d.error, ex, d.error else fn() if r.error then Ant.OS.announcer.osfail d.error, ex, d.error else fn()
@ -398,25 +399,20 @@ Ant.OS.GUI =
return new Ant.OS.GUI.BasicDialog conf.name, conf.layout return new Ant.OS.GUI.BasicDialog conf.name, conf.layout
login: () -> login: () ->
Ant.OS.API.resource "schemes/login.html" scheme = $.parseHTML Ant.OS.GUI.schemes.login
.then (x) -> ($ "#wrapper").append scheme
return null unless x ($ "#btlogin").click () ->
scheme = $.parseHTML x data =
($ "#wrapper").append scheme username: ($ "#txtuser").val(),
($ "#btlogin").click () -> password: ($ "#txtpass").val()
data = Ant.OS.API.handle.login data
username: ($ "#txtuser").val(), .then (d) ->
password: ($ "#txtpass").val() return ($ "#login_error").html d.error if d.error
Ant.OS.API.handle.login data Ant.OS.GUI.startAntOS d.result
.then (d) -> .catch (e) ->
return ($ "#login_error").html d.error if d.error ($ "#login_error").html "Login: server error"
Ant.OS.GUI.startAntOS d.result ($ "#txtpass").keyup (e) ->
.catch (e) -> ($ "#btlogin").click() if e.which is 13
($ "#login_error").html "Login: server error"
($ "#txtpass").keyup (e) ->
($ "#btlogin").click() if e.which is 13
.catch (e) ->
alert __("System fail: Cannot init login screen")
startAntOS: (conf) -> startAntOS: (conf) ->
# clean up things # clean up things
@ -469,4 +465,11 @@ Ant.OS.GUI.schemes.ws = """
""" """
Ant.OS.GUI.schemes.login = """ Ant.OS.GUI.schemes.login = """
<div id = "login_form">
<p>Welcome to AntOS, please identify</p>
<input id = "txtuser" type = "text" value = "demo" />
<input id = "txtpass" type = "password" value = "demo" />
<button id = "btlogin">Login</button>
<div id = "login_error"></div>
</div>
""" """

View File

@ -1,8 +0,0 @@
<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>

View File

@ -1,78 +0,0 @@
<!--
Since nothing is loaded, the login form is a standalone element,
it deserves it own unique style
For now, it can not be themed !!!
-->
<style>
body, html{
background-color: rgba(215,215,215,0.7);
}
#login_form{
width:300px;
height: 200px;
display: block;
border:1px solid #a6a6a6;
border-radius: 6px;
box-shadow: 1px 1px 1px #9f9F9F;
position: absolute;
margin: auto;
top:0;
right: 0;
bottom: 0;
left: 0;
font-family:Verdana, Geneva, Tahoma, sans-serif;
font-size: 13px;
text-align: center;
background-color: white;
color: #414339;
}
#login_form p{
display: inline-block;
background-color:#dfdfdf;
border-bottom: 1px solid #a6a6a6;
padding:10px;
width: calc(100% - 20px);
border-top-left-radius: 6px;
border-top-right-radius: 6px;
font-weight: bold;
margin:0;
}
#login_form input {
width: 250px;
outline: none;
margin-top:10px;
border-radius: 6px;
box-sizing: border-box;
font-size: 13px;
padding: 5px;
border: 1px solid #a6a6a6;
background-color: white;
color: #414339;
}
#login_form button{
margin-top:10px;
width: 250px;
height: 30px;
background-color: #2786F3;
color: white;
border: 1px solid #dedede;
border-radius: 6px;
font-family: Verdana, Geneva, Tahoma, sans-serif;
font-size: 13px;
padding:5px;
}
#login_error{
padding:3px;
color:red;
font-weight: normal;
}
</style>
<div id = "login_form">
<p>Welcome to AntOS, please identify</p>
<input id = "txtuser" type = "text" value = "demo" />
<input id = "txtpass" type = "password" value = "demo" />
<button id = "btlogin">Login</button>
<span id = "login_error"></span>
</div>

View File

@ -20,7 +20,7 @@
Ant.OS.setting.applications = conf.applications if conf.applications Ant.OS.setting.applications = conf.applications if conf.applications
Ant.OS.setting.appearance = conf.appearance if conf.appearance Ant.OS.setting.appearance = conf.appearance if conf.appearance
Ant.OS.setting.appearance.wp = { Ant.OS.setting.appearance.wp = {
url: "os://resources/themes/system/wp/wp2.jpg", url: "os://resources/themes/system/wp/wp3.jpg",
size: "cover", size: "cover",
repeat: "repeat" repeat: "repeat"
} unless Ant.OS.setting.appearance.wp } unless Ant.OS.setting.appearance.wp

View File

@ -27,6 +27,7 @@ class FileViewTag extends Ant.OS.GUI.BaseTag
$(@refs.status).hide() $(@refs.status).hide()
__showhidden__: (v) -> __showhidden__: (v) ->
return unless @get "data"
@switchView() @switchView()
__path__: (v) -> __path__: (v) ->
@ -35,6 +36,7 @@ class FileViewTag extends Ant.OS.GUI.BaseTag
return unless @get "fetch" return unless @get "fetch"
@get("fetch")(v) @get("fetch")(v)
.then (data) -> .then (data) ->
return unless data
me.set "data", data me.set "data", data
me.refs.status.set("text", " ") if me.get "status" me.refs.status.set("text", " ") if me.get "status"
.catch (e) -> .catch (e) ->
@ -172,6 +174,7 @@ class FileViewTag extends Ant.OS.GUI.BaseTag
@refs.treeview.set "fetch", (v) -> @refs.treeview.set "fetch", (v) ->
new Promise (resolve, reject) -> new Promise (resolve, reject) ->
return resolve undefined unless me.get("fetch") return resolve undefined unless me.get("fetch")
return resolve undefined unless v.get("data").path
me.get("fetch")(v.get("data").path) me.get("fetch")(v.get("data").path)
.then (d) -> resolve me.getTreeData(d.sort me.sortByType) .then (d) -> resolve me.getTreeData(d.sort me.sortByType)
.catch (e) -> reject e .catch (e) -> reject e

View File

@ -21,7 +21,7 @@ class GridCellPrototype extends Ant.OS.GUI.BaseTag
@get("data").selected = v @get("data").selected = v
return unless v return unless v
@cellseleck {}, false @cellseleck {}, false
update: () -> update: () ->
@set "data", @get("data") @set "data", @get("data")

View File

@ -11,6 +11,9 @@ class LabelTag extends Ant.OS.GUI.BaseTag
mount: () -> mount: () ->
update: () ->
@set "text", @get("text")
__class__: (v) -> __class__: (v) ->
$(@root).removeClass() $(@root).removeClass()
$(@root).addClass v if v $(@root).addClass v if v

View File

@ -155,7 +155,15 @@ class ListViewTag extends Ant.OS.GUI.BaseTag
__buttons__: (v) -> __buttons__: (v) ->
return if @get "dropdown" return if @get "dropdown"
return unless v.length > 0
for item in v
$(@refs.btlist).show()
bt = $("<afx-button>").appendTo @refs.btlist
bt[0].uify @observable
bt[0].set "*", item
item.domel = bt[0]
__data__: (data) -> __data__: (data) ->
$( @refs.mlist).empty() $( @refs.mlist).empty()
for item in data for item in data
@ -203,6 +211,7 @@ class ListViewTag extends Ant.OS.GUI.BaseTag
mount: () -> mount: () ->
me = @ me = @
$(@refs.btlist).hide()
@observable.on "resize", (e) -> me.calibrate() @observable.on "resize", (e) -> me.calibrate()
@calibrate() @calibrate()

View File

@ -5,10 +5,12 @@ class TabContainerTag extends Ant.OS.GUI.BaseTag
@setopt "selectedTab", undefined @setopt "selectedTab", undefined
@setopt "tabbarwidth", undefined @setopt "tabbarwidth", undefined
@setopt "tabbarheight", undefined @setopt "tabbarheight", undefined
@setopt "ontabselect", () ->
me = @ me = @
@refs.bar.set "ontabselect", (e) -> @refs.bar.set "ontabselect", (e) ->
data = e.data.item.get "data" data = e.data.item.get "data"
me.set "selectedTab", data me.set "selectedTab", data
me.get("ontabselect") { data: data, id: me.aid() }
__selectedTab: (v) -> __selectedTab: (v) ->
return unless v return unless v

View File

@ -28,8 +28,11 @@ class TreeViewItemPrototype extends Ant.OS.GUI.BaseTag
.removeClass() .removeClass()
if(v) if(v)
if @get("fetch") if @get("fetch")
@get("fetch")(@root).then (d) -> @get("fetch")(@root)
me.set "nodes", d .then (d) ->
return unless d
me.set "nodes", d
.catch (e) -> Ant.OS.announcer.oserror e
$(@refs.childnodes).show() $(@refs.childnodes).show()
else else
$(@refs.childnodes).hide() $(@refs.childnodes).hide()

View File

@ -11,9 +11,9 @@ class Ant.OS.GUI.BaseTag
@root.get = (k) -> me.get k @root.get = (k) -> me.get k
@root.aid = () -> me.aid() @root.aid = () -> me.aid()
@root.calibrate = () -> me.calibrate() @root.calibrate = () -> me.calibrate()
@root.update = () -> me.update()
@mounted = false
@root.sync = () -> me.sync() @root.sync = () -> me.sync()
@mounted = false
@root.setup = () -> me.setup()
@refs = {} @refs = {}
@setopt "data-id", (Math.floor(Math.random() * 100000) + 1).toString() @setopt "data-id", (Math.floor(Math.random() * 100000) + 1).toString()
@setopt "tooltip", undefined @setopt "tooltip", undefined
@ -61,13 +61,19 @@ class Ant.OS.GUI.BaseTag
@get "data-id" @get "data-id"
calibrate: () -> calibrate: () ->
update: () ->
update: () ->
get: (opt) -> get: (opt) ->
return @opts if opt is "*" return @opts if opt is "*"
@opts[opt] @opts[opt]
sync: () -> sync: () ->
@update()
$(@root).children().each () -> @update()
@root
setup: () ->
return if @mounted return if @mounted
@mounted = true @mounted = true
@mount() @mount()
@ -107,10 +113,15 @@ Element.prototype.mkui = (observable) ->
Element.prototype.mount = () -> Element.prototype.mount = () ->
return @sync() if @sync return @setup() if @setup
$(@).children().each () -> @mount() $(@).children().each () -> @mount()
@ @
Element.prototype.update = () ->
return @sync() if @sync
$(@).children().each () -> @update()
@
Element.prototype.uify = (observable) -> Element.prototype.uify = (observable) ->
@mkui(observable) @mkui(observable)
@mount() @mount()

View File

@ -23,9 +23,8 @@
<title>AntOS webOS</title> <title>AntOS webOS</title>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link href="resources/themes/system/font-awesome.css" rel="stylesheet"> <link href="resources/themes/system/system.css" rel="stylesheet">
<link id="ostheme" rel="stylesheet" href=""> <link id="ostheme" rel="stylesheet" href="">
<!--link href="theme/antos/style.css" rel="stylesheet"-->
<script src="scripts/jquery-3.2.1.min.js"></script> <script src="scripts/jquery-3.2.1.min.js"></script>
<script src="scripts/antos.js"></script> <script src="scripts/antos.js"></script>
</head> </head>

View File

@ -72,14 +72,12 @@ class PushNotification extends this.OS.GUI.BaseService
.css "bottom", "0" .css "bottom", "0"
.hide() .hide()
pushout: (s, o, mfeed) -> pushout: (s, o) ->
d = { d = {
text: "[#{s}] #{o.name} (#{o.id}): #{o.data.m}", text: "[#{s}] #{o.name} (#{o.id}): #{o.data.m}",
icon: o.data.icon, icon: o.data.icon,
iconclass: o.data.iconclass, iconclass: o.data.iconclass,
closable: true } closable: true }
#console.log o.data.s
#console.log o.data.e
@mlist.unshift d @mlist.unshift d
@notifeed d @notifeed d

View File

@ -16,7 +16,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
#along with this program. If not, see https://www.gnu.org/licenses/. #along with this program. If not, see https://www.gnu.org/licenses/.
class AppearanceHandler extends SettingHandler class AppearanceHandle extends SettingHandle
constructor:(scheme, parent) -> constructor:(scheme, parent) ->
super(scheme, parent) super(scheme, parent)
me = @ me = @
@ -27,23 +27,27 @@ class AppearanceHandler extends SettingHandler
@themelist = @find "theme-list" @themelist = @find "theme-list"
@syswp = undefined @syswp = undefined
@wplist.set "onlistselect", (e) -> @wplist.set "onlistselect", (e) ->
$(me.wpreview).css("background-image", "url(#{me.parent._api.handler.get}/#{e.data.path})" ) data = e.data.item.get("data")
.css("background-size", "cover") $(me.wpreview)
me.parent.systemsetting.appearance.wp.url = e.data.path .css("background-image", "url(#{data.path.asFileHandle().getlink()})" )
.css("background-size", "cover")
me.parent.systemsetting.appearance.wp.url = data.path
me.parent._gui.wallpaper() me.parent._gui.wallpaper()
@wplist.set "buttons", [ @wplist.set "buttons", [
{ {
text: "+", onbtclick: (e) -> text: "+", onbtclick: (e) ->
me.parent.openDialog "FileDiaLog", (d, n, p) -> me.parent.openDialog("FileDialog", {
me.parent.systemsetting.appearance.wps.push p title: __("Select image file"),
me.render() mimes: ["image/.*"]
, __("Select image file"), { mimes: ["image/.*"] } }).then (d) ->
me.parent.systemsetting.appearance.wps.push d.file.path
me.wplist.set "data", me.getwplist()
} }
] ]
@wpsize.set "onlistselect", (e) -> @wpsize.set "onlistselect", (e) ->
me.parent.systemsetting.appearance.wp.size = e.data.text me.parent.systemsetting.appearance.wp.size = e.data.item.get("data").text
me.parent._gui.wallpaper() me.parent._gui.wallpaper()
sizes = [ sizes = [
@ -51,46 +55,45 @@ class AppearanceHandler extends SettingHandler
{ text: "auto", selected: me.parent.systemsetting.appearance.wp.size is "auto" }, { text: "auto", selected: me.parent.systemsetting.appearance.wp.size is "auto" },
{ text: "contain", selected: me.parent.systemsetting.appearance.wp.size is "contain" } { text: "contain", selected: me.parent.systemsetting.appearance.wp.size is "contain" }
] ]
@wpsize.set "items", sizes @wpsize.set "data", sizes
repeats = [ repeats = [
{ text: "repeat", selected: me.parent.systemsetting.appearance.wp.repeat is "repeat" }, { text: "repeat", selected: me.parent.systemsetting.appearance.wp.repeat is "repeat" },
{ text: "repeat-x", selected: me.parent.systemsetting.appearance.wp.repeat is "repeat-x" }, { text: "repeat-x", selected: me.parent.systemsetting.appearance.wp.repeat is "repeat-x" },
{ text: "repeat-y", selected: me.parent.systemsetting.appearance.wp.repeat is "repeat-y" }, { text: "repeat-y", selected: me.parent.systemsetting.appearance.wp.repeat is "repeat-y" },
{ text: "no-repeat", selected: me.parent.systemsetting.appearance.wp.repeat is "no-repeat" } { text: "no-repeat", selected: me.parent.systemsetting.appearance.wp.repeat is "no-repeat" }
] ]
@wprepeat.set "items", repeats
@wprepeat.set "onlistselect", (e) -> @wprepeat.set "onlistselect", (e) ->
me.parent.systemsetting.appearance.wp.repeat = e.data.text me.parent.systemsetting.appearance.wp.repeat = e.data.item.get("data").text
me.parent._gui.wallpaper() me.parent._gui.wallpaper()
@wprepeat.set "data", repeats
@themelist.set "items" , [{ text: "antos", selected: true }] @themelist.set "data" , [{ text: "antos", selected: true }]
render: () ->
me = @
if not @syswp if not @syswp
path = "os://resources/themes/system/wp" path = "os://resources/themes/system/wp"
path.asFileHandler().read (d) -> path.asFileHandle().read()
me.parent.error __("Cannot read wallpaper list from {0}", path) if d.error .then (d) ->
for v in d.result return me.parent.error __("Cannot read wallpaper list from {0}", path) if d.error
v.text = v.filename for v in d.result
v.selected = true if v.path is me.parent.systemsetting.appearance.wp.url v.text = v.filename
v.iconclass = "fa fa-file-image-o" v.iconclass = "fa fa-file-image-o"
me.syswp = d.result me.syswp = d.result
me.wplist.set "items", me.getwplist() me.wplist.set "data", me.getwplist()
.catch (e) -> me.parent.error e.stack
else else
me.wplist.set "items", me.getwplist() me.wplist.set "data", me.getwplist()
getwplist: () -> getwplist: () ->
list = [] list = []
for v in @parent.systemsetting.appearance.wps for v in @parent.systemsetting.appearance.wps
file = v.asFileHandler() file = v.asFileHandle()
list.push list.push
text: file.basename, text: file.basename,
path: file.path path: file.path
selected: file.path is @parent.systemsetting.appearance.wp.url, selected: file.path is @parent.systemsetting.appearance.wp.url,
iconclass: "fa fa-file-image-o" iconclass: "fa fa-file-image-o"
list = list.concat @syswp list = list.concat @syswp
v.selected = v.path is @parent.systemsetting.appearance.wp.url for v in list
return list return list

View File

@ -16,24 +16,24 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
#along with this program. If not, see https://www.gnu.org/licenses/. #along with this program. If not, see https://www.gnu.org/licenses/.
class LocaleHandler extends SettingHandler class LocaleHandle extends SettingHandle
constructor:(scheme, parent) -> constructor: (scheme, parent) ->
super(scheme, parent) super(scheme, parent)
me = @ me = @
@lglist = @find "lglist" @lglist = @find "lglist"
@localelist = undefined @localelist = undefined
@lglist.set "onlistselect", (e) -> @lglist.set "onlistselect", (e) ->
me.parent._api.setLocale e.data.text me.parent._api.setLocale e.data.item.get("data").text
render: () ->
me = @
if not @localelist if not @localelist
path = "os://resources/languages" path = "os://resources/languages"
path.asFileHandler().read (d) -> path.asFileHandle().read()
.then (d) ->
return me.parent.error __("Cannot fetch system locales: {0}", d.error) if d.derror return me.parent.error __("Cannot fetch system locales: {0}", d.error) if d.derror
for v in d.result for v in d.result
v.text = v.filename.replace /\.json$/g, "" v.text = v.filename.replace /\.json$/g, ""
v.selected = v.text is me.parent.systemsetting.system.locale v.selected = v.text is me.parent.systemsetting.system.locale
me.localelist = d.result me.localelist = d.result
me.lglist.set "items", me.localelist me.lglist.set "data", me.localelist
.catch (e) -> me.parent.error e.stack
else else
me.lglist.set "items", me.localelist me.lglist.set "data", me.localelist

View File

@ -1,10 +1,10 @@
coffee_files = main.coffee AppearanceHandler.coffee VFSHandler.coffee LocaleHandler.coffee StartupHandler.coffee coffee_files = main.coffee AppearanceHandle.coffee VFSHandle.coffee LocaleHandle.coffee StartupHandle.coffee
jsfiles = jsfiles =
cssfiles = main.css cssfiles = main.css
copyfiles = scheme.html package.json schemes copyfiles = scheme.html package.json
PKG_NAME=Setting PKG_NAME=Setting

View File

@ -16,8 +16,8 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
#along with this program. If not, see https://www.gnu.org/licenses/. #along with this program. If not, see https://www.gnu.org/licenses/.
class StartupHandler extends SettingHandler class StartupHandle extends SettingHandle
constructor:(scheme, parent) -> constructor: (scheme, parent) ->
super(scheme, parent) super(scheme, parent)
me = @ me = @
@srvlist = @find "srvlist" @srvlist = @find "srvlist"
@ -28,19 +28,22 @@ class StartupHandler extends SettingHandler
services = [] services = []
for k, v of me.parent.systemsetting.system.packages for k, v of me.parent.systemsetting.system.packages
if v.services if v.services
srvs = ({ text: "#{k}/#{x}", iconclass:"fa fa-tasks" } for x in v.services) srvs = ({ text: "#{k}/#{x}", iconclass: "fa fa-tasks" } for x in v.services)
services = services.concat srvs services = services.concat srvs
me.parent.openDialog me.mkdialog(), (d) -> me.parent.openDialog("SelectionDialog", {
me.parent.systemsetting.system.startup.services.push d title: "__(Add service)",
me.render() data: services
, "__(Add service)", services }).then (d) ->
me.parent.systemsetting.system.startup.services.push d.text
me.refresh()
}, },
{ {
text: "-", onbtclick: (e) -> text: "-", onbtclick: (e) ->
selidx = me.srvlist.get "selidx" item = me.srvlist.get "selectedItem"
return unless selidx >= 0 return unless item
me.parent.systemsetting.system.startup.services.splice selidx,1 selidx = $(item).index()
me.render() me.parent.systemsetting.system.startup.services.splice selidx, 1
me.refresh()
} }
] ]
@ -48,23 +51,27 @@ class StartupHandler extends SettingHandler
{ {
text: "+", onbtclick: (e) -> text: "+", onbtclick: (e) ->
apps = ( { text: k, iconclass: v.iconclass } for k, v of me.parent.systemsetting.system.packages ) apps = ( { text: k, iconclass: v.iconclass } for k, v of me.parent.systemsetting.system.packages )
me.parent.openDialog me.mkdialog(), (d) -> me.parent.openDialog("SelectionDialog", {
me.parent.systemsetting.system.startup.apps.push d title: "__(Add application)",
me.render() data: apps
, "__(Add application)", apps }).then (d) ->
me.parent.systemsetting.system.startup.apps.push d.text
me.refresh()
}, },
{ {
text: "-", onbtclick: (e) -> text: "-", onbtclick: (e) ->
selidx = me.applist.get "selidx" item = me.applist.get "selectedItem"
return unless selidx >= 0 return unless item
me.parent.systemsetting.system.startup.apps.splice selidx,1 selidx = $(item).index()
me.render() me.parent.systemsetting.system.startup.apps.splice selidx, 1
me.refresh()
} }
] ]
@refresh()
render: () -> refresh: () ->
@srvlist.set "items", ( { text:v } for v in @parent.systemsetting.system.startup.services ) @srvlist.set "data", ( { text:v } for v in @parent.systemsetting.system.startup.services )
@applist.set "items", ( { text:v } for v in @parent.systemsetting.system.startup.apps ) @applist.set "data", ( { text:v } for v in @parent.systemsetting.system.startup.apps )
mkdialog: () -> mkdialog: () ->

View File

@ -0,0 +1,150 @@
# Copyright 2017-2018 Xuan Sang LE <xsang.le AT gmail DOT com>
# AnTOS Web desktop is is licensed under the GNU General Public
# License v3.0, see the LICENCE file for more information
# This program is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of
# the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License
#along with this program. If not, see https://www.gnu.org/licenses/.
class VFSSettingDialog extends this.OS.GUI.BasicDialog
constructor: () ->
super "VFSSettingDialog", VFSSettingDialog.scheme
init: () ->
me = @
$(@find("txtPath")).click (e) ->
me.openDialog("FileDialog", {
title: "__(Select a directory)",
mimes: ["dir"],
hidden: true
})
.then (d) ->
(me.find "txtPath").value = d.file.path
@find("btnOk").set "onbtclick", (e) ->
data = {
path: (me.find "txtPath").value,
name: (me.find "txtName").value
}
return me.error __("Please enter mount point name") unless data.name and data.name isnt ""
return me .error __("Please select a directory") unless data.path and data.path isnt ""
me.handle(data) if me.handle
me.quit()
(@find "btnCancel").set "onbtclick", (e) ->
me.quit()
return unless @data
(@find "txtName").value = @data.text if @data.text
(@find "txtPath").value = @data.path if @data.path
VFSSettingDialog.scheme = """
<afx-app-window width='250' height='180' apptitle = "__(Mount Points)">
<afx-vbox>
<afx-hbox>
<div data-width = "10" />
<afx-vbox>
<div data-height="10" />
<afx-label data-height="30" text = "__(Name)" />
<input type = "text" data-id= "txtName" />
<div data-height="3" />
<afx-label data-height="30" text = "__(Path)" />
<input type = "text" data-id= "txtPath" />
<div data-height="10" />
<afx-hbox data-height="30">
<div />
<afx-button data-id = "btnOk" text = "__(Ok)" data-width = "40" />
<afx-button data-id = "btnCancel" text = "__(Cancel)" data-width = "50" />
</afx-hbox>
</afx-vbox>
<div data-width = "10" />
</afx-hbox>
</afx-vbox>
</afx-app-window>
"""
class VFSHandle extends SettingHandle
constructor: (scheme, parent) ->
super(scheme, parent)
me = @
@mplist = @find "mplist"
@dpath = @find "dpath"
@ppath = @find "ppath"
@mplist.set "buttons", [
{
text: "+",
onbtclick: (e) ->
me.parent.openDialog(new VFSSettingDialog(), {
title: "__(Add mount point)"
})
.then (d) ->
me.parent.systemsetting.VFS.mountpoints.push {
text: d.name, path: d.path, iconclass: "fa fa-folder", type: "fs"
}
me.refresh()
},
{
text: "-",
onbtclick: (e) ->
item = me.mplist.get "selectedItem"
return unless item
selidx = $(item).index()
me.parent.openDialog("YesNoDialog", {
title: "__(Remove)",
text: __("Remove: {0}?", item.get("data").text)
}).then (d) ->
return unless d
me.parent.systemsetting.VFS.mountpoints.splice selidx, 1
me.refresh()
},
{
text: "",
iconclass: "fa fa-pencil",
onbtclick: (e) ->
sel = me.mplist.get "selectedItem"
return unless sel
me.parent.openDialog(new VFSSettingDialog(), {
title: "__(Edit mount point)",
text: sel.get("data").text,
path: sel.get("data").path
}).then (d) ->
sel.get("data").text = d.name
sel.get("data").path = d.path
me.refresh()
}
]
(@find "btndpath").set 'onbtclick', (e) ->
me.parent.openDialog("FileDialog", {
title: "__(Select a directory)",
mimes: ["dir"],
hidden: true
}).then (d) ->
me.parent.systemsetting.desktop.path = d.file.path
me.parent._gui.refreshDesktop()
me.refresh()
(@find "btnppath").set 'onbtclick', (e) ->
me.parent.openDialog("FileDialog", {
title: "__(Select a directory)",
mimes: ["dir"],
hidden: true
}).then (d) ->
me.parent.systemsetting.system.pkgpaths.user = d.file.path
me.refresh()
me.refresh()
refresh: () ->
me = @
@mplist.set "data", @parent.systemsetting.VFS.mountpoints
@dpath.set "text", @parent.systemsetting.desktop.path
@ppath.set "text", @parent.systemsetting.system.pkgpaths.user

View File

@ -1,117 +0,0 @@
# Copyright 2017-2018 Xuan Sang LE <xsang.le AT gmail DOT com>
# AnTOS Web desktop is is licensed under the GNU General Public
# License v3.0, see the LICENCE file for more information
# This program is free software: you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of
# the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
# You should have received a copy of the GNU General Public License
#along with this program. If not, see https://www.gnu.org/licenses/.
class VFSHandler extends SettingHandler
constructor:(scheme, parent) ->
super(scheme, parent)
me = @
@mplist = @find "mplist"
@dpath = @find "dpath"
@ppath = @find "ppath"
@mplist.set "buttons", [
{
text: "+",
onbtclick: (e) ->
me.parent.openDialog me.mkdialog(), (d) ->
me.parent.systemsetting.VFS.mountpoints.push {
text: d.name, path: d.path, iconclass: "fa fa-folder", type: "fs"
}
me.render()
, "__(Add mount point)"
},
{
text: "-",
onbtclick: (e) ->
selidx = me.mplist.get "selidx"
sel = me.mplist.get "selected"
return unless selidx >= 0
me.parent.openDialog "YesNoDialog", (d) ->
return unless d
me.parent.systemsetting.VFS.mountpoints.splice selidx, 1
me.render()
, "__(Remove)", { text: __("Remove: {0}?", sel.text) }
},
{
text: "",
iconclass: "fa fa-pencil",
onbtclick: (e) ->
sel = me.mplist.get "selected"
return unless sel
me.parent.openDialog me.mkdialog(), (d) ->
d.el.text = d.name
d.el.path = d.path
me.render()
, "__(Edit mount point)", sel
}
]
(@find "btndpath").set 'onbtclick', (e) ->
me.parent.openDialog "FileDiaLog", (d, n, p) ->
me.parent.systemsetting.desktop.path = p
me.parent._gui.refreshDesktop()
me.render()
, "__(Select a directory)", { mimes: ["dir"], hidden: true }
(@find "btnppath").set 'onbtclick', (e) ->
me.parent.openDialog "FileDiaLog", (d, n, p) ->
me.parent.systemsetting.system.pkgpaths.user = p
me.render()
, "__(Select a directory)", { mimes: ["dir"], hidden: true }
render: () ->
me = @
@mplist.set "items", @parent.systemsetting.VFS.mountpoints
@dpath.set "text", @parent.systemsetting.desktop.path
@ppath.set "text", @parent.systemsetting.system.pkgpaths.user
mkdialog: () ->
return @parent._gui.mkdialog {
name: "MountPointDialog",
layout: {
tags: [
{ tag: "afx-label", att: 'text="__(Name)" data-height="20"' },
{ tag: "input", att: "type='text' data-height='25'" },
{ tag: "afx-label", att: 'text="__(Path)" data-height="20"' },
{ tag: "input", att: "type='text' data-height='25'" }
],
width: 250,
height: 150,
resizable: false,
buttons: [
{
label: "__(Ok)", onclick: (d) ->
data = {
name: (d.find "content1").value,
path: (d.find "content3").value,
el: d.data
}
return d.error __("Please enter mount point name") unless data.name and data.name isnt ""
return d.error __("Please select a directory") unless data.path and data.path isnt ""
d.handler(data) if d.handler
d.quit()
},
{ label: "__(Cancel)", onclick: (d) -> d.quit() }
],
filldata: (dia) ->
$(dia.find "content3").click (e) ->
dia.openDialog "FileDiaLog", (d, n, p) ->
(dia.find "content3").value = p
, "__(Select a directory)", { mimes: ["dir"], hidden: true }
return unless dia.data
(dia.find "content1").value = dia.data.text if dia.data.text
(dia.find "content3").value = dia.data.path if dia.data.path
}
}

View File

@ -16,15 +16,13 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
#along with this program. If not, see https://www.gnu.org/licenses/. #along with this program. If not, see https://www.gnu.org/licenses/.
class SettingHandler class SettingHandle
constructor:(@scheme, @parent) -> constructor: (@scheme, @parent) ->
find: (id) -> ($ "[data-id='#{id}']", @scheme)[0] if @scheme find: (id) -> ($ "[data-id='#{id}']", @scheme)[0] if @scheme
render: () -> render: () ->
class Setting extends this.OS.GUI.BaseApplication class Setting extends this.OS.GUI.BaseApplication
constructor: (args) -> constructor: (args) ->
super "Setting", args super "Setting", args
@ -32,39 +30,18 @@ class Setting extends this.OS.GUI.BaseApplication
main: () -> main: () ->
me = @ me = @
@container = @find "container" @container = @find "container"
@container.setTabs [
{ new AppearanceHandle @find("appearance"), @
text: "__(Appearance)", new VFSHandle @find("vfs"), @
iconclass: "fa fa-paint-brush", new LocaleHandle @find("locale"), @
url: "#{@path()}/schemes/appearance.html", new StartupHandle @find("startup"), @
handler: (sch) ->
new AppearanceHandler sch, me
},
{
text: "__(VFS)",
iconclass: "fa fa-inbox" ,
url: "#{@path()}/schemes/vfs.html" ,
handler: (sch) ->
new VFSHandler sch, me
},
{
text: "__(Languages)",
iconclass: "fa fa-globe",
url: "#{@path()}/schemes/locale.html",
handler: (sch) ->
new LocaleHandler sch, me
},
{
text: "__(Startup)",
iconclass: "fa fa-cog",
url: "#{@path()}/schemes/startup.html",
handler: (sch) ->
new StartupHandler sch,me
}
]
(@find "btnsave").set "onbtclick", (e) -> (@find "btnsave").set "onbtclick", (e) ->
me._api.setting (d) -> me._api.setting()
return me.error __("Cannot save system setting: {0}", d.error) if d.error .then (d) ->
me.notify __("System setting saved") return me.error __("Cannot save system setting: {0}", d.error) if d.error
me.notify __("System setting saved")
.catch (e) ->
me.error __("Cannot save system setting: {0}", e.stack)
Setting.singleton = true Setting.singleton = true
this.OS.register "Setting", Setting this.OS.register "Setting", Setting

View File

@ -1,4 +1,4 @@
afx-app-window[data-id = "setting-window"] afx-tab-container afx-tab-bar afx-list-view > div > ul > li{ afx-app-window[data-id = "setting-window"] afx-tab-container afx-tab-bar afx-list-view > div > ul li{
float:none; float:none;
border-radius: 0; border-radius: 0;
font-weight: bold; font-weight: bold;
@ -6,8 +6,8 @@ afx-app-window[data-id = "setting-window"] afx-tab-container afx-tab-bar afx-lis
padding-bottom: 3px; padding-bottom: 3px;
border:0; border:0;
} }
afx-app-window[data-id = "setting-window"] afx-tab-container div[data-ref="container"]{ afx-app-window[data-id = "setting-window"] afx-tab-bar{
border-left: 1px solid #cbcbcb; border-right: 1px solid #cbcbcb;
} }
afx-app-window[data-id = "setting-window"] afx-label.header{ afx-app-window[data-id = "setting-window"] afx-label.header{
@ -17,39 +17,39 @@ afx-app-window[data-id = "setting-window"] div.footer{
border-right: 1px solid #cbcbcb; border-right: 1px solid #cbcbcb;
} }
/*APPEARANCE*/ /*APPEARANCE*/
afx-app-window[data-id = "setting-window"] afx-vbox[data-id="appearance"] div[data-id = "wp-preview"]{ afx-app-window[data-id = "setting-window"] afx-hbox[data-id="appearance"] div[data-id = "wp-preview"]{
display: block; display: block;
border:1px solid #cbcbcb; border:1px solid #cbcbcb;
border-radius: 10px; border-radius: 10px;
} }
afx-app-window[data-id = "setting-window"] afx-vbox[data-id="appearance"] afx-list-view[data-id="wplist"] afx-app-window[data-id = "setting-window"] afx-hbox[data-id="appearance"] afx-list-view[data-id="wplist"]
{ {
border:1px solid #cbcbcb; border:1px solid #cbcbcb;
padding:2px; padding:2px;
} }
afx-app-window[data-id = "setting-window"] afx-vbox[data-id="appearance"] afx-resizer{ afx-app-window[data-id = "setting-window"] afx-hbox[data-id="appearance"] afx-resizer{
border:0; border:0;
background-color: transparent; background-color: transparent;
} }
/*VFS*/ /*VFS*/
afx-app-window[data-id = "setting-window"] afx-vbox[data-id="vfs"] afx-list-view[data-id="mplist"] afx-app-window[data-id = "setting-window"] afx-hbox[data-id="vfs"] afx-list-view[data-id="mplist"]
{ {
border: 1px solid #cbcbcb; border: 1px solid #cbcbcb;
} }
afx-app-window[data-id = "setting-window"] afx-vbox[data-id="vfs"] afx-button.btnsel button{ afx-app-window[data-id = "setting-window"] afx-hbox[data-id="vfs"] afx-button.btnsel button{
border-radius: 0; border-radius: 0;
padding-top:2px; padding-top:2px;
padding-bottom: 2px; padding-bottom: 2px;
} }
/*LANGUAGES*/ /*LANGUAGES*/
afx-app-window[data-id = "setting-window"] afx-vbox[data-id="locale"] afx-list-view[data-id="lglist"] afx-app-window[data-id = "setting-window"] afx-hbox[data-id="locale"] afx-list-view[data-id="lglist"]
{ {
border: 1px solid #cbcbcb; border: 1px solid #cbcbcb;
} }
/*STARTUP*/ /*STARTUP*/
afx-app-window[data-id = "setting-window"] afx-vbox[data-id="startup"] afx-list-view afx-app-window[data-id = "setting-window"] afx-hbox[data-id="startup"] afx-list-view
{ {
border: 1px solid #cbcbcb; border: 1px solid #cbcbcb;
} }

View File

@ -1,6 +1,83 @@
<afx-app-window data-id = "setting-window" apptitle="Setting" width="600" height="400"> <afx-app-window data-id = "setting-window" apptitle="Setting" width="600" height="400">
<afx-vbox> <afx-vbox>
<afx-tab-container data-id = "container" barwidth="120" bar="left"></afx-tab-container> <afx-tab-container data-id = "container" dir = "row" tabbarwidth= "120">
<afx-hbox tabname="__(Appearance)" data-id="appearance" iconclass = "fa fa-paint-brush">
<div data-width="10"></div>
<afx-vbox>
<div data-height="5"></div>
<afx-label text = "__(Wallpaper)" iconclass = "fa fa-image" class = "header" data-height="23"></afx-label>
<afx-hbox>
<afx-list-view data-width="150" data-id="wplist"></afx-list-view>
<afx-resizer data-width="2"></afx-resizer>
<afx-vbox>
<div data-id = "wp-preview"></div>
<div data-height="5"></div>
<afx-hbox data-height="25">
<afx-list-view data-id = "wpsize" dropdown="true"></afx-list-view>
<div data-width="5"></div>
<afx-list-view data-id = "wprepeat" dropdown="true"></afx-list-view>
</afx-hbox>
</afx-vbox>
</afx-hbox>
<div data-height="5"></div>
<afx-label text = "__(Theme)" iconclass = "fa fa-window-restore" class = "header" data-height="23"></afx-label>
<afx-list-view data-height="30" data-id="theme-list" dropdown="true"></afx-list-view>
<div data-height="5"></div>
</afx-vbox>
<div data-width="10"></div>
</afx-hbox>
<afx-hbox data-id="vfs" tabname = "__(VFS)" iconclass = "fa fa-inbox">
<div data-width="10"></div>
<afx-vbox>
<div data-height="5"></div>
<afx-label text = "__(Mount points)" iconclass = "fa fa-folder" class = "header" data-height="23"></afx-label>
<afx-list-view data-id="mplist"></afx-list-view>
<div data-height="5"></div>
<afx-label text = "__(Desktop path)" iconclass = "fa fa-desktop" class = "header" data-height="23"></afx-label>
<afx-hbox data-height = "25" >
<div data-width="16"></div>
<afx-label data-id="dpath"></afx-label>
<afx-button text="" iconclass = "fa fa-arrow-up" data-id="btndpath" data-width="20" class="btnsel"></afx-button>
</afx-hbox>
<div data-height="5"></div>
<afx-label text = "__(Local packages path)" iconclass = "fa fa-cube" class = "header" data-height="23"></afx-label>
<afx-hbox data-height = "25" >
<div data-width="16"></div>
<afx-label data-id="ppath"></afx-label>
<afx-button text="" data-id="btnppath" iconclass = "fa fa-arrow-up" data-width="20" class="btnsel"></afx-button>
</afx-hbox>
<div data-height="10"></div>
</afx-vbox>
<div data-width="10"></div>
</afx-hbox>
<afx-hbox data-id="locale" tabname = "__(Languages)"iconclass = "fa fa-globe">
<div data-width="10"></div>
<afx-vbox>
<div data-height="5"></div>
<afx-label text = "__(System locale)" iconclass = "fa fa-globe" class = "header" data-height="23"></afx-label>
<afx-list-view data-id="lglist"></afx-list-view>
<div data-height="10"></div>
</afx-vbox>
<div data-width="10"></div>
</afx-hbox>
<afx-hbox data-id="startup" tabname = "__(Startup)" iconclass = "fa fa-cog">
<div data-width="10"></div>
<afx-vbox>
<afx-label text = "__(Startup services)" iconclass = "fa fa-tasks" class = "header" data-height="23"></afx-label>
<afx-list-view data-id="srvlist"></afx-list-view>
<div data-height="5"></div>
<afx-label text = "__(Startup applications)" iconclass = "fa fa-adn" class = "header" data-height="23"></afx-label>
<afx-list-view data-id="applist"></afx-list-view>
<div data-height="10"></div>
</afx-vbox>
<div data-width="10"></div>
</afx-hbox>
</afx-tab-container>
<afx-hbox data-height="35"> <afx-hbox data-height="35">
<div data-width = "120" class = "footer"></div> <div data-width = "120" class = "footer"></div>
<div style="text-align:right" > <div style="text-align:right" >

View File

@ -1,27 +0,0 @@
<afx-vbox data-id="appearance">
<div data-height="5"></div>
<afx-hbox>
<div data-width="10"></div>
<afx-vbox>
<afx-label text = "__(Wallpaper)" iconclass = "fa fa-image" class = "header" data-height="23"></afx-label>
<afx-hbox>
<afx-list-view data-width="150" data-id="wplist"></afx-list-view>
<afx-resizer data-width="5"></afx-resizer>
<afx-vbox>
<div data-id = "wp-preview"></div>
<div data-height="5"></div>
<afx-hbox data-height="25">
<afx-list-view data-id = "wpsize" dropdown="true"></afx-list-view>
<div data-width="5"></div>
<afx-list-view data-id = "wprepeat" dropdown="true"></afx-list-view>
</afx-hbox>
</afx-vbox>
</afx-hbox>
<div data-height="5"></div>
<afx-label text = "__(Theme)" iconclass = "fa fa-window-restore" class = "header" data-height="23"></afx-label>
<afx-list-view data-height="30" data-id="theme-list" dropdown="true"></afx-list-view>
<div data-height="5"></div>
</afx-vbox>
<div data-width="10"></div>
</afx-hbox>
</afx-vbox>

View File

@ -1,12 +0,0 @@
<afx-vbox data-id="locale">
<div data-height="5"></div>
<afx-hbox>
<div data-width="10"></div>
<afx-vbox>
<afx-label text = "__(System locale)" iconclass = "fa fa-globe" class = "header" data-height="23"></afx-label>
<afx-list-view data-id="lglist"></afx-list-view>
<div data-height="10"></div>
</afx-vbox>
<div data-width="10"></div>
</afx-hbox>
</afx-vbox>

View File

@ -1,15 +0,0 @@
<afx-vbox data-id="startup">
<div data-height="5"></div>
<afx-hbox>
<div data-width="10"></div>
<afx-vbox>
<afx-label text = "__(Startup services)" iconclass = "fa fa-tasks" class = "header" data-height="23"></afx-label>
<afx-list-view data-id="srvlist"></afx-list-view>
<div data-height="5"></div>
<afx-label text = "__(Startup applications)" iconclass = "fa fa-adn" class = "header" data-height="23"></afx-label>
<afx-list-view data-id="applist"></afx-list-view>
<div data-height="10"></div>
</afx-vbox>
<div data-width="10"></div>
</afx-hbox>
</afx-vbox>

View File

@ -1,26 +0,0 @@
<afx-vbox data-id="vfs">
<div data-height="5"></div>
<afx-hbox>
<div data-width="10"></div>
<afx-vbox>
<afx-label text = "__(Mount points)" iconclass = "fa fa-folder" class = "header" data-height="23"></afx-label>
<afx-list-view data-id="mplist"></afx-list-view>
<div data-height="5"></div>
<afx-label text = "__(Desktop path)" iconclass = "fa fa-desktop" class = "header" data-height="23"></afx-label>
<afx-hbox data-height = "25" >
<div data-width="16"></div>
<afx-label data-id="dpath"></afx-label>
<afx-button text="" iconclass = "fa fa-arrow-up" data-id="btndpath" data-width="20" class="btnsel"></afx-button>
</afx-hbox>
<div data-height="5"></div>
<afx-label text = "__(Local packages path)" iconclass = "fa fa-cube" class = "header" data-height="23"></afx-label>
<afx-hbox data-height = "25" >
<div data-width="16"></div>
<afx-label data-id="ppath"></afx-label>
<afx-button text="" data-id="btnppath" iconclass = "fa fa-arrow-up" data-width="20" class="btnsel"></afx-button>
</afx-hbox>
<div data-height="10"></div>
</afx-vbox>
<div data-width="10"></div>
</afx-hbox>
</afx-vbox>

View File

@ -8,13 +8,13 @@ class ShowCase extends this.OS.GUI.BaseApplication
bt = @find 'bttest' bt = @find 'bttest'
bt.set "onbtclick", (e) -> bt.set "onbtclick", (e) ->
console.log "btclicked" me.notify "btclicked"
@observable.on "btclick", (e) -> @observable.on "btclick", (e) ->
console.log "button clicked" me.notify "button clicked"
@observable.on "menuselect", (e) -> @observable.on "menuselect", (e) ->
console.log e.id me.notify e.id
list = @find 'list' list = @find 'list'
@ -27,19 +27,15 @@ class ShowCase extends this.OS.GUI.BaseApplication
{ text: "some thing 5" } { text: "some thing 5" }
] ]
list.unshift { text: "shifted el" } list.unshift { text: "shifted el" }
list.set "onlistselect", (e) -> console.log(e.data.items) list.set "onlistselect", (e) -> me.notify(e.data.items)
@observable.on "itemclose", (e) ->
console.log "remove", list.get("data")
console.log list[0].get "selectedItem"
console.log list[0].get "selectedItems"
sw = @find 'switch' sw = @find 'switch'
sw.set "onchange", (e) -> sw.set "onchange", (e) ->
console.log e.data me.notify e.data
spin = @find 'spin' spin = @find 'spin'
spin.set "onchange", (e) -> spin.set "onchange", (e) ->
console.log e.data me.notify e.data
menu = @find 'menu' menu = @find 'menu'
menu.set "items", @menu() menu.set "items", @menu()
@ -50,12 +46,12 @@ class ShowCase extends this.OS.GUI.BaseApplication
grid = @find 'grid' grid = @find 'grid'
grid.set "oncelldbclick", (e) -> grid.set "oncelldbclick", (e) ->
console.log "on dbclick", e me.notify "on dbclick", e
grid.set "onrowselect", (e) -> grid.set "onrowselect", (e) ->
console.log "on rowselect", e.data.items me.notify "on rowselect", e.data.items
@observable.on "cellselect", (e) -> @observable.on "cellselect", (e) ->
console.log "observable", e console.log "observable", e
grid.set "header", [{ text: "header1", width: 80 }, { text: "header2" }, { text: "header3" }] grid.set "header", [{ text: "header1", width: 80 }, { text: "header2" }, { text: "header3" }]
grid.set "rows", [ grid.set "rows", [
@ -104,25 +100,25 @@ class ShowCase extends this.OS.GUI.BaseApplication
tree = @find 'tree' tree = @find 'tree'
tree.set "data", tdata tree.set "data", tdata
tree.set "ontreeselect", (e) -> tree.set "ontreeselect", (e) ->
console.log e.data.item.get "treepath" me.notify e.data.item.get "treepath"
tree.set "ontreedbclick", (e) -> tree.set "ontreedbclick", (e) ->
console.log "treedbclick", e me.notify "treedbclick", e
@observable.on "treedbclick", (e) -> @observable.on "treedbclick", (e) ->
console.log "observable treedbclick", e me.notify "observable treedbclick", e
slider = @find 'slider' slider = @find 'slider'
slider.set "onchanging", (v) -> slider.set "onchange", (v) ->
console.log v me.notify v
cal = @find 'cal' cal = @find 'cal'
cal.set "ondateselect", (e) -> cal.set "ondateselect", (e) ->
console.log e me.notify e
pk = @find 'cpk' pk = @find 'cpk'
pk.set "oncolorselect", (e) -> pk.set "oncolorselect", (e) ->
console.log e me.notify e
pk.set "oncolorselect", (e) -> pk.set "oncolorselect", (e) ->
console.log e me.notify e
fileview = @find 'fileview' fileview = @find 'fileview'
fileview.set "fetch", (path) -> fileview.set "fetch", (path) ->
@ -144,7 +140,7 @@ class ShowCase extends this.OS.GUI.BaseApplication
{ text: "tree" } { text: "tree" }
] ]
viewoption.set "onlistselect", (e) -> viewoption.set "onlistselect", (e) ->
console.log e.data.item.get("data").text me.notify e.data.item.get("data").text
fileview.set "view", e.data.item.get("data").text fileview.set "view", e.data.item.get("data").text
dllist = @find "dialoglist" dllist = @find "dialoglist"
@ -172,17 +168,17 @@ class ShowCase extends this.OS.GUI.BaseApplication
label: "enter value" label: "enter value"
}) })
.then (d) -> .then (d) ->
console.log d me.notify d
when "calendar" when "calendar"
me.openDialog("CalendarDialog", { me.openDialog("CalendarDialog", {
title: "Calendar" title: "Calendar"
}) })
.then (d) -> .then (d) ->
console.log d me.notify d
when "colorpicker" when "colorpicker"
me.openDialog("ColorPickerDialog") me.openDialog("ColorPickerDialog")
.then (d) -> .then (d) ->
console.log d me.notify d
when "info" when "info"
me.openDialog("InfoDialog", { me.openDialog("InfoDialog", {
title: "Info application", title: "Info application",
@ -197,7 +193,7 @@ class ShowCase extends this.OS.GUI.BaseApplication
text: "Do you realy want to delete file ?" text: "Do you realy want to delete file ?"
}) })
.then (d) -> .then (d) ->
console.log d me.notify d
when "selection" when "selection"
me.openDialog("SelectionDialog", { me.openDialog("SelectionDialog", {
title: "Select data ?", title: "Select data ?",
@ -208,7 +204,7 @@ class ShowCase extends this.OS.GUI.BaseApplication
] ]
}) })
.then (d) -> .then (d) ->
console.log d me.notify d.text
when "about" when "about"
me.openDialog("AboutDialog" ) me.openDialog("AboutDialog" )
.then (d) -> .then (d) ->
@ -220,13 +216,13 @@ class ShowCase extends this.OS.GUI.BaseApplication
file: "Untitled".asFileHandle() file: "Untitled".asFileHandle()
}) })
.then (f, name) -> .then (f, name) ->
console.log f, name me.notify f, name
else return else return
mnFile: () -> mnFile: () ->
#console.log file #me.notify file
me = @ me = @
arr = { arr = {
text: "__(File)", text: "__(File)",
@ -238,7 +234,7 @@ class ShowCase extends this.OS.GUI.BaseApplication
{ text: "__(Download)", dataid: "#{@name}-download" }, { text: "__(Download)", dataid: "#{@name}-download" },
{ text: "__(Share file)", dataid: "#{@name}-share", shortcut: 'C-S' }, { text: "__(Share file)", dataid: "#{@name}-share", shortcut: 'C-S' },
{ text: "__(Properties)", dataid: "#{@name}-info", shortcut: 'C-I' } { text: "__(Properties)", dataid: "#{@name}-info", shortcut: 'C-I' }
], onchildselect: (e) -> console.log "child", e ], onchildselect: (e) -> me.notify "child", e
} }
return arr return arr
mnEdit: () -> mnEdit: () ->
@ -251,7 +247,7 @@ class ShowCase extends this.OS.GUI.BaseApplication
{ text: "__(Cut)", dataid: "#{@name}-cut", shortcut: 'C-X' }, { text: "__(Cut)", dataid: "#{@name}-cut", shortcut: 'C-X' },
{ text: "__(Copy)", dataid: "#{@name}-copy", shortcut: 'C-C' }, { text: "__(Copy)", dataid: "#{@name}-copy", shortcut: 'C-C' },
{ text: "__(Paste)", dataid: "#{@name}-paste", shortcut: 'C-P' } { text: "__(Paste)", dataid: "#{@name}-paste", shortcut: 'C-P' }
], onchildselect: (e) -> console.log "child", e ], onchildselect: (e) -> console.log "child", e
} }
menu: () -> menu: () ->

View File

@ -1,29 +1,18 @@
afx-app-window div.afx-window-wrapper{ afx-app-window div.afx-window-wrapper{
border:1px solid #a6a6a6; border:1px solid #a6a6a6;
/*box-shadow: 1px 1px 1px #cbcbcb;*/
box-shadow: 1px 1px 1px #9f9F9F; box-shadow: 1px 1px 1px #9f9F9F;
border-radius: 5px; border-radius: 5px;
background-color:#dfdfdf; background-color:#dfdfdf;
padding:0;
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
} }
afx-app-window.unactive > div.afx-window-wrapper{ afx-app-window.unactive > div.afx-window-wrapper{
background-color: #f6f6f6; background-color: #f6f6f6;
} }
afx-app-window ul.afx-window-top{ afx-app-window ul.afx-window-top{
margin: 0;
padding: 0;
width: 100%;
padding:0;
height: 20px; height: 20px;
border-bottom: 1px solid #a6a6a6; border-bottom: 1px solid #a6a6a6;
} }
afx-app-window ul.afx-window-top li{ afx-app-window ul.afx-window-top li{
list-style: none;
margin-left: 3px; margin-left: 3px;
margin-top:4px; margin-top:4px;
@ -48,8 +37,6 @@ afx-app-window ul li.afx-window-maximize{
afx-app-window ul li.afx-window-title{ afx-app-window ul li.afx-window-title{
margin-top:1px; margin-top:1px;
float:none;
overflow: hidden;
padding-left: 5px; padding-left: 5px;
padding-right: 5px; padding-right: 5px;
text-align: center; text-align: center;
@ -57,16 +44,7 @@ afx-app-window ul li.afx-window-title{
afx-app-window div.afx-window-content afx-app-window div.afx-window-content
{ {
overflow: hidden;
width: 100%;
background-color: white; background-color: white;
flex-grow: 1;
border-bottom-left-radius: 5px; border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px; border-bottom-right-radius: 5px;
}
afx-app-window div.afx-window-grip{
height: 10px;
width: 10px;
background-color: transparent;
} }

View File

@ -1,5 +1,4 @@
afx-button button{ afx-button button{
outline: none;
padding: 4px; padding: 4px;
border: 1px solid #a6a6a6; border: 1px solid #a6a6a6;
background-color: #f6F6F6; background-color: #f6F6F6;
@ -16,7 +15,6 @@ afx-button i.icon-style {
width: 16px; width: 16px;
height: 16px; height: 16px;
display: inline-block; display: inline-block;
float:left;
} }
afx-button button:active, afx-button button.btactive { afx-button button:active, afx-button button.btactive {
background-color: #2786F3; background-color: #2786F3;

View File

@ -1,16 +1,13 @@
afx-apps-dock{ afx-apps-dock{
float: left;
bottom: 3px; bottom: 3px;
top: 3px; top: 3px;
width: 32px; width: 32px;
background-color:#e7e7e7; background-color:#e7e7e7;
position: absolute;
padding:2px; padding:2px;
padding-top: 5px; padding-top: 5px;
border-top-right-radius: 5px; border-top-right-radius: 5px;
border-bottom-right-radius: 5px; border-bottom-right-radius: 5px;
border:1px solid #a6a6a6; border:1px solid #a6a6a6;
overflow: hidden;
box-shadow: 1px 1px 1px #9f9F9F; box-shadow: 1px 1px 1px #9f9F9F;
} }
afx-apps-dock afx-button button{ afx-apps-dock afx-button button{

View File

@ -1,21 +1,12 @@
afx-file-view {
position: relative;
}
afx-file-view afx-label.status{ afx-file-view afx-label.status{
position: absolute;
bottom: 1px;
left:0px;
padding:3px; padding:3px;
right: 0px; right: 0px;
height: 15px; height: 15px;
background-color: #f6F6F6; background-color: #f6F6F6;
border-top: 1px solid #cbcbcb; border-top: 1px solid #cbcbcb;
color:#414339; color:#414339;
transform: translateZ(0);
} }
afx-file-view afx-list-view > div.list-container > ul li{ afx-file-view afx-list-view > div.list-container > ul li{
float:left;
display: block;
width:70px; width:70px;
height: 60px; height: 60px;
background-color: transparent; background-color: transparent;
@ -38,7 +29,6 @@ afx-file-view afx-list-view i.dir:before{
afx-file-view afx-list-view i{ afx-file-view afx-list-view i{
width: 32px; width: 32px;
height: 32px; height: 32px;
display: block;
margin-left: 19px; margin-left: 19px;
} }
@ -77,7 +67,6 @@ afx-file-view afx-grid-view i.dir:before{
font-weight: normal; font-weight: normal;
} }
afx-file-view afx-grid-view i{ afx-file-view afx-grid-view i{
display: inline-block;
margin-right: 5px; margin-right: 5px;
} }
afx-file-view afx-grid-view afx-grid-row.afx-grid-row-selected i:before{ afx-file-view afx-grid-view afx-grid-row.afx-grid-row-selected i:before{
@ -106,14 +95,7 @@ afx-file-view afx-tree-view .afx-tree-view-folder-open:before{
color:#76D2F9; color:#76D2F9;
font-size: 16px; font-size: 16px;
} }
afx-file-view afx-tree-view{
margin:0;
overflow: hidden;
background-color: transparent;
}
afx-file-view afx-tree-view .afx_tree_item_odd{
background-color: transparent;
}
afx-file-view afx-tree-view .afx-tree-view-item:before{ afx-file-view afx-tree-view .afx-tree-view-item:before{
content: "\f016"; content: "\f016";
font-family: "FontAwesome"; font-family: "FontAwesome";
@ -122,18 +104,7 @@ afx-file-view afx-tree-view .afx-tree-view-item:before{
font-style: normal; font-style: normal;
font-weight: normal; font-weight: normal;
} }
afx-file-view afx-tree-view div{
overflow: hidden;
white-space: nowrap;
background-color: transparent;
padding:0;
}
afx-file-view div.treecontainer{
display: block;
overflow: auto;
padding:0;
margin:0;
}
afx-file-view afx-tree-view div.afx_tree_item_selected, afx-file-view afx-tree-view div.afx_tree_item_selected:hover{ afx-file-view afx-tree-view div.afx_tree_item_selected, afx-file-view afx-tree-view div.afx_tree_item_selected:hover{
background-color: transparent; background-color: transparent;
color:#414339; color:#414339;

View File

@ -1,9 +1,3 @@
afx-grid-view afx-grid-row afx-grid-cell{
user-select:none;
-webkit-user-select:none;
cursor:default;
}
afx-grid-view afx-grid-row:nth-child(even) afx-grid-cell afx-grid-view afx-grid-row:nth-child(even) afx-grid-cell
{ {
background-color: #f5F5F5; background-color: #f5F5F5;
@ -22,9 +16,4 @@ afx-grid-view afx-grid-row.afx-grid-row-selected afx-grid-cell.afx-grid-cell-sel
afx-grid-view .grid_row_header afx-grid-cell{ afx-grid-view .grid_row_header afx-grid-cell{
border-right: 2px solid #e5e5e5; border-right: 2px solid #e5e5e5;
user-select:none;
-webkit-user-select:none;
cursor:default;
font-weight: bold;
border-right:0;
} }

View File

@ -1,7 +1,6 @@
afx-label i.icon-style { afx-label i.icon-style {
width: 16px; width: 16px;
height: 16px; height: 16px;
float: left;
} }
afx-label i afx-label i

View File

@ -1,41 +1,10 @@
afx-list-view{
overflow:hidden;
/*padding: 5px;*/
display: block;
}
/*
afx-list-view div.list-container{
width: 100%;
height: 100%;
display: inline-block;
position: relative;
background-color: red;
}*/
afx-list-view afx-list-item
{
display: contents;
}
afx-list-view > div.list-container{
overflow: auto;
}
afx-list-view > div.list-container > ul{
margin:0;
padding: 0;
}
afx-list-view > div.list-container > ul li{ afx-list-view > div.list-container > ul li{
margin:0;
padding:0;
list-style: none;
padding: 5px; padding: 5px;
padding-top:3px; padding-top:3px;
padding-bottom: 3px; padding-bottom: 3px;
padding-right: 10px; padding-right: 10px;
color: #414339; color: #414339;
background-color: white; background-color: white;
position: relative;
-webkit-user-select:none;
cursor:default;
} }
afx-list-view > div.list-container > ul afx-list-item:nth-child(even) li{ afx-list-view > div.list-container > ul afx-list-item:nth-child(even) li{
background-color:#f5F5F5; background-color:#f5F5F5;
@ -43,19 +12,12 @@ afx-list-view > div.list-container > ul afx-list-item:nth-child(even) li{
afx-list-view i.closable{ afx-list-view i.closable{
width: 16px; width: 16px;
height: 16px; height: 16px;
display: inline-block;
position:absolute;
top:0px;
right:2px;
cursor: pointer;
} }
afx-list-view i.closable:before{ afx-list-view i.closable:before{
content: "\f00d";
font-family: "FontAwesome";
font-size: 10px; font-size: 10px;
margin-left: 10px; margin-left: 10px;
color: #414339; color: #414339;
font-style: normal;
} }
afx-list-view > div.list-container > ul li > i { afx-list-view > div.list-container > ul li > i {
@ -67,45 +29,15 @@ afx-list-view > div.list-container > ul > afx-list-item > li.selected{
color:white; color:white;
} }
/*
afx-list-view.dropdown div.list-container{
position: relative;
display: inline-block;
}
afx-list-view.dropdown div.list-container ul{
position:absolute;
top:100%;
left:0;
display: none;
border:1px solid red;
}*/
afx-list-view.dropdown {
padding:0;
margin: 0;
}
afx-list-view.dropdown > div.list-container{
overflow: visible;
}
afx-list-view.dropdown > div.list-container > ul{
max-height: 150px;
overflow-y: auto;
overflow-x: hidden;
background-color: white;
}
afx-list-view.dropdown > div.list-container > ul{ afx-list-view.dropdown > div.list-container > ul{
border:1px solid #a6a6a6; border:1px solid #a6a6a6;
box-shadow: 1px 1px 1px #9f9F9F; box-shadow: 1px 1px 1px #9f9F9F;
border-radius: 3px; border-radius: 3px;
/*padding:2px;*/ max-height: 150px;
background-color: white;
border-top-left-radius: 0px; border-top-left-radius: 0px;
z-index: 10; z-index: 10;
} }
afx-list-view.dropdown > div.list-container > ul li{
display: inline-block;
width:100%;
}
afx-list-view.dropdown div.list-container div{ afx-list-view.dropdown div.list-container div{
color: #414339; color: #414339;
@ -147,12 +79,7 @@ afx-list-view ul.complex-content li{
afx-list-view > div.list-container > ul li.selected ul.complex-content li{ afx-list-view > div.list-container > ul li.selected ul.complex-content li{
color:white; color:white;
} }
/*
afx-list-view div.button_container {
padding-top:2px;
border-top:1px solid #cbcbcb;
}
*/
afx-list-view div.button_container afx-button{ afx-list-view div.button_container afx-button{
margin-right: 2px; margin-right: 2px;
} }

View File

@ -1,27 +1,6 @@
afx-menu {
position:relative;
display:inline-block;
z-index: 100000;
}
afx-menu a{ afx-menu a{
text-decoration: none;
color: #414339; color: #414339;
display: flex;
width: 100%;
height: 100%;
flex-direction: row;
}
afx-menu a afx-label{
flex:1;
}
afx-menu ul{
padding:0;
margin: 0;
display:inline-block;
}
afx-menu ul li{
white-space:nowrap;
} }
afx-menu afx-switch span{ afx-menu afx-switch span{
width: 20px; width: 20px;
@ -30,7 +9,6 @@ afx-menu afx-switch span{
/*margin-top:5px;*/ /*margin-top:5px;*/
} }
afx-menu span.shortcut{ afx-menu span.shortcut{
width:40px;
text-align: right; text-align: right;
} }
afx-menu li:hover > a afx-switch span:before{ afx-menu li:hover > a afx-switch span:before{
@ -47,44 +25,15 @@ afx-menu afx-menu ul {
background-color: #e7e7e7; background-color: #e7e7e7;
} }
afx-menu ul li /*, afx-menu ul >afx-menu-entry > li*/{ afx-menu ul li /*, afx-menu ul >afx-menu-entry > li*/{
list-style:none;
margin:0;
position: relative;
float: left;
padding:3px; padding:3px;
padding-left: 5px; padding-left: 5px;
padding-right: 5px; padding-right: 5px;
cursor:default;
}
afx-menu ul li.fix_padding{
padding-top:1px;
padding-bottom: 0;
padding-left: 5px;
padding-right: 5px;
}
afx-menu afx-menu ul li.fix_padding{
padding:3px;
padding-left: 5px;
padding-right: 5px;
}
afx-menu afx-menu {
top:100%;
left:0;
position: absolute;
display:none;
} }
afx-menu afx-menu i{ afx-menu afx-menu i{
margin-right: 5px; margin-right: 5px;
} }
afx-menu afx-menu li{ afx-menu afx-menu li{
float:none;
min-width: 150px; min-width: 150px;
cursor:default;
}
afx-menu afx-menu afx-menu, afx-menu ul.context afx-menu{
top:-4px;
left: 100%;
} }
afx-menu li:hover { afx-menu li:hover {
@ -94,20 +43,6 @@ afx-menu li:hover > a {
color: white; color: white;
} }
afx-menu afx-menu li:hover > afx-menu, ul.context li:hover > afx-menu
{
display: block;
}
afx-menu li.afx-corner-fix{
height: 3px;
padding: 0;
margin: 0;
background-color: transparent;
}
afx-menu li.afx-corner-fix:hover{
background-color: transparent;
}
afx-menu afx-menu .afx_submenu:before, afx-menu ul.context .afx_submenu:before{ afx-menu afx-menu .afx_submenu:before, afx-menu ul.context .afx_submenu:before{
content: "\f054"; content: "\f054";
font-family: "FontAwesome"; font-family: "FontAwesome";
@ -119,17 +54,12 @@ afx-menu afx-menu .afx_submenu:before, afx-menu ul.context .afx_submenu:before
} }
afx-menu ul.context{ afx-menu ul.context{
position: absolute;
z-index: 1000000;
padding: 0;
border:1px solid #a6a6a6; border:1px solid #a6a6a6;
border-radius: 5px; border-radius: 5px;
border-top-left-radius: 0px; border-top-left-radius: 0px;
/*box-shadow: 2px 2px 2px #cbcbcb;*/
box-shadow: 1px 1px 1px #9f9F9F; box-shadow: 1px 1px 1px #9f9F9F;
background-color: #e7e7e7; background-color: #e7e7e7;
} }
afx-menu ul.context li{ afx-menu ul.context li{
clear:float; min-width: 150px;
min-width: 150px;
} }

View File

@ -1,21 +1,6 @@
afx-nspinner{
display: flex;
flex-direction: row;
}
afx-nspinner ul{
padding:0;
margin: 0;
list-style: none;
}
afx-nspinner input{
margin: 0;
}
afx-nspinner ul li{ afx-nspinner ul li{
display: block;
border: 1px solid #a6a6a6; border: 1px solid #a6a6a6;
width: 100%; width: 100%;
padding:0;
margin: 0;
color: #414339; color: #414339;
} }
@ -34,16 +19,8 @@ afx-nspinner ul li:hover{
color:#116cD6; color:#116cD6;
} }
afx-nspinner ul li.incr i:before{ afx-nspinner ul li.incr i:before{
content: "\f0d8";
font-family: "FontAwesome";
font-size: 16px; font-size: 16px;
font-style: normal;
} }
afx-nspinner ul li.decr i:before{ afx-nspinner ul li.decr i:before{
content: "\f0d7";
font-family: "FontAwesome";
font-size: 16px; font-size: 16px;
font-style: normal;
} }

View File

@ -1,3 +1,3 @@
afx-resizer { afx-resizer {
background-color: #a6a6a6; background-color: #cbcbcb;
} }

View File

@ -1,30 +1,16 @@
afx-slider{
display: flex;
align-items: center;
justify-content: center;
}
afx-slider div.container{ afx-slider div.container{
display: block;
border:0;
border-radius: 3px; border-radius: 3px;
height: 5px; height: 5px;
background-color: #e6e6e6; background-color: #e6e6e6;
position: relative;
padding:0;
cursor: pointer;
} }
afx-slider div.progress { afx-slider div.progress {
padding:0;
margin: 0;
display: block;
background-color: #116cd6; background-color: #116cd6;
border:0;
border-radius: 3px; border-radius: 3px;
} }
afx-slider div.dragpoint { afx-slider div.dragpoint {
display: block;
width: 20px; width: 20px;
height: 20px; height: 20px;
border:1px solid #6b6b6b; border:1px solid #6b6b6b;

View File

@ -1,8 +1,6 @@
afx-switch span{ afx-switch span{
display: inline-block;
width: 30px; width: 30px;
height:24px; height:24px;
cursor: pointer;
font-size: 24px; font-size: 24px;
font-family: "FontAwesome"; font-family: "FontAwesome";
} }

View File

@ -1,24 +1,10 @@
afx-sys-panel{
padding:0;
margin: 0;
}
afx-sys-panel > div{ afx-sys-panel > div{
width: 100%;
height: 23px;
margin:0;
padding: 0;
background-color: #e7e7e7; background-color: #e7e7e7;
border-bottom: 1px solid #9c9C9C; border-bottom: 1px solid #9c9C9C;
box-shadow: 1px 1px 1px #9F9F9F; box-shadow: 1px 1px 1px #9F9F9F;
position:absolute; height: 22px;
} }
afx-sys-panel .afx-panel-os-menu {
padding:0;
margin: 0;
float:left;
margin-right: 10px;
}
afx-sys-panel .afx-panel-os-menu li afx-sys-panel .afx-panel-os-menu li
{ {
font-weight: bold; font-weight: bold;
@ -29,22 +15,15 @@ afx-sys-panel .afx-panel-os-menu li
afx-sys-panel .afx-panel-os-menu a { afx-sys-panel .afx-panel-os-menu a {
color: white; color: white;
} }
afx-sys-panel .afx-panel-os-stray{
float:right;
position: relative;
}
afx-sys-panel afx-menu.afx-panel-os-stray afx-menu { afx-sys-panel afx-menu.afx-panel-os-stray afx-menu {
right: 0;
left: calc(100% - 170px); left: calc(100% - 170px);
position: absolute;
} }
afx-sys-panel afx-menu.afx-panel-os-stray afx-menu li.afx_submenu a{ afx-sys-panel afx-menu.afx-panel-os-stray afx-menu li.afx_submenu a{
margin-left: 10px; margin-left: 10px;
} }
afx-sys-panel afx-menu.afx-panel-os-stray afx-menu li.afx_submenu:before { afx-sys-panel afx-menu.afx-panel-os-stray afx-menu li.afx_submenu:before {
content: "\f054"; content: "\f054";
font-family: "FontAwesome"; font-family: "FontAwesome";
@ -55,11 +34,6 @@ afx-sys-panel afx-menu.afx-panel-os-stray afx-menu li.afx_submenu:before {
left:5px; left:5px;
top:25%; top:25%;
} }
afx-sys-panel afx-menu.afx-panel-os-stray afx-menu afx-menu{
left: -100%;
right: 100%;
top:-4px;
}
afx-sys-panel afx-menu.afx-panel-os-stray afx-menu ul{ afx-sys-panel afx-menu.afx-panel-os-stray afx-menu ul{
border:1px solid #a6a6a6; border:1px solid #a6a6a6;
border-radius: 5px; border-radius: 5px;
@ -72,11 +46,8 @@ afx-sys-panel afx-menu.afx-panel-os-stray afx-menu li{
afx-sys-panel afx-overlay afx-sys-panel afx-overlay
{ {
background-color: #e7e7e7; background-color: #e7e7e7;
overflow-y: auto;
overflow-x: hidden;
border: 1px solid #9c9C9C; border: 1px solid #9c9C9C;
width: 250px; width: 250px;
margin: 0;
} }
afx-sys-panel afx-list-view[data-id="applist"] afx-sys-panel afx-list-view[data-id="applist"]
{ {
@ -94,10 +65,6 @@ afx-sys-panel afx-list-view[data-id="applist"] > div.list-container > ul li
afx-sys-panel afx-hbox[data-id="btlist"] afx-button button afx-sys-panel afx-hbox[data-id="btlist"] afx-button button
{ {
width: 100%;
height: 100%;
border-radius: 0;
border: 0px;
border-left: 1px solid #afafaf; border-left: 1px solid #afafaf;
} }

View File

@ -1,16 +1,3 @@
afx-tab-bar {
display: block;
width: 100%;
}
afx-tab-bar afx-list-view {
padding:0;
margin:0;
}
afx-tab-bar afx-list-view > div.list-container > ul afx-list-item:nth-child(even) li
{
background-color: transparent;
}
afx-tab-bar afx-list-view > div.list-container > ul > afx-list-item > li.selected afx-tab-bar afx-list-view > div.list-container > ul > afx-list-item > li.selected
{ {
@ -19,7 +6,6 @@ afx-tab-bar afx-list-view > div.list-container > ul > afx-list-item > li.selecte
} }
afx-tab-bar afx-list-view > div.list-container > ul li{ afx-tab-bar afx-list-view > div.list-container > ul li{
float:left;
border-top-left-radius: 5px; border-top-left-radius: 5px;
border-top-right-radius: 5px; border-top-right-radius: 5px;
padding-bottom: 2px; padding-bottom: 2px;

View File

@ -1,35 +1,15 @@
afx-tree-view{ afx-tree-view{
color: #414339; color: #414339;
padding:3px; padding:3px;
overflow: auto;
display: block;
}
afx-tree-view afx-tree-view{
padding:0;
overflow: hidden;
display: block;
}
afx-tree-view ul{
margin:0;
padding:0;
}
afx-tree-view li{
list-style: none;
margin:0;
padding: 0;
} }
afx-tree-view div{ afx-tree-view div{
padding:3px; padding:3px;
background-color: white; background-color: white;
-webkit-user-select:none;
cursor:default;
} }
afx-tree-view i.icon-style { afx-tree-view i.icon-style {
width: 16px; width: 16px;
height: 16px; height: 16px;
display: inline-block;
float:left;
margin-right: 3px;
} }
afx-tree-view div.afx_tree_item_selected{ afx-tree-view div.afx_tree_item_selected{
background-color: #116cd6; background-color: #116cd6;
@ -39,22 +19,14 @@ afx-tree-view div.afx_tree_item_selected:hover{
background-color: #116cd6; background-color: #116cd6;
color:white; color:white;
} }
/*
afx-tree-view div:hover{
background-color: #f5F5F5;
color: #414339;
}*/
afx-tree-view .afx_folder_item{ afx-tree-view .afx_folder_item{
font-weight: bold; font-weight: bold;
} }
afx-tree-view .afx-tree-view-folder-open:before{ afx-tree-view .afx-tree-view-folder-open:before{
content: "\f147";
font-family: "FontAwesome";
font-size: 13px; font-size: 13px;
} }
afx-tree-view .afx-tree-view-folder-close:before{ afx-tree-view .afx-tree-view-folder-close:before{
content: "\f196";
font-family: "FontAwesome";
font-size: 13px; font-size: 13px;
} }

View File

@ -1,64 +1,25 @@
html,body{ html,body{
margin: 0;
padding: 0;
font-family: "Ubuntu"; font-family: "Ubuntu";
font-size: 13px; font-size: 13px;
width: 100%;
height: 100%;
overflow: hidden;
} }
/*
*:fullscreen, *:-webkit-full-screen, *:-moz-full-screen {
background-color: transparent;
background: transparent;
}*/
#wrapper{
margin: 0;
padding: 0;
min-height:100%;
overflow:hidden;
}
.afx-clear{
clear:both;
background-color: transparent;
border: 0;
height: 1px;
}
#workspace { #workspace {
width: 100%;
position: absolute;
bottom: 0;
top: 24px; top: 24px;
} }
#desktop{ #desktop{
position: absolute;
top:3px; top:3px;
bottom: 0;
margin: 0;
left: 40px; left: 40px;
right: 0;
user-select:none;
cursor: default;
padding:0px;
} }
#desktop > div > ul afx-list-item { #desktop > div > ul afx-list-item {
display:block;
background-color:transparent;
text-align: center;
width: 70px; width: 70px;
color: white; color: white;
padding:3px; padding:3px;
} }
#desktop > div > ul afx-list-item li.selected { #desktop > div > ul afx-list-item li.selected {
display:block;
background-color: #116cd6; background-color: #116cd6;
color:white; color:white;
border-radius: 6px; border-radius: 6px;
text-align: center;
width: 70px; width: 70px;
color: white; color: white;
padding:3px; padding:3px;
@ -73,10 +34,7 @@ html,body{
font-style: normal; font-style: normal;
font-weight: normal; font-weight: normal;
} }
#desktop > div > ul afx-list-item span{
width: 100%;
word-wrap: break-word;
}
#desktop > div > ul afx-list-item i.dir:before{ #desktop > div > ul afx-list-item i.dir:before{
display: block; display: block;
content: "\f07b\a"; content: "\f07b\a";
@ -92,11 +50,10 @@ html,body{
border-radius: 3px; border-radius: 3px;
padding-left:3px; padding-left:3px;
padding-right:3px; padding-right:3px;
/*box-shadow: 2px 2px 2px #cbcbcb;*/
box-shadow: 1px 1px 1px #9f9F9F; box-shadow: 1px 1px 1px #9f9F9F;
background-color: #e7e7e7; background-color: #e7e7e7;
z-index: 1000000;
} }
input { input {
outline: none; outline: none;
padding: 2px; padding: 2px;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

View File

@ -0,0 +1,34 @@
afx-app-window div.afx-window-wrapper{
padding:0;
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
}
afx-app-window ul.afx-window-top{
margin: 0;
padding: 0;
width: 100%;
padding:0;
}
afx-app-window ul.afx-window-top li{
list-style: none;
}
afx-app-window ul li.afx-window-title{
float:none;
overflow: hidden;
}
afx-app-window div.afx-window-content
{
overflow: hidden;
width: 100%;
flex-grow: 1;
}
afx-app-window div.afx-window-grip{
height: 10px;
width: 10px;
background-color: transparent;
}

View File

@ -0,0 +1,7 @@
afx-button button{
outline: none;
}
afx-button i.icon-style {
float: left;
}

View File

@ -0,0 +1,5 @@
afx-apps-dock{
float: left;
position: absolute;
overflow: hidden;
}

View File

@ -0,0 +1,46 @@
afx-file-view {
position: relative;
}
afx-file-view afx-label.status{
position: absolute;
bottom: 1px;
left:0px;
transform: translateZ(0);
}
afx-file-view afx-list-view > div.list-container > ul li{
float:left;
display: block;
}
afx-file-view afx-list-view i{
display: block;
}
afx-file-view afx-grid-view i{
display: inline-block;
}
afx-file-view afx-tree-view{
margin:0;
overflow: hidden;
background-color: transparent;
}
afx-file-view afx-tree-view .afx_tree_item_odd{
background-color: transparent;
}
afx-file-view afx-tree-view div{
overflow: hidden;
white-space: nowrap;
background-color: transparent;
padding:0;
}
afx-file-view div.treecontainer{
display: block;
overflow: auto;
padding:0;
margin:0;
}

View File

@ -0,0 +1,12 @@
afx-grid-view afx-grid-row afx-grid-cell{
user-select:none;
-webkit-user-select:none;
cursor:default;
}
afx-grid-view .grid_row_header afx-grid-cell{
user-select:none;
-webkit-user-select:none;
cursor:default;
font-weight: bold;
}

View File

@ -0,0 +1,3 @@
afx-label i.icon-style {
float: left;
}

View File

@ -0,0 +1,56 @@
afx-list-view{
overflow:hidden;
display: block;
}
afx-list-view afx-list-item
{
display: contents;
}
afx-list-view > div.list-container{
overflow: auto;
}
afx-list-view > div.list-container > ul{
margin:0;
padding: 0;
}
afx-list-view > div.list-container > ul li{
margin:0;
padding:0;
list-style: none;
position: relative;
-webkit-user-select:none;
cursor:default;
}
afx-list-view i.closable{
display: inline-block;
position:absolute;
top:0px;
right:2px;
cursor: pointer;
}
afx-list-view i.closable:before{
content: "\f00d";
font-family: "FontAwesome";
font-style: normal;
}
afx-list-view.dropdown {
padding:0;
margin: 0;
}
afx-list-view.dropdown > div.list-container{
overflow: visible;
}
afx-list-view.dropdown > div.list-container > ul{
overflow-y: auto;
overflow-x: hidden;
}
afx-list-view.dropdown > div.list-container > ul li{
display: inline-block;
width:100%;
}

View File

@ -0,0 +1,87 @@
afx-menu {
position:relative;
display:inline-block;
z-index: 100000;
}
afx-menu a{
text-decoration: none;
display: flex;
width: 100%;
height: 100%;
flex-direction: row;
}
afx-menu a afx-label{
flex:1;
}
afx-menu ul{
padding:0;
margin: 0;
display:inline-block;
}
afx-menu ul li{
white-space:nowrap;
}
afx-menu span.shortcut{
text-align: right;
}
afx-menu ul li {
list-style:none;
margin:0;
position: relative;
float: left;
cursor:default;
}
afx-menu ul li.fix_padding{
padding-top:1px;
padding-bottom: 0;
padding-left: 5px;
padding-right: 5px;
}
afx-menu afx-menu ul li.fix_padding{
padding:3px;
padding-left: 5px;
padding-right: 5px;
}
afx-menu afx-menu {
top:100%;
left:0;
position: absolute;
display:none;
}
afx-menu afx-menu li{
float:none;
cursor:default;
}
afx-menu afx-menu afx-menu, afx-menu ul.context afx-menu{
top:-4px;
left: 100%;
}
afx-menu afx-menu li:hover > afx-menu, ul.context li:hover > afx-menu
{
display: block;
}
afx-menu li.afx-corner-fix{
height: 3px;
padding: 0;
margin: 0;
background-color: transparent;
}
afx-menu li.afx-corner-fix:hover{
background-color: transparent;
}
afx-menu ul.context{
position: absolute;
z-index: 1000000;
padding: 0;
}
afx-menu ul.context li{
clear:float;
}

View File

@ -0,0 +1,30 @@
afx-nspinner{
display: flex;
flex-direction: row;
}
afx-nspinner ul{
padding:0;
margin: 0;
list-style: none;
}
afx-nspinner input{
margin: 0;
}
afx-nspinner ul li{
display: block;
padding:0;
margin: 0;
}
afx-nspinner ul li.incr i:before{
content: "\f0d8";
font-family: "FontAwesome";
font-style: normal;
}
afx-nspinner ul li.decr i:before{
content: "\f0d7";
font-family: "FontAwesome";
font-style: normal;
}

View File

@ -0,0 +1,23 @@
afx-slider{
display: flex;
align-items: center;
justify-content: center;
}
afx-slider div.container{
display: block;
border:0;
position: relative;
padding:0;
cursor: pointer;
}
afx-slider div.progress {
padding:0;
margin: 0;
display: block;
border:0;
}
afx-slider div.dragpoint {
display: block;
}

View File

@ -0,0 +1,4 @@
afx-switch span{
display: inline-block;
cursor: pointer;
}

View File

@ -0,0 +1,48 @@
afx-sys-panel{
padding:0;
margin: 0;
}
afx-sys-panel > div{
width: 100%;
margin:0;
padding: 0;
position:absolute;
}
afx-sys-panel .afx-panel-os-menu {
padding:0;
margin: 0;
float:left;
margin-right: 5px;
}
afx-sys-panel .afx-panel-os-stray{
float:right;
position: relative;
}
afx-sys-panel afx-menu.afx-panel-os-stray afx-menu {
right: 0;
position: absolute;
}
afx-sys-panel afx-menu.afx-panel-os-stray afx-menu afx-menu{
left: -100%;
right: 100%;
top:-4px;
}
afx-sys-panel afx-overlay
{
overflow-y: auto;
overflow-x: hidden;
margin: 0;
}
afx-sys-panel afx-hbox[data-id="btlist"] afx-button button
{
width: 100%;
height: 100%;
border-radius: 0;
border: 0px;
}

View File

@ -0,0 +1,18 @@
afx-tab-bar {
display: block;
width: 100%;
}
afx-tab-bar afx-list-view {
padding:0;
margin:0;
}
afx-tab-bar afx-list-view > div.list-container > ul afx-list-item:nth-child(even) li
{
background-color: transparent;
}
afx-tab-bar afx-list-view > div.list-container > ul li{
float:left;
}

View File

@ -0,0 +1,35 @@
afx-tree-view{
overflow: auto;
display: block;
}
afx-tree-view afx-tree-view{
padding:0;
overflow: hidden;
display: block;
}
afx-tree-view ul{
margin:0;
padding:0;
}
afx-tree-view li{
list-style: none;
margin:0;
padding: 0;
}
afx-tree-view div{
-webkit-user-select:none;
cursor:default;
}
afx-tree-view i.icon-style {
float:left;
margin-right: 3px;
}
afx-tree-view .afx-tree-view-folder-open:before{
content: "\f147";
font-family: "FontAwesome";
}
afx-tree-view .afx-tree-view-folder-close:before{
content: "\f196";
font-family: "FontAwesome";
}

123
src/themes/system/antos.css Normal file
View File

@ -0,0 +1,123 @@
html,body{
margin: 0;
padding: 0;
width: 100%;
height: 100%;
overflow: hidden;
}
body
{
background-image: url("wp/wp2.jpg");
background-size: "cover";
background-repeat: "repeat";
}
#wrapper{
margin: 0;
padding: 0;
min-height:100%;
overflow:hidden;
}
.afx-clear{
clear:both;
background-color: transparent;
border: 0;
height: 1px;
}
#workspace {
width: 100%;
position: absolute;
bottom: 0;
}
#desktop{
position: absolute;
bottom: 0;
margin: 0;
right: 0;
user-select:none;
cursor: default;
padding:0px;
}
#desktop > div > ul afx-list-item {
display:block;
background-color:transparent;
text-align: center;
}
#desktop > div > ul afx-list-item li.selected {
display:block;
text-align: center;
}
#desktop > div > ul afx-list-item span{
width: 100%;
word-wrap: break-word;
}
#systooltip {
z-index: 1000000;
}
#login_form{
width:300px;
height: 200px;
display: block;
border:1px solid #a6a6a6;
border-radius: 6px;
box-shadow: 1px 1px 1px #9f9F9F;
position: absolute;
margin: auto;
top:0;
right: 0;
bottom: 0;
left: 0;
font-family:Verdana, Geneva, Tahoma, sans-serif;
font-size: 13px;
text-align: center;
background-color: white;
color: #414339;
}
#login_form p{
display: inline-block;
background-color:#dfdfdf;
border-bottom: 1px solid #a6a6a6;
padding:10px;
width: calc(100% - 20px);
border-top-left-radius: 6px;
border-top-right-radius: 6px;
font-weight: bold;
margin:0;
}
#login_form input {
width: 250px;
outline: none;
margin-top:10px;
border-radius: 6px;
box-sizing: border-box;
font-size: 13px;
padding: 5px;
border: 1px solid #a6a6a6;
background-color: white;
color: #414339;
}
#login_form button{
margin-top:10px;
width: 250px;
height: 30px;
background-color: #2786F3;
color: white;
border: 1px solid #dedede;
border-radius: 6px;
font-family: Verdana, Geneva, Tahoma, sans-serif;
font-size: 13px;
padding:5px;
}
#login_error{
padding:3px;
color:red;
font-weight: normal;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB