From a506bdcd10fbbb0c4a89cbd2efbd2eacc54a56d0 Mon Sep 17 00:00:00 2001 From: Erik Winter Date: Sun, 24 Dec 2023 10:16:11 +0100 Subject: [PATCH] more idiomatic setup of tui --- cmd/terminal-client/tui/basemodel.go | 35 ++++++++++------- cmd/terminal-client/tui/command.go | 22 +++++++++++ cmd/terminal-client/tui/movie.go | 11 ++++++ cmd/terminal-client/tui/tabemdb.go | 57 ++++++++++------------------ cmd/terminal-client/tui/tui.go | 11 +----- 5 files changed, 78 insertions(+), 58 deletions(-) diff --git a/cmd/terminal-client/tui/basemodel.go b/cmd/terminal-client/tui/basemodel.go index c873468..9c281bf 100644 --- a/cmd/terminal-client/tui/basemodel.go +++ b/cmd/terminal-client/tui/basemodel.go @@ -11,13 +11,12 @@ import ( ) type baseModel struct { - config Config emdb *client.EMDB tmdb *client.TMDB Tabs []string TabContent tea.Model activeTab int - ready bool + initialized bool logger *Logger logViewport viewport.Model windowSize tea.WindowSizeMsg @@ -25,6 +24,22 @@ type baseModel struct { tabSize tea.WindowSizeMsg } +func NewBaseModel(emdb *client.EMDB, tmdb *client.TMDB, logger *Logger) (tea.Model, tea.Cmd) { + logViewport := viewport.New(0, 0) + logViewport.KeyMap = viewport.KeyMap{} + + m := baseModel{ + emdb: emdb, + tmdb: tmdb, + Tabs: []string{"Erik's movie database", "The movie database"}, + logViewport: logViewport, + logger: logger, + } + m.setSize() + + return m, nil +} + func (m baseModel) Init() tea.Cmd { return nil } @@ -47,8 +62,10 @@ func (m baseModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } case tea.WindowSizeMsg: m.windowSize = msg - if !m.ready { - m.initialModel() + if !m.initialized { + m.TabContent, cmd = NewEMDBTab(m.emdb, m.logger) + cmds = append(cmds, cmd) + m.initialized = true } m.Log(fmt.Sprintf("new window size: %dx%d", msg.Width, msg.Height)) m.setSize() @@ -76,7 +93,7 @@ func (m *baseModel) Log(msg string) { } func (m baseModel) View() string { - if !m.ready { + if !m.initialized { return "\n Initializing..." } @@ -116,14 +133,6 @@ func (m *baseModel) renderLog() string { return windowStyle.Width(m.contentSize.Width).Height(logLineCount).Render(m.logViewport.View()) } -func (m *baseModel) initialModel() { - m.logViewport = viewport.New(0, 0) - m.logViewport.KeyMap = viewport.KeyMap{} - m.setSize() - - m.ready = true -} - func (m *baseModel) setSize() { logHeight := logLineCount + docStyle.GetVerticalFrameSize() menuHeight := 1 diff --git a/cmd/terminal-client/tui/command.go b/cmd/terminal-client/tui/command.go index 89aa0ee..1453173 100644 --- a/cmd/terminal-client/tui/command.go +++ b/cmd/terminal-client/tui/command.go @@ -1 +1,23 @@ package tui + +import ( + "fmt" + + "ewintr.nl/emdb/client" + tea "github.com/charmbracelet/bubbletea" +) + +func FetchMovieList(emdb *client.EMDB, logger *Logger) tea.Cmd { + return func() tea.Msg { + logger.Log("fetching emdb movies...") + ems, err := emdb.GetMovies() + if err != nil { + logger.Log(err.Error()) + } + + //m.list.SetItems(items) + logger.Log(fmt.Sprintf("found %d movies in in emdb", len(ems))) + + return Movies(ems) + } +} diff --git a/cmd/terminal-client/tui/movie.go b/cmd/terminal-client/tui/movie.go index bcf1f48..a9ff926 100644 --- a/cmd/terminal-client/tui/movie.go +++ b/cmd/terminal-client/tui/movie.go @@ -4,6 +4,7 @@ import ( "fmt" "ewintr.nl/emdb/model" + "github.com/charmbracelet/bubbles/list" ) type Movie struct { @@ -21,3 +22,13 @@ func (m Movie) Title() string { func (m Movie) Description() string { return fmt.Sprintf("%s", m.m.Summary) } + +type Movies []model.Movie + +func (ms Movies) listItems() []list.Item { + items := []list.Item{} + for _, m := range ms { + items = append(items, Movie{m: m}) + } + return items +} diff --git a/cmd/terminal-client/tui/tabemdb.go b/cmd/terminal-client/tui/tabemdb.go index 3083b7c..20d89f9 100644 --- a/cmd/terminal-client/tui/tabemdb.go +++ b/cmd/terminal-client/tui/tabemdb.go @@ -1,25 +1,30 @@ package tui import ( - "fmt" - + "ewintr.nl/emdb/client" "github.com/charmbracelet/bubbles/list" tea "github.com/charmbracelet/bubbletea" ) type emdbTab struct { - ready bool - list list.Model - parent *baseModel - logger *Logger + initialized bool + list list.Model + emdb *client.EMDB + logger *Logger } -func NewEMDBTab(parent *baseModel, logger *Logger) tea.Model { - m := emdbTab{} - m.parent = parent - m.logger = logger +func NewEMDBTab(emdb *client.EMDB, logger *Logger) (tea.Model, tea.Cmd) { + list := list.New([]list.Item{}, list.NewDefaultDelegate(), 0, 0) + list.Title = "Movies" + list.SetShowHelp(false) - return m + m := emdbTab{ + emdb: emdb, + logger: logger, + list: list, + } + + return m, FetchMovieList(emdb, logger) } func (m emdbTab) Init() tea.Cmd { @@ -32,10 +37,13 @@ func (m emdbTab) Update(msg tea.Msg) (tea.Model, tea.Cmd) { switch msg := msg.(type) { case TabSizeMsgType: - if !m.ready { - m.initialModel() + if !m.initialized { + //cmds = append(cmds, FetchMovieList(m.emdb, m.logger)) + m.initialized = true } m.list.SetSize(msg.Width, msg.Height) + case Movies: + m.list.SetItems(msg.listItems()) } m.list, cmd = m.list.Update(msg) @@ -48,29 +56,6 @@ func (m emdbTab) View() string { return m.list.View() } -func (m *emdbTab) initialModel() { - m.list = list.New([]list.Item{}, list.NewDefaultDelegate(), 0, 0) - m.list.Title = "Movies" - m.list.SetShowHelp(false) - m.refreshMovieList() - m.ready = true -} - func (m *emdbTab) Log(s string) { m.logger.Log(s) } - -func (m *emdbTab) refreshMovieList() { - m.Log("fetch emdb movies...") - ems, err := m.parent.emdb.GetMovies() - if err != nil { - m.Log(err.Error()) - } - items := make([]list.Item, len(ems)) - for i, em := range ems { - items[i] = list.Item(Movie{m: em}) - } - m.list.SetItems(items) - m.Log(fmt.Sprintf("found %d movies in in emdb", len(items))) - -} diff --git a/cmd/terminal-client/tui/tui.go b/cmd/terminal-client/tui/tui.go index 0bcb9d1..c944bb8 100644 --- a/cmd/terminal-client/tui/tui.go +++ b/cmd/terminal-client/tui/tui.go @@ -43,19 +43,12 @@ func (l *Logger) Log(s string) { type TabSizeMsgType tea.WindowSizeMsg func New(conf Config, logger *Logger) (*tea.Program, error) { - tabs := []string{"Erik's movie database", "The movie database"} tmdb, err := client.NewTMDB(conf.TMDBAPIKey) if err != nil { return nil, err } - m := baseModel{ - config: conf, - emdb: client.NewEMDB(conf.EMDBBaseURL, conf.EMDBAPIKey), - tmdb: tmdb, - Tabs: tabs, - logger: logger, - } - m.TabContent = NewEMDBTab(&m, m.logger) + emdb := client.NewEMDB(conf.EMDBBaseURL, conf.EMDBAPIKey) + m, _ := NewBaseModel(emdb, tmdb, logger) p := tea.NewProgram(m, tea.WithAltScreen())