Implemented history for DirectoryView
For some reason DirectoryView won't draw changes all of the time...
This commit is contained in:
parent
f74f6a43f8
commit
14802b4b82
@ -17,6 +17,11 @@ type fileLayoutEntry struct {
|
|||||||
Bounds image.Rectangle
|
Bounds image.Rectangle
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type historyEntry struct {
|
||||||
|
location string
|
||||||
|
filesystem ReadDirStatFS
|
||||||
|
}
|
||||||
|
|
||||||
// DirectoryView displays a list of files within a particular directory and
|
// DirectoryView displays a list of files within a particular directory and
|
||||||
// file system.
|
// file system.
|
||||||
type DirectoryView struct {
|
type DirectoryView struct {
|
||||||
@ -33,8 +38,8 @@ type DirectoryView struct {
|
|||||||
|
|
||||||
onScrollBoundsChange func ()
|
onScrollBoundsChange func ()
|
||||||
|
|
||||||
filesystem ReadDirStatFS
|
history []historyEntry
|
||||||
location string
|
historyIndex int
|
||||||
onChoose func (file string)
|
onChoose func (file string)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,8 +61,10 @@ func NewDirectoryView (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Location returns the directory's location and filesystem.
|
// Location returns the directory's location and filesystem.
|
||||||
func (element *DirectoryView) Location () (string, fs.ReadDirFS) {
|
func (element *DirectoryView) Location () (string, ReadDirStatFS) {
|
||||||
return element.location, element.filesystem
|
if len(element.history) < 1 { return "", nil }
|
||||||
|
current := element.history[element.historyIndex]
|
||||||
|
return current.location, current.filesystem
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetLocation sets the directory's location and filesystem. If within is nil,
|
// SetLocation sets the directory's location and filesystem. If within is nil,
|
||||||
@ -70,14 +77,40 @@ func (element *DirectoryView) SetLocation (
|
|||||||
within = defaultFS { }
|
within = defaultFS { }
|
||||||
}
|
}
|
||||||
element.scroll = image.Point { }
|
element.scroll = image.Point { }
|
||||||
element.location = location
|
|
||||||
element.filesystem = within
|
if element.history != nil {
|
||||||
|
element.historyIndex ++
|
||||||
|
}
|
||||||
|
element.history = append (
|
||||||
|
element.history[:element.historyIndex],
|
||||||
|
historyEntry { location, within })
|
||||||
return element.Update()
|
return element.Update()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Backward goes back a directory in history
|
||||||
|
func (element *DirectoryView) Backward () (bool, error) {
|
||||||
|
if element.historyIndex > 1 {
|
||||||
|
element.historyIndex --
|
||||||
|
return true, element.Update()
|
||||||
|
} else {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Forward goes forward a directory in history
|
||||||
|
func (element *DirectoryView) Forward () (bool, error) {
|
||||||
|
if element.historyIndex < len(element.history) - 1 {
|
||||||
|
element.historyIndex ++
|
||||||
|
return true, element.Update()
|
||||||
|
} else {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Update refreshes the directory's contents.
|
// Update refreshes the directory's contents.
|
||||||
func (element *DirectoryView) Update () error {
|
func (element *DirectoryView) Update () error {
|
||||||
entries, err := element.filesystem.ReadDir(element.location)
|
location, filesystem := element.Location()
|
||||||
|
entries, err := filesystem.ReadDir(location)
|
||||||
|
|
||||||
// disown all entries
|
// disown all entries
|
||||||
for _, file := range element.children {
|
for _, file := range element.children {
|
||||||
@ -91,10 +124,8 @@ func (element *DirectoryView) Update () error {
|
|||||||
|
|
||||||
element.children = make([]fileLayoutEntry, len(entries))
|
element.children = make([]fileLayoutEntry, len(entries))
|
||||||
for index, entry := range entries {
|
for index, entry := range entries {
|
||||||
filePath := filepath.Join(element.location, entry.Name())
|
filePath := filepath.Join(location, entry.Name())
|
||||||
file, err := NewFile (
|
file, err := NewFile(filePath, filesystem)
|
||||||
filePath,
|
|
||||||
element.filesystem)
|
|
||||||
if err != nil { continue }
|
if err != nil { continue }
|
||||||
file.SetParent(element)
|
file.SetParent(element)
|
||||||
file.OnChoose (func () {
|
file.OnChoose (func () {
|
||||||
|
@ -53,6 +53,15 @@ func run () {
|
|||||||
choose(locationInput.Value())
|
choose(locationInput.Value())
|
||||||
})
|
})
|
||||||
choose(homeDir)
|
choose(homeDir)
|
||||||
|
backButton.OnClick (func () {
|
||||||
|
directoryView.Backward()
|
||||||
|
})
|
||||||
|
forwardButton.OnClick (func () {
|
||||||
|
directoryView.Forward()
|
||||||
|
})
|
||||||
|
refreshButton.OnClick (func () {
|
||||||
|
directoryView.Update()
|
||||||
|
})
|
||||||
|
|
||||||
controlBar.Adopt(backButton, false)
|
controlBar.Adopt(backButton, false)
|
||||||
controlBar.Adopt(forwardButton, false)
|
controlBar.Adopt(forwardButton, false)
|
||||||
|
Reference in New Issue
Block a user