package views import ( "fmt" "github.com/charmbracelet/bubbles/key" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) type PlayModelPage int const ( LandingPage PlayModelPage = iota InsertCodePage StartGamePage ) // Keyboard controls type playKeyMap struct { EnterNewGame key.Binding StartNewGame key.Binding GoLogout key.Binding Quit key.Binding NextPage key.Binding PrevPage key.Binding } // Default key bindings for the play model var defaultPlayKeyMap = playKeyMap{ EnterNewGame: key.NewBinding( key.WithKeys("alt+E", "alt+e"), key.WithHelp("Alt+E", "Enter a play using code"), ), StartNewGame: key.NewBinding( key.WithKeys("alt+s", "alt+S"), key.WithHelp("Alt+S", "Start a new play"), ), GoLogout: key.NewBinding( key.WithKeys("alt+Q", "alt+q"), key.WithHelp("Alt+Q", "Logout"), ), Quit: key.NewBinding( key.WithKeys("Q", "q"), key.WithHelp(" Q", "Quit"), ), NextPage: key.NewBinding( key.WithKeys("right"), key.WithHelp("→/h", "Next Page"), ), PrevPage: key.NewBinding( key.WithKeys("left"), key.WithHelp("←/l", "Prev Page"), ), } func (m PlayModel) handleKeyPress(msg tea.KeyMsg) (tea.Model, tea.Cmd) { var cmd tea.Cmd switch { case key.Matches(msg, m.keys.EnterNewGame): m.page = InsertCodePage m.namePrompt, cmd = m.namePrompt.Update("suca") return m, cmd case key.Matches(msg, m.keys.StartNewGame): m.page = StartGamePage if !m.isLoading { m.isLoading = true return m, m.newGameCallback() } case key.Matches(msg, m.keys.GoLogout): return m, logout(m.width, m.height+1) case key.Matches(msg, m.keys.Quit): return m, tea.Quit case msg.Type == tea.KeyEnter: if m.page == InsertCodePage && !m.isLoading { m.isLoading = true return m, m.enterGame() } } m.paginator, _ = m.paginator.Update(msg) if m.page == InsertCodePage { m.namePrompt, cmd = m.namePrompt.Update(msg) return m, cmd } return m, nil } func (m PlayModel) renderNavigationButtons() string { logoutKey := fmt.Sprintf("%s %s", altCodeStyle.Render(m.keys.GoLogout.Help().Key), m.keys.GoLogout.Help().Desc) quitKey := fmt.Sprintf("%s %s", altCodeStyle.Render(m.keys.Quit.Help().Key), m.keys.Quit.Help().Desc) if m.page == LandingPage { enterKey := fmt.Sprintf("%s %s", altCodeStyle.Render(m.keys.EnterNewGame.Help().Key), m.keys.EnterNewGame.Help().Desc) startKey := fmt.Sprintf("%s %s", altCodeStyle.Render(m.keys.StartNewGame.Help().Key), m.keys.StartNewGame.Help().Desc) nextPageKey := fmt.Sprintf("%s %s", altCodeStyle.Render(m.keys.NextPage.Help().Key), m.keys.NextPage.Help().Desc) prevPageKey := fmt.Sprintf("%s %s", altCodeStyle.Render(m.keys.PrevPage.Help().Key), m.keys.PrevPage.Help().Desc) return lipgloss.JoinVertical( lipgloss.Left, enterKey, startKey, lipgloss.JoinHorizontal(lipgloss.Left, prevPageKey, " | ", nextPageKey), logoutKey, quitKey, ) } return lipgloss.JoinVertical( lipgloss.Left, logoutKey, quitKey, ) }