add tree view

This commit is contained in:
Xuan Sang LE
2017-08-26 20:27:43 +02:00
parent 4cf1d694f9
commit 599e27bb01
13 changed files with 165 additions and 79 deletions

View File

@ -22,7 +22,6 @@
var desktop_pos = $("#desktop").offset()
var isMaxi = false
var history = {}
var isResize = opts.resize || true
var width = opts.width || 400
var height = opts.height || 300
this.root.observable = opts.observable || riot.observable()
@ -70,7 +69,7 @@
//self.root.observable.trigger("windowselect")
})
enable_dragging()
if(isResize)
if(self.resizable)
enable_resize()
$(self.refs.dragger).dblclick(function(e){
toggle_window()

View File

@ -1,15 +1,17 @@
<afx-file-view>
<afx-list-view if = {view == 'icon'} ref="listview" observable = {root.observable}></afx-list-view>
<afx-grid-view if = {view == 'list'} ref = "gridview" header = {header} observable = {root.observable}></afx-grid-view>
<afx-tree-view if = {view == 'tree'} ref = "treeview" observable = {root.observable}></afx-tree-view>
<afx-list-view ref="listview" observable = {root.observable}></afx-list-view>
<afx-grid-view ref = "gridview" header = {header} observable = {root.observable}></afx-grid-view>
<afx-tree-view ref = "treeview" observable = {root.observable}></afx-tree-view>
<div if = {status == true} class = "status" ref = "stbar"></div>
<script>
var self = this
self.root.observable = opts.observable || riot.observable()
self.view = opts.view || 'list'
self.data = opts.data || []
self.path = opts.path || "os://"
self.onfileselect
this.status = opts.status == undefined?true:opts.status
this.selectedFile = undefined
this.rid = $(self.root).attr("data-id") || Math.floor(Math.random() * 100000) + 1
this.header = [{value:"File name"},{value: "Type", width:100}, {value: "Size", width:70}]
@ -20,6 +22,8 @@
self[i] = v[i]
else
self[k] = v
if(k == 'view')
switchView()
self.update()
}
self.root.get = function(k)
@ -35,67 +39,103 @@
var h = $(self.root).height()
if(self.refs.stbar)
h -= $(self.refs.stbar).height()
if(self.refs.listview)
$(self.refs.listview.root).css("height", h + "px")
else if(self.refs.gridview)
$(self.refs.gridview.root).css("height", h + "px")
else if(self.refs.treeview)
$(self.refs.treeview.root).css("height", h + "px")
$(self.refs.listview.root).css("height", h + "px")
$(self.refs.gridview.root).css("height", h + "px")
$(self.refs.treeview.root).css("height", h + "px")
}
var refreshList = function(){
$.each(self.data, function(i, v){
v.text = v.filename
if(v.text.length > 10)
v.text = v.text.substring(0,9) + "..."
if(v.type == 'file')
v.iconclass = 'afx-file'
else
v.iconclass = 'afx-dir'
v.iconclass = v.type
})
self.refs.listview.root.set("items", self.data)
}
var refreshGrid = function(){
var rows = []
$.each(self.data, function(i,v){
var row = [{value:v.filename, iconclass: v.type == "dir"?"afx-dir":"afx-file" },{value:v.mime},{value:v.size}]
var row = [{value:v.filename, iconclass: v.type},{value:v.mime},{value:v.size}]
rows.push(row)
})
self.refs.gridview.root.set("rows",rows)
}
var refreshTree = function(){
var tdata = {}
tdata.name = self.path
tdata.nodes = []
$.each(self.data, function(i,v){
v.name = v.filename
if(v.type == 'dir')
{
v.nodes = []
v.open = false
}
v.iconclass = v.type
tdata.nodes.push(v)
})
self.refs.treeview.root.set("*", tdata)
}
var refreshData = function(){
self.data.sort(sortByType)
if(self.refs.listview)
if(self.view == "icon")
refreshList()
else if(self.refs.gridview)
else if(self.view == "list")
refreshGrid()
else
refreshTree()
}
var switchView = function()
{
$(self.refs.listview.root).hide()
$(self.refs.gridview.root).hide()
$(self.refs.treeview.root).hide()
self.selectedFile = undefined
self.refs.listview.root.set("selected", -1)
self.refs.treeview.selectedItem = undefined
$(self.refs.stbar).html("")
switch (self.view) {
case 'icon':
$(self.refs.listview.root).show()
break;
case 'list':
$(self.refs.gridview.root).show()
break;
case 'tree':
$(self.refs.treeview.root).show()
break;
default:
break;
}
calibre_size()
}
self.on("updated", function(){
refreshData()
calibre_size()
})
self.on("mount", function(){
if(self.refs.listview)
switchView()
self.refs.listview.onlistselect = function(data)
{
self.refs.listview.onlistselect = function(data)
{
data.id = self.rid
self.root.observable.trigger("fileselect",data)
}
data.id = self.rid
self.root.observable.trigger("fileselect",data)
}
if(self.refs.gridview)
self.refs.gridview.root.observable = self.root.observable
self.refs.gridview.ongridselect = function(d)
{
self.refs.gridview.root.observable = self.root.observable
self.refs.gridview.ongridselect = function(d)
{
var data = {id:self.rid, data:self.data[d.data.i], idx:d.data.i}
self.root.observable.trigger("fileselect",data)
}
var data = {id:self.rid, data:self.data[d.data.i], idx:d.data.i}
self.root.observable.trigger("fileselect",data)
}
self.refs.treeview.ontreeselect = function(d)
{
var data = {id:self.rid, data:d.data.child, idx:d.data.i}
self.root.observable.trigger("fileselect",data)
}
self.root.observable.on("fileselect", function(e){
if(e.id != self.rid) return
self.selectedFile = e.data
$(self.refs.stbar).html("Selected: " + e.data.filename + " (" + e.data.size + " bytes)")
})
calibre_size()
self.root.observable.on("resize", function(e){
calibre_size()

View File

@ -27,7 +27,7 @@
}
this.calibrate_size = function()
{
if(self.header)
if(self.header && self.refs.gridhead)
{
$(self.refs.scroller).css("height",
$(self.root).height() - $(self.refs.gridhead.root).children().first().height()
@ -55,7 +55,8 @@
self.calibrate_size()
self.root.observable.on("resize",function(){
self.calibrate_size()
if(self.root)
self.calibrate_size()
})
})
this.on("updated",function(){

View File

@ -22,7 +22,7 @@
{
if(self.selidx != -1)
self.items[self.selidx].selected =false
self.items[v].selected = true
if(self.items[v]) self.items[v].selected = true
}
else if(k == "*")
for(var i in v)
@ -137,25 +137,6 @@
if(self.selidx != -1)
self.items[self.selidx].selected =false
event.item.item.selected = true
/*var data = {
id:$(self.root).attr("data-id"),
data:event.item.item,
idx:event.item.i}
self.selidx = data.idx
if(!self.items[self.selidx])
return
self.items[self.selidx].selected = true
if(opts.dropdown == "true")
{
$(self.refs.mlist).hide()
self.selectedText = self.items[self.selidx].text
}
this.root.observable.trigger('listselect',data)
//event.preventDefault()*/
}
</script>
</afx-list-view>

View File

@ -3,6 +3,7 @@
<li class="afx-corner-fix"></li>
<li ref = "container" each={ data,i in items } class = {afx_submenu:data.child != null, fix_padding:data.icon} no-reorder>
<a href="#" onclick = {parent.onselect}>
<afx-switch if = {data.switch || data.radio} class = {checked:parent.checkItem(data)} enable = false swon = {data.checked} ></afx-switch>
<afx-label iconclass = {data.iconclass} icon = {data.icon} text = {data.text} ></afx-label>
</a>
@ -13,6 +14,7 @@
<script>
this.items = opts.child || []
var isRoot
var lastChecked = undefined
if(opts.rootid)
{
this.rid = opts.rootid
@ -25,6 +27,17 @@
}
var self = this
this.onmenuselect = opts.onmenuselect
checkItem(d)
{
if(d.checked == true && d.radio)
{
if(lastChecked)
lastChecked.checked = false
lastChecked = d
lastChecked.checked = true
}
return false
}
self.root.set = function(k,v)
{
if(k == "*")
@ -125,6 +138,18 @@
onselect(event)
{
var data = {id:self.rid, root:isRoot, e:event, item:event.item}
if(event.item.data.switch)
{
event.item.data.checked = !event.item.data.checked
} else if(event.item.data.radio)
{
if(lastChecked)
{
lastChecked.checked = false
}
event.item.data.checked = true
lastChecked = event.item.data
}
this.root.observable.trigger('menuselect',data)
if( this.onmenuselect && !isRoot) this.onmenuselect(data)
event.preventDefault()

View File

@ -4,16 +4,16 @@
this.swon = opts.swon || false
var self = this
this.root.observable = opts.observable
this.enable = opts.enable || true
this.onchange = opts.onchange
this.rid = $(self.root).attr("data-id") || Math.floor(Math.random() * 100000) + 1
console.log(this.swon)
self.root.set = function(k,v)
{
if(k == "*")
for(var i in v)
self[i] = v[i]
opts[i] = v[i]
else
self[k] = v
opts[k] = v
self.update()
}
self.root.get = function(k)
@ -22,16 +22,20 @@
}
this.root.toggle = function()
{
self.swon = !self.swon
opts.swon = !self.swon
self.update()
}
this.on("update", function(e){
self.swon = opts.swon
self.onchange = opts.onchange
})
toggle(e)
{
self.swon = !self.swon
if(!self.enable) return
opts.swon = !self.swon
var data = {
id: self.rid,
data: self.swon
data: opts.swon
}
if(self.onchange)
self.onchange(data)

View File

@ -8,8 +8,9 @@
<script>
this.osmenu = {child:[
{text:"",iconclass:"fa fa-eercast", child:[
{text:"About"},
{text:"System Preferences", iconclass:"fa fa-commenting"},
{text:"About", radio:true},
{text:"App Store", radio:true},
{text:"System Preferences", switch:true, iconclass:"fa fa-commenting"},
{text:"Applications",child:[
{text:"wTerm",type:"app"},
{text:"NotePad",type:"app", iconclass:"fa fa-commenting"},

View File

@ -11,20 +11,24 @@
<ul if={ isFolder() } show={ isFolder() && open }>
<li each={ child, i in nodes }>
<afx-tree-view data={child} indent={indent+1} observable = {parent.root.observable} path = {parent.path + ">" + i} treeroot= {parent.treeroot}></afx-tree-view>
<afx-tree-view ontreeselect = {parent.ontreeselect} data={child} indent={indent+1} observable = {parent.root.observable} path = {parent.path + ">" + i} treeroot= {parent.treeroot}></afx-tree-view>
</li>
</ul>
<script>
var self = this
self.open = true
if(opts.data)
{
self.name = opts.data.name
self.nodes = opts.data.nodes
self.icon = opts.data.icon
self.icon = opts.data.icon
self.open = opts.data.open == undefined?true:opts.data.open
self.iconclass = opts.data.iconclass
}
this.rid = $(self.root).attr("data-id") || Math.floor(Math.random() * 100000) + 1
self.ontreeselect = opts.ontreeselect
self.indent = opts.indent || 1
self.open = true
var istoggle = false
if(opts.treeroot)
{
@ -66,7 +70,7 @@
})
isFolder() {
return self.nodes && self.nodes.length
return self.nodes //&& self.nodes.length
}
toggle(e) {
@ -83,12 +87,12 @@
return
}
var data = {
id:$(self.treeroot.root).attr("data-id"),
id:self.rid,
data:event.item,
path:self.path
}
if(opts.ontreeselect)
opts.ontreeselect(data)
if(self.ontreeselect)
self.ontreeselect(data)
self.treeroot.selectedItem = data
this.root.observable.trigger('treeselect',data)
event.preventUpdate = true