Add vim-style keybindings

This commit is contained in:
Trevor Slocum 2019-10-11 22:46:33 -07:00
parent 24cce86c0f
commit df42979b16
3 changed files with 95 additions and 38 deletions

View File

@ -22,6 +22,7 @@ var (
closedGUI bool
inputActive bool
showDetails bool
app *tview.Application
grid *tview.Grid
@ -262,6 +263,15 @@ func setInputStatus(active bool) {
}
}
func setShowDetails(active bool) {
if showDetails == active {
return
}
showDetails = active
draw <- event.DrawAll
}
func renderPreviewMatrix() {
g := activeGame
if g == nil || len(g.Players) == 0 || g.Players[g.LocalPlayer].Matrix.Bag == nil {
@ -428,19 +438,33 @@ func renderMatrix(m *mino.Matrix) []byte {
renderBuffer.Write(renderLRCorner)
renderBuffer.WriteRune('\n')
name := m.PlayerName
if len(name) > m.W*bs {
name = name[:m.W*bs]
}
padName := ((m.W*bs - len(name)) / 2) + 1
for i := 0; i < padName; i++ {
renderBuffer.WriteRune(' ')
}
renderBuffer.WriteString(name)
renderPlayerDetails(renderBuffer, m, bs)
return renderBuffer.Bytes()
}
func renderPlayerDetails(b bytes.Buffer, m *mino.Matrix, bs int) {
var buf string
if !showDetails {
buf = m.PlayerName
} else {
buf = strconv.Itoa(m.Speed)
}
if len(buf) > m.W*bs {
buf = buf[:m.W*bs]
}
padBuf := ((m.W*bs - len(buf)) / 2) + 1
for i := 0; i < padBuf; i++ {
renderBuffer.WriteRune(' ')
}
renderBuffer.WriteString(buf)
padBuf = m.W*bs + 2 - len(buf) - padBuf
for i := 0; i < padBuf; i++ {
renderBuffer.WriteRune(' ')
}
}
func renderMatrixes(mx []*mino.Matrix) []byte {
if mx == nil {
return nil
@ -507,19 +531,7 @@ func renderMatrixes(mx []*mino.Matrix) []byte {
renderBuffer.WriteString(div)
}
name := m.PlayerName
if len(name) > m.W*blockSize {
name = name[:m.W*blockSize]
}
padName := ((m.W*blockSize - len(name)) / 2) + 1
for i := 0; i < padName; i++ {
renderBuffer.WriteRune(' ')
}
renderBuffer.WriteString(name)
padName = (m.W * blockSize) + 2 - len(name) - padName
for i := 0; i < padName; i++ {
renderBuffer.WriteRune(' ')
}
renderPlayerDetails(renderBuffer, m, blockSize)
}
for i := range mx {

View File

@ -6,8 +6,11 @@ import (
)
func handleKeypress(ev *tcell.EventKey) *tcell.EventKey {
k := ev.Key()
r := ev.Rune()
if inputActive {
if ev.Key() == tcell.KeyEnter {
if k == tcell.KeyEnter {
msg := inputView.GetText()
if msg != "" {
if activeGame != nil {
@ -18,14 +21,15 @@ func handleKeypress(ev *tcell.EventKey) *tcell.EventKey {
}
setInputStatus(false)
} else if ev.Key() == tcell.KeyEscape {
} else if k == tcell.KeyEscape {
setInputStatus(false)
}
return ev
}
if ev.Key() == tcell.KeyUp {
switch k {
case tcell.KeyUp:
if activeGame == nil {
return ev
}
@ -35,7 +39,7 @@ func handleKeypress(ev *tcell.EventKey) *tcell.EventKey {
activeGame.Unlock()
return nil
} else if ev.Key() == tcell.KeyDown {
case tcell.KeyDown:
if activeGame == nil {
return ev
}
@ -45,7 +49,7 @@ func handleKeypress(ev *tcell.EventKey) *tcell.EventKey {
activeGame.Unlock()
return nil
} else if ev.Key() == tcell.KeyLeft {
case tcell.KeyLeft:
if activeGame == nil {
return ev
}
@ -55,7 +59,7 @@ func handleKeypress(ev *tcell.EventKey) *tcell.EventKey {
activeGame.Unlock()
return nil
} else if ev.Key() == tcell.KeyRight {
case tcell.KeyRight:
if activeGame == nil {
return ev
}
@ -65,7 +69,16 @@ func handleKeypress(ev *tcell.EventKey) *tcell.EventKey {
activeGame.Unlock()
return nil
} else if ev.Rune() == 'z' || ev.Rune() == 'Z' {
case tcell.KeyEnter:
setInputStatus(!inputActive)
case tcell.KeyTab:
setShowDetails(!showDetails)
case tcell.KeyEscape:
done <- true
}
switch r {
case 'z', 'Z':
if activeGame == nil {
return ev
}
@ -75,20 +88,53 @@ func handleKeypress(ev *tcell.EventKey) *tcell.EventKey {
activeGame.Unlock()
return nil
} else if ev.Rune() == 'x' || ev.Rune() == 'X' {
if activeGame == nil {
return ev
}
case 'x', 'X':
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.RotatePiece(1, 0)
activeGame.Unlock()
return nil
} else if ev.Key() == tcell.KeyEnter {
setInputStatus(!inputActive)
} else if ev.Key() == tcell.KeyEscape {
done <- true
case 'h', 'H':
if activeGame == nil {
return ev
}
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.MovePiece(-1, 0)
activeGame.Unlock()
return nil
case 'j', 'J':
if activeGame == nil {
return ev
}
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.MovePiece(0, -1)
activeGame.Unlock()
return nil
case 'k', 'K':
if activeGame == nil {
return ev
}
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.HardDropPiece()
activeGame.Unlock()
return nil
case 'l', 'L':
if activeGame == nil {
return ev
}
activeGame.Lock()
activeGame.Players[activeGame.LocalPlayer].Matrix.MovePiece(1, 0)
activeGame.Unlock()
return nil
}
return ev

View File

@ -867,7 +867,6 @@ func (m *Matrix) Replace(newmtx *Matrix) {
m.Lock()
defer m.Unlock()
m.W, m.H, m.B = newmtx.W, newmtx.H, newmtx.B
m.M = newmtx.M
m.P = newmtx.P
m.Preview = newmtx.Preview