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 Bindings interface {
23	BindingKeys() []key.Binding
24}
25
26type Positionable interface {
27	SetPosition(x, y int) tea.Cmd
28}
29
30type Help interface {
31	Help() help.KeyMap
32}
33
34func KeyMapToSlice(t any) (bindings []key.Binding) {
35	typ := reflect.TypeOf(t)
36	if typ.Kind() != reflect.Struct {
37		return nil
38	}
39	for i := range typ.NumField() {
40		v := reflect.ValueOf(t).Field(i)
41		bindings = append(bindings, v.Interface().(key.Binding))
42	}
43	return
44}