From d274bf926c79ec834afcac00dab3f95f8bd5325f Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Thu, 14 Mar 2019 23:45:06 -0400 Subject: widgets/directories.go -> widgets/dirlist.go --- widgets/directories.go | 156 ------------------------------------------------- widgets/dirlist.go | 156 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 156 insertions(+), 156 deletions(-) delete mode 100644 widgets/directories.go create mode 100644 widgets/dirlist.go diff --git a/widgets/directories.go b/widgets/directories.go deleted file mode 100644 index d66ae1f..0000000 --- a/widgets/directories.go +++ /dev/null @@ -1,156 +0,0 @@ -package widgets - -import ( - "log" - "sort" - - "github.com/gdamore/tcell" - - "git.sr.ht/~sircmpwn/aerc2/config" - "git.sr.ht/~sircmpwn/aerc2/lib/ui" - "git.sr.ht/~sircmpwn/aerc2/worker/types" -) - -type DirectoryList struct { - conf *config.AccountConfig - dirs []string - logger *log.Logger - onInvalidate func(d ui.Drawable) - selecting string - selected string - spinner *Spinner - worker *types.Worker -} - -func NewDirectoryList(conf *config.AccountConfig, - logger *log.Logger, worker *types.Worker) *DirectoryList { - - dirlist := &DirectoryList{ - conf: conf, - logger: logger, - spinner: NewSpinner(), - worker: worker, - } - dirlist.spinner.OnInvalidate(func(_ ui.Drawable) { - dirlist.Invalidate() - }) - dirlist.spinner.Start() - return dirlist -} - -func (dirlist *DirectoryList) UpdateList(done func(dirs []string)) { - 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.spinner.Stop() - dirlist.Invalidate() - if done != nil { - done(dirs) - } - } - }) -} - -func (dirlist *DirectoryList) Select(name string) { - dirlist.selecting = name - dirlist.worker.PostAction(&types.OpenDirectory{Directory: name}, - func(msg types.WorkerMessage) { - switch msg.(type) { - case *types.Error: - dirlist.selecting = "" - default: - dirlist.selected = dirlist.selecting - } - dirlist.Invalidate() - }) - dirlist.Invalidate() -} - -func (dirlist *DirectoryList) Selected() string { - return dirlist.selected -} - -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) - - if dirlist.spinner.IsRunning() { - dirlist.spinner.Draw(ctx) - return - } - - row := 0 - for _, name := range dirlist.dirs { - if row >= ctx.Height() { - break - } - if len(dirlist.conf.Folders) > 1 && name != dirlist.selected { - idx := sort.SearchStrings(dirlist.conf.Folders, name) - if idx == len(dirlist.conf.Folders) || - dirlist.conf.Folders[idx] != name { - continue - } - } - style := tcell.StyleDefault - if name == dirlist.selected { - style = style.Background(tcell.ColorWhite). - Foreground(tcell.ColorBlack) - } - ctx.Fill(0, row, ctx.Width(), 1, ' ', style) - ctx.Printf(0, row, style, "%s", name) - row++ - } -} - -func (dirlist *DirectoryList) nextPrev(delta int) { - for i, dir := range dirlist.dirs { - if dir == dirlist.selected { - var j int - ndirs := len(dirlist.dirs) - for j = i + delta; j != i; j += delta { - if j < 0 { - j = ndirs - 1 - } - if j >= ndirs { - j = 0 - } - name := dirlist.dirs[j] - if len(dirlist.conf.Folders) > 1 && name != dirlist.selected { - idx := sort.SearchStrings(dirlist.conf.Folders, name) - if idx == len(dirlist.conf.Folders) || - dirlist.conf.Folders[idx] != name { - - continue - } - } - break - } - dirlist.Select(dirlist.dirs[j]) - break - } - } -} - -func (dirlist *DirectoryList) Next() { - dirlist.nextPrev(1) -} - -func (dirlist *DirectoryList) Prev() { - dirlist.nextPrev(-1) -} diff --git a/widgets/dirlist.go b/widgets/dirlist.go new file mode 100644 index 0000000..d66ae1f --- /dev/null +++ b/widgets/dirlist.go @@ -0,0 +1,156 @@ +package widgets + +import ( + "log" + "sort" + + "github.com/gdamore/tcell" + + "git.sr.ht/~sircmpwn/aerc2/config" + "git.sr.ht/~sircmpwn/aerc2/lib/ui" + "git.sr.ht/~sircmpwn/aerc2/worker/types" +) + +type DirectoryList struct { + conf *config.AccountConfig + dirs []string + logger *log.Logger + onInvalidate func(d ui.Drawable) + selecting string + selected string + spinner *Spinner + worker *types.Worker +} + +func NewDirectoryList(conf *config.AccountConfig, + logger *log.Logger, worker *types.Worker) *DirectoryList { + + dirlist := &DirectoryList{ + conf: conf, + logger: logger, + spinner: NewSpinner(), + worker: worker, + } + dirlist.spinner.OnInvalidate(func(_ ui.Drawable) { + dirlist.Invalidate() + }) + dirlist.spinner.Start() + return dirlist +} + +func (dirlist *DirectoryList) UpdateList(done func(dirs []string)) { + 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.spinner.Stop() + dirlist.Invalidate() + if done != nil { + done(dirs) + } + } + }) +} + +func (dirlist *DirectoryList) Select(name string) { + dirlist.selecting = name + dirlist.worker.PostAction(&types.OpenDirectory{Directory: name}, + func(msg types.WorkerMessage) { + switch msg.(type) { + case *types.Error: + dirlist.selecting = "" + default: + dirlist.selected = dirlist.selecting + } + dirlist.Invalidate() + }) + dirlist.Invalidate() +} + +func (dirlist *DirectoryList) Selected() string { + return dirlist.selected +} + +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) + + if dirlist.spinner.IsRunning() { + dirlist.spinner.Draw(ctx) + return + } + + row := 0 + for _, name := range dirlist.dirs { + if row >= ctx.Height() { + break + } + if len(dirlist.conf.Folders) > 1 && name != dirlist.selected { + idx := sort.SearchStrings(dirlist.conf.Folders, name) + if idx == len(dirlist.conf.Folders) || + dirlist.conf.Folders[idx] != name { + continue + } + } + style := tcell.StyleDefault + if name == dirlist.selected { + style = style.Background(tcell.ColorWhite). + Foreground(tcell.ColorBlack) + } + ctx.Fill(0, row, ctx.Width(), 1, ' ', style) + ctx.Printf(0, row, style, "%s", name) + row++ + } +} + +func (dirlist *DirectoryList) nextPrev(delta int) { + for i, dir := range dirlist.dirs { + if dir == dirlist.selected { + var j int + ndirs := len(dirlist.dirs) + for j = i + delta; j != i; j += delta { + if j < 0 { + j = ndirs - 1 + } + if j >= ndirs { + j = 0 + } + name := dirlist.dirs[j] + if len(dirlist.conf.Folders) > 1 && name != dirlist.selected { + idx := sort.SearchStrings(dirlist.conf.Folders, name) + if idx == len(dirlist.conf.Folders) || + dirlist.conf.Folders[idx] != name { + + continue + } + } + break + } + dirlist.Select(dirlist.dirs[j]) + break + } + } +} + +func (dirlist *DirectoryList) Next() { + dirlist.nextPrev(1) +} + +func (dirlist *DirectoryList) Prev() { + dirlist.nextPrev(-1) +} -- cgit v1.2.3