diff --git a/profile/binmeta/find_windows.go b/profile/binmeta/find_windows.go index b00cb1666..3ac2b8b9d 100644 --- a/profile/binmeta/find_windows.go +++ b/profile/binmeta/find_windows.go @@ -35,8 +35,9 @@ func GetIconAndName(ctx context.Context, binPath string, homeDir string) (icon * } return &Icon{ - Type: IconTypeAPI, - Value: filename, + Type: IconTypeAPI, + Value: filename, + Source: IconSourceCore, }, name, nil } diff --git a/profile/binmeta/icon.go b/profile/binmeta/icon.go index d92d0e991..64ab6e43b 100644 --- a/profile/binmeta/icon.go +++ b/profile/binmeta/icon.go @@ -15,8 +15,9 @@ import ( // Icon describes an icon. type Icon struct { - Type IconType - Value string + Type IconType + Value string + Source IconSource } // IconType describes the type of an Icon. @@ -38,16 +39,46 @@ func (t IconType) sortOrder() int { case IconTypeFile: return 3 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. func SortAndCompactIcons(icons []Icon) []Icon { // Sort. slices.SortFunc[[]Icon, Icon](icons, func(a, b Icon) int { - aOrder := a.Type.sortOrder() - bOrder := b.Type.sortOrder() + aOrder := a.sortOrder() + bOrder := b.sortOrder() switch { case aOrder != bOrder: @@ -68,7 +99,7 @@ func SortAndCompactIcons(icons []Icon) []Icon { } // 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 { case IconTypeFile: return "", errors.New("getting icon from file is not supported") diff --git a/profile/binmeta/icons.go b/profile/binmeta/icons.go index ab25f7ee5..595fbb10e 100644 --- a/profile/binmeta/icons.go +++ b/profile/binmeta/icons.go @@ -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 &Icon{ - Type: IconTypeAPI, - Value: filename, + Type: IconTypeAPI, + Value: filename, + Source: IconSourceCore, }, nil } diff --git a/sync/profile.go b/sync/profile.go index fa4604170..bfc76893b 100644 --- a/sync/profile.go +++ b/sync/profile.go @@ -420,8 +420,9 @@ func ImportProfile(r *ProfileImportRequest, requiredProfileSource profile.Profil return nil, fmt.Errorf("%w: icon is invalid: %w", ErrImportFailed, err) } p.Icons = []binmeta.Icon{{ - Type: binmeta.IconTypeAPI, - Value: filename, + Type: binmeta.IconTypeAPI, + Value: filename, + Source: binmeta.IconSourceImport, }} }