coffeescript-ui
Version:
Coffeescript User Interface System
362 lines (294 loc) • 10.5 kB
text/coffeescript
###
* coffeescript-ui - Coffeescript User Interface System (CUI)
* Copyright (c) 2013 - 2016 Programmfabrik GmbH
* MIT Licence
* https://github.com/programmfabrik/coffeescript-ui, http://www.coffeescript-ui.org
###
class Demo.ListViewTreeDemo extends Demo
#load filesystem tree, used as example content for list views
loadFiles: ->
dfr = new CUI.Deferred()
data = require('./files.txt')
@files = []
for line in data.split("\n")
if line.trim() == ""
continue
spl = line.split(" ")
type = spl[2]
if type not in ["f", "d"]
continue
parts = spl[0].match("^(.*)\/(.*)$")
if not parts
path = spl[0]
name = spl[0]
else
path = parts[1]
name = parts[2]
file =
path: spl[0]
name: name
depth: parseInt(spl[1])
type: type
size: spl[3]
date: new Date(Math.floor(spl[4]*1000))
@files.push(file)
dfr.resolve()
dfr.promise()
display: ->
get_footer = (pane_footer) =>
#get the parent listviewtree
_lv = CUI.dom.closest(pane_footer.DOM, ".cui-list-view-tree").__dom_data["element"]
minusButton = new CUI.Button
icon: new CUI.Icon(class: "fa-minus")
group: "plus-minus"
disabled: true
onClick: ->
CUI.dom.remove(_lv.getSelectedNode())
bb = (new CUI.Buttonbar
buttons: [
new CUI.Button
group: "plus-minus"
icon: new CUI.Icon(class: "fa-plus")
onClick: =>
_lv.addNode(new Demo.ListViewTreeDemoDummyNode(demo: @, date: new Date()))
new CUI.Button
group: "plus-minus"
icon: new CUI.Icon(class: "fa-plus")
text: "Nested"
onClick: =>
_lv.addNode(new Demo.ListViewNestedNode(demo: @, cols: 6))
minusButton
]
)
CUI.Events.listen
node: _lv
type: ["row_selected","row_deselected"]
call: (ev, info) ->
if _lv.getSelectedNode()
minusButton.enable()
else
minusButton.disable()
bb
first_list_viewOptions =
class: "cui-tree-list-view-demo-first-list-view"
cols: ["auto", "maximize", "auto", "auto"]
fixedRows: 1
fixedCols: 1
unmaximized_list_viewOptions = CUI.util.copyObject(first_list_viewOptions, true)
connected_list_view1_option = CUI.util.copyObject(first_list_viewOptions, true)
connected_list_view2_option = CUI.util.copyObject(first_list_viewOptions, true)
connected_list_view3_option = CUI.util.copyObject(first_list_viewOptions, true)
maximized_list_viewOptions = CUI.util.copyObject(first_list_viewOptions, true)
plaintableListviewOptions = CUI.util.copyObject(first_list_viewOptions, true)
first_list_viewOptions.root = new Demo.ListViewTreeDemoNode(demo: @)
first_list_viewOptions.selectable = true
first_list_viewOptions.header_center = "Fill Space ListView:"
first_list_viewOptions.footer_left = get_footer
@root_layout = new CUI.HorizontalLayout
class: "cui-tree-list-view-demo-root-layout"
left:
content: CUI.dom.div()
right:
content: CUI.dom.div()
connected_list_view1_option.root = new Demo.ListViewTreeDemoNode(demo: @)
connected_list_view1_option.cols = ["auto", "auto", "auto", "auto"]
connected_list_view1_option.class = "list-view-demo-fixed-width"
connected_list_view1_option.header_left = "1:"
connected_list_view1_option.maximize = false
connected_list_view2_option.root = new Demo.ListViewTreeDemoNode(demo: @)
connected_list_view2_option.class = "list-view-demo-fixed-width"
connected_list_view2_option.header_left = "2:"
connected_list_view2_option.cols = ["auto", "auto", "auto", "auto"]
connected_list_view2_option.maximize = false
connected_list_view3_option.root = new Demo.ListViewTreeDemoNode(demo: @)
connected_list_view3_option.class = "list-view-demo-fixed-width"
connected_list_view3_option.header_left = "3:"
connected_list_view3_option.cols = ["auto", "auto", "auto", "auto"]
connected_list_view3_option.maximize = false
unmaximized_list_viewOptions.root = new Demo.ListViewTreeDemoNode(demo: @)
unmaximized_list_viewOptions.cols = ["auto", "auto", "auto", "auto"]
unmaximized_list_viewOptions.maximize = false
#unmaximized_list_viewOptions.header_center = "Unmaximized ListView"
unmaximized_list_viewOptions.selectable = true
unmaximized_list_viewOptions.footer_left = get_footer
maximized_list_viewOptions.root = new Demo.ListViewTreeDemoNode(demo: @)
maximized_list_viewOptions.class = "list-view-demo-fixed-width"
#maximized_list_viewOptions.header_center = "Maximized ListView"
maximized_list_viewOptions.selectable = true
maximized_list_viewOptions.footer_left = get_footer
unmaximized_list_viewOptions.maximize = true
first_list_view = new CUI.ListViewTree(first_list_viewOptions)
connected_list_view1 = new CUI.ListViewTree(connected_list_view1_option)
connected_list_view2 = new CUI.ListViewTree(connected_list_view2_option)
connected_list_view3 = new CUI.ListViewTree(connected_list_view3_option)
unmaximized_list_view = new CUI.ListViewTree(unmaximized_list_viewOptions)
maximized_list_view = new CUI.ListViewTree(maximized_list_viewOptions)
tabs = new CUI.Tabs
class: "cui-tree-list-view-demo-tabs"
footer_left: "This Footer belongs to the Tabs"
tabs: [
text: "ListView not maximized"
content: unmaximized_list_view.render()
# ,
# text: "ListView maximized"
# content: maximized_list_view.render()
]
unmaximized_list_view.root.open()
connected_list_view_layout = new CUI.VerticalLayout
class: "cui-tree-list-view-demo-connected-layout"
maximize: true
center:
content: [
connected_list_view1.render()
connected_list_view2.render()
connected_list_view3.render()
]
connected_list_view1.root.open()
connected_list_view2.root.open()
connected_list_view3.root.open()
@root_layout.getLayout().replace(first_list_view.render(),"left")
first_list_view.appendRow(new Demo.ListViewTreeDemoHeaderNode())
first_list_view.root.open()
return @root_layout.DOM
CUI.dom.append(@root_layout.getLayout().map.center, connected_list_view_layout.DOM)
@root_layout.getLayout().replace(tabs.DOM,"right")
connected_list_view1.appendRow(new Demo.ListViewTreeDemoHeaderNode())
connected_list_view2.appendRow(new Demo.ListViewTreeDemoHeaderNode())
connected_list_view3.appendRow(new Demo.ListViewTreeDemoHeaderNode())
unmaximized_list_view.appendRow(new Demo.ListViewTreeDemoHeaderNode())
#maximized_list_view.appendRow(new ListViewTreeDemoHeaderNode())
@root_layout.DOM
class Demo.ListViewTreeDemoDummyNode extends CUI.ListViewTreeNode
constructor: (@opts={}) ->
@demo = @opts.demo
super(@opts)
initOpts: ->
super()
@addOpts
demo:
check: Demo.ListViewTreeDemo
date:
check: (v) ->
v instanceof Date
renderContent: =>
@columns.splice(0,0, new CUI.ListViewColumn(text: @getNodeId()))
d = CUI.dom.div()
btn = new CUI.Button(
text: "More Content"
onClick: ->
b = new CUI.Button
text: ""+Math.random()
onClick: ->
CUI.DOM.remove(@DOM.parent())
@destroy()
CUI.Events.trigger
type: "content-resize"
node: d
CUI.dom.append(d, CUI.dom.append(CUI.dom.div(), b.DOM))
CUI.Events.trigger
type: "content-resize"
node: d
)
CUI.dom.append(d, CUI.dom.append(CUI.dom.div(), btn.DOM))
@addColumn(new CUI.ListViewColumn(element: d, colspan: 2))
# @addColumn(new CUI.ListViewColumn(text: dateToString(@opts.date)))
new CUI.Label(text: "Added Manually")
class Demo.ListViewTreeDemoHeaderNode extends CUI.ListViewRow
constructor: ->
super()
@addColumn(new CUI.ListViewColumn(text: "Node"))
@addColumn(new CUI.ListViewColumn(text: "File"))
@addColumn(new CUI.ListViewColumn(text: "Size"))
@addColumn(new CUI.ListViewColumn(text: "Date"))
class Demo.ListViewTreeDemoNode extends CUI.ListViewTreeNode
constructor: (@opts={}) ->
@demo = @opts.demo
@file = @opts.file
super(@opts)
initOpts: ->
super()
@addOpts
demo:
check: Demo.ListViewTreeDemo
file:
check: "PlainObject"
leaf:
check: Boolean
getChildren: =>
dfr = new CUI.Deferred()
children = []
push_file = (file) =>
children.push(new Demo.ListViewTreeDemoNode(demo: @demo, file: file, leaf: file.type == "f"))
if not @file
@demo.loadFiles()
.done =>
for file in @demo.files
if file.depth > 1
continue
push_file(file)
# children.push(new ListViewNestedNode(demo: @demo, cols: 3))
dfr.resolve(children)
else
for file in @demo.files
if file.depth != @file.depth+1
continue
if file.path.substr(0, @file.path.length) != @file.path
continue
push_file(file)
dfr.resolve(children)
dfr.promise()
renderContent: =>
@columns.splice(0,0, new CUI.ListViewColumn(text: @getNodeId()))
@addColumn(new CUI.ListViewColumn(text: @file.size))
@addColumn(new CUI.ListViewColumn(text: dateToString(@file.date)))
new CUI.Label(text: @file.name)
class Demo.ListViewNestedNode extends Demo.ListViewTreeDemoNode
constructor: (@opts={}) ->
@cols = @opts.cols
@opts.leaf = true
super(@opts)
initOpts: ->
super()
@addOpts
cols:
check: "Integer"
renderContent: ->
@columns.splice(0,0,new CUI.ListViewColumn(text: @getNodeId()))
__getColumns = (textFunc = (i) -> ""+i) =>
columns = []
columns.push(new CUI.ListViewColumn(text: String.fromCharCode(65+(lv?.rowsCount or 0))))
for i in [0...@cols]
columns.push(new CUI.ListViewColumn(text: textFunc(i)))
columns
columns = __getColumns()
lv = new CUI.ListView
cols: ((if idx == 1 then "auto" else "auto") for c, idx in columns)
footer_left: new CUI.Buttonbar buttons: [
new CUI.Button
group: "plus-minus"
icon: new CUI.Icon(class: "fa-plus")
onClick: ->
columns = __getColumns(-> ""+Math.floor(Math.random()*1000))
lv.appendRow(new CUI.ListViewRow(columns: columns))
#lv.layout()
lb.enable()
lb = new CUI.Button
group: "plus-minus"
disabled: true
icon: new CUI.Icon(class: "fa-minus")
text: "Last"
onClick: ->
if lv.rowsCount > 1
lv.removeRow(lv.getRowIdx(lv.rowsCount-1))
#lv.layout()
if lv.rowsCount == 1
lb.disable()
]
fixedRows: 1
fixedCols: 1
@addColumn(new CUI.ListViewColumn(colspan: 2, element: lv.render()))
lv.appendRow(new CUI.ListViewRow(columns: columns))
new CUI.Label(text: "Nested")
dateToString = (d) ->
d.toLocaleDateString()+" "+d.toLocaleTimeString()
Demo.register(new Demo.ListViewTreeDemo())