From 2985689217c5fc1b81b8066edcdc6f863f8ae289 Mon Sep 17 00:00:00 2001 From: Xuan Sang LE Date: Mon, 14 Aug 2017 00:20:19 +0200 Subject: [PATCH] core for app development --- Makefile | 55 +++--- src/antos.coffee | 1 + src/core/{apis => }/api.coffee | 5 +- src/core/gui/BaseApplication.coffee | 83 ++++++++- src/core/gui/BaseEvent.coffee | 7 + src/core/gui/gui.coffee | 115 ++++++++----- src/core/gui/tags/afx-app-window.js | 82 +++++++-- src/core/gui/tags/afx-apps-dock.js | 57 +++++- src/core/gui/tags/afx-button.js | 31 +++- src/core/gui/tags/afx-grid-view.js | 162 ++++++++++++++++++ src/core/gui/tags/afx-hbox.js | 24 ++- src/core/gui/tags/afx-list-view.js | 106 ++++++++++-- src/core/gui/tags/afx-menu.js | 44 ++++- src/core/gui/tags/afx-sys-panel.js | 24 ++- src/core/gui/tags/afx-tree-view.js | 103 +++++++++++ src/core/gui/tags/afx-vbox.js | 17 ++ src/core/gui/themes/antos/afx-app-window.css | 7 +- src/core/gui/themes/antos/afx-button.css | 7 +- src/core/gui/themes/antos/afx-dock.css | 16 +- src/core/gui/themes/antos/afx-grid-view.css | 33 ++++ src/core/gui/themes/antos/afx-list-view.css | 104 +++++++++++ src/core/gui/themes/antos/afx-menu.css | 28 ++- src/core/gui/themes/antos/afx-sys-panel.css | 13 +- src/core/gui/themes/antos/afx-tree-view.css | 59 +++++++ .../handlers/InBrowserHandler.coffee | 0 src/core/processes.coffee | 35 ++++ src/define.coffee | 8 +- src/index.html | 2 + src/packages/ActivityMonitor/Makefile | 33 ++++ src/packages/ActivityMonitor/main.coffee | 56 ++++++ src/packages/ActivityMonitor/main.css | 8 + src/packages/ActivityMonitor/package.json | 12 ++ src/packages/ActivityMonitor/scheme.html | 7 + src/packages/NotePad/Makefile | 14 +- src/packages/NotePad/main.coffee | 55 +++++- src/packages/NotePad/main.css | 10 +- src/packages/NotePad/package.json | 2 +- src/packages/NotePad/scheme.html | 26 ++- src/packages/Terminal/Makefile | 33 ++++ src/packages/Terminal/main.coffee | 80 +++++++++ src/packages/Terminal/main.css | 0 src/packages/Terminal/package.json | 12 ++ .../Terminal/scheme.html} | 10 +- 43 files changed, 1414 insertions(+), 172 deletions(-) rename src/core/{apis => }/api.coffee (89%) create mode 100644 src/core/gui/BaseEvent.coffee create mode 100644 src/core/gui/tags/afx-grid-view.js create mode 100644 src/core/gui/tags/afx-tree-view.js create mode 100644 src/core/gui/themes/antos/afx-grid-view.css create mode 100644 src/core/gui/themes/antos/afx-list-view.css create mode 100644 src/core/gui/themes/antos/afx-tree-view.css rename src/core/{apis => }/handlers/InBrowserHandler.coffee (100%) create mode 100644 src/core/processes.coffee create mode 100644 src/packages/ActivityMonitor/Makefile create mode 100644 src/packages/ActivityMonitor/main.coffee create mode 100644 src/packages/ActivityMonitor/main.css create mode 100644 src/packages/ActivityMonitor/package.json create mode 100644 src/packages/ActivityMonitor/scheme.html create mode 100644 src/packages/Terminal/Makefile create mode 100644 src/packages/Terminal/main.coffee create mode 100644 src/packages/Terminal/main.css create mode 100644 src/packages/Terminal/package.json rename src/{core/gui/schemes/test.html => packages/Terminal/scheme.html} (55%) diff --git a/Makefile b/Makefile index 48e2a92..d2ca833 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,16 @@ BUILDDIR = build/htdocs -BLUE=\033[0;34m +BLUE=\033[1;34m NC=\033[0m coffees= src/define.coffee\ - src/core/apis/api.coffee\ - src/core/apis/handlers/InBrowserHandler.coffee\ + src/core/api.coffee\ + src/core/processes.coffee\ + src/core/handlers/InBrowserHandler.coffee\ src/core/gui/gui.coffee\ src/core/gui/BaseApplication.coffee\ + src/core/gui/BaseEvent.coffee\ src/antos.coffee tags= src/core/gui/tags/afx-button.js\ @@ -18,7 +20,9 @@ tags= src/core/gui/tags/afx-button.js\ src/core/gui/tags/afx-app-window.js\ src/core/gui/tags/afx-vbox.js\ src/core/gui/tags/afx-hbox.js\ - src/core/gui/tags/afx-list-view.js + src/core/gui/tags/afx-list-view.js\ + src/core/gui/tags/afx-tree-view.js \ + src/core/gui/tags/afx-grid-view.js antos_themes = src/core/gui/themes/antos/font-awesome.css\ src/core/gui/themes/antos/ubuntu-regular.css\ @@ -28,19 +32,23 @@ antos_themes = src/core/gui/themes/antos/font-awesome.css\ src/core/gui/themes/antos/afx-menu.css\ src/core/gui/themes/antos/afx-sys-panel.css\ src/core/gui/themes/antos/afx-dock.css\ - src/core/gui/themes/antos/afx-app-window.css + src/core/gui/themes/antos/afx-list-view.css\ + src/core/gui/themes/antos/afx-tree-view.css\ + src/core/gui/themes/antos/afx-grid-view.css\ + src/core/gui/themes/antos/afx-app-window.css -packages = NotePad -main: build_coffee build_tag build_theme schemes libs packages_builds +packages = NotePad Terminal ActivityMonitor + +main: clean build_coffee build_tag build_theme schemes libs build_packages - cp src/index.html $(BUILDDIR)/ #%.js: %.coffee # coffee --compile $< build_coffee: - - echo "$(BLUE)=======Building coffee files=======$(NC)" + @echo "$(BLUE)=======Building coffee files=======$(NC)" - mkdir $(BUILDDIR)/scripts - rm $(BUILDDIR)/scripts/antos.js for f in $(coffees); do (cat "$${f}"; echo) >> $(BUILDDIR)/scripts/antos.coffee; done @@ -49,36 +57,37 @@ build_coffee: libs: - - echo "$(BLUE)=======Copy lib files=======$(NC) - - cp -rf src/libs/* $(BUILDDIR)/scripts + @echo "$(BLUE)=======Copy lib files=======$(NC)" + cp -rf src/libs/* $(BUILDDIR)/scripts/ schemes: - - echo "$(BLUE)=======Copy schemes files======= $(NC)" + @echo "$(BLUE)=======Copy schemes files======= $(NC)" - mkdir -p $(BUILDDIR)/resources/schemes - - cp src/core/gui/schemes/* $(BUILDDIR)/resources/schemes - + cp src/core/gui/schemes/* $(BUILDDIR)/resources/schemes/ + build_tag: - - echo "=======$(BLUE)Building tag files=======$(NC)" + @echo "=======$(BLUE)Building tag files=======$(NC)" -mkdir $(BUILDDIR)/resources -rm $(BUILDDIR)/resources/antos_tags.js - - for f in $(tags); do (cat "$${f}"; echo) >> $(BUILDDIR)/resources/antos_tags.js; done + for f in $(tags); do (cat "$${f}"; echo) >> $(BUILDDIR)/resources/antos_tags.js; done build_theme: antos_themes_build antos_themes_build: - - echo "=======$(BLUE)Building themes name: antos=======$(NC)" + @echo "=======$(BLUE)Building themes name: antos=======$(NC)" + -rm -rf $(BUILDDIR)/resources/themes/antos/* -mkdir -p $(BUILDDIR)/resources/themes/antos - - for f in $(antos_themes); do (cat "$${f}"; echo) >> $(BUILDDIR)/resources/themes/antos/antos.css; done + for f in $(antos_themes); do (cat "$${f}"; echo) >> $(BUILDDIR)/resources/themes/antos/antos.css; done -mkdir -p $(BUILDDIR)/resources/themes/antos/fonts - - cp -rf src/core/gui/themes/antos/fonts/* $(BUILDDIR)/resources/themes/antos/fonts - - cp src/core/gui/themes/antos/wallpaper.jpg $(BUILDDIR)/resources/themes/antos/ + cp -rf src/core/gui/themes/antos/fonts/* $(BUILDDIR)/resources/themes/antos/fonts + cp src/core/gui/themes/antos/wallpaper.jpg $(BUILDDIR)/resources/themes/antos/ -packages_builds: +build_packages: - mkdir $(BUILDDIR)/packages - - for d in $(packages); do (cd src/packages/$$d; make);done - - for d in $(packages); do ( test -d $(BUILDDIR)/packages/$$d || mkdir -p $(BUILDDIR)/packages/$$d && cp -rf src/packages/$$d/build/* $(BUILDDIR)/packages/$$d/);done - - for d in $(packages); do ( test -d src/packages/$$d/build && rm -r src/packages/$$d/build ); done + for d in $(packages); do (cd src/packages/$$d; make);done + for d in $(packages); do ( test -d $(BUILDDIR)/packages/$$d || mkdir -p $(BUILDDIR)/packages/$$d && cp -rf src/packages/$$d/build/* $(BUILDDIR)/packages/$$d/);done + for d in $(packages); do ( test -d src/packages/$$d/build && rm -r src/packages/$$d/build ); done clean: rm -rf $(BUILDDIR)/* \ No newline at end of file diff --git a/src/antos.coffee b/src/antos.coffee index fa0632f..3642a8d 100644 --- a/src/antos.coffee +++ b/src/antos.coffee @@ -1,6 +1,7 @@ _GUI = self.OS.GUI _API = self.OS.API _APP = self.OS.APP +_PM = self.OS.PM this.onload = () -> console.log "Booting the os" self.OS.boot() \ No newline at end of file diff --git a/src/core/apis/api.coffee b/src/core/api.coffee similarity index 89% rename from src/core/apis/api.coffee rename to src/core/api.coffee index 2229a97..840a682 100644 --- a/src/core/apis/api.coffee +++ b/src/core/api.coffee @@ -13,13 +13,12 @@ self.OS.API = _API.request 'config', (result) -> console.log result - get:(p,c)=> + get:(p,c,f)-> $.get p .done (data) -> c(data) .fail -> - alert "cannot get data" - c(null) + f() resource: (resource,callback) -> path = "resources/#{resource}" _API.get path,callback diff --git a/src/core/gui/BaseApplication.coffee b/src/core/gui/BaseApplication.coffee index a754590..f96e9c5 100644 --- a/src/core/gui/BaseApplication.coffee +++ b/src/core/gui/BaseApplication.coffee @@ -1,21 +1,88 @@ +self = this +_PM = self.OS.PM +_APP = self.OS.APP class BaseApplication constructor: (@name) -> @observable = riot.observable() + @pid = 0 + @_api = self.OS.API init: -> - #first load the scheme + me = @ + # first register some base event to the app + @on "exit", ()-> me.quit() + @on "focus", () -> + me.sysdock.set "selectedApp", me + me.appmenu.pid = me.pid + me.appmenu.set "items", (me.baseMenu() || []) + me.appmenu.set "onmenuselect", (d)-> + me.trigger("menuselect",d) + @on "hide", ()-> + me.sysdock.set "selectedApp", null + me.appmenu.set "items",[] + @on "menuselect", (item) -> + switch item.data.dataid + when "#{me.name}-about" then alert "About " + me.pid + me.name + when "#{me.name}-exit" then me.trigger "exit" + #now load the scheme path = "packages/#{@name}/scheme.html" - @scheme = _GUI.loadScheme path,@observable - #if(!scheme) bug repporter go here - @event() - event: -> - #implement by subclasses + _GUI.loadScheme path ,this + on: (e,f) -> @observable.on e,f + trigger:(e,d) -> @observable.trigger e,d + + show: () -> + @observable.trigger "focus" + + blur: () -> + @.appmenu.set "items",[] if @.appmenu and @.pid == @.appmenu.pid + @observable.trigger "blur" + + hide: () -> + @observable.trigger "hide" + + toggle:() -> + @observable.trigger "toggle" + + quit: () -> + evt = new _GUI.BaseEvent("exit") + @exit(evt) + if not evt.prevent + @.appmenu.set "items",[] if @.pid == @.appmenu.pid + _PM.kill(@) + ($ @scheme).remove() + + find: (id) -> ($ "[data-id='#{id}']",@scheme)[0] + + baseMenu:-> + menu = + [{ + text:_APP[@name].meta.name, + child:[ + {text:"About", dataid:"#{@name}-about"}, + {text:"Exit", dataid:"#{@name}-exit"} + ] + }] + menu = menu.concat @menu() || [] + menu + + main: -> + #main program + # implement by subclasses + menu: -> + # implement by subclasses + # to add menu to application + [] open:-> #implement by subclasses data:-> #implement by subclasses + # to return app data update:-> #implement by subclasses - -this.OS.GUI.BaseApplication = BaseApplication \ No newline at end of file + exit: (e) -> + #implement by subclasses + # to handle the exit event + # use e.preventDefault() to + # discard the quit command +this.OS.GUI.BaseApplication = BaseApplication \ No newline at end of file diff --git a/src/core/gui/BaseEvent.coffee b/src/core/gui/BaseEvent.coffee new file mode 100644 index 0000000..e1ee6db --- /dev/null +++ b/src/core/gui/BaseEvent.coffee @@ -0,0 +1,7 @@ +class BaseEvent + constructor: (@name) -> + @prevent = false + preventDefault:()-> + @prevent = true + +this.OS.GUI.BaseEvent = BaseEvent \ No newline at end of file diff --git a/src/core/gui/gui.coffee b/src/core/gui/gui.coffee index 4e4bb9e..f8ff92f 100644 --- a/src/core/gui/gui.coffee +++ b/src/core/gui/gui.coffee @@ -1,82 +1,109 @@ self.OS.GUI = - tagPath: "resources/tags/" init: () -> query = path: 'VFS/get' data: "#{_GUI.tagPath}/tags.json" self.OS.API.request query, ()-> - loadScheme: (path, obs) -> - _API.get path, (x) -> + loadScheme: (path,app) -> + _API.get path, + (x) -> return null unless x - scheme = $.parseHTML x + scheme = $.parseHTML x ($ "#desktop").append scheme - riot.mount ($ scheme), {observable:obs} - scheme + riot.mount ($ scheme), {observable:app.observable} + app.scheme = scheme[0] + app.show() + app.main() + , (f) -> + alert "cannot load scheme" + loadTheme: (name) -> path = "resources/themes/#{name}/#{name}.css" $ "head link#ostheme" .attr "href", path + launch: (app) -> if not _APP[app] # first load it - path = "packages/#{app}/main.js" - $.getScript path + path = "packages/#{app}/" + $.getScript path + "main.js" .done (e,s) -> + #load css file + $.get "#{path}main.css", () -> + $ '', {rel:'stylesheet', type:'text/css', 'href':"#{path}main.css"} + .appendTo 'head' #launch - _app = new _APP[app] - _app.init() - console.log "Fist time loading "+app + if _APP[app] + # load app meta data + _API.get "#{path}package.json", + (data) -> + _APP[app].meta = data + _PM.createProcess app, _APP[app] + console.log "Fist time loading "+app + ,(e,s)-> + alert "cannot read application, meta-data" .fail (e,s) -> #BUG report here console.log "bug report" else - # now launch it - _app = new _APP[app] - _app.init() + # now launch it + if _APP[app] + _PM.createProcess app, _APP[app] + dock: (app,meta) -> + # dock an application to a dock + # create a data object + data = + icon:null + iconclass:meta.iconclass||"" + app:app + onbtclick:() -> + app.toggle() + data.icon = "packages/#{meta.app}/#{meta.icon}" if meta.icon + data.iconclass = "fa fa-cogs" if (not meta.icon) and (not meta.iconclass) + dock = $ "#sysdock" + dock.get(0).newapp data + app.sysdock = dock.get(0) + app.appmenu = ($ "[data-id = 'appmenu']","#syspanel")[0] + app.init() + #app.show() -- notwork, sice the scheme is not loaded yet + + undock: (app) -> + ($ "#sysdock").get(0).removeapp app + initDM: -> _API.resource "schemes/dm.html", (x) -> return null unless x scheme = $.parseHTML x ($ "#wrapper").append scheme - #riot.mount $ "#button", $ "#wrapper" + ($ "#desktop").on "click", (e)-> + return if e.target isnt ($ "#desktop").get(0) + ($ "#sysdock").get(0).set "selectedApp",null + osmenu = {child:[ - {text:"",icon:"fa fa-circle", child:[ + {text:"",iconclass:"fa fa-eercast", child:[ {text:"About"}, - {text:"System Preferences", icon:"fa fa-commenting"}, - {text:"Applications",child:[{text:"Terminal"},{text:"Text edit"}]}, + {text:"System Preferences", iconclass:"fa fa-commenting"}, + {text:"Applications",child:[ + {text:"Terminal",type:"app"}, + {text:"NotePad",type:"app", icon:"packages/NotePad/icon.png"}, + {text:"ActivityMonitor",type:"app"} + ]}, {text:"Logout"} ]} - ], - onmenuselect: (item)-> - console.log item - _GUI.launch "NotePad" + ],onmenuselect: (item)-> + switch item.data.type + when "app" then _GUI.launch item.data.text } - appmenu = {child:[ - {text:"Text edit", child:[ - {text:"About"}, - {text:"Preferences"}, - {text:"Exit"} - ]}, - {text:"File",child:[ - {text:"Open"},{text:"Save"}]} - ], - onmenuselect: (item)-> console.log item} + appmenu = {child:[]} systray = {child:[ {text:"Sun 22:57 6 August 2017"}, - {text:"",icon:"fa fa-search"}, - {text:"",icon:"fa fa-commenting"} + {text:"",iconclass:"fa fa-search"}, + {text:"",iconclass:"fa fa-commenting"} - ], - onmenuselect: (item)-> - console.log item + ],onmenuselect: (item)-> + console.log item } riot.mount ($ "#syspanel", $ "#wrapper"),{osmenu:osmenu,appmenu:appmenu,systray:systray} - - docks = {items:[ - {icon:"fa fa-cogs"}, - {icon:"fa fa-life-ring"}, - {icon:"fa fa-cubes"} - ]} - riot.mount ($ "#sysdock", $ "#wrapper"), docks \ No newline at end of file + riot.mount ($ "#sysdock", $ "#wrapper"), {items:[]} \ No newline at end of file diff --git a/src/core/gui/tags/afx-app-window.js b/src/core/gui/tags/afx-app-window.js index 58efa57..6651d39 100644 --- a/src/core/gui/tags/afx-app-window.js +++ b/src/core/gui/tags/afx-app-window.js @@ -1,8 +1,8 @@ - -
-
    -
  • -
  • + +
    +
      +
    • +
    • { apptitle }
    @@ -25,6 +25,32 @@ var height = opts.height || 300 this.root.observable = opts.observable || riot.observable() if(!window._zidex) window._zidex = 10 + this.shown = false + self.root.set = function(k,v) + { + if(k == "*") + for(var i in v) + self[i] = v[i] + else + self[k] = v + self.update() + } + self.root.get = function(k) + { + return self[k] + } + self.root.update = function() + { + self.update() + } + minimize() + { + this.root.observable.trigger("hide") + } + close() + { + this.root.observable.trigger("exit") + } this.on('mount', function() { var left,top left = 20 + Math.floor(Math.random() * width) @@ -37,8 +63,13 @@ .css("height", height + "px") .css("z-index",window._zidex++) $(self.refs.window).on("mousedown", function(e){ - window._zidex++ - $(self.refs.window).css("z-index",window._zidex) + if(self.shown == false) + self.root.observable.trigger("focus") + }) + $(self.refs.window).click(function(e) { + //e.stopPropagation() + //e.windowactive = true + //self.root.observable.trigger("windowselect") }) enable_dragging() if(isResize) @@ -49,6 +80,34 @@ $(self.refs.content).children().each(function(e){ this.observable = self.root.observable }) + + self.root.observable.on("focus",function(){ + window._zidex++ + $(self.refs.window) + .show() + .css("z-index",window._zidex) + .removeClass("unactive") + + self.shown = true + }) + self.root.observable.on("blur", function(){ + self.shown = false + $(self.refs.window) + .addClass("unactive") + // add css to blur app :) + }) + self.root.observable.on("hide", function() + { + $(self.refs.window).hide() + self.shown = false + }) + + self.root.observable.on("toggle", function(){ + if(self.shown) + self.root.observable.trigger("hide") + else + self.root.observable.trigger("focus") + }) }) var enable_dragging = function() { @@ -112,7 +171,8 @@ .css("width", w +"px") .css("height",h + "px") isMaxi = false - self.root.observable.trigger('resize',w,h) + self.root.observable.trigger('resize', + {id:$(self.root).attr("data-id"),w:w,h:h}) }) $(window).on("mouseup", function(e){ $(window).unbind("mousemove", null) @@ -137,7 +197,8 @@ .css("width", w + "px") .css("height", h + "px") .css("top","0").css("left","0") - self.root.observable.trigger('resize',w,h) + self.root.observable.trigger('resize', + {id:$(self.root).attr("data-id"),w:w,h:h}) isMaxi = true } else @@ -147,7 +208,8 @@ .css("width",history.width) .css("height",history.height) .css("top",history.top).css("left",history.left) - self.root.observable.trigger('resize',history.width, history.height) + self.root.observable.trigger('resize', + {id:$(self.root).attr("data-id"),w:history.width,h:history.height} ) } } diff --git a/src/core/gui/tags/afx-apps-dock.js b/src/core/gui/tags/afx-apps-dock.js index 59b5b10..a5d8989 100644 --- a/src/core/gui/tags/afx-apps-dock.js +++ b/src/core/gui/tags/afx-apps-dock.js @@ -1,7 +1,60 @@ - + \ No newline at end of file diff --git a/src/core/gui/tags/afx-button.js b/src/core/gui/tags/afx-button.js index 25fb8a1..398a4ee 100644 --- a/src/core/gui/tags/afx-button.js +++ b/src/core/gui/tags/afx-button.js @@ -1,20 +1,41 @@ diff --git a/src/core/gui/tags/afx-grid-view.js b/src/core/gui/tags/afx-grid-view.js new file mode 100644 index 0000000..c6edf8a --- /dev/null +++ b/src/core/gui/tags/afx-grid-view.js @@ -0,0 +1,162 @@ + + +
    +
    + +
    +
    + +
    + + +
    + + + {child.value} +
    + +
    \ No newline at end of file diff --git a/src/core/gui/tags/afx-hbox.js b/src/core/gui/tags/afx-hbox.js index 7fcd61a..956897a 100644 --- a/src/core/gui/tags/afx-hbox.js +++ b/src/core/gui/tags/afx-hbox.js @@ -4,14 +4,30 @@
    \ No newline at end of file diff --git a/src/core/gui/tags/afx-menu.js b/src/core/gui/tags/afx-menu.js index d54f56f..b552af2 100644 --- a/src/core/gui/tags/afx-menu.js +++ b/src/core/gui/tags/afx-menu.js @@ -1,17 +1,42 @@ + \ No newline at end of file diff --git a/src/core/gui/tags/afx-vbox.js b/src/core/gui/tags/afx-vbox.js index 890fd5c..e52b005 100644 --- a/src/core/gui/tags/afx-vbox.js +++ b/src/core/gui/tags/afx-vbox.js @@ -4,6 +4,23 @@
+ + diff --git a/src/packages/ActivityMonitor/Makefile b/src/packages/ActivityMonitor/Makefile new file mode 100644 index 0000000..5bd288b --- /dev/null +++ b/src/packages/ActivityMonitor/Makefile @@ -0,0 +1,33 @@ +coffee_files = main.coffee + +jsfiles = + +cssfiles = main.css + +copyfiles = scheme.html package.json + + +BLUE=\033[1;34m +NC=\033[0m + +main: title clean js css copy + +title: + @echo "$(BLUE)======= Package ActivityMonitor =======$(NC)" + +coffee: + - mkdir build + for f in $(coffee_files); do (coffee -cs < $$f >build/"$$f.js");done + for f in build/*.coffee.js; do (cat "$${f}"; echo) >> build/main.js; done + - rm build/*.coffee.js + +js: coffee + for f in $(jsfiles); do (cat "$${f}"; echo) >> build/main.js; done + +css: + for f in $(cssfiles); do (cat "$${f}"; echo) >> build/main.css; done + +copy: + cp -rf $(copyfiles) build/ +clean: + - rm -rf build/* \ No newline at end of file diff --git a/src/packages/ActivityMonitor/main.coffee b/src/packages/ActivityMonitor/main.coffee new file mode 100644 index 0000000..de05f2e --- /dev/null +++ b/src/packages/ActivityMonitor/main.coffee @@ -0,0 +1,56 @@ +_PM = this.OS.PM +_APP = this.OS.APP +class ActivityMonitor extends this.OS.GUI.BaseApplication + constructor: () -> + super "ActivityMonitor" + main: () -> + me = @ + @scheme.set "apptitle", "Activity Monitor" + @grid = @find "mygrid" + @on "btclick", (e)-> + return unless e.id == "btkill" + item = me.grid.get "selected" + return unless item + app = _PM.appByPid item[0].value + app.quit() if app + + header = [{width:50,value:"Pid"},{value:"Name"},{width:100,value:"Alive (ms)"}] + @gdata = + processes:{} + alive:[] + @grid.set "header",header + @monitor() + + monitor: () -> + me = @ + #get all current running process + me.gdata.alive = [] + now = (new Date).getTime() + $.each _PM.processes, (i,d)-> + $.each d , (j,a)-> + if me.gdata.processes[a.pid] #update it + me.gdata.processes[a.pid][2].value = now - a.birth + else #add it + me.gdata.processes[a.pid] = [ + {value:a.pid}, + {icon:_APP[a.name].meta.icon,iconclass:_APP[a.name].meta.iconclass,value:a.name}, + {value: now - a.birth} + ] + me.gdata.alive.push a.pid + @refreshGrid() + @timer = setTimeout (()-> me.monitor()),500#one second + + refreshGrid: ()-> + activeList = [] + me = @ + $.each @gdata.processes, (i,e) -> + if ($.inArray (Number i),me.gdata.alive) >= 0 + activeList.push e + else + me.gdata.processes[i] = undefined + @grid.set "rows",activeList + exit: (e) -> + clearTimeout @timer if @timer + +ActivityMonitor.singleton = true +this.OS.register "ActivityMonitor",ActivityMonitor \ No newline at end of file diff --git a/src/packages/ActivityMonitor/main.css b/src/packages/ActivityMonitor/main.css new file mode 100644 index 0000000..308258e --- /dev/null +++ b/src/packages/ActivityMonitor/main.css @@ -0,0 +1,8 @@ +afx-app-window[data-id="am-window"] afx-button{ + margin: 3px; +} + +afx-app-window[data-id="am-window"] afx-grid-view{ + padding-left:10px; + padding-right: 10px; +} \ No newline at end of file diff --git a/src/packages/ActivityMonitor/package.json b/src/packages/ActivityMonitor/package.json new file mode 100644 index 0000000..4e7e188 --- /dev/null +++ b/src/packages/ActivityMonitor/package.json @@ -0,0 +1,12 @@ +{ + "app":"ActivityMonitor", + "name":"Activity monitor", + "description":"Processes monitor and manager", + "author":{ + "name": "Xuan Sang LE", + "email": "xsang.le@gmail.com" + }, + "category":"System", + "iconclass":"fa fa-heartbeat", + "mimes":["*"] +} \ No newline at end of file diff --git a/src/packages/ActivityMonitor/scheme.html b/src/packages/ActivityMonitor/scheme.html new file mode 100644 index 0000000..19f9a0f --- /dev/null +++ b/src/packages/ActivityMonitor/scheme.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/packages/NotePad/Makefile b/src/packages/NotePad/Makefile index 71dae6b..c190611 100644 --- a/src/packages/NotePad/Makefile +++ b/src/packages/NotePad/Makefile @@ -7,27 +7,27 @@ cssfiles = main.css copyfiles = scheme.html package.json -BLUE=\033[0;34m +BLUE=\033[1;34m NC=\033[0m main: title clean js css copy title: - - echo "$(BLUE)======= Package NotePad =======$(NC)" + @echo "$(BLUE)======= Package NotePad =======$(NC)" coffee: - mkdir build - - for f in $(coffee_files); do (coffee -cs < $$f >build/"$$f.js");done - - for f in build/*.coffee.js; do (cat "$${f}"; echo) >> build/main.js; done + for f in $(coffee_files); do (coffee -cs < $$f >build/"$$f.js");done + for f in build/*.coffee.js; do (cat "$${f}"; echo) >> build/main.js; done - rm build/*.coffee.js js: coffee - - for f in $(jsfiles); do (cat "$${f}"; echo) >> build/main.js; done + for f in $(jsfiles); do (cat "$${f}"; echo) >> build/main.js; done css: - - for f in $(cssfiles); do (cat "$${f}"; echo) >> build/main.css; done + for f in $(cssfiles); do (cat "$${f}"; echo) >> build/main.css; done copy: - - cp -rf $(copyfiles) build/ + cp -rf $(copyfiles) build/ clean: - rm -rf build/* \ No newline at end of file diff --git a/src/packages/NotePad/main.coffee b/src/packages/NotePad/main.coffee index 9d294d6..f6c235d 100644 --- a/src/packages/NotePad/main.coffee +++ b/src/packages/NotePad/main.coffee @@ -1,10 +1,53 @@ class NotePad extends this.OS.GUI.BaseApplication constructor: () -> super "NotePad" - event: () -> - console.log @scheme - @on "btclick", (e)-> - alert "Happy pola" - @on "resize", (w,h)-> - console.log "resize" + main: () -> + me = @ + @scheme.set "apptitle", "NotePad" + + div = @find "datarea" + ace.require "ace/ext/language_tools" + @.editor = ace.edit div + @.editor.setTheme "ace/theme/monokai" + @.editor.getSession().setMode 'ace/mode/text' + @.editor.setOptions { + enableBasicAutocompletion: true, + enableSnippets: true, + enableLiveAutocompletion: true, + fontSize: "10pt" + } + @.editor.completers.push {getCompletions:(editor, session, pos, prefix, callback)->} + @.editor.getSession().setUseWrapMode true + + list = @find "modelist" + @modes = ace.require "ace/ext/modelist" + ldata = [] + ldata.push {text:m.name, mode:m.mode} for m in @modes.modes + list.set "items",ldata + list.set "onlistselect", (e)-> + me.editor.session.setMode e.data.mode + + stat = @find "editorstat" + #status + stup = (e)-> + c = me.editor.session.selection.getCursor() + l = me.editor.session.getLength() + $(stat).html "Row #{c.row}, col #{c.column}, lines: #{l}" + stup(0) + @.editor.getSession().selection.on "changeCursor", (e)-> + stup(e) + + @on "resize", ()-> me.editor.resize() + @on "focus", ()->me.editor.focus() + + menu: ()-> + menu = [{ + text:"File", + child:[ + {text:"Open", dataid:"#{@name}-Open"}, + {text:"Close", dataid:"#{@name}-Close"} + ] + }] + menu +NotePad.singleton = false this.OS.register "NotePad",NotePad \ No newline at end of file diff --git a/src/packages/NotePad/main.css b/src/packages/NotePad/main.css index 59380ce..72604bf 100644 --- a/src/packages/NotePad/main.css +++ b/src/packages/NotePad/main.css @@ -1,3 +1,9 @@ -fut{ - background-color: black + +afx-app-window[data-id="notepad"] afx-list-view[data-id="modelist"]{ + margin:2px; +} + +afx-app-window[data-id="notepad"] span[data-id="editorstat"]{ + padding:5px; + display: inline-block; } \ No newline at end of file diff --git a/src/packages/NotePad/package.json b/src/packages/NotePad/package.json index f8d791e..7223d3b 100644 --- a/src/packages/NotePad/package.json +++ b/src/packages/NotePad/package.json @@ -7,6 +7,6 @@ "email": "xsang.le@gmail.com" }, "category":"System", - "icon":"", + "iconclass":"fa fa-pencil-square-o", "mimes":["*"] } \ No newline at end of file diff --git a/src/packages/NotePad/scheme.html b/src/packages/NotePad/scheme.html index 1446de5..7256b81 100644 --- a/src/packages/NotePad/scheme.html +++ b/src/packages/NotePad/scheme.html @@ -1,16 +1,24 @@ - - + + - - + +
+ +
+ + +
+
\ No newline at end of file diff --git a/src/packages/Terminal/Makefile b/src/packages/Terminal/Makefile new file mode 100644 index 0000000..197cf3d --- /dev/null +++ b/src/packages/Terminal/Makefile @@ -0,0 +1,33 @@ +coffee_files = main.coffee + +jsfiles = + +cssfiles = main.css + +copyfiles = scheme.html package.json + + +BLUE=\033[1;34m +NC=\033[0m + +main: title clean js css copy + +title: + @echo "$(BLUE)======= Package Terminal =======$(NC)" + +coffee: + - mkdir build + for f in $(coffee_files); do (coffee -cs < $$f >build/"$$f.js");done + for f in build/*.coffee.js; do (cat "$${f}"; echo) >> build/main.js; done + - rm build/*.coffee.js + +js: coffee + for f in $(jsfiles); do (cat "$${f}"; echo) >> build/main.js; done + +css: + for f in $(cssfiles); do (cat "$${f}"; echo) >> build/main.css; done + +copy: + cp -rf $(copyfiles) build/ +clean: + - rm -rf build/* \ No newline at end of file diff --git a/src/packages/Terminal/main.coffee b/src/packages/Terminal/main.coffee new file mode 100644 index 0000000..a4d5b38 --- /dev/null +++ b/src/packages/Terminal/main.coffee @@ -0,0 +1,80 @@ +class Terminal extends this.OS.GUI.BaseApplication + constructor: () -> + super "Terminal" + main: () -> + self = @ + @on "btclick", (e)-> + alert "#{self.name}: Happy pola" + @on "resize", (w,h)-> + console.log "#{self.name}: resize" + #@on "listselect", (i)-> + # console.log self.name, i + @on "treeselect", (i) -> + console.log self.name,i + @on "focus", ()-> + console.log self.name, "is focused" + tree = @find "mytree" + + @scheme.set "apptitle", "Terminal" + tdata = { + name: 'My Tree', + nodes: [ + { name: 'hello', icon:'packages/NotePad/icon.png'}, + { name: 'wat' }, + { + name: 'child folder', + nodes: [ + { + name: 'child folder', + nodes: [ + { name: 'hello' }, + { name: 'wat' } + ] + }, + { name: 'hello' }, + { name: 'wat' }, + { + name: 'child folder', + nodes: [ + { name: 'hello' }, + { name: 'wat' } + ] + } + ] + } + ] + } + tree.set "*",tdata + + list = @find "mylist" + ldata = [ + {text:"some thing with avery long text"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"}, + {text:"some thing"} + ] + list.set "items",ldata + list.set "onlistselect", (e)-> + console.log e + +Terminal.singleton = false +this.OS.register "Terminal",Terminal \ No newline at end of file diff --git a/src/packages/Terminal/main.css b/src/packages/Terminal/main.css new file mode 100644 index 0000000..e69de29 diff --git a/src/packages/Terminal/package.json b/src/packages/Terminal/package.json new file mode 100644 index 0000000..746ae1b --- /dev/null +++ b/src/packages/Terminal/package.json @@ -0,0 +1,12 @@ +{ + "app":"Terminal", + "name":"Unix terminal like", + "description":"Access Unix terminal from web", + "author":{ + "name": "Xuan Sang LE", + "email": "xsang.le@gmail.com" + }, + "category":"System", + "iconclass":"fa fa-terminal", + "mimes":["*"] +} \ No newline at end of file diff --git a/src/core/gui/schemes/test.html b/src/packages/Terminal/scheme.html similarity index 55% rename from src/core/gui/schemes/test.html rename to src/packages/Terminal/scheme.html index 1446de5..2d526a1 100644 --- a/src/core/gui/schemes/test.html +++ b/src/packages/Terminal/scheme.html @@ -1,16 +1,14 @@ - - - + - + -
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore + +
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
-
Test
\ No newline at end of file