From 25d0e0aa9955c032074730059e6487e629107d9e Mon Sep 17 00:00:00 2001 From: Tai Groot Date: Fri, 24 Feb 2023 18:48:49 -0800 Subject: [PATCH] break out cli into ui subpackage --- cmd/cli/cli.go | 411 +----------------------------------------- ui/bb.go | 21 --- ui/commitlog.go | 137 ++++++++++++++ ui/graph.go | 89 +++++++++ ui/graph/graph.go | 56 ------ ui/graph/help/help.go | 30 --- ui/settings.go | 84 +++++++++ ui/ui.go | 154 ++++++++++++++++ 8 files changed, 466 insertions(+), 516 deletions(-) delete mode 100644 ui/bb.go create mode 100644 ui/commitlog.go create mode 100644 ui/graph.go delete mode 100644 ui/graph/graph.go delete mode 100644 ui/graph/help/help.go create mode 100644 ui/settings.go create mode 100644 ui/ui.go diff --git a/cmd/cli/cli.go b/cmd/cli/cli.go index 08d606d..2030784 100644 --- a/cmd/cli/cli.go +++ b/cmd/cli/cli.go @@ -3,420 +3,13 @@ package main import ( "fmt" "os" - "path/filepath" - "strings" - "time" - "github.com/charmbracelet/bubbles/help" - "github.com/charmbracelet/bubbles/key" - "github.com/charmbracelet/bubbles/list" - "github.com/charmbracelet/bubbles/table" tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" - - "github.com/taigrr/gico/commits" - "github.com/taigrr/gico/types" + "github.com/taigrr/gico/ui" ) -const ( - settings Cursor = iota - graph - commitLog - - authors SettingsCursor = iota - repos -) - -type ( - Cursor int - errMsg error - model struct { - SettingsModel Settings - GraphModel Graph - CommitLogModel CommitLog - HelpModel help.Model - Bindings []key.Binding - quitting bool - cursor Cursor - err error - } - CommitLog struct { - Year int - YearDay int - Commits [][]types.Commit - Authors []string - Repos []string - Table table.Model - } - SettingsCursor int - Settings struct { - AllAuthors map[string]bool - SelectedAuthors []string - AllRepos map[string]bool - SelectedRepos []string - cursor SettingsCursor - highlightedEntry int - AuthorList list.Model - RepoList list.Model - } - Graph struct { - Selected int - Year int - Repos []string - Authors []string - } -) - -var ( - quitKeys = key.NewBinding( - key.WithKeys("q", "esc", "ctrl+c"), - key.WithHelp("", "press q to quit"), - ) - settingsKey = key.NewBinding( - key.WithKeys("ctrl+g"), - key.WithHelp("", "press ctrl+g to open settings"), - ) -) - -func initialModel() (model, error) { - var m model - var err error - m.SettingsModel, err = NewSettings() - if err != nil { - return m, err - } - m.GraphModel, err = NewGraph(m.SettingsModel.SelectedAuthors, m.SettingsModel.SelectedRepos) - if err != nil { - return m, err - } - m.CommitLogModel, err = NewCommitLog() - if err != nil { - return m, err - } - m.cursor = graph - m.HelpModel = help.New() - m.Bindings = []key.Binding{ - quitKeys, - settingsKey, - m.CommitLogModel.Table.KeyMap.LineDown, - m.CommitLogModel.Table.KeyMap.LineUp, - m.CommitLogModel.Table.KeyMap.PageUp, - m.CommitLogModel.Table.KeyMap.PageDown, - } - - return m, nil -} - -func (m model) Init() tea.Cmd { - return nil -} - -func (m Settings) Update(msg tea.Msg) (tea.Model, tea.Cmd) { - return m, nil -} - -func (m Settings) Init() tea.Cmd { - return nil -} - -func (m Settings) View() string { - return fmt.Sprintf("This is the settings view %s", "fmt") -} - -func (m CommitLog) Update(msg tea.Msg) (tea.Model, tea.Cmd) { - switch msg := msg.(type) { - case tea.KeyMsg: - switch msg.String() { - case "j", "k", "b", "n", "pgdown", "pgup": - default: - mr := commits.RepoSet(m.Repos) - cis, _ := mr.GetRepoCommits(m.Year, m.Authors) - m.Commits = cis - commits := m.Commits[m.YearDay] - rows := []table.Row{} - for _, c := range commits { - repo := filepath.Base(c.Repo) - r := table.Row{ - c.TimeStamp.Format("0" + time.Kitchen), - repo, - c.Author.Name, - c.Message, - } - rows = append(rows, r) - } - m.Table.SetRows(rows) - m.Table.SetCursor(0) - } - } - var cmd tea.Cmd - m.Table, cmd = m.Table.Update(msg) - return m, cmd -} - -func newTable() table.Model { - t := table.New() - t.SetColumns([]table.Column{ - {Title: "Time", Width: 8}, - {Title: "Repository", Width: 20}, - {Title: "Author", Width: 15}, - {Title: "Message", Width: 40}, - }) - t.KeyMap.LineUp = key.NewBinding(key.WithKeys("k"), - key.WithHelp("k", "move up one commit")) - t.KeyMap.LineDown = key.NewBinding(key.WithKeys("j"), - key.WithHelp("j", "move down one commit")) - t.Focus() - return t -} - -func (m CommitLog) Init() tea.Cmd { - return nil -} - -func (m CommitLog) View() string { - if len(m.Commits) == 0 { - return "No commits to display" - } - - if len(m.Commits[m.YearDay]) == 0 { - return "No commits to display" - } - var b strings.Builder - b.WriteString("\nCommit Log\n\n") - b.WriteString(m.Table.View()) - return b.String() - // return fmt.Sprintf("This is the Commit Log, selected %v", "sd") -} - -func YearLen(year int) int { - yearLen := 365 - if year%4 == 0 { - yearLen++ - } - return yearLen -} - -func (m Graph) Update(msg tea.Msg) (tea.Model, tea.Cmd) { - yearLen := YearLen(m.Year) - prevYearLen := YearLen(m.Year - 1) - switch msg := msg.(type) { - case tea.KeyMsg: - switch msg.String() { - case "down": - if m.Selected%7 != 6 { - m.Selected++ - } - case "up": - if m.Selected%7 != 0 { - m.Selected-- - } - case "left": - if m.Selected > 6 { - m.Selected -= 7 - } else { - // TODO calculate the square for this day last year - m.Selected -= 7 - m.Selected += prevYearLen - m.Year-- - go func() { - mr := commits.RepoSet(m.Repos) - mr.FrequencyChan(m.Year-1, m.Authors) - }() - } - case "right": - if m.Selected < yearLen-7 { - m.Selected += 7 - } else { - m.Selected += 7 - m.Selected -= yearLen - m.Year++ - go func() { - mr := commits.RepoSet(m.Repos) - mr.FrequencyChan(m.Year+1, m.Authors) - }() - } - } - } - return m, nil -} - -func NewCommitLog() (CommitLog, error) { - var m CommitLog - now := time.Now() - today := now.YearDay() - 1 - year := now.Year() - aName, err := commits.GetAuthorName() - if err != nil { - return m, err - } - aEmail, err := commits.GetAuthorEmail() - if err != nil { - return m, err - } - mr, err := commits.GetMRRepos() - if err != nil { - return m, err - } - m.Authors = []string{aName, aEmail} - m.Repos = mr - m.Year = year - m.YearDay = today - m.Table = newTable() - { - cis, _ := mr.GetRepoCommits(m.Year, m.Authors) - m.Commits = cis - commits := m.Commits[m.YearDay] - rows := []table.Row{} - for _, c := range commits { - repo := filepath.Base(c.Repo) - r := table.Row{ - c.TimeStamp.Format("0" + time.Kitchen), - repo, - c.Author.Name, - c.Message, - } - rows = append(rows, r) - } - m.Table.SetRows(rows) - } - m.Commits, err = mr.GetRepoCommits(m.Year, m.Authors) - if err != nil { - return m, err - } - m.Table.SetCursor(0) - return m, err -} - -func NewSettings() (Settings, error) { - var m Settings - var err error - m.cursor = authors - allRepos, err := commits.GetMRRepos() - if err != nil { - return m, err - } - allAuthors, err := commits.RepoSet(allRepos).GetRepoAuthors() - if err != nil { - return m, err - } - - m.AllRepos = make(map[string]bool) - for _, v := range allRepos { - m.AllRepos[v] = true - } - - m.AllAuthors = make(map[string]bool) - for _, v := range allAuthors { - m.AllAuthors[v] = false - } - m.SelectedRepos = allRepos - email, _ := commits.GetAuthorEmail() - if email != "" { - m.SelectedAuthors = append(m.SelectedAuthors, email) - } - name, _ := commits.GetAuthorName() - if name != "" { - m.SelectedAuthors = append(m.SelectedAuthors, name) - } - for _, v := range m.SelectedRepos { - m.AllAuthors[v] = true - } - return m, nil -} - -func NewGraph(authors, repos []string) (Graph, error) { - var m Graph - now := time.Now() - today := now.YearDay() - 1 - year := now.Year() - m.Repos = repos - m.Authors = authors - m.Year = year - m.Selected = today - return m, nil -} - -func (m Graph) Init() tea.Cmd { - go func() { - mr := commits.RepoSet(m.Repos) - mr.FrequencyChan(m.Year-1, m.Authors) - mr.FrequencyChan(m.Year+1, m.Authors) - }() - return nil -} - -func (m Graph) View() string { - mr := commits.RepoSet(m.Repos) - gfreq, _ := mr.FrequencyChan(m.Year, m.Authors) - return gfreq.StringSelected(m.Selected) -} - -func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { - switch cmd := msg.(type) { - - case tea.KeyMsg: - if key.Matches(cmd, settingsKey) { - switch m.cursor { - case settings: - m.cursor = graph - default: - m.cursor = settings - } - } - if key.Matches(cmd, quitKeys) { - m.quitting = true - return m, tea.Quit - } - case errMsg: - m.err = cmd - return m, nil - - default: - } - switch m.cursor { - // multiple cursors defined for extensibility, but only graph is used - case graph, commitLog: - m.GraphModel.Authors = m.SettingsModel.SelectedAuthors - m.GraphModel.Repos = m.SettingsModel.SelectedRepos - - m.CommitLogModel.Authors = m.SettingsModel.SelectedAuthors - m.CommitLogModel.Repos = m.SettingsModel.SelectedRepos - - tmp, _ := m.GraphModel.Update(msg) - m.GraphModel, _ = tmp.(Graph) - - m.CommitLogModel.Year = m.GraphModel.Year - if m.CommitLogModel.YearDay != m.GraphModel.Selected { - m.CommitLogModel.YearDay = m.GraphModel.Selected - m.CommitLogModel.Table.SetCursor(0) - } - tmpC, cmd := m.CommitLogModel.Update(msg) - m.CommitLogModel, _ = tmpC.(CommitLog) - return m, cmd - case settings: - tmp, cmd := m.SettingsModel.Update(msg) - m.SettingsModel, _ = tmp.(Settings) - return m, cmd - } - return m, nil -} - -func (m model) View() string { - if m.err != nil { - return m.err.Error() - } - if m.quitting { - return "" - } - mainView := lipgloss.JoinVertical(lipgloss.Top, m.GraphModel.View(), m.CommitLogModel.View(), m.HelpModel.ShortHelpView(m.Bindings)) - if m.cursor == settings { - return lipgloss.JoinHorizontal(lipgloss.Left, m.SettingsModel.View(), mainView) - } - return mainView -} - func main() { - m, err := initialModel() + m, err := ui.InitialModel() if err != nil { panic(err) } diff --git a/ui/bb.go b/ui/bb.go deleted file mode 100644 index b1901e1..0000000 --- a/ui/bb.go +++ /dev/null @@ -1,21 +0,0 @@ -package ui - -import ( - "fmt" - "os" - - tea "github.com/charmbracelet/bubbletea" - "github.com/taigrr/gico/ui/graph" -) - -func InteractiveGraph() { - m := graph.New() - // df := lipgloss.NewDoeFoot() - // m = m.UpdateDoeFoot(df) - - p := tea.NewProgram(m) - if err := p.Start(); err != nil { - fmt.Printf("Error: %v", err) - os.Exit(1) - } -} diff --git a/ui/commitlog.go b/ui/commitlog.go new file mode 100644 index 0000000..999ee38 --- /dev/null +++ b/ui/commitlog.go @@ -0,0 +1,137 @@ +package ui + +import ( + "path/filepath" + "strings" + "time" + + "github.com/charmbracelet/bubbles/key" + "github.com/charmbracelet/bubbles/table" + tea "github.com/charmbracelet/bubbletea" + + "github.com/taigrr/gico/commits" + "github.com/taigrr/gico/types" +) + +type ( + CommitLog struct { + Year int + YearDay int + Commits [][]types.Commit + Authors []string + Repos []string + Table table.Model + } +) + +func (m CommitLog) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch msg := msg.(type) { + case tea.KeyMsg: + switch msg.String() { + case "j", "k", "b", "n", "pgdown", "pgup": + default: + mr := commits.RepoSet(m.Repos) + cis, _ := mr.GetRepoCommits(m.Year, m.Authors) + m.Commits = cis + commits := m.Commits[m.YearDay] + rows := []table.Row{} + for _, c := range commits { + repo := filepath.Base(c.Repo) + r := table.Row{ + c.TimeStamp.Format("0" + time.Kitchen), + repo, + c.Author.Name, + c.Message, + } + rows = append(rows, r) + } + m.Table.SetRows(rows) + m.Table.SetCursor(0) + } + } + var cmd tea.Cmd + m.Table, cmd = m.Table.Update(msg) + return m, cmd +} + +func newTable() table.Model { + t := table.New() + t.SetColumns([]table.Column{ + {Title: "Time", Width: 8}, + {Title: "Repository", Width: 20}, + {Title: "Author", Width: 15}, + {Title: "Message", Width: 40}, + }) + t.KeyMap.LineUp = key.NewBinding(key.WithKeys("k"), + key.WithHelp("k", "move up one commit")) + t.KeyMap.LineDown = key.NewBinding(key.WithKeys("j"), + key.WithHelp("j", "move down one commit")) + t.Focus() + return t +} + +func (m CommitLog) Init() tea.Cmd { + return nil +} + +func (m CommitLog) View() string { + if len(m.Commits) == 0 { + return "No commits to display" + } + + if len(m.Commits[m.YearDay]) == 0 { + return "No commits to display" + } + var b strings.Builder + b.WriteString("\nCommit Log\n\n") + b.WriteString(m.Table.View()) + return b.String() + // return fmt.Sprintf("This is the Commit Log, selected %v", "sd") +} + +func NewCommitLog() (CommitLog, error) { + var m CommitLog + now := time.Now() + today := now.YearDay() - 1 + year := now.Year() + aName, err := commits.GetAuthorName() + if err != nil { + return m, err + } + aEmail, err := commits.GetAuthorEmail() + if err != nil { + return m, err + } + mr, err := commits.GetMRRepos() + if err != nil { + return m, err + } + m.Authors = []string{aName, aEmail} + m.Repos = mr + m.Year = year + m.YearDay = today + m.Table = newTable() + { + cis, _ := mr.GetRepoCommits(m.Year, m.Authors) + m.Commits = cis + commits := m.Commits[m.YearDay] + rows := []table.Row{} + for _, c := range commits { + repo := filepath.Base(c.Repo) + r := table.Row{ + c.TimeStamp.Format("0" + time.Kitchen), + repo, + c.Author.Name, + c.Message, + } + rows = append(rows, r) + } + m.Table.SetRows(rows) + } + m.Commits, err = mr.GetRepoCommits(m.Year, m.Authors) + if err != nil { + return m, err + } + m.Table.SetCursor(0) + return m, err +} diff --git a/ui/graph.go b/ui/graph.go new file mode 100644 index 0000000..31a1518 --- /dev/null +++ b/ui/graph.go @@ -0,0 +1,89 @@ +package ui + +import ( + "time" + + tea "github.com/charmbracelet/bubbletea" + + "github.com/taigrr/gico/commits" +) + +type ( + Graph struct { + Selected int + Year int + Repos []string + Authors []string + } +) + +func (m Graph) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + yearLen := YearLen(m.Year) + prevYearLen := YearLen(m.Year - 1) + switch msg := msg.(type) { + case tea.KeyMsg: + switch msg.String() { + case "down": + if m.Selected%7 != 6 { + m.Selected++ + } + case "up": + if m.Selected%7 != 0 { + m.Selected-- + } + case "left": + if m.Selected > 6 { + m.Selected -= 7 + } else { + // TODO calculate the square for this day last year + m.Selected -= 7 + m.Selected += prevYearLen + m.Year-- + go func() { + mr := commits.RepoSet(m.Repos) + mr.FrequencyChan(m.Year-1, m.Authors) + }() + } + case "right": + if m.Selected < yearLen-7 { + m.Selected += 7 + } else { + m.Selected += 7 + m.Selected -= yearLen + m.Year++ + go func() { + mr := commits.RepoSet(m.Repos) + mr.FrequencyChan(m.Year+1, m.Authors) + }() + } + } + } + return m, nil +} + +func NewGraph(authors, repos []string) (Graph, error) { + var m Graph + now := time.Now() + today := now.YearDay() - 1 + year := now.Year() + m.Repos = repos + m.Authors = authors + m.Year = year + m.Selected = today + return m, nil +} + +func (m Graph) Init() tea.Cmd { + go func() { + mr := commits.RepoSet(m.Repos) + mr.FrequencyChan(m.Year-1, m.Authors) + mr.FrequencyChan(m.Year+1, m.Authors) + }() + return nil +} + +func (m Graph) View() string { + mr := commits.RepoSet(m.Repos) + gfreq, _ := mr.FrequencyChan(m.Year, m.Authors) + return gfreq.StringSelected(m.Selected) +} diff --git a/ui/graph/graph.go b/ui/graph/graph.go deleted file mode 100644 index b3aca0d..0000000 --- a/ui/graph/graph.go +++ /dev/null @@ -1,56 +0,0 @@ -package graph - -import ( - tea "github.com/charmbracelet/bubbletea" - "github.com/taigrr/gico/ui/graph/help" -) - -type Graph struct { - Help help.Help - // df lipgloss.DoeFoot -} - -func (g Graph) Update(msg tea.Msg) (tea.Model, tea.Cmd) { - var cmd tea.Cmd - switch msg := msg.(type) { - case tea.WindowSizeMsg: - h, _ := g.Help.Update(msg) - t, _ := h.(help.Help) - g.Help = t - case tea.KeyMsg: - switch msg.String() { - case "ctrl+c", "q": - return g, tea.Quit - case "right", "l": - case "up", "k": - case "down", "j": - case "left", "h": - case "G": - default: - h, _ := g.Help.Update(msg) - t, _ := h.(help.Help) - g.Help = t - } - } - return g, cmd -} - -func (g Graph) Init() tea.Cmd { - return nil -} - -func (g Graph) View() string { - return "" -} - -func New() Graph { - var g Graph - g.Help = help.New() - return g -} - -//func (g Graph) UpdateDoeFoot(df lipgloss.DoeFoot) Graph { -// g.df = df -// g.Help = g.Help.UpdateDoeFoot(df) -// return g -//} diff --git a/ui/graph/help/help.go b/ui/graph/help/help.go deleted file mode 100644 index c76e70b..0000000 --- a/ui/graph/help/help.go +++ /dev/null @@ -1,30 +0,0 @@ -package help - -import ( - tea "github.com/charmbracelet/bubbletea" -) - -type Help struct { - // df lipgloss.DoeFoot -} - -func (h Help) Update(m tea.Msg) (tea.Model, tea.Cmd) { - return h, nil -} - -func (h Help) Init() tea.Cmd { - return nil -} - -func (h Help) View() string { - return "" -} - -func New() Help { - return Help{} -} - -//func (h Help) UpdateDoeFoot(df lipgloss.DoeFoot) Help { -// h.df = df -// return h -//} diff --git a/ui/settings.go b/ui/settings.go new file mode 100644 index 0000000..d59854e --- /dev/null +++ b/ui/settings.go @@ -0,0 +1,84 @@ +package ui + +import ( + "fmt" + + "github.com/charmbracelet/bubbles/key" + "github.com/charmbracelet/bubbles/list" + tea "github.com/charmbracelet/bubbletea" + + "github.com/taigrr/gico/commits" +) + +const ( + authors SettingsCursor = iota + repos +) + +type ( + SettingsCursor int + Settings struct { + AllAuthors map[string]bool + SelectedAuthors []string + AllRepos map[string]bool + SelectedRepos []string + cursor SettingsCursor + highlightedEntry int + AuthorList list.Model + RepoList list.Model + } +) + +var settingsKey = key.NewBinding( + key.WithKeys("ctrl+g"), + key.WithHelp("", "press ctrl+g to open settings"), +) + +func (m Settings) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + return m, nil +} + +func (m Settings) Init() tea.Cmd { + return nil +} + +func (m Settings) View() string { + return fmt.Sprintf("This is the settings view %s", "fmt") +} + +func NewSettings() (Settings, error) { + var m Settings + var err error + m.cursor = authors + allRepos, err := commits.GetMRRepos() + if err != nil { + return m, err + } + allAuthors, err := commits.RepoSet(allRepos).GetRepoAuthors() + if err != nil { + return m, err + } + + m.AllRepos = make(map[string]bool) + for _, v := range allRepos { + m.AllRepos[v] = true + } + + m.AllAuthors = make(map[string]bool) + for _, v := range allAuthors { + m.AllAuthors[v] = false + } + m.SelectedRepos = allRepos + email, _ := commits.GetAuthorEmail() + if email != "" { + m.SelectedAuthors = append(m.SelectedAuthors, email) + } + name, _ := commits.GetAuthorName() + if name != "" { + m.SelectedAuthors = append(m.SelectedAuthors, name) + } + for _, v := range m.SelectedRepos { + m.AllAuthors[v] = true + } + return m, nil +} diff --git a/ui/ui.go b/ui/ui.go new file mode 100644 index 0000000..7ff1328 --- /dev/null +++ b/ui/ui.go @@ -0,0 +1,154 @@ +package ui + +import ( + "fmt" + "os" + + "github.com/charmbracelet/bubbles/help" + "github.com/charmbracelet/bubbles/key" + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/lipgloss" +) + +const ( + settings Cursor = iota + graph + commitLog +) + +type ( + Cursor int + errMsg error + model struct { + SettingsModel Settings + GraphModel Graph + CommitLogModel CommitLog + HelpModel help.Model + Bindings []key.Binding + quitting bool + cursor Cursor + err error + } +) + +var quitKeys = key.NewBinding( + key.WithKeys("q", "esc", "ctrl+c"), + key.WithHelp("", "press q to quit"), +) + +func InitialModel() (model, error) { + var m model + var err error + m.SettingsModel, err = NewSettings() + if err != nil { + return m, err + } + m.GraphModel, err = NewGraph(m.SettingsModel.SelectedAuthors, m.SettingsModel.SelectedRepos) + if err != nil { + return m, err + } + m.CommitLogModel, err = NewCommitLog() + if err != nil { + return m, err + } + m.cursor = graph + m.HelpModel = help.New() + m.Bindings = []key.Binding{ + quitKeys, + settingsKey, + m.CommitLogModel.Table.KeyMap.LineDown, + m.CommitLogModel.Table.KeyMap.LineUp, + m.CommitLogModel.Table.KeyMap.PageUp, + m.CommitLogModel.Table.KeyMap.PageDown, + } + + return m, nil +} + +func (m model) Init() tea.Cmd { + return nil +} + +func YearLen(year int) int { + yearLen := 365 + if year%4 == 0 { + yearLen++ + } + return yearLen +} + +func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + switch cmd := msg.(type) { + + case tea.KeyMsg: + if key.Matches(cmd, settingsKey) { + switch m.cursor { + case settings: + m.cursor = graph + default: + m.cursor = settings + } + } + if key.Matches(cmd, quitKeys) { + m.quitting = true + return m, tea.Quit + } + case errMsg: + m.err = cmd + return m, nil + + default: + } + switch m.cursor { + // multiple cursors defined for extensibility, but only graph is used + case graph, commitLog: + m.GraphModel.Authors = m.SettingsModel.SelectedAuthors + m.GraphModel.Repos = m.SettingsModel.SelectedRepos + + m.CommitLogModel.Authors = m.SettingsModel.SelectedAuthors + m.CommitLogModel.Repos = m.SettingsModel.SelectedRepos + + tmp, _ := m.GraphModel.Update(msg) + m.GraphModel, _ = tmp.(Graph) + + m.CommitLogModel.Year = m.GraphModel.Year + if m.CommitLogModel.YearDay != m.GraphModel.Selected { + m.CommitLogModel.YearDay = m.GraphModel.Selected + m.CommitLogModel.Table.SetCursor(0) + } + tmpC, cmd := m.CommitLogModel.Update(msg) + m.CommitLogModel, _ = tmpC.(CommitLog) + return m, cmd + case settings: + tmp, cmd := m.SettingsModel.Update(msg) + m.SettingsModel, _ = tmp.(Settings) + return m, cmd + } + return m, nil +} + +func (m model) View() string { + if m.err != nil { + return m.err.Error() + } + if m.quitting { + return "" + } + mainView := lipgloss.JoinVertical(lipgloss.Top, m.GraphModel.View(), m.CommitLogModel.View(), m.HelpModel.ShortHelpView(m.Bindings)) + if m.cursor == settings { + return lipgloss.JoinHorizontal(lipgloss.Left, m.SettingsModel.View(), mainView) + } + return mainView +} + +func main() { + m, err := InitialModel() + if err != nil { + panic(err) + } + p := tea.NewProgram(m) + if _, err := p.Run(); err != nil { + fmt.Println(err) + os.Exit(1) + } +}