diff --git a/icon.go b/icon.go index 90308fa..fddcaa2 100644 --- a/icon.go +++ b/icon.go @@ -1,10 +1,13 @@ package objects import "git.tebibyte.media/tomo/tomo" +import "git.tebibyte.media/tomo/tomo/canvas" // Icon displays a single icon. type Icon struct { tomo.Box + icon tomo.Icon + size tomo.IconSize } func iconSizeString (size tomo.IconSize) string { @@ -22,14 +25,28 @@ func NewIcon (icon tomo.Icon, size tomo.IconSize) *Icon { } this.SetRole(tomo.R("objects", "Icon")) this.SetIcon(icon, size) + this.OnIconSetChange(this.handleIconSetChange) return this } // SetIcon sets the icon. func (this *Icon) SetIcon (icon tomo.Icon, size tomo.IconSize) { - iconTexture := icon.Texture(size) - bounds := iconTexture.Bounds() - this.SetAttr(tomo.AIcon(icon, size)) - this.SetAttr(tomo.AMinimumSize(bounds.Dx(), bounds.Dy())) - this.SetTag(iconSizeString(size), true) + if this.icon == icon { return } + this.icon = icon + this.setTexture(icon.Texture(size)) +} + +func (this *Icon) handleIconSetChange () { + this.setTexture(this.icon.Texture(this.size)) +} + +func (this *Icon) setTexture (texture canvas.Texture) { + this.SetAttr(tomo.ATexture(texture)) + this.SetAttr(tomo.ATextureMode(tomo.TextureModeCenter)) + if texture == nil { + this.SetAttr(tomo.AMinimumSize(0, 0)) + } else { + bounds := texture.Bounds() + this.SetAttr(tomo.AttrMinimumSize(bounds.Max.Sub(bounds.Min))) + } } diff --git a/mimeicon.go b/mimeicon.go index a4afba9..0b49eae 100644 --- a/mimeicon.go +++ b/mimeicon.go @@ -16,7 +16,7 @@ func NewMimeIcon (mime data.Mime, size tomo.IconSize) *MimeIcon { this := &MimeIcon { Box: tomo.NewBox(), } - this.SetRole(tomo.R("objects", "Icon")) + this.SetRole(tomo.R("objects", "MimeIcon")) this.SetIcon(mime, size) this.OnIconSetChange(this.handleIconSetChange) return this @@ -27,7 +27,6 @@ func (this *MimeIcon) SetIcon (mime data.Mime, size tomo.IconSize) { if this.mime == mime && this.size == size { return } this.mime = mime this.size = size - this.SetTag(iconSizeString(size), true) this.setTexture(tomo.MimeIconTexture(mime, size)) }