74 lines
1.5 KiB
Go
74 lines
1.5 KiB
Go
|
package fileElements
|
||
|
|
||
|
import "io/fs"
|
||
|
import "path/filepath"
|
||
|
import "git.tebibyte.media/sashakoshka/tomo/elements/basic"
|
||
|
|
||
|
type ReadDirStatFS interface {
|
||
|
fs.ReadDirFS
|
||
|
fs.StatFS
|
||
|
}
|
||
|
|
||
|
type DirectoryView struct {
|
||
|
*basicElements.List
|
||
|
|
||
|
filesystem ReadDirStatFS
|
||
|
location string
|
||
|
onChoose func (file string)
|
||
|
}
|
||
|
|
||
|
func NewDirectoryView (
|
||
|
location string,
|
||
|
within ReadDirStatFS,
|
||
|
) (
|
||
|
element *DirectoryView,
|
||
|
err error,
|
||
|
) {
|
||
|
element = &DirectoryView {
|
||
|
List: basicElements.NewList(),
|
||
|
}
|
||
|
err = element.SetLocation(location, within)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (element *DirectoryView) Location () (string, fs.ReadDirFS) {
|
||
|
return element.location, element.filesystem
|
||
|
}
|
||
|
|
||
|
func (element *DirectoryView) SetLocation (
|
||
|
location string,
|
||
|
within ReadDirStatFS,
|
||
|
) error {
|
||
|
if within == nil {
|
||
|
within = defaultFS { }
|
||
|
}
|
||
|
element.location = location
|
||
|
element.filesystem = within
|
||
|
return element.Update()
|
||
|
}
|
||
|
|
||
|
func (element *DirectoryView) Update () error {
|
||
|
entries, err := element.filesystem.ReadDir(element.location)
|
||
|
|
||
|
listEntries := make([]basicElements.ListEntry, len(entries))
|
||
|
for index, entry := range entries {
|
||
|
filePath := filepath.Join(element.location, entry.Name())
|
||
|
listEntries[index] = basicElements.NewListEntry (
|
||
|
entry.Name(),
|
||
|
func () {
|
||
|
filePath := filePath
|
||
|
if element.onChoose != nil {
|
||
|
element.onChoose(filePath)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
element.Clear()
|
||
|
element.Append(listEntries...)
|
||
|
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func (element *DirectoryView) OnChoose (callback func (file string)) {
|
||
|
element.onChoose = callback
|
||
|
}
|