From caff1e9b42910190c7421ec8d2707bd6e5fdafc8 Mon Sep 17 00:00:00 2001 From: J Logan Date: Fri, 22 May 2026 13:03:09 -0700 Subject: [PATCH] Improve readability of progress bar width computation. (#1584) - Refines bugfix from #1547, no functional changes. --- Sources/TerminalProgress/ProgressBar.swift | 23 ++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/Sources/TerminalProgress/ProgressBar.swift b/Sources/TerminalProgress/ProgressBar.swift index 0c5a4896..5d9bfcb5 100644 --- a/Sources/TerminalProgress/ProgressBar.swift +++ b/Sources/TerminalProgress/ProgressBar.swift @@ -271,18 +271,25 @@ extension ProgressBar { // Progress bar - always shown if configured if config.showProgressBar, total > 0, allowProgress { + // reserve spaces between components, plus 45 for components rendered after the bar (size, speed, time, etc.) let joinedComponents = components.joined(separator: " ") - // 45 reserves space for components rendered after the bar (size, speed, time, etc.) - let usedWidth = (useColor ? joinedComponents.visibleLength : joinedComponents.count) + 45 - let remainingWidth = max(config.width - usedWidth, 1) - let barLength = min(remainingWidth, max(0, state.finished ? remainingWidth : Int(Int64(remainingWidth) * value / total))) - let barPaddingLength = remainingWidth - barLength + let reservedWidth = (useColor ? joinedComponents.visibleLength : joinedComponents.count) + 45 + let totalBarWidth = max(config.width - reservedWidth, 1) + let completedWidth: Int + if state.finished { + completedWidth = totalBarWidth + } else { + let progressWidth = max(0, Int(Int64(totalBarWidth) * value / total)) + completedWidth = min(totalBarWidth, progressWidth) + } + + let uncompletedWidth = totalBarWidth - completedWidth if useColor { - let filledBar = EscapeSequence.colored(String(repeating: config.theme.bar, count: barLength), EscapeSequence.green) - let emptyBar = String(repeating: " ", count: barPaddingLength) + let filledBar = EscapeSequence.colored(String(repeating: config.theme.bar, count: completedWidth), EscapeSequence.green) + let emptyBar = String(repeating: " ", count: uncompletedWidth) components.append("|\(filledBar)\(emptyBar)|") } else { - let bar = "\(String(repeating: config.theme.bar, count: barLength))\(String(repeating: " ", count: barPaddingLength))" + let bar = "\(String(repeating: config.theme.bar, count: completedWidth))\(String(repeating: " ", count: uncompletedWidth))" components.append("|\(bar)|") } }