pop/keymap.go
2023-07-31 10:32:02 -04:00

91 lines
2.5 KiB
Go

package main
import "github.com/charmbracelet/bubbles/key"
// KeyMap represents the key bindings for the application.
type KeyMap struct {
NextInput key.Binding
PrevInput key.Binding
Send key.Binding
Attach key.Binding
Unattach key.Binding
Back key.Binding
Quit key.Binding
}
// DefaultKeybinds returns the default key bindings for the application.
func DefaultKeybinds() KeyMap {
return KeyMap{
NextInput: key.NewBinding(
key.WithKeys("tab"),
key.WithHelp("tab", "next"),
),
PrevInput: key.NewBinding(
key.WithKeys("shift+tab"),
),
Send: key.NewBinding(
key.WithKeys("ctrl+d", "enter"),
key.WithHelp("enter", "send"),
key.WithDisabled(),
),
Attach: key.NewBinding(
key.WithKeys("enter"),
key.WithHelp("enter", "attach file"),
key.WithDisabled(),
),
Unattach: key.NewBinding(
key.WithKeys("x"),
key.WithHelp("x", "remove"),
key.WithDisabled(),
),
Back: key.NewBinding(
key.WithKeys("esc"),
key.WithHelp("esc", "back"),
key.WithDisabled(),
),
Quit: key.NewBinding(
key.WithKeys("ctrl+c"),
key.WithHelp("ctrl+c", "quit"),
),
}
}
// ShortHelp returns the key bindings for the short help screen.
func (k KeyMap) ShortHelp() []key.Binding {
return []key.Binding{
k.NextInput,
k.Quit,
k.Attach,
k.Unattach,
k.Send,
}
}
// FullHelp returns the key bindings for the full help screen.
func (k KeyMap) FullHelp() [][]key.Binding {
return [][]key.Binding{
{k.NextInput, k.Send, k.Attach, k.Unattach, k.Quit},
}
}
func (m *Model) updateKeymap() {
m.keymap.Attach.SetEnabled(m.state == editingAttachments)
m.keymap.Send.SetEnabled(m.canSend() && m.state == hoveringSendButton)
m.keymap.Unattach.SetEnabled(m.state == editingAttachments && len(m.Attachments.Items()) > 0)
m.keymap.Back.SetEnabled(m.state == pickingFile)
m.filepicker.KeyMap.Up.SetEnabled(m.state == pickingFile)
m.filepicker.KeyMap.Down.SetEnabled(m.state == pickingFile)
m.filepicker.KeyMap.Back.SetEnabled(m.state == pickingFile)
m.filepicker.KeyMap.Select.SetEnabled(m.state == pickingFile)
m.filepicker.KeyMap.Open.SetEnabled(m.state == pickingFile)
m.filepicker.KeyMap.PageUp.SetEnabled(m.state == pickingFile)
m.filepicker.KeyMap.PageDown.SetEnabled(m.state == pickingFile)
m.filepicker.KeyMap.GoToTop.SetEnabled(m.state == pickingFile)
m.filepicker.KeyMap.GoToLast.SetEnabled(m.state == pickingFile)
}
func (m Model) canSend() bool {
return m.From.Value() != "" && m.To.Value() != "" && m.Subject.Value() != "" && m.Body.Value() != ""
}