1
0
Fork 0
mirror of https://github.com/diamondburned/cchat-gtk.git synced 2024-11-16 03:02:45 +00:00
cchat-gtk/internal/ui/primitives/buttonoverlay/buttonoverlay.go

58 lines
1.3 KiB
Go

package buttonoverlay
import "github.com/gotk3/gotk3/gtk"
type Widget interface {
gtk.IWidget
SetMarginEnd(int)
SetSizeRequest(int, int)
SetHAlign(gtk.Align)
}
var _ Widget = (*gtk.Widget)(nil)
type Button interface {
Widget
// Bin
GetChild() (gtk.IWidget, error)
// Container
Add(gtk.IWidget)
Remove(gtk.IWidget)
// Button
SetRelief(gtk.ReliefStyle)
}
var _ Button = (*gtk.Button)(nil)
// Wrap wraps maincontent inside an overlay with smallbutton placed rightmost on
// top of the content. It will also set the margins and aligns widgets.
func Wrap(maincontent Widget, smallbutton Button, size int) *gtk.Overlay {
maincontent.SetMarginEnd(size)
smallbutton.SetSizeRequest(size, size)
smallbutton.SetHAlign(gtk.ALIGN_END)
smallbutton.SetRelief(gtk.RELIEF_NONE)
o, _ := gtk.OverlayNew()
o.Add(maincontent)
o.AddOverlay(smallbutton)
o.Show()
return o
}
// Take takes over the given button and replaces its content with the wrapped
// overlay, which has the old content as well as the smaller button on top.
func Take(b, smallbutton Button, size int) {
childv, _ := b.GetChild()
widget := childv.ToWidget()
// As GetChild doesn't reference, we'll want our own reference.
widget.Ref()
defer widget.Unref()
// This will unreference.
b.Remove(widget)
// Wrap will reference.
b.Add(Wrap(widget, smallbutton, size))
}