From 63ad22242562b1e66353694f2a17df6d1c64a8fd Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Thu, 16 Feb 2023 18:57:15 +0100 Subject: move more ui logic into Collection * Generalize hover detection and move it into ui.Collection * Implement transparencu for the prompt banner --- go/ui/hoverDetector.go | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 go/ui/hoverDetector.go (limited to 'go/ui/hoverDetector.go') 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 +} -- cgit v1.2.3