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  }