Add vim-style keybindings
This commit is contained in:
parent
24cce86c0f
commit
df42979b16
3 changed files with 95 additions and 38 deletions
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue