mirror of
https://github.com/diamondburned/cchat-gtk.git
synced 2024-11-01 03:54:16 +00:00
58 lines
1.3 KiB
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))
|
||
|
}
|