1
0
mirror of https://github.com/tw93/Mole.git synced 2026-03-22 16:45:07 +00:00

Merge pull request #606 from teee32/fix/status-resize-ghost-lines

refactor(status): extract view height padding helper
This commit is contained in:
Tw93
2026-03-21 07:19:21 +08:00
committed by GitHub
2 changed files with 21 additions and 13 deletions

View File

@@ -59,6 +59,21 @@ type model struct {
catHidden bool // true = hidden, false = visible catHidden bool // true = hidden, false = visible
} }
// padViewToHeight ensures the rendered frame always overwrites the full
// terminal region by padding with empty lines up to the current height.
func padViewToHeight(view string, height int) string {
if height <= 0 {
return view
}
contentHeight := lipgloss.Height(view)
if contentHeight >= height {
return view
}
return view + strings.Repeat("\n", height-contentHeight)
}
// getConfigPath returns the path to the status preferences file. // getConfigPath returns the path to the status preferences file.
func getConfigPath() string { func getConfigPath() string {
home, err := os.UserHomeDir() home, err := os.UserHomeDir()
@@ -194,17 +209,7 @@ func (m model) View() string {
} }
parts = append(parts, cardContent) parts = append(parts, cardContent)
output := lipgloss.JoinVertical(lipgloss.Left, parts...) output := lipgloss.JoinVertical(lipgloss.Left, parts...)
return padViewToHeight(output, m.height)
// Pad output to exactly fill the terminal height so every frame fully
// overwrites the alt screen buffer, preventing ghost lines on resize.
if m.height > 0 {
contentHeight := lipgloss.Height(output)
if contentHeight < m.height {
output += strings.Repeat("\n", m.height-contentHeight)
}
}
return output
} }
func (m model) collectCmd() tea.Cmd { func (m model) collectCmd() tea.Cmd {

View File

@@ -84,7 +84,10 @@ EOF
} }
@test "should_protect_path protects Mole runtime logs" { @test "should_protect_path protects Mole runtime logs" {
result="$(HOME="$HOME" bash --noprofile --norc -c "source '$PROJECT_ROOT/lib/core/common.sh'; should_protect_path '$HOME/Library/Logs/mole/operations.log' && echo protected || echo not-protected")" result="$(
HOME="$HOME" PROJECT_ROOT="$PROJECT_ROOT" bash --noprofile --norc -c \
'source "$PROJECT_ROOT/lib/core/common.sh"; should_protect_path "$HOME/Library/Logs/mole/operations.log" && echo protected || echo not-protected'
)"
[ "$result" = "protected" ] [ "$result" = "protected" ]
} }
@@ -241,7 +244,7 @@ EOF
PATH="$fake_bin:$PATH" PROJECT_ROOT="$PROJECT_ROOT" HOME="$HOME" \ PATH="$fake_bin:$PATH" PROJECT_ROOT="$PROJECT_ROOT" HOME="$HOME" \
/usr/bin/script -q /dev/null /bin/bash --noprofile --norc -c \ /usr/bin/script -q /dev/null /bin/bash --noprofile --norc -c \
'source "$PROJECT_ROOT/lib/core/common.sh"; start_inline_spinner "Testing..."; /bin/sleep 0.15; stop_inline_spinner' \ "source \"\$PROJECT_ROOT/lib/core/common.sh\"; start_inline_spinner \"Testing...\"; /bin/sleep 0.15; stop_inline_spinner" \
> /dev/null 2>&1 > /dev/null 2>&1
[ ! -f "$marker" ] [ ! -f "$marker" ]