2018-01-30 19:06:30 +01:00

256 lines
9.7 KiB
CoffeeScript

class Files extends this.OS.GUI.BaseApplication
constructor: (args) ->
super "Files", args
main: () ->
me = @
@scheme.set "apptitle", "Files manager"
@view = @find "fileview"
@navinput = @find "navinput"
@navbar = @find "nav-bar"
@currdir = if @args and @args.length > 0 then @args[0].asFileHandler() else "home:///".asFileHandler()
@favo = @find "favouri"
@clipboard = undefined
@view.contextmenuHandler = (e, m) ->
m.set "items", [ me.mnFile(), me.mnEdit() ]
m.show(e)
#@on "fileselect", (d) -> console.log d
@view.set "onfileopen", (e) ->
return unless e
return if e.type is "dir"
me._gui.openWith e
@favo.set "onlistselect", (e) ->
me.chdir e.data.path
($ @find "btback").click () ->
return if me.currdir.isRoot()
p = me.currdir.parent()
me.favo.set "selected", -1
me.chdir p
($ @navinput).keyup (e) ->
me.chdir ($ me.navinput).val() if e.keyCode is 13 #enter
@view.set "chdir", (p) -> me.chdir p
@view.set "fetch", (e, f) ->
return unless e.child
return if e.child.filename is "[..]"
e.child.path.asFileHandler().read (d) ->
return me.error "Resource not found #{e.child.path}" if d.error
f d.result
@setting.sidebar = true if @setting.sidebar is undefined
@setting.nav = true if @setting.nav is undefined
@setting.showhidden = false if @setting.showhidden is undefined
mntpoints = @systemsetting.VFS.mountpoints
el.selected = false for el, i in mntpoints
@favo.set "items", mntpoints
#@favo.set "selected", -1
@applySetting()
@subscribe "VFS", (d) ->
me.chdir null if d.data.file.hash() is me.currdir.hash() or d.data.file.parent().hash() is me.currdir.hash()
@chdir null
applySetting: (k) ->
# view setting
@view.set "view", @setting.view if @setting.view
@view.set "showhidden", @setting.showhidden
@toggleSidebar @setting.sidebar
@toggleNav @setting.nav
chdir: (p) ->
me = @
dir = if p then p.asFileHandler() else me.currdir
dir.read (d) ->
if(d.error)
return me.error "Resource not found #{p}"
console.log "error"
me.currdir = dir
if not dir.isRoot()
p = dir.parent().asFileHandler()
p.filename = "[..]"
p.type = "dir"
#p.size = 0
d.result.unshift p
($ me.navinput).val dir.path
me.view.set "path", dir.path
me.view.set "data", d.result
mnFile:() ->
#console.log file
me = @
f = () ->
console.log "called"
file = me.view.get "selectedFile"
return undefined unless file
return me._gui.appsByMime file.mime
{
text: "File",
child: [
{ text: "New file", dataid: "#{@name}-mkf" },
{ text: "New folder", dataid: "#{@name}-mkdir" },
{ text: "Open with", dataid: "#{@name}-open", child: f },
{ text: "Upload", dataid: "#{@name}-upload" },
{ text: "Download", dataid: "#{@name}-download" },
{ text: "Properties", dataid: "#{@name}-info" }
], onmenuselect: (e) -> me.actionFile e
}
mnEdit: () ->
me = @
{
text: "Edit",
child: [
{ text: "Rename", dataid: "#{@name}-mv" },
{ text: "Delete", dataid: "#{@name}-rm" },
{ text: "Cut", dataid: "#{@name}-cut" },
{ text: "Copy", dataid: "#{@name}-copy" },
{ text: "Paste", dataid: "#{@name}-paste" }
], onmenuselect: (e) -> me.actionEdit e
}
menu: () ->
me = @
menu = [
@mnFile(),
@mnEdit(),
{
text: "View",
child: [
{ text: "Refresh", dataid: "#{@name}-refresh" },
{ text: "Sidebar", switch: true, checked: @setting.sidebar, dataid: "#{@name}-side" },
{ text: "Navigation bar", switch: true, checked: @setting.nav, dataid: "#{@name}-nav" },
{ text: "Hidden files", switch: true, checked: @setting.showhidden, dataid: "#{@name}-hidden" },
{ text: "Type", child: [
{ text: "Icon view", radio: true, checked: @setting.view is 'icon', dataid: "#{@name}-icon", type: 'icon' },
{ text: "List view", radio:true, checked: @setting.view is 'list' or not @setting.view, dataid: "#{@name}-list", type: 'list' },
{ text: "Tree view", radio:true, checked: @setting.view is 'tree', dataid: "#{@name}-tree", type: 'tree' }
], onmenuselect: (e) ->
me.view.set 'view', e.item.data.type
me.setting.view = e.item.data.type
},
], onmenuselect: (e) -> me.actionView e
},
]
menu
toggleSidebar: (b) ->
if b then ($ @favo).show() else ($ @favo).hide()
@trigger "resize"
toggleNav: (b) ->
if b then ($ @navbar).show() else ($ @navbar).hide()
@trigger "resize"
actionView: (e) ->
switch e.item.data.dataid
when "#{@name}-hidden"
#@.view.set "showhidden", e.item.data.checked
@registry "showhidden",e.item.data.checked
#@.setting.showhidden = e.item.data.checked
when "#{@name}-refresh"
@.chdir null
when "#{@name}-side"
@registry "sidebar",e.item.data.checked
#@setting.sidebar = e.item.data.checked
#@toggleSidebar e.item.data.checked
when "#{@name}-nav"
@registry "nav", e.item.data.checked
#@setting.nav = e.item.data.checked
#@toggleNav e.item.data.checked
actionEdit: (e) ->
me = @
file = @view.get "selectedFile"
switch e.item.data.dataid
when "#{@name}-mv"
return unless file
@openDialog "PromptDialog",
(d) ->
return if d is file.filename
file.path.asFileHandler()
.move "#{me.currdir.path}/#{d}", (r) ->
me.error "Fail to rename to #{d}: #{r.error}" if r.error
, "Rename", file.filename
when "#{@name}-rm"
return unless file
@openDialog "YesNoDialog",
(d) ->
return unless d
file.path.asFileHandler()
.remove (r) ->
me.error "Fail to delete #{file.filename}: #{r.error}" if r.error
, "Delete" ,
{ iconclass: "fa fa-question-circle", text: "Do you really want to delete: #{file.filename} ?" }
when "#{@name}-cut"
return unless file
@clipboard =
cut: true
file: file.path.asFileHandler()
@notify "File #{file.filename} cut"
when "#{@name}-copy"
return unless file
@clipboard =
cut: false
file: file.path.asFileHandler()
@notify "File #{file.filename} copied"
when "#{@name}-paste"
me = @
return unless @clipboard
if @clipboard.cut
@clipboard.file # duplicate file check
.move "#{me.currdir.path}/#{@clipboard.file.basename}", (r) ->
me.clipboard = undefined
me.error "Fail to paste: #{r.error}" if r.error
else
@notify "Copy not yet implemented"
@clipboard = undefined
else
@_api.handler.setting()
actionFile: (e) ->
me = @
file = @view.get "selectedFile"
switch e.item.data.dataid
when "#{@name}-mkdir"
@openDialog "PromptDialog",
(d) ->
me.currdir.mk d, (r) ->
me.error "Fail to create #{d}: #{r.error}" if r.error
, "New folder"
when "#{@name}-mkf"
@openDialog "PromptDialog",
(d) ->
fp = "#{me.currdir.path}/#{d}".asFileHandler()
fp.write "", (r) ->
me.error "Fail to create #{d}: #{r.error}" if r.error
, "New file"
when "#{@name}-info"
return unless file
@openDialog "InfoDialog", null, file.filename, file
when "#{@name}-upload"
me = @
@currdir.upload (r) ->
me.error "Faile to upload to: #{d}: #{r.error}" if r.error
when "#{@name}-download"
return unless file
file.path.asFileHandler().download ()->
when "#{@name}-open"
return unless file
@_gui.openWith file
else
console.log e
this.OS.register "Files", Files