twink/tui/app.go

74 lines
1.4 KiB
Go
Raw Normal View History

2025-12-06 11:01:11 +01:00
package tui
import (
2025-12-07 11:42:57 +01:00
"fmt"
2025-12-06 11:01:11 +01:00
"strings"
tea "github.com/charmbracelet/bubbletea"
)
type (
AppModel struct{
Size Size
Header HeaderModel
Screen tea.Model
2025-12-07 11:42:57 +01:00
Screens []tea.Model
2025-12-06 11:01:11 +01:00
}
)
func NewApp() AppModel {
2025-12-07 11:42:57 +01:00
screens := []tea.Model{
NewHomeScreen(),
NewNotificationScreen(),
}
2025-12-06 11:01:11 +01:00
return AppModel{
Header: NewHeader(),
2025-12-07 11:42:57 +01:00
Screen: screens[0],
Screens: screens,
2025-12-06 11:01:11 +01:00
}
}
func (m AppModel) Init() tea.Cmd {
return nil
}
func (m AppModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var cmd, headerCmd, screenCmd tea.Cmd
switch msg := msg.(type) {
case tea.WindowSizeMsg:
2025-12-07 11:42:57 +01:00
m.SetSize(msg.Width, msg.Height)
case SwitchHomeScreenMsg:
m.Screen = m.Screens[0]
case SwitchNotificationScreenMsg:
m.Screen = m.Screens[1]
2025-12-06 11:01:11 +01:00
}
m.Header, headerCmd = m.Header.Update(msg)
m.Screen, screenCmd = m.Screen.Update(msg)
return m, tea.Batch(cmd, headerCmd, screenCmd)
}
2025-12-07 11:42:57 +01:00
func (m *AppModel) SetSize(width, height int) {
m.Size = NewSize(width, height)
m.Header.SetWidth(width)
screenHeight := height - m.Header.Size.Height
switch screen := m.Screen.(type) {
case Sized:
m.Screen = screen.SetSize(width, screenHeight)
case SizedWidth:
m.Screen = screen.SetWidth(width)
case SizedHeight:
m.Screen = screen.SetHeight(screenHeight)
}
}
2025-12-06 11:01:11 +01:00
func (m AppModel) View() string {
return strings.Join([]string{
2025-12-07 11:42:57 +01:00
fmt.Sprintf("%d x %d", m.Size.Width, m.Size.Height),
2025-12-06 11:01:11 +01:00
m.Header.View(),
m.Screen.View(),
}, "\n")
}