Path: blob/main/internal/components/hoverpopover/controller.go
366 views
package hoverpopover12import (3"github.com/diamondburned/gotk4/pkg/glib/v2"4"github.com/diamondburned/gotk4/pkg/gtk/v4"5)67// PopoverController provides a way to open and close a popover while also8// reusing the widget if it's been open recently.9type PopoverController struct {10parent *gtk.Widget11popover *gtk.Popover12initPopover func(*gtk.Popover) bool13hideTimeout glib.SourceHandle14}1516// NewPopoverController creates a new PopoverController.17func NewPopoverController(parent gtk.Widgetter, initFn func(*gtk.Popover) bool) *PopoverController {18return &PopoverController{19parent: gtk.BaseWidget(parent),20initPopover: initFn,21}22}2324// Popup pops up the popover.25func (p *PopoverController) Popup() *gtk.Popover {26if p.popover != nil {27p.popover.SetCSSClasses(nil)28if !p.initPopover(p.popover) {29return nil30}3132if p.hideTimeout != 0 {33glib.SourceRemove(p.hideTimeout)34p.hideTimeout = 035}3637p.popover.Popup()38return p.popover39}4041p.popover = gtk.NewPopover()42p.popover.SetCSSClasses(nil)4344if !p.initPopover(p.popover) {45p.popover = nil46return nil47}4849p.popover.SetParent(p.parent)50p.popover.Popup()51return p.popover52}5354// Popdown pops down the popover.55func (p *PopoverController) Popdown() {56if p.popover == nil {57return58}5960p.popover.Popdown()6162if p.hideTimeout != 0 {63return64}6566p.hideTimeout = glib.TimeoutSecondsAdd(3, func() {67p.popover.Unparent()68p.popover = nil69p.hideTimeout = 070})71}7273// IsPoppedUp returns whether the popover is popped up.74func (p *PopoverController) IsPoppedUp() bool {75return p.popover != nil && p.popover.IsVisible()76}777879