feat(font): display font families

resolves #4168
This commit is contained in:
Jan De Dobbeleer 2023-08-27 11:01:17 +02:00 committed by Jan De Dobbeleer
parent b2f3a43d19
commit cac268bcca
2 changed files with 38 additions and 16 deletions

View file

@ -29,7 +29,7 @@ type loadMsg []*Asset
type zipMsg []byte type zipMsg []byte
type successMsg int type successMsg []string
type errMsg error type errMsg error
@ -69,12 +69,13 @@ const (
) )
type main struct { type main struct {
spinner spinner.Model spinner spinner.Model
list *list.Model list *list.Model
system bool system bool
font string font string
state state state state
err error err error
families []string
} }
func (m *main) buildFontList(nerdFonts []*Asset) { func (m *main) buildFontList(nerdFonts []*Asset) {
@ -124,12 +125,12 @@ func installLocalFontZIP(zipFile string, user bool) {
} }
func installFontZIP(zipFile []byte, user bool) { func installFontZIP(zipFile []byte, user bool) {
err := InstallZIP(zipFile, user) families, err := InstallZIP(zipFile, user)
if err != nil { if err != nil {
program.Send(errMsg(err)) program.Send(errMsg(err))
return return
} }
program.Send(successMsg(0)) program.Send(successMsg(families))
} }
func (m *main) Init() tea.Cmd { func (m *main) Init() tea.Cmd {
@ -216,6 +217,7 @@ func (m *main) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
case successMsg: case successMsg:
m.state = done m.state = done
m.families = msg
return m, tea.Quit return m, tea.Quit
case errMsg: case errMsg:
@ -251,7 +253,13 @@ func (m *main) View() string {
case quit: case quit:
return textStyle.Render("No need to install a new font? That's cool.") return textStyle.Render("No need to install a new font? That's cool.")
case done: case done:
return textStyle.Render(fmt.Sprintf("Successfully installed %s 🚀", m.font)) var builder strings.Builder
builder.WriteString(fmt.Sprintf("Successfully installed %s 🚀\n\n", m.font))
builder.WriteString("The following font families are now available for configuration:\n")
for _, family := range m.families {
builder.WriteString(fmt.Sprintf(" • %s\n", family))
}
return textStyle.Render(builder.String())
} }
return "" return ""
} }

View file

@ -10,12 +10,22 @@ import (
"strings" "strings"
) )
func InstallZIP(data []byte, user bool) error { func contains[S ~[]E, E comparable](s S, e E) bool {
for _, a := range s {
if a == e {
return true
}
}
return false
}
func InstallZIP(data []byte, user bool) ([]string, error) {
var families []string
bytesReader := bytes.NewReader(data) bytesReader := bytes.NewReader(data)
zipReader, err := zip.NewReader(bytesReader, int64(bytesReader.Len())) zipReader, err := zip.NewReader(bytesReader, int64(bytesReader.Len()))
if err != nil { if err != nil {
return err return families, err
} }
fonts := make(map[string]*Font) fonts := make(map[string]*Font)
@ -23,13 +33,13 @@ func InstallZIP(data []byte, user bool) error {
for _, zf := range zipReader.File { for _, zf := range zipReader.File {
rc, err := zf.Open() rc, err := zf.Open()
if err != nil { if err != nil {
return err return families, err
} }
defer rc.Close() defer rc.Close()
data, err := io.ReadAll(rc) data, err := io.ReadAll(rc)
if err != nil { if err != nil {
return err return families, err
} }
fontData, err := newFont(zf.Name, data) fontData, err := newFont(zf.Name, data)
@ -51,9 +61,13 @@ func InstallZIP(data []byte, user bool) error {
for _, font := range fonts { for _, font := range fonts {
if err = install(font, user); err != nil { if err = install(font, user); err != nil {
return err return families, err
}
if !contains(families, font.Family) {
families = append(families, font.Family)
} }
} }
return nil return families, nil
} }