Add icon source

This commit is contained in:
Daniel 2023-12-22 14:20:10 +01:00
parent 496016b810
commit f7f64e6b46
4 changed files with 46 additions and 12 deletions

View file

@ -35,8 +35,9 @@ func GetIconAndName(ctx context.Context, binPath string, homeDir string) (icon *
} }
return &Icon{ return &Icon{
Type: IconTypeAPI, Type: IconTypeAPI,
Value: filename, Value: filename,
Source: IconSourceCore,
}, name, nil }, name, nil
} }

View file

@ -15,8 +15,9 @@ import (
// Icon describes an icon. // Icon describes an icon.
type Icon struct { type Icon struct {
Type IconType Type IconType
Value string Value string
Source IconSource
} }
// IconType describes the type of an Icon. // IconType describes the type of an Icon.
@ -38,16 +39,46 @@ func (t IconType) sortOrder() int {
case IconTypeFile: case IconTypeFile:
return 3 return 3
default: default:
return 100 return 9
} }
} }
// IconSource describes the source of an Icon.
type IconSource string
// Supported icon sources.
const (
IconSourceUser IconSource = "user"
IconSourceImport IconSource = "import"
IconSourceUI IconSource = "ui"
IconSourceCore IconSource = "core"
)
func (s IconSource) sortOrder() int {
switch s {
case IconSourceUser:
return 10
case IconSourceImport:
return 20
case IconSourceUI:
return 30
case IconSourceCore:
return 40
default:
return 90
}
}
func (icon Icon) sortOrder() int {
return icon.Source.sortOrder() + icon.Type.sortOrder()
}
// SortAndCompactIcons sorts and compacts a list of icons. // SortAndCompactIcons sorts and compacts a list of icons.
func SortAndCompactIcons(icons []Icon) []Icon { func SortAndCompactIcons(icons []Icon) []Icon {
// Sort. // Sort.
slices.SortFunc[[]Icon, Icon](icons, func(a, b Icon) int { slices.SortFunc[[]Icon, Icon](icons, func(a, b Icon) int {
aOrder := a.Type.sortOrder() aOrder := a.sortOrder()
bOrder := b.Type.sortOrder() bOrder := b.sortOrder()
switch { switch {
case aOrder != bOrder: case aOrder != bOrder:
@ -68,7 +99,7 @@ func SortAndCompactIcons(icons []Icon) []Icon {
} }
// GetIconAsDataURL returns the icon data as a data URL. // GetIconAsDataURL returns the icon data as a data URL.
func (icon *Icon) GetIconAsDataURL() (bloburl string, err error) { func (icon Icon) GetIconAsDataURL() (bloburl string, err error) {
switch icon.Type { switch icon.Type {
case IconTypeFile: case IconTypeFile:
return "", errors.New("getting icon from file is not supported") return "", errors.New("getting icon from file is not supported")

View file

@ -92,8 +92,9 @@ func LoadAndSaveIcon(ctx context.Context, iconPath string) (*Icon, error) {
return nil, fmt.Errorf("failed to import icon %s: %w", iconPath, err) return nil, fmt.Errorf("failed to import icon %s: %w", iconPath, err)
} }
return &Icon{ return &Icon{
Type: IconTypeAPI, Type: IconTypeAPI,
Value: filename, Value: filename,
Source: IconSourceCore,
}, nil }, nil
} }

View file

@ -420,8 +420,9 @@ func ImportProfile(r *ProfileImportRequest, requiredProfileSource profile.Profil
return nil, fmt.Errorf("%w: icon is invalid: %w", ErrImportFailed, err) return nil, fmt.Errorf("%w: icon is invalid: %w", ErrImportFailed, err)
} }
p.Icons = []binmeta.Icon{{ p.Icons = []binmeta.Icon{{
Type: binmeta.IconTypeAPI, Type: binmeta.IconTypeAPI,
Value: filename, Value: filename,
Source: binmeta.IconSourceImport,
}} }}
} }