diff options
Diffstat (limited to 'internal/switcher')
-rw-r--r-- | internal/switcher/keys.go | 40 | ||||
-rw-r--r-- | internal/switcher/switcher.go | 51 |
2 files changed, 71 insertions, 20 deletions
diff --git a/internal/switcher/keys.go b/internal/switcher/keys.go index e019ba1..215a8e2 100644 --- a/internal/switcher/keys.go +++ b/internal/switcher/keys.go @@ -3,7 +3,7 @@ package switcher import "github.com/charmbracelet/bubbles/key" type keybinds struct { - next, prev, cpHex, cpRgb, cpHsl, cpCmyk, quit key.Binding + next, prev, cpHex, cpRgb, cpHsl, cpCmyk, help, quit key.Binding } func newKeybinds() keybinds { @@ -14,23 +14,27 @@ func newKeybinds() keybinds { ), prev: key.NewBinding( key.WithKeys("shift+tab"), - key.WithHelp("shift+tab", "previous picker"), + key.WithHelp("shift+tab", "prev. picker"), ), cpHex: key.NewBinding( key.WithKeys("x"), - key.WithHelp("x", "yank/copy hex value"), + key.WithHelp("x", "copy hex"), ), cpRgb: key.NewBinding( key.WithKeys("r"), - key.WithHelp("r", "yank/copy RGB value"), + key.WithHelp("r", "copy rgb"), ), cpHsl: key.NewBinding( key.WithKeys("s"), - key.WithHelp("s", "yank/copy HSL value"), + key.WithHelp("s", "copy hsl"), ), cpCmyk: key.NewBinding( key.WithKeys("c"), - key.WithHelp("c", "yank/copy CMYK value"), + key.WithHelp("c", "copy cmyk"), + ), + help: key.NewBinding( + key.WithKeys("?"), + key.WithHelp("?", "help"), ), quit: key.NewBinding( key.WithKeys("q", "ctrl+c"), @@ -41,9 +45,27 @@ func newKeybinds() keybinds { func Keys() []key.Binding { k := newKeybinds() - return []key.Binding{k.next, k.prev, k.cpHex, k.cpRgb, k.cpHsl, k.cpCmyk, k.quit} + return []key.Binding{k.next, k.prev, k.cpHex, k.cpRgb, k.cpHsl, k.cpCmyk, k.help, k.quit} +} + +func shortKeys() [][]key.Binding { + keys := make([][]key.Binding, 2) + rows := 2 + cRow := 0 + for i := 0; i < len(Keys()); i++ { + keys[cRow] = append(keys[cRow], Keys()[i]) + cRow++ + if cRow == rows { + cRow = 0 + } + } + return keys } -func (m Model) AllKeys() []key.Binding { - return append(Keys(), m.pickers[m.active].AllKeys()...) +func (m Model) AllKeys() [][]key.Binding { + keys := make([][]key.Binding, len(m.pickers[m.active].AllKeys())+1) + keys[0] = Keys() + copy(keys[1:], m.pickers[m.active].AllKeys()) + return keys + // return append(m.pickers[m.active].AllKeys(), Keys()) } diff --git a/internal/switcher/switcher.go b/internal/switcher/switcher.go index c470557..fdf91af 100644 --- a/internal/switcher/switcher.go +++ b/internal/switcher/switcher.go @@ -9,21 +9,27 @@ import ( "github.com/ChausseBenjamin/termpicker/internal/preview" "github.com/ChausseBenjamin/termpicker/internal/quit" "github.com/ChausseBenjamin/termpicker/internal/util" + "github.com/charmbracelet/bubbles/help" "github.com/charmbracelet/bubbles/key" tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/lipgloss" ) type Model struct { - active int - pickers []picker.Model - preview preview.Model + active int + pickers []picker.Model + preview preview.Model + help help.Model + fullHelp bool // When false, only show help for the switcher (not children) } func New(pickers []picker.Model) Model { return Model{ - active: 0, - pickers: pickers, - preview: *preview.New(colors.Hex(pickers[0].GetColor())), + active: 0, + pickers: pickers, + preview: *preview.New(colors.Hex(pickers[0].GetColor())), + help: help.New(), + fullHelp: false, } } @@ -51,15 +57,36 @@ func (m Model) Init() tea.Cmd { } func (m Model) View() string { - v := "|" + tabs := "|" for i, p := range m.pickers { if i == m.active { - v += fmt.Sprintf(">%s<|", p.Title()) + tabs += fmt.Sprintf(">%s<|", p.Title()) } else { - v += fmt.Sprintf(" %s |", p.Title()) + tabs += fmt.Sprintf(" %s |", p.Title()) } } - return fmt.Sprintf("%s\n%s\n%s", v, m.pickers[m.active].View(), m.preview.View()) + + pickerView := m.pickers[m.active].View() + w := lipgloss.Width(pickerView) + + m.help.Styles.ShortKey.Width(w) + var helpstr string + if m.fullHelp { + helpstr = m.help.FullHelpView(m.AllKeys()) + } else { + // This is a hack since the current view has too many keys + // and the horizontal "ShortHelpView" gets too wide. + // "FullHelpView" seperates keys by columns (and we only show the first). + // helpstr = m.help.FullHelpView([][]key.Binding{m.AllKeys()[0]}) + helpstr = m.help.FullHelpView(shortKeys()) + } + + return fmt.Sprintf("%s\n%s\n%s\n%v", + tabs, + pickerView, + m.preview.View(), + helpstr, + ) } func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { @@ -97,6 +124,9 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmyk := colors.CMYK{}.FromPrecise(pc).(colors.CMYK) util.Copy(cmyk.String()) + case key.Matches(msg, keys.help): + m.fullHelp = !m.fullHelp + case key.Matches(msg, keys.quit): return quit.Model{}, tea.Quit @@ -112,7 +142,6 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, tea.Batch(cmds...) } default: - // fmt.Printf("\nmsg: %T\n", msg) } for i, p := range m.pickers { newActive, cmd := p.Update(msg) |