summaryrefslogtreecommitdiff
path: root/internal/display/hittest.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/display/hittest.go')
-rw-r--r--internal/display/hittest.go82
1 files changed, 82 insertions, 0 deletions
diff --git a/internal/display/hittest.go b/internal/display/hittest.go
new file mode 100644
index 0000000..fe88471
--- /dev/null
+++ b/internal/display/hittest.go
@@ -0,0 +1,82 @@
+package display
+
+import (
+ "codeberg.org/snonux/loadbars/internal/config"
+ "codeberg.org/snonux/loadbars/internal/stats"
+ "github.com/veandco/go-sdl2/sdl"
+)
+
+// barKind identifies what type of data a bar represents.
+type barKind int
+
+const (
+ barCPU barKind = iota
+ barMem
+ barNet
+)
+
+// barDescriptor describes a single bar's position, host, and type.
+type barDescriptor struct {
+ host string // hostname this bar belongs to
+ kind barKind // CPU, mem, or net
+ cpuName string // CPU name (e.g. "cpu", "cpu0"); only set for barCPU
+ rect sdl.Rect
+}
+
+// buildBarMap replays the same host/bar iteration as drawBars to produce
+// a slice of bar descriptors with their screen rectangles.
+func buildBarMap(snap map[string]*stats.HostStats, cfg *config.Config, state *runState) []barDescriptor {
+ numBars := countBars(snap, state.cpuMode, state.showMem, state.showNet)
+ maxPerRow := cfg.MaxBarsPerRow
+ hosts := sortedHosts(snap)
+
+ bars := make([]barDescriptor, 0, numBars)
+ barIndex := 0
+ for _, host := range hosts {
+ h := snap[host]
+ if h == nil {
+ continue
+ }
+ cpuNames := sortedCPUNames(h.CPU, state.cpuMode)
+ for _, name := range cpuNames {
+ x, y, w, bh := barRect(state.winW, state.winH, numBars, maxPerRow, barIndex)
+ bars = append(bars, barDescriptor{
+ host: host,
+ kind: barCPU,
+ cpuName: name,
+ rect: sdl.Rect{X: x, Y: y, W: w, H: bh},
+ })
+ barIndex++
+ }
+ if state.showMem {
+ x, y, w, bh := barRect(state.winW, state.winH, numBars, maxPerRow, barIndex)
+ bars = append(bars, barDescriptor{
+ host: host,
+ kind: barMem,
+ rect: sdl.Rect{X: x, Y: y, W: w, H: bh},
+ })
+ barIndex++
+ }
+ if state.showNet {
+ x, y, w, bh := barRect(state.winW, state.winH, numBars, maxPerRow, barIndex)
+ bars = append(bars, barDescriptor{
+ host: host,
+ kind: barNet,
+ rect: sdl.Rect{X: x, Y: y, W: w, H: bh},
+ })
+ barIndex++
+ }
+ }
+ return bars
+}
+
+// hitTest returns the bar descriptor under the given point, or nil if none.
+func hitTest(bars []barDescriptor, mx, my int32) *barDescriptor {
+ for i := range bars {
+ r := &bars[i].rect
+ if mx >= r.X && mx < r.X+r.W && my >= r.Y && my < r.Y+r.H {
+ return &bars[i]
+ }
+ }
+ return nil
+}