package main import ( "embed" "io/ioutil" "path" "strings" ) // Embed the built-in icons into the binary. // //go:embed icons/* var fs embed.FS // Icon implements a fyne.Resource and provides built-in icon data. type Icon struct { name string data []byte } func (i Icon) Empty() bool { return len(i.data) == 0 } func (i Icon) Name() string { return i.name } func (i Icon) Content() []byte { return i.data } // A map of all the built-in icons by name. var ( icons = map[string]Icon{} iconNames = []string{} ) // LoadIcons parses the built-in icons into memory. func LoadIcons() { filenames, err := fs.ReadDir("icons") if err != nil { panic(err) } for _, icon := range filenames { basename := strings.TrimSuffix(icon.Name(), ".png") iconNames = append(iconNames, basename) // Populate the icons map too. if _, ok := icons[basename]; !ok { bin, err := fs.ReadFile("icons/" + icon.Name()) if err != nil { panic(err) } i := Icon{ name: basename, data: bin, } icons[basename] = i } } } // LoadCustomIcon adds a custom icon (PNG image) from disk. func LoadCustomIcon(filename string) (basename string, err error) { basename = path.Base(filename) data, err := ioutil.ReadFile(filename) if err != nil { return } i := Icon{ name: basename, data: data, } icons[basename] = i return }