Files
supersonic/ui/widgets/iconbutton.go
T

143 lines
2.7 KiB
Go

package widgets
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/driver/desktop"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
myTheme "github.com/dweymouth/supersonic/ui/theme"
)
type IconButtonSize int
const (
IconButtonSizeNormal IconButtonSize = iota
IconButtonSizeBigger
IconButtonSizeSmaller
)
type IconButton struct {
widget.BaseWidget
Highlighted bool
IconSize IconButtonSize
OnTapped func()
icon fyne.Resource
focused bool
hovered bool
themed *theme.ThemedResource
img *canvas.Image
}
var (
_ fyne.Tappable = (*IconButton)(nil)
_ fyne.Focusable = (*IconButton)(nil)
_ desktop.Hoverable = (*IconButton)(nil)
)
func NewIconButton(icon fyne.Resource, onTapped func()) *IconButton {
i := &IconButton{icon: icon, OnTapped: onTapped}
i.ExtendBaseWidget(i)
return i
}
func (i *IconButton) SetIcon(icon fyne.Resource) {
i.icon = icon
if i.img != nil {
i.themed = theme.NewThemedResource(icon)
i.img.Resource = i.themed
i.Refresh()
}
}
func (i *IconButton) Tapped(*fyne.PointEvent) {
if i.OnTapped != nil {
i.OnTapped()
}
}
func (i *IconButton) FocusGained() {
if !i.focused {
defer i.Refresh()
}
i.focused = true
}
func (i *IconButton) FocusLost() {
if i.focused {
defer i.Refresh()
}
i.focused = false
}
func (i *IconButton) TypedKey(e *fyne.KeyEvent) {
if e.Name == fyne.KeySpace {
i.Tapped(nil)
}
}
func (i *IconButton) TypedRune(r rune) {
}
func (i *IconButton) MouseIn(*desktop.MouseEvent) {
if !i.hovered {
defer i.Refresh()
}
i.hovered = true
}
func (i *IconButton) MouseOut() {
if i.hovered {
defer i.Refresh()
}
i.hovered = false
}
func (i *IconButton) MouseMoved(*desktop.MouseEvent) {
}
func (i *IconButton) MinSize() fyne.Size {
return i.iconSize()
}
func (i *IconButton) iconSize() fyne.Size {
switch i.IconSize {
case IconButtonSizeBigger:
return fyne.NewSquareSize(theme.IconInlineSize() * 2)
case IconButtonSizeSmaller:
return fyne.NewSquareSize(theme.IconInlineSize())
default:
return fyne.NewSquareSize(theme.IconInlineSize() * 1.3333)
}
}
func (i *IconButton) Refresh() {
if i.img == nil {
return
}
if i.Highlighted || i.focused {
i.themed.ColorName = theme.ColorNamePrimary
} else if i.hovered {
i.themed.ColorName = myTheme.ColorNameHoveredIconButton
} else {
i.themed.ColorName = myTheme.ColorNameIconButton
}
i.img.SetMinSize(i.iconSize())
i.img.Refresh()
}
func (i *IconButton) CreateRenderer() fyne.WidgetRenderer {
if i.img == nil {
i.themed = theme.NewThemedResource(i.icon)
i.img = canvas.NewImageFromResource(i.themed)
i.img.FillMode = canvas.ImageFillContain
i.img.SetMinSize(i.iconSize())
}
return widget.NewSimpleRenderer(container.NewCenter(i.img))
}