aboutsummaryrefslogtreecommitdiff
path: root/go/ui/hoverDetector.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/ui/hoverDetector.go')
-rw-r--r--go/ui/hoverDetector.go41
1 files changed, 41 insertions, 0 deletions
diff --git a/go/ui/hoverDetector.go b/go/ui/hoverDetector.go
new file mode 100644
index 00000000..49161f4f
--- /dev/null
+++ b/go/ui/hoverDetector.go
@@ -0,0 +1,41 @@
+package ui
+
+// A simple structure to detect if the cursor has not moved or started moving again.
+// hoverDetector.update must be called during each Update invocation to track the
+// frame and the current cursor position.
+type hoverDetector struct {
+ last_x, last_y int
+ ticks int
+ hovering Hoverable
+}
+
+func (h *hoverDetector) update(collection *Collection, x, y int, w Widget) {
+ if x == h.last_x && y == h.last_y {
+ h.hover(collection, x, y, w)
+ } else {
+ h.reset(x, y)
+ h.last_x, h.last_y = x, y
+ }
+}
+
+func (h *hoverDetector) hover(collection *Collection, x, y int, w Widget) {
+ h.ticks++
+
+ if w == nil || h.hovering != nil {
+ return
+ }
+
+ if hoverable, ok := w.(Hoverable); ok && hoverable.onHover(h.ticks, x, y, collection) {
+ h.hovering = hoverable
+ }
+}
+
+func (h *hoverDetector) reset(x, y int) {
+ if h.hovering != nil {
+ if !h.hovering.stopHover(h.ticks, x, y) {
+ return
+ }
+ h.hovering = nil
+ }
+ h.ticks = 0
+}