package client import ( "fmt" "strings" "github.com/alecthomas/colour" GoTomato "git.smsvc.net/pomodoro/GoTomato/pkg/models" "github.com/charmbracelet/bubbles/progress" ) var progressBar = progress.New(progress.WithDefaultGradient(), progress.WithoutPercentage()) func (a app) View() string { var body string var serverStatus string body = "Waiting for server message..." if a.pomodoro != (GoTomato.ServerMessage{}) { body = terminalOutput(a.pomodoro) desktopNotifications(a.pomodoro) } serverStatus = colour.Sprintf("^D^1disconnected: %v^R\n", client.LastErr) if client.Connected() { serverStatus = colour.Sprintf("^D^2connected to %s^R\n", client.Server) } helpView := a.help.View(a.keys) height := 10 - strings.Count(body, "\n") - strings.Count(serverStatus, "\n") - strings.Count(helpView, "\n") return body + strings.Repeat("\n", height) + serverStatus + helpView } // Return terminal output based on the passed ServerMessage func terminalOutput(pomodoro GoTomato.ServerMessage) string { var ( output string modePrefix string timerOutput string ) // header output += colour.Sprintf("^D^4Work: %d ◊ Break: %d ◊ Longbreak: %d^R\n\n", pomodoro.Settings.Work/60, pomodoro.Settings.ShortBreak/60, pomodoro.Settings.LongBreak/60, ) //body switch pomodoro.Mode { case "Idle": modePrefix = " " timerOutput = "" default: modePrefix = " " if pomodoro.Paused { modePrefix = " " } minutes := pomodoro.TimeLeft / 60 seconds := pomodoro.TimeLeft % 60 timerOutput = fmt.Sprintf("⏱ %02d:%02d", minutes, seconds) + "\n" timerOutput += progressBar.ViewAs(calc_percentage(pomodoro)) } output += fmt.Sprintf("Session: %d/%d\n", pomodoro.Session, pomodoro.Settings.Sessions, ) output += fmt.Sprintf("%s %s\n", modePrefix, pomodoro.Mode) + "\n" output += timerOutput return output } func calc_percentage(message GoTomato.ServerMessage) float64 { var duration float64 switch message.Mode { case "Work": duration = float64(message.Settings.Work) case "ShortBreak": duration = float64(message.Settings.ShortBreak) case "LongBreak", "End": duration = float64(message.Settings.LongBreak) } timeLeft := float64(message.TimeLeft) return 1.0 - (timeLeft / duration) }