github.com/wtfutil/wtf@v0.43.0/modules/todo/keyboard.go (about) 1 package todo 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/gdamore/tcell/v2" 8 "github.com/wtfutil/wtf/cfg" 9 "github.com/wtfutil/wtf/utils" 10 ) 11 12 func (widget *Widget) initializeKeyboardControls() { 13 widget.InitializeHelpTextKeyboardControl(widget.ShowHelp) 14 widget.InitializeRefreshKeyboardControl(widget.Refresh) 15 16 widget.SetKeyboardChar("j", widget.NextTodo, "Select next item") 17 widget.SetKeyboardChar("k", widget.PrevTodo, "Select previous item") 18 widget.SetKeyboardChar(" ", widget.toggleChecked, "Toggle checkmark") 19 widget.SetKeyboardChar("n", widget.newItem, "Create new item") 20 widget.SetKeyboardChar("o", widget.openFile, "Open file") 21 widget.SetKeyboardChar("#", widget.setTag, "Set tag(s) to show") 22 widget.SetKeyboardChar("f", widget.setFilter, "Filter shown items") 23 24 widget.SetKeyboardKey(tcell.KeyDown, widget.NextTodo, "Select next item") 25 widget.SetKeyboardKey(tcell.KeyUp, widget.PrevTodo, "Select previous item") 26 widget.SetKeyboardKey(tcell.KeyEsc, widget.unselect, "Clear selection") 27 widget.SetKeyboardKey(tcell.KeyCtrlD, widget.deleteSelected, "Delete item") 28 widget.SetKeyboardKey(tcell.KeyCtrlJ, widget.demoteSelected, "Demote item") 29 widget.SetKeyboardKey(tcell.KeyCtrlL, widget.makeSelectedLast, "Make item last") 30 widget.SetKeyboardKey(tcell.KeyCtrlK, widget.promoteSelected, "Promote item") 31 widget.SetKeyboardKey(tcell.KeyCtrlF, widget.makeSelectedFirst, "Make item first") 32 widget.SetKeyboardKey(tcell.KeyEnter, widget.updateSelected, "Edit item") 33 34 } 35 36 func (widget *Widget) NextTodo() { 37 newIndex := widget.Selected + 1 38 for newIndex < len(widget.list.Items) && !widget.shouldShowItem(widget.list.Items[newIndex]) { 39 newIndex = newIndex + 1 40 } 41 if newIndex < len(widget.list.Items) { 42 widget.Selected = newIndex 43 } 44 widget.display() 45 } 46 47 func (widget *Widget) PrevTodo() { 48 newIndex := widget.Selected - 1 49 for newIndex >= 0 && !widget.shouldShowItem(widget.list.Items[newIndex]) { 50 newIndex = newIndex - 1 51 } 52 if newIndex >= 0 { 53 widget.Selected = newIndex 54 } 55 widget.display() 56 } 57 58 func (widget *Widget) deleteSelected() { 59 60 if !widget.isItemSelected() { 61 return 62 } 63 64 widget.list.Delete(widget.Selected) 65 widget.ScrollableWidget.SetItemCount(len(widget.list.Items)) 66 widget.Prev() 67 widget.persist() 68 widget.display() 69 } 70 71 func (widget *Widget) demoteSelected() { 72 if !widget.isItemSelected() { 73 return 74 } 75 76 j := widget.Selected + 1 77 if j >= len(widget.list.Items) { 78 j = 0 79 } 80 81 widget.list.Swap(widget.Selected, j) 82 widget.Selected = j 83 84 widget.persist() 85 widget.display() 86 } 87 88 func (widget *Widget) makeSelectedLast() { 89 if !widget.isItemSelected() { 90 return 91 } 92 93 j := widget.Selected + 1 94 if j >= len(widget.list.Items) { 95 return 96 } 97 98 for j < len(widget.list.Items) { 99 widget.list.Swap(widget.Selected, j) 100 widget.Selected = j 101 j = j + 1 102 } 103 104 if widget.settings.parseDates { 105 widget.Selected = widget.placeItemBasedOnDate(widget.Selected) 106 } 107 108 widget.persist() 109 widget.display() 110 } 111 112 func (widget *Widget) openFile() { 113 confDir, _ := cfg.WtfConfigDir() 114 utils.OpenFile(fmt.Sprintf("%s/%s", confDir, widget.filePath)) 115 } 116 117 func (widget *Widget) setTag() { 118 if !widget.settings.parseTags { 119 return 120 } 121 122 widget.processFormInput("Tag prefix:", "", func(filter string) { 123 widget.showTagPrefix = filter 124 }) 125 } 126 127 func (widget *Widget) setFilter() { 128 widget.processFormInput("Filter:", "", func(filter string) { 129 widget.showFilter = strings.ToLower(filter) 130 }) 131 } 132 133 func (widget *Widget) promoteSelected() { 134 if !widget.isItemSelected() { 135 return 136 } 137 138 k := widget.Selected - 1 139 if k < 0 { 140 k = len(widget.list.Items) - 1 141 } 142 143 widget.list.Swap(widget.Selected, k) 144 widget.Selected = k 145 widget.persist() 146 widget.display() 147 } 148 149 func (widget *Widget) makeSelectedFirst() { 150 if !widget.isItemSelected() { 151 return 152 } 153 154 j := widget.Selected - 1 155 if j < 0 { 156 return 157 } 158 159 for j >= 0 { 160 widget.list.Swap(widget.Selected, j) 161 widget.Selected = j 162 j = j - 1 163 } 164 165 if widget.settings.parseDates { 166 widget.Selected = widget.placeItemBasedOnDate(widget.Selected) 167 } 168 169 widget.persist() 170 widget.display() 171 } 172 173 func (widget *Widget) toggleChecked() { 174 selectedItem := widget.SelectedItem() 175 if selectedItem == nil { 176 return 177 } 178 179 selectedItem.Toggle() 180 181 if !selectedItem.Checked { 182 widget.Selected = widget.placeItemBasedOnDate(widget.Selected) 183 } 184 185 widget.persist() 186 widget.display() 187 } 188 189 func (widget *Widget) unselect() { 190 if widget.showFilter != "" { 191 widget.showFilter = "" 192 } else { 193 widget.Selected = -1 194 } 195 widget.display() 196 }