diff --git a/Makefile b/Makefile index 2bafa51..7ce1573 100644 --- a/Makefile +++ b/Makefile @@ -35,6 +35,7 @@ coffees= src/core/core.coffee \ src/core/tags/SwitchTag.coffee \ src/core/tags/NSpinnerTag.coffee \ src/core/tags/MenuTag.coffee \ + src/core/tags/GridView.coffee \ src/antos.coffee diff --git a/src/core/Announcerment.coffee b/src/core/Announcerment.coffee index cca4d3a..82ba3aa 100644 --- a/src/core/Announcerment.coffee +++ b/src/core/Announcerment.coffee @@ -18,29 +18,29 @@ class Announcer constructor: () -> @observable = {} + @enable = true + disable: () -> + @off("*") + @enable = false + on: (evtName, callback) -> + return unless @enable @observable[evtName] = { one: new Set(), many: new Set() } unless @observable[evtName] - @observable[evtName].many.push callback + @observable[evtName].many.add callback one: (evtName, callback) -> + return unless @enable @observable[evtName] = { one: new Set(), many: new Set() } unless @observable[evtName] - @observable[evtName].one.push callback + @observable[evtName].one.add callback off: (evtName, callback) -> me = @ fn = (evt, cb) -> return unless me.observable[evt] if cb - for f, i in me.observable[evt].one - if f == cb - me.observable[evt].one.splice i, 1 - break - - for f, i in me.observable[evt].many - if f == cb - me.observable[evt].many.splice i, 1 - break + me.observable[evt].one.delete(cb) + me.observable[evt].many.delete(cb) else delete me.observable[evt] if me.observable[evt] if evtName is "*" then fn k, callback for k, v of me.observable else fn evtName, callback @@ -51,10 +51,10 @@ class Announcer names = [name, "*"] for evt in names continue unless me.observable[evt] - for f, i in me.observable[evt].one + me.observable[evt].one.forEach (f) -> f data - me.observable[evt].one = new Set() - for f, i in me.observable[evt].many + me.observable[evt].one = new Set() + me.observable[evt].many.forEach (f) -> f data if evtName is "*" @@ -68,7 +68,7 @@ Ant.OS.announcer = quota: 0 listeners: {} on: (e, f, a) -> - Ant.OS.announcer.listeners[a.pid] = new Set() unless Ant.OS.announcer.listeners[a.pid] + Ant.OS.announcer.listeners[a.pid] = [] unless Ant.OS.announcer.listeners[a.pid] Ant.OS.announcer.listeners[a.pid].push { e: e, f: f } Ant.OS.announcer.observable.on e, f trigger: (e, d) -> Ant.OS.announcer.observable.trigger e, d diff --git a/src/core/BaseModel.coffee b/src/core/BaseModel.coffee index fb258a4..5a8428f 100644 --- a/src/core/BaseModel.coffee +++ b/src/core/BaseModel.coffee @@ -25,7 +25,7 @@ class BaseModel @systemsetting = Ant.OS.setting me = @ @on "exit", () -> me.quit() - @host = "#desktop" + @host = @_gui.workspace @dialog = undefined render: (p) -> Ant.OS.GUI.loadScheme p, @, @host diff --git a/src/core/tags/ButtonTag.coffee b/src/core/tags/ButtonTag.coffee index 01447bc..16d9712 100644 --- a/src/core/tags/ButtonTag.coffee +++ b/src/core/tags/ButtonTag.coffee @@ -11,23 +11,23 @@ class ButtonTag extends Ant.OS.GUI.BaseTag @setopt "onbtclick", () -> - on_color_changed: (v) -> + __color__: (v) -> console.log @refs @refs.label.set "color", v - on_icon_changed: (v) -> + __icon__: (v) -> @refs.label.set "icon", v - on_iconclass_changed: (v) -> + __iconclass__: (v) -> @refs.label.set "iconclass", v - on_text_changed: (v) -> + __text__: (v) -> @refs.label.set "text", v - on_enable_changed: (v) -> + __enable__: (v) -> $(@refs.button).prop "disabled", !(@get "enable") - on_selected_changed: (v) -> + __selected__: (v) -> $(@button).removeClass() $(@button).addClass "selected" if v diff --git a/src/core/tags/GridView.coffee b/src/core/tags/GridView.coffee new file mode 100644 index 0000000..847bd38 --- /dev/null +++ b/src/core/tags/GridView.coffee @@ -0,0 +1,110 @@ +class GridCellPrototype extends Ant.OS.GUI.BaseTag + constructor: (r, o) -> + super r, o + @setopt "class", "afxgridcell" + @setopt "data", {} + + + __class__: (v) -> + $(@root).removeClass().addClass @get("class") + +class SimpleGridCell extends GridCellPrototype + constructor: (r, o) -> + super r, o + @setopt "header", false + + __header__: (v) -> + + + __data__: (d) -> + @refs.cell.set k, v for k, v of d + + mount: () -> + $(@root).css "display", "block" + layout: () -> + [{ + el: "afx-label", ref: "cell" + }] + +class GridViewTag extends Ant.OS.GUI.BaseTag + constructor: (r, o) -> + super r, o + @setopt "header", [] + @setopt "headeritem", "afx-grid-cell" + @setopt "cellitem", "afx-grid-cell" + @setopt "cellclass", "afxgridcell" + @setopt "rows", [] + + __header__: (v) -> + return $(@refs.header).hide() if not v or v.length is 0 + $(@refs.header).empty() + for item in v + el = $("<#{@get("headeritem")}>").appendTo @refs.header + el[0].uify undefined + el[0].set "data", item + item.domel = el[0] + @calibrate() + + __rows__: (rows) -> + $(@refs.grid).empty() + for row in rows + for cell in row + el = $("<#{@get("cellitem")}>").appendTo @refs.grid + el[0].uify undefined + el[0].set "data", cell + cell.domel = el[0] + + has_header: () -> + h = @get("header") + return h and h.length > 0 + calibrate: () -> + @calibrate_header() + if @has_header() + $(@refs.container).css "height", $(@root).height() - $(@refs.header).height() + "px" + else + $(@refs.container).css "height", $(@root).height() + "px" + + calibrate_header: () -> + header = @get "header" + return if not header or header.length is 0 + colssize = [] + ocw = 0 + nauto = 0 + totalw = $(@root).parent().width() + $.each header, (i, item) -> + if item.width + colssize.push item.width + ocw += item.width + else + colssize.push -1 + nauto++ + if nauto > 0 + cellw = parseInt((totalw - ocw) / nauto) + $.each colssize, (i, e) -> + return unless e is -1 + colssize[i] = cellw + template = "" + template += "#{v}px " for v in colssize + $(@refs.grid).css "grid-template-columns", template + $(@refs.header).css "grid-template-columns", template + + mount: () -> + me = @ + $(@refs.grid).css "display", "grid" + $(@refs.header).css "display", "grid" + @observable.on "resize", (e) -> me.calibrate() + $(@refs.container) + .css "width", "100%" + .css "overflow-x", "hidden" + .css "overflow-y", "auto" + + layout: () -> + [ + { el: "div", ref: "header" }, + { el: "div", ref: "container", children: [ + { el: "div", ref: "grid" } + ] } + ] +Ant.OS.GUI.define "afx-grid-view", GridViewTag +Ant.OS.GUI.define "afx-grid-cell", SimpleGridCell +Ant.OS.GUI.define "afx-grid-cell-proto", GridCellPrototype \ No newline at end of file diff --git a/src/core/tags/LabelTag.coffee b/src/core/tags/LabelTag.coffee index 5bbc065..74b1179 100644 --- a/src/core/tags/LabelTag.coffee +++ b/src/core/tags/LabelTag.coffee @@ -10,11 +10,11 @@ class LabelTag extends Ant.OS.GUI.BaseTag mount: () -> - on_color_changed: (v) -> + __color__: (v) -> return unless v $(@refs.container).css "color", v - on_icon_changed: (v) -> + __icon__: (v) -> $(@refs.i).attr "style", "" if v $(@refs.i) @@ -25,7 +25,7 @@ class LabelTag extends Ant.OS.GUI.BaseTag else $(@refs.i).hide() - on_iconclass_changed: (v) -> + __iconclass__: (v) -> $(@refs.iclass).removeClass() if v $(@refs.iclass).addClass v @@ -35,7 +35,7 @@ class LabelTag extends Ant.OS.GUI.BaseTag - on_text_changed: (v) -> + __text__: (v) -> @refs.text.nodeValue = v.__() if v layout: () -> diff --git a/src/core/tags/ListViewTag.coffee b/src/core/tags/ListViewTag.coffee index adfe9ed..4c49b51 100644 --- a/src/core/tags/ListViewTag.coffee +++ b/src/core/tags/ListViewTag.coffee @@ -31,16 +31,16 @@ class SimpleListItemTag extends ListViewItemTag e.item = me.root me.get("onclose")(e) - on_closable_changed: (v) -> + __closable__: (v) -> if v then $(@refs.btcl).show() else $(@refs.btcl).hide() - on_selected_changed: (v) -> + __selected__: (v) -> $(@refs.item).removeClass() return unless v $(@refs.item).addClass "selected" @get("onselect")({ item: @root }) - on_data_changed: (v) -> + __data__: (v) -> return unless v @refs.label.set "class", v.class if v.class @refs.label.set "color", v.color if v.color @@ -81,10 +81,10 @@ class ListViewTag extends Ant.OS.GUI.BaseTag @get "multiselect" - on_buttons_changed: (v) -> + __buttons__: (v) -> return if @get "dropdown" - on_data_changed: (data) -> + __data__: (data) -> $( @refs.mlist).empty() for item in data el = $("<#{@get "itemtag"}>").appendTo @refs.mlist @@ -140,7 +140,7 @@ class ListViewTag extends Ant.OS.GUI.BaseTag return unless e.item $(e.item).remove() - on_dropdown_changed: (v) -> + __dropdown__: (v) -> $(@refs.container).removeAttr "style" $(@refs.mlist).removeAttr "style" $(@refs.container).css "flex", 1 diff --git a/src/core/tags/MenuTag.coffee b/src/core/tags/MenuTag.coffee index 251b90c..86f1ae4 100644 --- a/src/core/tags/MenuTag.coffee +++ b/src/core/tags/MenuTag.coffee @@ -4,15 +4,16 @@ class MenuEntryTag extends Ant.OS.GUI.BaseTag super r, o @setopt "data", {} @setopt "onmenuselect", () -> + @setopt "onchildselect", () -> @setopt "children", undefined @setopt "child", undefined @setopt "parent", undefined - @setopt "rootid", undefined + @setopt "root", undefined - on_data_changed: (data) -> + __data__: (data) -> @set k, v for k, v of data - on_child_changed: (v) -> + __child__: (v) -> @set "children", v has_children: () -> @@ -34,47 +35,47 @@ class SimpleMenuEntryTag extends MenuEntryTag @setopt "shortcut", undefined @setopt "checked", false - on_switch_changed: (v) -> + __switch__: (v) -> if @get("radio") or v $(@refs.switch).show() else $(@refs.switch).hide() - on_radio_changed: (v) -> + __radio__: (v) -> if @get("switch") or v $(@refs.switch).show() else $(@refs.switch).hide() - on_checked_changed: (v) -> + __checked__: (v) -> return unless @get("radio") or @get("switch") @refs.switch.set "swon", v - on_color_changed: (v) -> + __color__: (v) -> return unless v @refs.label.set "color", v - on_icon_changed: (v) -> + __icon__: (v) -> $(@refs.container).removeClass("fix_padding") return unless v @refs.label.set "icon", v $(@refs.container).addClass("fix_padding") - on_iconclass_changed: (v) -> + __iconclass__: (v) -> return unless v @refs.label.set "iconclass", v - on_text_changed: (v) -> + __text__: (v) -> return unless v isnt undefined @refs.label.set "text", v - on_shortcut_changed: (v) -> + __shortcut__: (v) -> $(@refs.shortcut).hide() return unless v $(@refs.shortcut).show() $(@refs.shortcut).val v - on_children_changed: (v) -> + __children__: (v) -> me = @ $(@refs.container).removeClass("afx_submenu") return $(@refs.submenu).hide() unless v and v.length > 0 @@ -83,6 +84,7 @@ class SimpleMenuEntryTag extends MenuEntryTag .show() .attr("style", "") @refs.submenu.set "parent", @ + @refs.submenu.set "root", me.get("root") @refs.submenu.set "items", v if @is_root() $(@refs.container).mouseleave (e) -> @@ -110,7 +112,6 @@ class SimpleMenuEntryTag extends MenuEntryTag e.item = @root evt = { id: @aid(), data: e } e.preventDefault() - children = @get("children") if @is_root() and @has_children() and not @get "context" $(@refs.submenu).show() else @@ -121,9 +122,11 @@ class SimpleMenuEntryTag extends MenuEntryTag p = @get "parent" p.reset_radio() if p @set "checked", !@get "checked" - @get("onmenuselect") evt - @observable.trigger "menuselect", evt + if @get("parent") + @get("parent").get("onchildselect") evt + if @get("root") + @get("root").get("onmenuitemselect") evt layout: () -> [{ @@ -142,17 +145,24 @@ class SimpleMenuEntryTag extends MenuEntryTag class MenuTag extends Ant.OS.GUI.BaseTag constructor: (r, o) -> super r, o + me = @ @setopt "context", false @setopt "parent", undefined + @setopt "root", undefined @setopt "contentag", "afx-menu-entry" + @setopt "onmenuitemselect", (e) -> me.handleselect e + @setopt "onmenuselect", (e) -> @setopt "items", [] - me = @ @root.show = (e) -> me.showctxmenu e + handleselect: (e) -> + $(@root).hide() if @isctxmenu() + @get("onmenuselect") e + @observable.trigger "menuselect", e + showctxmenu: (e) -> return unless @get "context" - #console.log $(@root) .css("top", e.clientY - 15 + "px") .css("left", e.clientX - 5 + "px") @@ -161,28 +171,31 @@ class MenuTag extends Ant.OS.GUI.BaseTag isctxmenu: () -> return @get "context" + is_root: () -> + return @get("root") is undefined + mount: () -> me = @ - - on_context_changed: (v) -> + return unless me.isctxmenu() + $(@refs.container).mouseleave (e) -> + return unless me.is_root() + $(me.root).hide() + __context__: (v) -> $(@refs.container).removeClass("context") return unless v $(@refs.container).addClass("context") $(@root).hide() - @observable.on "menuselect", (e) -> - console.log e.data.item - console.log e.data.item.get("rootid") - on_items_changed: (data) -> + __items__: (data) -> me = @ $(@refs.container).empty() $("