Archived
Support the mouse in the branch popup
A click on a branch switches to it, the wheel moves the selection, a click outside closes the popup. The popup is hit-tested by its own position, as it is drawn after zone.Scan. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -7,28 +7,27 @@ import (
|
||||
"github.com/charmbracelet/x/ansi"
|
||||
)
|
||||
|
||||
// overlay draws fg centered over bg, which is w x h cells. bg must be the
|
||||
// overlay draws fg over bg with its top-left cell at (x, y). bg must be the
|
||||
// final string (after zone.Scan): its lines are cut at the popup's edges.
|
||||
// The backdrop loses its colors and is drawn in dim, so the popup stands out.
|
||||
func overlay(bg, fg string, w, h int, dim lipgloss.Style) string {
|
||||
func overlay(bg, fg string, x, y int, dim lipgloss.Style) string {
|
||||
lines := strings.Split(bg, "\n")
|
||||
for i, l := range lines {
|
||||
lines[i] = dim.Render(ansi.Strip(l))
|
||||
}
|
||||
pop := strings.Split(fg, "\n")
|
||||
pw := lipgloss.Width(fg)
|
||||
top := max((h-len(pop))/2, 0)
|
||||
left := max((w-pw)/2, 0)
|
||||
left := x
|
||||
for i, p := range pop {
|
||||
y := top + i
|
||||
if y >= len(lines) {
|
||||
row := y + i
|
||||
if row >= len(lines) {
|
||||
break
|
||||
}
|
||||
line := lines[y]
|
||||
line := lines[row]
|
||||
if lw := ansi.StringWidth(line); lw < left {
|
||||
line += strings.Repeat(" ", left-lw)
|
||||
}
|
||||
lines[y] = ansi.Truncate(line, left, "") + "\x1b[0m" + p + "\x1b[0m" + ansi.TruncateLeft(line, left+pw, "")
|
||||
lines[row] = ansi.Truncate(line, left, "") + "\x1b[0m" + p + "\x1b[0m" + ansi.TruncateLeft(line, left+pw, "")
|
||||
}
|
||||
return strings.Join(lines, "\n")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user