fix(vulkan): draw the active position hint dot white and larger so the current band stands out
- commit
- bbca21d5be4d6242cba41ac7b9d92c67caad77f7
- author
- brice · · 2026-10-20 02:00 UTC
- parent
- a941335
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
2 files · +16 -11
M internal/adapters/vulkan/position_hint.go +10 -7
| @@ -16,20 +16,23 @@ func (w *sceneWalk) positionHint() { | |||
| 16 | 16 | alpha := w.alpha | |
| 17 | 17 | w.alpha = h.Opacity * 0.8 | |
| 18 | 18 | w.hintRound(w.physRect(b.X, b.Y, b.W, b.H), w.phys(ports.PositionHintRadius), [3]uint8{30, 30, 38}) | |
| 19 | - | active := parseColor(w.s.Border.Active) | |
| 19 | + | // The active dot is white, opaque and larger, whatever border.active is: | |
| 20 | + | // a grey accent must not blend it into the other dots of its column. | |
| 20 | 21 | for col := range min(int(h.Columns), ports.PositionHintMaxColumns) { | |
| 21 | 22 | for row := range min(int(h.Counts[col]), ports.PositionHintMaxRows) { | |
| 22 | - | color, opacity := [3]uint8{190, 190, 200}, float32(0.3) | |
| 23 | + | color, opacity, d := [3]uint8{190, 190, 200}, float32(0.2), ports.PositionHintDiameter | |
| 23 | 24 | if !h.Vertical && col == int(h.ActiveCol) { | |
| 24 | - | opacity = 0.65 | |
| 25 | + | opacity = 0.45 | |
| 25 | 26 | } | |
| 26 | 27 | if col == int(h.ActiveCol) && row == int(h.ActiveRow) { | |
| 27 | - | color, opacity = active, 1 | |
| 28 | + | color, opacity, d = [3]uint8{255, 255, 255}, 1, ports.PositionHintActiveDiameter | |
| 28 | 29 | } | |
| 29 | 30 | w.alpha = h.Opacity * opacity | |
| 30 | - | x := b.X + ports.PositionHintPadding + col*(ports.PositionHintDiameter+ports.PositionHintGap) | |
| 31 | - | y := b.Y + ports.PositionHintPadding + row*(ports.PositionHintDiameter+ports.PositionHintGap) | |
| 32 | - | w.hintRound(w.physRect(x, y, ports.PositionHintDiameter, ports.PositionHintDiameter), w.phys(ports.PositionHintDiameter)/2, color) | |
| 31 | + | // Every dot is centered in its PositionHintDiameter cell. | |
| 32 | + | inset := (ports.PositionHintDiameter - d) / 2 | |
| 33 | + | x := b.X + ports.PositionHintPadding + col*(ports.PositionHintDiameter+ports.PositionHintGap) + inset | |
| 34 | + | y := b.Y + ports.PositionHintPadding + row*(ports.PositionHintDiameter+ports.PositionHintGap) + inset | |
| 35 | + | w.hintRound(w.physRect(x, y, d, d), w.phys(d)/2, color) | |
| 33 | 36 | } | |
| 34 | 37 | } | |
| 35 | 38 | w.alpha = alpha | |
| @@ -16,20 +16,23 @@ func (w *sceneWalk) positionHint() { | |||||
| 16 | alpha := w.alpha | 16 | alpha := w.alpha | ||
| 17 | w.alpha = h.Opacity * 0.8 | 17 | w.alpha = h.Opacity * 0.8 | ||
| 18 | w.hintRound(w.physRect(b.X, b.Y, b.W, b.H), w.phys(ports.PositionHintRadius), [3]uint8{30, 30, 38}) | 18 | w.hintRound(w.physRect(b.X, b.Y, b.W, b.H), w.phys(ports.PositionHintRadius), [3]uint8{30, 30, 38}) | ||
| 19 | - | active := parseColor(w.s.Border.Active) | 19 | + | // The active dot is white, opaque and larger, whatever border.active is: |
| 20 | + | // a grey accent must not blend it into the other dots of its column. | |||
| 20 | for col := range min(int(h.Columns), ports.PositionHintMaxColumns) { | 21 | for col := range min(int(h.Columns), ports.PositionHintMaxColumns) { | ||
| 21 | for row := range min(int(h.Counts[col]), ports.PositionHintMaxRows) { | 22 | for row := range min(int(h.Counts[col]), ports.PositionHintMaxRows) { | ||
| 22 | - | color, opacity := [3]uint8{190, 190, 200}, float32(0.3) | 23 | + | color, opacity, d := [3]uint8{190, 190, 200}, float32(0.2), ports.PositionHintDiameter |
| 23 | if !h.Vertical && col == int(h.ActiveCol) { | 24 | if !h.Vertical && col == int(h.ActiveCol) { | ||
| 24 | - | opacity = 0.65 | 25 | + | opacity = 0.45 |
| 25 | } | 26 | } | ||
| 26 | if col == int(h.ActiveCol) && row == int(h.ActiveRow) { | 27 | if col == int(h.ActiveCol) && row == int(h.ActiveRow) { | ||
| 27 | - | color, opacity = active, 1 | 28 | + | color, opacity, d = [3]uint8{255, 255, 255}, 1, ports.PositionHintActiveDiameter |
| 28 | } | 29 | } | ||
| 29 | w.alpha = h.Opacity * opacity | 30 | w.alpha = h.Opacity * opacity | ||
| 30 | - | x := b.X + ports.PositionHintPadding + col*(ports.PositionHintDiameter+ports.PositionHintGap) | 31 | + | // Every dot is centered in its PositionHintDiameter cell. |
| 31 | - | y := b.Y + ports.PositionHintPadding + row*(ports.PositionHintDiameter+ports.PositionHintGap) | 32 | + | inset := (ports.PositionHintDiameter - d) / 2 |
| 32 | - | w.hintRound(w.physRect(x, y, ports.PositionHintDiameter, ports.PositionHintDiameter), w.phys(ports.PositionHintDiameter)/2, color) | 33 | + | x := b.X + ports.PositionHintPadding + col*(ports.PositionHintDiameter+ports.PositionHintGap) + inset |
| 34 | + | y := b.Y + ports.PositionHintPadding + row*(ports.PositionHintDiameter+ports.PositionHintGap) + inset | |||
| 35 | + | w.hintRound(w.physRect(x, y, d, d), w.phys(d)/2, color) | |||
| 33 | } | 36 | } | ||
| 34 | } | 37 | } | ||
| 35 | w.alpha = alpha | 38 | w.alpha = alpha | ||
M internal/ports/position_hint.go +6 -4
| @@ -4,10 +4,12 @@ const ( | |||
| 4 | 4 | PositionHintMaxColumns = 16 | |
| 5 | 5 | PositionHintMaxRows = 16 | |
| 6 | 6 | PositionHintDiameter = 8 | |
| 7 | - | PositionHintGap = 10 | |
| 8 | - | PositionHintPadding = 10 | |
| 9 | - | PositionHintBottom = 48 | |
| 10 | - | PositionHintRadius = 10 | |
| 7 | + | // PositionHintActiveDiameter fits in the padding and gap around its cell. | |
| 8 | + | PositionHintActiveDiameter = 12 | |
| 9 | + | PositionHintGap = 10 | |
| 10 | + | PositionHintPadding = 10 | |
| 11 | + | PositionHintBottom = 48 | |
| 12 | + | PositionHintRadius = 10 | |
| 11 | 13 | ) | |
| 12 | 14 | ||
| 13 | 15 | // PositionHint is a bounded, comparable snapshot. Scenes copy it by value; | |
| @@ -4,10 +4,12 @@ const ( | |||||
| 4 | PositionHintMaxColumns = 16 | 4 | PositionHintMaxColumns = 16 | ||
| 5 | PositionHintMaxRows = 16 | 5 | PositionHintMaxRows = 16 | ||
| 6 | PositionHintDiameter = 8 | 6 | PositionHintDiameter = 8 | ||
| 7 | - | PositionHintGap = 10 | 7 | + | // PositionHintActiveDiameter fits in the padding and gap around its cell. |
| 8 | - | PositionHintPadding = 10 | 8 | + | PositionHintActiveDiameter = 12 |
| 9 | - | PositionHintBottom = 48 | 9 | + | PositionHintGap = 10 |
| 10 | - | PositionHintRadius = 10 | 10 | + | PositionHintPadding = 10 |
| 11 | + | PositionHintBottom = 48 | |||
| 12 | + | PositionHintRadius = 10 | |||
| 11 | ) | 13 | ) | ||
| 12 | 14 | ||||
| 13 | // PositionHint is a bounded, comparable snapshot. Scenes copy it by value; | 15 | // PositionHint is a bounded, comparable snapshot. Scenes copy it by value; | ||