layout.go

 1package layout
 2
 3import (
 4	"reflect"
 5
 6	"github.com/charmbracelet/bubbles/v2/help"
 7	"github.com/charmbracelet/bubbles/v2/key"
 8	tea "github.com/charmbracelet/bubbletea/v2"
 9)
10
11type Focusable interface {
12	Focus() tea.Cmd
13	Blur() tea.Cmd
14	IsFocused() bool
15}
16
17type Sizeable interface {
18	SetSize(width, height int) tea.Cmd
19	GetSize() (int, int)
20}
21
22type Help interface {
23	Help() help.KeyMap
24}
25
26type Positionable interface {
27	SetPosition(x, y int) tea.Cmd
28}
29
30func KeyMapToSlice(t any) (bindings []key.Binding) {
31	typ := reflect.TypeOf(t)
32	if typ.Kind() != reflect.Struct {
33		return nil
34	}
35	for i := range typ.NumField() {
36		v := reflect.ValueOf(t).Field(i)
37		bindings = append(bindings, v.Interface().(key.Binding))
38	}
39	return
40}