self = this _PM = self.OS.PM _APP = self.OS.APP class BaseApplication constructor: (@name) -> @observable = riot.observable() @pid = 0 @_api = self.OS.API init: -> 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" _GUI.loadScheme path , @ 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 exit: (e) -> #implement by subclasses # to handle the exit event # use e.preventDefault() to # discard the quit command BaseApplication.type = 1 this.OS.GUI.BaseApplication = BaseApplication