projects.go (1445B)
1 package main 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 "path" 8 9 "github.com/charmbracelet/bubbles/list" 10 tea "github.com/charmbracelet/bubbletea" 11 ) 12 13 type Project struct { 14 Name string 15 IsActive bool 16 } 17 18 func GetProjects(config *Config) ([]*Project, error) { 19 projects := []*Project{} 20 21 dirs, err := os.ReadDir(config.ProjectDirectory) 22 if err != nil { 23 return nil, err 24 } 25 26 for _, dir := range dirs { 27 if !dir.IsDir() { 28 continue 29 } 30 31 isActive := exists(path.Join(config.ActiveDirectory, dir.Name())) 32 projects = append(projects, &Project{ 33 Name: dir.Name(), 34 IsActive: isActive, 35 }) 36 } 37 38 return projects, nil 39 } 40 41 func (p *Project) FilterValue() string { 42 return p.Name 43 } 44 45 type projectItemDelegate struct{} 46 47 func (d projectItemDelegate) Height() int { 48 return 1 49 } 50 51 func (d projectItemDelegate) Spacing() int { 52 return 0 53 } 54 55 func (d projectItemDelegate) Update(msg tea.Msg, m *list.Model) tea.Cmd { 56 return nil 57 } 58 59 func (d projectItemDelegate) Render(w io.Writer, m list.Model, index int, listItem list.Item) { 60 fmt.Fprint(w, d.render(m, index, listItem)) 61 } 62 63 func (d projectItemDelegate) render(m list.Model, index int, listItem list.Item) string { 64 project, ok := listItem.(*Project) 65 if !ok { 66 return "" 67 } 68 69 checked := " " 70 if project.IsActive { 71 checked = "x" 72 } 73 74 str := fmt.Sprintf("[%s] %s", checked, project.Name) 75 76 if index == m.Index() { 77 return selectedItemStyle.Render("> " + str) 78 } else { 79 return itemStyle.Render(str) 80 } 81 }