1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00

WTF-427 Add KeyboardWidget and switch Todo widget to using it

This commit is contained in:
Chris Cummer
2019-05-06 04:51:30 -07:00
parent b22a9ead17
commit a9c5dc3be8
5 changed files with 149 additions and 88 deletions

70
modules/todo/keyboard.go Normal file
View File

@@ -0,0 +1,70 @@
package todo
import (
"fmt"
"github.com/gdamore/tcell"
"github.com/wtfutil/wtf/cfg"
"github.com/wtfutil/wtf/wtf"
)
func (widget *Widget) initializeKeyboardControls() {
widget.SetKeyboardChar(" ", widget.toggleChecked)
widget.SetKeyboardChar("/", widget.ShowHelp)
widget.SetKeyboardChar("j", widget.displayNext)
widget.SetKeyboardChar("k", widget.displayPrev)
widget.SetKeyboardChar("n", widget.newItem)
widget.SetKeyboardChar("o", widget.openFile)
widget.SetKeyboardKey(tcell.KeyCtrlD, widget.deleteSelected)
widget.SetKeyboardKey(tcell.KeyCtrlJ, widget.demoteSelected)
widget.SetKeyboardKey(tcell.KeyCtrlK, widget.promoteSelected)
widget.SetKeyboardKey(tcell.KeyDown, widget.displayNext)
widget.SetKeyboardKey(tcell.KeyEnter, widget.editSelected)
widget.SetKeyboardKey(tcell.KeyEsc, widget.unselect)
widget.SetKeyboardKey(tcell.KeyUp, widget.displayPrev)
}
func (widget *Widget) deleteSelected() {
widget.list.Delete()
widget.persist()
widget.display()
}
func (widget *Widget) demoteSelected() {
widget.list.Demote()
widget.persist()
widget.display()
}
func (widget *Widget) displayNext() {
widget.list.Next()
widget.display()
}
func (widget *Widget) displayPrev() {
widget.list.Prev()
widget.display()
}
func (widget *Widget) openFile() {
confDir, _ := cfg.ConfigDir()
wtf.OpenFile(fmt.Sprintf("%s/%s", confDir, widget.filePath))
}
func (widget *Widget) promoteSelected() {
widget.list.Promote()
widget.persist()
widget.display()
}
func (widget *Widget) toggleChecked() {
widget.list.Toggle()
widget.persist()
widget.display()
}
func (widget *Widget) unselect() {
widget.list.Unselect()
widget.display()
}

View File

@@ -35,8 +35,10 @@ const offscreen = -1000
const modalWidth = 80
const modalHeight = 7
// A Widget represents a Todo widget
type Widget struct {
wtf.HelpfulWidget
wtf.KeyboardWidget
wtf.TextWidget
app *tview.Application
@@ -46,10 +48,12 @@ type Widget struct {
pages *tview.Pages
}
// NewWidget creates a new instance of a widget
func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *Widget {
widget := Widget{
HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText),
TextWidget: wtf.NewTextWidget(app, settings.common, true),
HelpfulWidget: wtf.NewHelpfulWidget(app, pages, HelpText),
KeyboardWidget: wtf.NewKeyboardWidget(),
TextWidget: wtf.NewTextWidget(app, settings.common, true),
app: app,
settings: settings,
@@ -59,11 +63,13 @@ func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) *
}
widget.init()
widget.HelpfulWidget.SetView(widget.View)
widget.initializeKeyboardControls()
widget.View.SetScrollable(true)
widget.View.SetInputCapture(widget.InputCapture)
widget.View.SetRegions(true)
widget.View.SetInputCapture(widget.keyboardIntercept)
widget.View.SetScrollable(true)
widget.HelpfulWidget.SetView(widget.View)
return &widget
}
@@ -74,20 +80,21 @@ func (widget *Widget) Refresh() {
widget.load()
widget.app.QueueUpdateDraw(func() {
widget.View.SetTitle(widget.ContextualTitle(widget.CommonSettings.Title))
title := widget.ContextualTitle(widget.CommonSettings.Title)
widget.View.SetTitle(title)
widget.display()
})
}
func (widget *Widget) SetList(newList checklist.Checklist) {
widget.list = newList
func (widget *Widget) SetList(list checklist.Checklist) {
widget.list = list
}
/* -------------------- Unexported Functions -------------------- */
// edit opens a modal dialog that permits editing the text of the currently-selected item
func (widget *Widget) editItem() {
func (widget *Widget) editSelected() {
if widget.list.SelectedItem() == nil {
return
}
@@ -115,81 +122,6 @@ func (widget *Widget) init() {
}
}
func (widget *Widget) keyboardIntercept(event *tcell.EventKey) *tcell.EventKey {
switch string(event.Rune()) {
case " ":
// Check/uncheck selected item
widget.list.Toggle()
widget.persist()
widget.display()
return nil
case "/":
widget.ShowHelp()
return nil
case "j":
// Select the next item down
widget.list.Next()
widget.display()
return nil
case "k":
// Select the next item up
widget.list.Prev()
widget.display()
return nil
case "n":
// Add a new item
widget.newItem()
return nil
case "o":
// Open the file
confDir, _ := cfg.ConfigDir()
wtf.OpenFile(fmt.Sprintf("%s/%s", confDir, widget.filePath))
return nil
}
switch event.Key() {
case tcell.KeyCtrlD:
// Delete the selected item
widget.list.Delete()
widget.persist()
widget.display()
return nil
case tcell.KeyCtrlJ:
// Move selected item down in the list
widget.list.Demote()
widget.persist()
widget.display()
return nil
case tcell.KeyCtrlK:
// Move selected item up in the list
widget.list.Promote()
widget.persist()
widget.display()
return nil
case tcell.KeyDown:
// Select the next item down
widget.list.Next()
widget.display()
return nil
case tcell.KeyEnter:
widget.editItem()
return nil
case tcell.KeyEsc:
// Unselect the current row
widget.list.Unselect()
widget.display()
return event
case tcell.KeyUp:
// Select the next item up
widget.list.Prev()
widget.display()
return nil
default:
// Pass it along
return event
}
}
// Loads the todo list from Yaml file
func (widget *Widget) load() {
confDir, _ := cfg.ConfigDir()