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

Can edit existing Todo items via modal

This commit is contained in:
Chris Cummer 2018-04-28 11:50:11 -07:00
parent bef57d799b
commit c63d92a1f7
3 changed files with 87 additions and 19 deletions

View File

@ -1,6 +1,8 @@
package todo package todo
import () import (
"fmt"
)
type List struct { type List struct {
Items []*Item Items []*Item
@ -8,6 +10,18 @@ type List struct {
selected int selected int
} }
/* -------------------- Exported Functions -------------------- */
func (list *List) Add(text string) {
item := Item{
Checked: false,
Text: text,
}
list.Items = append([]*Item{&item}, list.Items...)
fmt.Println("added")
}
func (list *List) Delete() { func (list *List) Delete() {
list.Items = append(list.Items[:list.selected], list.Items[list.selected+1:]...) list.Items = append(list.Items[:list.selected], list.Items[list.selected+1:]...)
} }
@ -46,6 +60,14 @@ func (list *List) Promote() {
list.selected = j list.selected = j
} }
func (list *List) Selected() *Item {
if list.selected < 0 || list.selected >= len(list.Items) {
return nil
}
return list.Items[list.selected]
}
// Toggle switches the checked state of the selected item // Toggle switches the checked state of the selected item
func (list *List) Toggle() { func (list *List) Toggle() {
list.Items[list.selected].Toggle() list.Items[list.selected].Toggle()

View File

@ -18,15 +18,17 @@ var Config *config.Config
type Widget struct { type Widget struct {
wtf.TextWidget wtf.TextWidget
app *tview.Application
pages *tview.Pages pages *tview.Pages
filePath string filePath string
list *List list *List
} }
func NewWidget(pages *tview.Pages) *Widget { func NewWidget(app *tview.Application, pages *tview.Pages) *Widget {
widget := Widget{ widget := Widget{
TextWidget: wtf.NewTextWidget(" 📝 Todo ", "todo"), TextWidget: wtf.NewTextWidget(" 📝 Todo ", "todo"),
app: app,
pages: pages, pages: pages,
filePath: Config.UString("wtf.mods.todo.filename"), filePath: Config.UString("wtf.mods.todo.filename"),
list: &List{selected: -1}, list: &List{selected: -1},
@ -53,18 +55,39 @@ func (widget *Widget) Refresh() {
/* -------------------- Unexported Functions -------------------- */ /* -------------------- Unexported Functions -------------------- */
// edit opens a modal dialog that permits editing the text of the currently-selected item // edit opens a modal dialog that permits editing the text of the currently-selected item
func (widget *Widget) edit() { func (widget *Widget) editItem() {
modal := tview.NewModal(). if widget.list.Selected() == nil {
SetText("Do you want to quit the application?"). return
AddButtons([]string{"Quit", "Cancel"}).
SetDoneFunc(func(buttonIndex int, buttonLabel string) {
if buttonLabel == "Quit" {
widget.pages.RemovePage("edit")
} }
_, _, w, h := widget.View.GetInnerRect()
form := tview.NewForm().
SetButtonsAlign(tview.AlignCenter).
SetButtonTextColor(tview.Styles.PrimaryTextColor)
form.AddInputField("New text:", widget.selectedText(), 60, nil, nil)
form.AddButton("Save", func() {
fld := form.GetFormItem(0)
widget.updateItem(fld.(*tview.InputField).GetText())
widget.pages.RemovePage("modal")
widget.app.SetFocus(widget.View)
widget.persist()
widget.display()
}) })
widget.pages.AddPage("edit", modal, false, true) frame := tview.NewFrame(form).SetBorders(0, 0, 0, 0, 0, 0)
//widget.app.SetFocus(modal) frame.SetBorder(true)
frame.SetRect(w+20, h+2, 80, 7)
widget.pages.AddPage("modal", frame, false, true)
widget.app.SetFocus(frame)
}
func (widget *Widget) newItem() {
} }
func (widget *Widget) init() { func (widget *Widget) init() {
@ -82,28 +105,26 @@ func (widget *Widget) keyboardIntercept(event *tcell.EventKey) *tcell.EventKey {
widget.persist() widget.persist()
widget.display() widget.display()
return nil return nil
case "e":
// Edit selected item
widget.edit()
return nil
case "h": case "h":
// Show help menu // Show help menu
fmt.Println("HELP!") fmt.Println("HELP!")
return nil return nil
case "j": case "j":
// Select the next item down
widget.list.Next() widget.list.Next()
widget.display() widget.display()
return nil return nil
case "k": case "k":
// Select the next item up
widget.list.Prev() widget.list.Prev()
widget.display() widget.display()
return nil return nil
case "n": case "n":
// Add a new item // Add a new item
widget.newItem()
return nil return nil
case "o": case "o":
// Open the file // Open the file
//widget.openFile()
wtf.OpenFile(widget.filePath) wtf.OpenFile(widget.filePath)
return nil return nil
} }
@ -132,6 +153,9 @@ func (widget *Widget) keyboardIntercept(event *tcell.EventKey) *tcell.EventKey {
widget.list.Next() widget.list.Next()
widget.display() widget.display()
return nil return nil
case tcell.KeyEnter:
widget.editItem()
return nil
case tcell.KeyEsc: case tcell.KeyEsc:
// Unselect the current row // Unselect the current row
widget.list.Unselect() widget.list.Unselect()
@ -170,3 +194,25 @@ func (widget *Widget) persist() {
panic(err) panic(err)
} }
} }
func (widget *Widget) selectedText() string {
selectedItem := widget.list.Selected()
if selectedItem == nil {
return ""
} else {
return selectedItem.Text
}
}
func (widget *Widget) updateItem(text string) {
selectedItem := widget.list.Selected()
if selectedItem == nil {
// Create a new item
widget.list.Add(text)
} else {
// Update the text of the existing item
selectedItem.Text = text
}
}

2
wtf.go
View File

@ -195,7 +195,7 @@ func main() {
status.NewWidget(), status.NewWidget(),
system.NewWidget(builtat, version), system.NewWidget(builtat, version),
textfile.NewWidget(), textfile.NewWidget(),
todo.NewWidget(pages), todo.NewWidget(app, pages),
weather.NewWidget(), weather.NewWidget(),
} }