aboutsummaryrefslogtreecommitdiff
path: root/go/ui/hoverDetector.go
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2023-02-16 18:57:15 +0100
committerFlorian Fischer <florian.fischer@muhq.space>2025-08-20 15:50:10 +0200
commit63ad22242562b1e66353694f2a17df6d1c64a8fd (patch)
treef91a3a98e554e58a30d5bb0a34b021c7fb206311 /go/ui/hoverDetector.go
parentc0ab1110429be3a2a1664084469952ea082961c1 (diff)
downloadmuhqs-game-63ad22242562b1e66353694f2a17df6d1c64a8fd.tar.gz
muhqs-game-63ad22242562b1e66353694f2a17df6d1c64a8fd.zip
move more ui logic into Collection
* Generalize hover detection and move it into ui.Collection * Implement transparencu for the prompt banner
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
+}