Ikon: cari per domain/URL gambar + semua format dikonversi ke PNG

- Dialog ikon: nama aplikasi -> Iconify; domain (mikrotik.com) -> ikon resmi situs
  (manifest 512, apple-touch-icon, favicon) + layanan favicon; URL gambar -> langsung
- Contoh kasus: 'winbox' cuma punya 1 ikon tidak nyambung di Iconify, tapi
  'mikrotik.com' memberi ikon resminya (5 pilihan, semuanya PNG)
- Decoder ICO: entri BMP 24/32-bit (favicon.ico lama) ikut didukung, bukan cuma PNG
- FromURL/Fetch selalu mengembalikan PNG; hasil raster/konversi seragam 512px
- Tes: deteksi URL gambar/domain, daftar ikon situs, decode ICO BMP, konversi format
This commit is contained in:
oxpoe committed 2026-10-13 08:00:12 +07:00
1 parent cad41caaee
commit 59145910b5
9 files changed
+441 -33

No files matched your search

+18 -1
View File
@@ -56,6 +56,7 @@ func (ui *app) showIconSearch(query string, onPick func(icon.Result, []byte)) {
entry.SetPlaceHolder("whatsapp")
status := muted(T("search_hint"))
entry.SetPlaceHolder("whatsapp / mikrotik.com")
grid := container.NewGridWithColumns(6)
results := container.NewVScroll(container.NewPadded(grid))
slots := make(chan struct{}, 3)
@@ -69,7 +70,7 @@ func (ui *app) showIconSearch(query string, onPick func(icon.Result, []byte)) {
status.SetText(T("searching"))
grid.RemoveAll()
go func() {
list, err := icon.SearchBest(entry.Text, 24)
list, err := lookupIcons(entry.Text)
fyne.Do(func() {
if err != nil {
status.SetText(T("search_failed"))
@@ -102,6 +103,22 @@ func (ui *app) showIconSearch(query string, onPick func(icon.Result, []byte)) {
search()
}
// lookupIcons memilih sumber sesuai yang diketik user:
// URL gambar → dipakai langsung, domain situs → ikon resmi situs itu,
// selain itu → pencarian nama di Iconify.
func lookupIcons(query string) ([]icon.Result, error) {
query = strings.TrimSpace(query)
if icon.IsImageURL(query) {
return []icon.Result{{Name: "URL ikon", URL: query}}, nil
}
if domain := icon.Domain(query); domain != "" {
if list, err := icon.SiteIcons(domain); err == nil && len(list) > 0 {
return list, nil
}
}
return icon.SearchBest(query, 24)
}
// iconChoice adalah satu ikon hasil pencarian. Gambarnya diunduh di latar belakang
// dan digambar sebagai PNG: SVG dari internet kadang tidak bisa digambar sehingga
// thumbnail tidak muncul atau proses menggambar berhenti.