From 777d2f09fc5f5b183c18a64d97ebc52cd2855daa Mon Sep 17 00:00:00 2001 From: Trevor Slocum Date: Mon, 18 May 2020 19:49:25 -0700 Subject: [PATCH] Use Keys shortcuts with Button, CheckBox, Grid and Table --- button.go | 2 +- checkbox.go | 13 ++++--------- grid.go | 28 ++++++---------------------- keys.go | 50 ++++++++++++++++++++++++++------------------------ list.go | 12 ++++++------ table.go | 36 ++++++++++-------------------------- textview.go | 40 ++++++++++------------------------------ treeview.go | 16 ++++++++-------- 8 files changed, 71 insertions(+), 126 deletions(-) diff --git a/button.go b/button.go index 38400f7..ec0ba1c 100644 --- a/button.go +++ b/button.go @@ -155,7 +155,7 @@ func (b *Button) InputHandler() func(event *tcell.EventKey, setFocus func(p Prim if b.selected != nil { b.selected() } - } else if HitShortcut(event, Keys.Cancel, Keys.PreviousField, Keys.NextField) { + } else if HitShortcut(event, Keys.Cancel, Keys.MovePreviousField, Keys.MoveNextField) { if b.blur != nil { b.blur(event.Key()) } diff --git a/checkbox.go b/checkbox.go index f80d863..b90549e 100644 --- a/checkbox.go +++ b/checkbox.go @@ -253,24 +253,19 @@ func (c *CheckBox) Draw(screen tcell.Screen) { // InputHandler returns the handler for this primitive. func (c *CheckBox) InputHandler() func(event *tcell.EventKey, setFocus func(p Primitive)) { return c.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { - // Process key event. - switch key := event.Key(); key { - case tcell.KeyRune, tcell.KeyEnter: // Check. - if key == tcell.KeyRune && event.Rune() != ' ' { - break - } + if HitShortcut(event, Keys.Select, Keys.SelectAlt) { c.Lock() c.checked = !c.checked c.Unlock() if c.changed != nil { c.changed(c.checked) } - case tcell.KeyTab, tcell.KeyBacktab, tcell.KeyEscape: // We're done. + } else if HitShortcut(event, Keys.Cancel, Keys.MovePreviousField, Keys.MoveNextField) { if c.done != nil { - c.done(key) + c.done(event.Key()) } if c.finished != nil { - c.finished(key) + c.finished(event.Key()) } } }) diff --git a/grid.go b/grid.go index b9c6225..542ac8a 100644 --- a/grid.go +++ b/grid.go @@ -324,33 +324,17 @@ func (g *Grid) InputHandler() func(event *tcell.EventKey, setFocus func(p Primit g.Lock() defer g.Unlock() - switch event.Key() { - case tcell.KeyRune: - switch event.Rune() { - case 'g': - g.rowOffset, g.columnOffset = 0, 0 - case 'G': - g.rowOffset = math.MaxInt32 - case 'j': - g.rowOffset++ - case 'k': - g.rowOffset-- - case 'h': - g.columnOffset-- - case 'l': - g.columnOffset++ - } - case tcell.KeyHome: + if HitShortcut(event, Keys.MoveFirst) { g.rowOffset, g.columnOffset = 0, 0 - case tcell.KeyEnd: + } else if HitShortcut(event, Keys.MoveLast) { g.rowOffset = math.MaxInt32 - case tcell.KeyUp: + } else if HitShortcut(event, Keys.MoveUp, Keys.MovePreviousField) { g.rowOffset-- - case tcell.KeyDown: + } else if HitShortcut(event, Keys.MoveDown, Keys.MoveNextField) { g.rowOffset++ - case tcell.KeyLeft: + } else if HitShortcut(event, Keys.MoveLeft) { g.columnOffset-- - case tcell.KeyRight: + } else if HitShortcut(event, Keys.MoveRight) { g.columnOffset++ } }) diff --git a/keys.go b/keys.go index 0a1b1db..b4a9d30 100644 --- a/keys.go +++ b/keys.go @@ -7,40 +7,42 @@ import ( // Key defines the keyboard shortcuts of an application. type Key struct { - Cancel []string - Select []string + Select []string + SelectAlt []string // SelectAlt is also used when not focusing a text input. + Cancel []string - FirstItem []string - LastItem []string + MoveUp []string + MoveDown []string + MoveLeft []string + MoveRight []string - PreviousItem []string - NextItem []string - - PreviousField []string - NextField []string - - PreviousPage []string - NextPage []string + MoveFirst []string + MoveLast []string + MovePreviousField []string + MoveNextField []string + MovePreviousPage []string + MoveNextPage []string ShowContextMenu []string } // Keys defines the keyboard shortcuts of an application. var Keys = Key{ - Cancel: []string{"Escape"}, - Select: []string{"Enter", "Ctrl+J"}, // Ctrl+J = keypad enter + Select: []string{"Enter", "Ctrl+J"}, // Ctrl+J = keypad enter + SelectAlt: []string{"Space"}, + Cancel: []string{"Escape"}, - FirstItem: []string{"Home", "g"}, - LastItem: []string{"End", "G"}, + MoveUp: []string{"Up", "k"}, + MoveDown: []string{"Down", "j"}, + MoveLeft: []string{"Left", "h"}, + MoveRight: []string{"Right", "l"}, - PreviousItem: []string{"Up", "k"}, - NextItem: []string{"Down", "j"}, - - PreviousField: []string{"Backtab"}, - NextField: []string{"Tab"}, - - PreviousPage: []string{"PageUp"}, - NextPage: []string{"PageDown"}, + MoveFirst: []string{"Home", "g"}, + MoveLast: []string{"End", "G"}, + MovePreviousField: []string{"Backtab"}, + MoveNextField: []string{"Tab"}, + MovePreviousPage: []string{"PageUp", "Ctrl+B"}, + MoveNextPage: []string{"PageDown", "Ctrl+F"}, ShowContextMenu: []string{"Alt+Enter"}, } diff --git a/list.go b/list.go index beed54f..e0c8b4a 100644 --- a/list.go +++ b/list.go @@ -939,17 +939,17 @@ func (l *List) InputHandler() func(event *tcell.EventKey, setFocus func(p Primit } if !matchesShortcut { - if HitShortcut(event, Keys.FirstItem) { + if HitShortcut(event, Keys.MoveFirst) { l.transform(TransformFirstItem) - } else if HitShortcut(event, Keys.LastItem) { + } else if HitShortcut(event, Keys.MoveLast) { l.transform(TransformLastItem) - } else if HitShortcut(event, Keys.PreviousItem, Keys.PreviousField) { + } else if HitShortcut(event, Keys.MoveUp, Keys.MovePreviousField) { l.transform(TransformPreviousItem) - } else if HitShortcut(event, Keys.NextItem, Keys.NextField) { + } else if HitShortcut(event, Keys.MoveDown, Keys.MoveNextField) { l.transform(TransformNextItem) - } else if HitShortcut(event, Keys.PreviousPage) { + } else if HitShortcut(event, Keys.MovePreviousPage) { l.transform(TransformPreviousPage) - } else if HitShortcut(event, Keys.NextPage) { + } else if HitShortcut(event, Keys.MoveNextPage) { l.transform(TransformNextPage) } } diff --git a/table.go b/table.go index 67aa9a2..6ddcb86 100644 --- a/table.go +++ b/table.go @@ -1379,39 +1379,23 @@ func (t *Table) InputHandler() func(event *tcell.EventKey, setFocus func(p Primi } ) - switch key { - case tcell.KeyRune: - switch event.Rune() { - case 'g': - home() - case 'G': - end() - case 'j': - down() - case 'k': - up() - case 'h': - left() - case 'l': - right() - } - case tcell.KeyHome: + if HitShortcut(event, Keys.MoveFirst) { home() - case tcell.KeyEnd: + } else if HitShortcut(event, Keys.MoveLast) { end() - case tcell.KeyUp: + } else if HitShortcut(event, Keys.MoveUp, Keys.MovePreviousField) { up() - case tcell.KeyDown: + } else if HitShortcut(event, Keys.MoveDown, Keys.MoveNextField) { down() - case tcell.KeyLeft: + } else if HitShortcut(event, Keys.MoveLeft) { left() - case tcell.KeyRight: + } else if HitShortcut(event, Keys.MoveRight) { right() - case tcell.KeyPgDn, tcell.KeyCtrlF: - pageDown() - case tcell.KeyPgUp, tcell.KeyCtrlB: + } else if HitShortcut(event, Keys.MovePreviousPage) { pageUp() - case tcell.KeyEnter: + } else if HitShortcut(event, Keys.MoveNextPage) { + pageDown() + } else if HitShortcut(event, Keys.Select) { if (t.rowsSelectable || t.columnsSelectable) && t.selected != nil { t.Unlock() t.selected(t.selectedRow, t.selectedColumn) diff --git a/textview.go b/textview.go index 02106d7..f47602a 100644 --- a/textview.go +++ b/textview.go @@ -1172,7 +1172,7 @@ func (t *TextView) InputHandler() func(event *tcell.EventKey, setFocus func(p Pr return t.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p Primitive)) { key := event.Key() - if key == tcell.KeyEscape || key == tcell.KeyEnter || key == tcell.KeyTab || key == tcell.KeyBacktab { + if HitShortcut(event, Keys.Cancel, Keys.Select, Keys.MovePreviousField, Keys.MoveNextField) { if t.done != nil { t.done(key) } @@ -1186,47 +1186,27 @@ func (t *TextView) InputHandler() func(event *tcell.EventKey, setFocus func(p Pr return } - switch key { - case tcell.KeyRune: - switch event.Rune() { - case 'g': // Home. - t.trackEnd = false - t.lineOffset = 0 - t.columnOffset = 0 - case 'G': // End. - t.trackEnd = true - t.columnOffset = 0 - case 'j': // Down. - t.lineOffset++ - case 'k': // Up. - t.trackEnd = false - t.lineOffset-- - case 'h': // Left. - t.columnOffset-- - case 'l': // Right. - t.columnOffset++ - } - case tcell.KeyHome: + if HitShortcut(event, Keys.MoveFirst) { t.trackEnd = false t.lineOffset = 0 t.columnOffset = 0 - case tcell.KeyEnd: + } else if HitShortcut(event, Keys.MoveLast) { t.trackEnd = true t.columnOffset = 0 - case tcell.KeyUp: + } else if HitShortcut(event, Keys.MoveUp) { t.trackEnd = false t.lineOffset-- - case tcell.KeyDown: + } else if HitShortcut(event, Keys.MoveDown) { t.lineOffset++ - case tcell.KeyLeft: + } else if HitShortcut(event, Keys.MoveLeft) { t.columnOffset-- - case tcell.KeyRight: + } else if HitShortcut(event, Keys.MoveRight) { t.columnOffset++ - case tcell.KeyPgDn, tcell.KeyCtrlF: - t.lineOffset += t.pageSize - case tcell.KeyPgUp, tcell.KeyCtrlB: + } else if HitShortcut(event, Keys.MovePreviousPage) { t.trackEnd = false t.lineOffset -= t.pageSize + } else if HitShortcut(event, Keys.MoveNextPage) { + t.lineOffset += t.pageSize } }) } diff --git a/treeview.go b/treeview.go index 71807c5..475f8bb 100644 --- a/treeview.go +++ b/treeview.go @@ -889,25 +889,25 @@ func (t *TreeView) InputHandler() func(event *tcell.EventKey, setFocus func(p Pr // Because the tree is flattened into a list only at drawing time, we also // postpone the (selection) movement to drawing time. - if HitShortcut(event, Keys.Cancel, Keys.PreviousField, Keys.NextField) { + if HitShortcut(event, Keys.Cancel, Keys.MovePreviousField, Keys.MoveNextField) { if t.done != nil { t.Unlock() t.done(event.Key()) t.Lock() } - } else if HitShortcut(event, Keys.FirstItem) { + } else if HitShortcut(event, Keys.MoveFirst) { t.movement = treeHome - } else if HitShortcut(event, Keys.LastItem) { + } else if HitShortcut(event, Keys.MoveLast) { t.movement = treeEnd - } else if HitShortcut(event, Keys.PreviousItem, Keys.PreviousField) { + } else if HitShortcut(event, Keys.MoveUp, Keys.MovePreviousField) { t.movement = treeUp - } else if HitShortcut(event, Keys.NextItem, Keys.NextField) { + } else if HitShortcut(event, Keys.MoveDown, Keys.MoveNextField) { t.movement = treeDown - } else if HitShortcut(event, Keys.PreviousPage) { + } else if HitShortcut(event, Keys.MovePreviousPage) { t.movement = treePageUp - } else if HitShortcut(event, Keys.NextPage) { + } else if HitShortcut(event, Keys.MoveNextPage) { t.movement = treePageDown - } else if HitShortcut(event, Keys.Select) || event.Rune() == ' ' { // TODO space is hardcoded + } else if HitShortcut(event, Keys.Select, Keys.SelectAlt) { t.Unlock() selectNode() t.Lock()