project-manager

Project directory management for macOS
git clone git://git.lair.cx/project-manager
Log | Files | Refs | README | LICENSE

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 }