Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
diamondburned
GitHub Repository: diamondburned/gtkcord4
Path: blob/main/internal/components/hoverpopover/controller.go
366 views
1
package hoverpopover
2
3
import (
4
"github.com/diamondburned/gotk4/pkg/glib/v2"
5
"github.com/diamondburned/gotk4/pkg/gtk/v4"
6
)
7
8
// PopoverController provides a way to open and close a popover while also
9
// reusing the widget if it's been open recently.
10
type PopoverController struct {
11
parent *gtk.Widget
12
popover *gtk.Popover
13
initPopover func(*gtk.Popover) bool
14
hideTimeout glib.SourceHandle
15
}
16
17
// NewPopoverController creates a new PopoverController.
18
func NewPopoverController(parent gtk.Widgetter, initFn func(*gtk.Popover) bool) *PopoverController {
19
return &PopoverController{
20
parent: gtk.BaseWidget(parent),
21
initPopover: initFn,
22
}
23
}
24
25
// Popup pops up the popover.
26
func (p *PopoverController) Popup() *gtk.Popover {
27
if p.popover != nil {
28
p.popover.SetCSSClasses(nil)
29
if !p.initPopover(p.popover) {
30
return nil
31
}
32
33
if p.hideTimeout != 0 {
34
glib.SourceRemove(p.hideTimeout)
35
p.hideTimeout = 0
36
}
37
38
p.popover.Popup()
39
return p.popover
40
}
41
42
p.popover = gtk.NewPopover()
43
p.popover.SetCSSClasses(nil)
44
45
if !p.initPopover(p.popover) {
46
p.popover = nil
47
return nil
48
}
49
50
p.popover.SetParent(p.parent)
51
p.popover.Popup()
52
return p.popover
53
}
54
55
// Popdown pops down the popover.
56
func (p *PopoverController) Popdown() {
57
if p.popover == nil {
58
return
59
}
60
61
p.popover.Popdown()
62
63
if p.hideTimeout != 0 {
64
return
65
}
66
67
p.hideTimeout = glib.TimeoutSecondsAdd(3, func() {
68
p.popover.Unparent()
69
p.popover = nil
70
p.hideTimeout = 0
71
})
72
}
73
74
// IsPoppedUp returns whether the popover is popped up.
75
func (p *PopoverController) IsPoppedUp() bool {
76
return p.popover != nil && p.popover.IsVisible()
77
}
78
79