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)) }