diff options
author | Santo Cariotti <santo@dcariotti.me> | 2025-04-08 14:37:33 +0200 |
---|---|---|
committer | Santo Cariotti <santo@dcariotti.me> | 2025-04-08 14:39:13 +0200 |
commit | 1f0d9ec8452f15c27cd33c4e3874454c35993743 (patch) | |
tree | c453a31ae5eb823aaf48868eea9fc4daf65f108b /pkg/ui/views/views.go | |
parent | c5b10e28b358308d8349b940af09f64368172f2e (diff) |
Use internal/pkg structure
Diffstat (limited to 'pkg/ui/views/views.go')
-rw-r--r-- | pkg/ui/views/views.go | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/pkg/ui/views/views.go b/pkg/ui/views/views.go new file mode 100644 index 0000000..fa70035 --- /dev/null +++ b/pkg/ui/views/views.go @@ -0,0 +1,144 @@ +package views + +import ( + "errors" + "os" + + "os/exec" + + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/lipgloss" + "golang.org/x/term" +) + +var logo = ` +▗▄▄▖ ▗▄▖ ▗▖ ▗▖ ▗▄▖ ▗▖ ▗▖▗▖ ▗▖ ▗▄▖ +▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▛▚▖▐▌▐▛▚▖▐▌▐▌ ▐▌ +▐▛▀▚▖▐▛▀▜▌▐▛▀▜▌▐▛▀▜▌▐▌ ▝▜▌▐▌ ▝▜▌▐▛▀▜▌ +▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌▐▌ ▐▌ +` + +var ( + highlightColor = lipgloss.Color("#7ee2a8") + errorStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("#ff0000")) + altCodeStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("#666666")).Bold(true) + windowStyle = lipgloss.NewStyle().BorderForeground(highlightColor).Padding(2, 0).Align(lipgloss.Center).Border(lipgloss.RoundedBorder()) + inputStyle = lipgloss.NewStyle().Foreground(highlightColor) +) + +// Get terminal size dynamically +func GetTerminalSize() (width, height int) { + fd := int(os.Stdin.Fd()) + if w, h, err := term.GetSize(fd); err == nil { + return w, h + } + return 80, 24 // Default size if detection fails +} + +// Clear terminal screen +func ClearScreen() { + if len(os.Getenv("DEBUG")) == 0 { + cmd := exec.Command("clear") + if os.Getenv("OS") == "Windows_NT" { + cmd = exec.Command("cmd", "/c", "cls") + } + cmd.Stdout = os.Stdout + cmd.Run() + } +} + +func getFormWidth(width int) int { + formWidth := width * 2 / 3 + if formWidth > 80 { + formWidth = 80 // Cap at 80 chars for readability + } else if formWidth < 40 { + formWidth = width - 4 // For small terminals + } + + return formWidth +} + +type RahannaModel struct { + width int + height int + currentModel tea.Model + auth AuthModel + play PlayModel +} + +func NewRahannaModel() RahannaModel { + width, height := GetTerminalSize() + + auth := NewAuthModel(width, height) + play := NewPlayModel(width, height) + + var currentModel tea.Model = auth + + if _, err := os.Stat(".rahannarc"); !errors.Is(err, os.ErrNotExist) { + currentModel = play + } + + return RahannaModel{ + width: width, + height: height, + currentModel: currentModel, + auth: auth, + play: play, + } +} + +func (m RahannaModel) Init() tea.Cmd { + return m.currentModel.Init() +} + +type switchModel struct { + model tea.Model +} + +func SwitchModelCmd(model tea.Model) tea.Cmd { + s := switchModel{ + model: model, + } + + return func() tea.Msg { + return s + } +} + +func (m RahannaModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case switchModel: + m.currentModel = msg.model + return m, nil + } + var cmd tea.Cmd + m.currentModel, cmd = m.currentModel.Update(msg) + return m, cmd +} + +func (m RahannaModel) View() string { + return m.currentModel.View() +} + +func handleExit(msg tea.Msg) tea.Cmd { + switch msg := msg.(type) { + case tea.KeyMsg: + switch msg.String() { + case "ctrl+c": + return tea.Quit + } + } + + return nil +} + +func getLogo(width int) string { + logoStyle := lipgloss.NewStyle(). + Foreground(lipgloss.Color("#7ee2a8")). + Bold(true). + Align(lipgloss.Center). + Width(width) + + return logoStyle.Render(logo) + +} |