diff options
author | Drew DeVault <sir@cmpwn.com> | 2019-01-13 14:25:46 -0500 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2019-01-13 14:26:46 -0500 |
commit | 2349b7de869e5abc16a419a073273af99b62aad2 (patch) | |
tree | 6799b9945f8d6e243e27aa458e21887cf2d9bd01 /widgets/directories.go | |
parent | c286d3da6ba8636412db5c3b72fda739a06e7f6c (diff) | |
download | aerc-2349b7de869e5abc16a419a073273af99b62aad2.tar.gz |
Add directory list widget
Diffstat (limited to 'widgets/directories.go')
-rw-r--r-- | widgets/directories.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/widgets/directories.go b/widgets/directories.go new file mode 100644 index 00000000..a9ea7d4b --- /dev/null +++ b/widgets/directories.go @@ -0,0 +1,58 @@ +package widgets + +import ( + "log" + "sort" + + "github.com/gdamore/tcell" + + "git.sr.ht/~sircmpwn/aerc2/lib/ui" + "git.sr.ht/~sircmpwn/aerc2/worker/types" +) + +type DirectoryList struct { + dirs []string + logger *log.Logger + onInvalidate func(d ui.Drawable) + worker *types.Worker +} + +func NewDirectoryList(logger *log.Logger, worker *types.Worker) *DirectoryList { + return &DirectoryList{logger: logger, worker: worker} +} + +func (dirlist *DirectoryList) UpdateList() { + var dirs []string + dirlist.worker.PostAction( + &types.ListDirectories{}, func(msg types.WorkerMessage) { + + switch msg := msg.(type) { + case *types.Directory: + dirs = append(dirs, msg.Name) + case *types.Done: + sort.Strings(dirs) + dirlist.dirs = dirs + dirlist.Invalidate() + } + }) +} + +func (dirlist *DirectoryList) OnInvalidate(onInvalidate func(d ui.Drawable)) { + dirlist.onInvalidate = onInvalidate +} + +func (dirlist *DirectoryList) Invalidate() { + if dirlist.onInvalidate != nil { + dirlist.onInvalidate(dirlist) + } +} + +func (dirlist *DirectoryList) Draw(ctx *ui.Context) { + ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', tcell.StyleDefault) + for i, name := range dirlist.dirs { + if i >= ctx.Height() { + break + } + ctx.Printf(0, i, tcell.StyleDefault, "%s", name) + } +} |