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")
|
|
|
|
|
}
|