From a610b19c348f61ce0d6e8eb5eb8a08fbfdb13fdc Mon Sep 17 00:00:00 2001 From: Andrei Gonchar Date: Sat, 4 May 2024 14:22:42 +0300 Subject: [PATCH] Add status message about wrong layout --- choose/choose.go | 5 +++++ play/bindings.go | 14 +++++++++++++- play/play.go | 2 ++ play/style.go | 20 +++++++++++++++++++- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/choose/choose.go b/choose/choose.go index b7830a7..6327e25 100644 --- a/choose/choose.go +++ b/choose/choose.go @@ -4,6 +4,7 @@ import ( "fmt" "io" "strings" + "time" "github.com/charmbracelet/bubbles/list" tea "github.com/charmbracelet/bubbletea" @@ -22,6 +23,7 @@ func New() tea.Model { listModel := list.New(nil, itemDelegate{}, 20, 14) listModel.SetFilteringEnabled(false) listModel.SetShowStatusBar(false) + listModel.StatusMessageLifetime = 5 * time.Second listModel.Title = "Select challenge" return choose{ @@ -61,6 +63,9 @@ func (c choose) Update(msg tea.Msg) (m tea.Model, cmd tea.Cmd) { ) case tea.KeyMsg: + if play.ValidateBindings(msg) { + return c, c.list.NewStatusMessage(play.RenderLayoutErr(msg)) + } if msg.String() == "enter" { return play.New( challenge.Challenge(c.list.SelectedItem().(item)), diff --git a/play/bindings.go b/play/bindings.go index 5f83dcb..394e991 100644 --- a/play/bindings.go +++ b/play/bindings.go @@ -1,6 +1,11 @@ package play -import "github.com/charmbracelet/bubbles/key" +import ( + "unicode" + + "github.com/charmbracelet/bubbles/key" + tea "github.com/charmbracelet/bubbletea" +) type keyBindings struct { short key.Binding @@ -53,6 +58,13 @@ func newBindings() keyBindings { } } +func ValidateBindings(msg tea.KeyMsg) bool { + return msg.Type == tea.KeyRunes && + len(msg.Runes) == 1 && + unicode.IsLetter(msg.Runes[0]) && + !unicode.Is(unicode.Latin, msg.Runes[0]) +} + func copyKey(k key.Binding, desc string) key.Binding { k.SetHelp(k.Help().Key, desc) diff --git a/play/play.go b/play/play.go index c7f7a88..995a71e 100644 --- a/play/play.go +++ b/play/play.go @@ -137,6 +137,8 @@ func (m model) Update(msg tea.Msg) (r tea.Model, cmd tea.Cmd) { case tea.KeyMsg: switch { + case ValidateBindings(msg): + return m, m.l.NewStatusMessage(RenderLayoutErr(msg)) case key.Matches(msg, m.b.Next): if m.question.questionFullyAnswered() && (!m.question.isLast) { m.currentQuestion++ diff --git a/play/style.go b/play/style.go index 0021a71..fb1a724 100644 --- a/play/style.go +++ b/play/style.go @@ -1,6 +1,11 @@ package play -import "github.com/charmbracelet/lipgloss" +import ( + "fmt" + + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/lipgloss" +) var ( questionNumberStyle = lipgloss.NewStyle().BorderStyle(lipgloss.RoundedBorder()).Padding(0, 1) @@ -8,6 +13,10 @@ var ( answerStyle = lipgloss.NewStyle(). PaddingLeft(1).PaddingRight(1). BorderStyle(lipgloss.NormalBorder()) + warningMessageStyle = lipgloss.NewStyle(). + Foreground(lipgloss.Color("231")). + Background(lipgloss.Color("166")). + Padding(0, 1) answerSelectedStyle = answerStyle.Copy(). Foreground(lipgloss.Color("170")). BorderStyle(lipgloss.DoubleBorder()). @@ -42,3 +51,12 @@ var ( Foreground(lipgloss.Color("170")). BorderForeground(lipgloss.Color("170")) ) + +func RenderLayoutErr(msg tea.KeyMsg) string { + return warningMessageStyle.Render( + fmt.Sprintf( + "'%s' have been pressed. Please, change keyboard layout to english.", + msg.String(), + ), + ) +}