cchat-gtk/internal/ui/primitives/roundimage/avatar.go

115 lines
2.2 KiB
Go

package roundimage
import (
"github.com/diamondburned/cchat-gtk/internal/gts/httputil"
"github.com/diamondburned/handy"
"github.com/gotk3/gotk3/gdk"
"github.com/gotk3/gotk3/gtk"
)
// TODO: GIF support
// TextSetter is an interface for setting texts.
type TextSetter interface {
SetText(text string)
}
func TrySetText(imager Imager, text string) {
if setter, ok := imager.(TextSetter); ok {
setter.SetText(text)
}
}
// Avatar is a static HdyAvatar container.
type Avatar struct {
handy.Avatar
pixbuf *gdk.Pixbuf
size int
}
// Make a better API that allows scaling.
var (
_ Imager = (*Avatar)(nil)
_ TextSetter = (*Avatar)(nil)
_ httputil.ImageContainer = (*Avatar)(nil)
)
func NewAvatar(size int) *Avatar {
avatar := Avatar{
Avatar: *handy.AvatarNew(size, "", true),
size: size,
}
// Set the load function. This should hopefully trigger a reload.
avatar.SetImageLoadFunc(avatar.loadFunc)
return &avatar
}
func (a *Avatar) GetSizeRequest() (int, int) {
return a.size, a.size
}
// SetSizeRequest sets the avatar size. The actual size is min(w, h).
func (a *Avatar) SetSizeRequest(w, h int) {
var min = w
if w > h {
min = h
}
a.Avatar.SetSize(min)
a.Avatar.SetSizeRequest(w, h)
}
func (a *Avatar) loadFunc(size int) *gdk.Pixbuf {
if a.pixbuf == nil {
a.size = size
return nil
}
if a.size != size {
a.size = size
p, err := a.pixbuf.ScaleSimple(size, size, gdk.INTERP_HYPER)
if err != nil {
return a.pixbuf
}
a.pixbuf = p
}
return a.pixbuf
}
// SetRadius is a no-op.
func (a *Avatar) SetRadius(float64) {}
// SetFromPixbuf sets the pixbuf.
func (a *Avatar) SetFromPixbuf(pb *gdk.Pixbuf) {
a.pixbuf = pb
a.Avatar.SetImageLoadFunc(a.loadFunc)
}
func (a *Avatar) SetFromAnimation(pa *gdk.PixbufAnimation) {
a.pixbuf = pa.GetStaticImage()
a.Avatar.SetImageLoadFunc(a.loadFunc)
}
func (a *Avatar) GetPixbuf() *gdk.Pixbuf {
return a.pixbuf
}
// GetAnimation returns nil.
func (a *Avatar) GetAnimation() *gdk.PixbufAnimation {
return nil
}
// GetImage returns nil.
func (a *Avatar) GetImage() *gtk.Image {
return nil
}
func (a *Avatar) GetStorageType() gtk.ImageType {
return gtk.IMAGE_PIXBUF
}