Private/UI/Show-VersionList.ps1
|
function Show-VersionList { param( [string[]]$Versions, [string]$ModuleName ) if (-not $Versions -or $Versions.Count -eq 0) { Write-Host "No versions found for $ModuleName." return $null } $palette = Get-PSMBColorPalette $esc = [char]27 $reset = "${esc}[0m" $innerWidth = Get-PSMBConsoleInnerWidth $border = ([char]0x2502) $hLine = ([char]0x2500) $amberRGB = @(168, 213, 162) $roseRGB = @(94, 234, 212) $fitText = { param([string]$Text) if ($null -eq $Text) { return '' } if ($Text.Length -le $innerWidth) { return $Text } if ($innerWidth -le 3) { return $Text.Substring(0, [Math]::Max(0, $innerWidth)) } return $Text.Substring(0, $innerWidth - 3) + '...' } $selectedIdx = 0 $maxVisible = [Math]::Min(15, [Console]::WindowHeight - 12) try { [Console]::CursorVisible = $false while ($true) { $startIdx = [Math]::Max(0, $selectedIdx - [Math]::Floor($maxVisible / 2)) $endIdx = [Math]::Min($Versions.Count - 1, $startIdx + $maxVisible - 1) if ($endIdx - $startIdx + 1 -lt $maxVisible -and $startIdx -gt 0) { $startIdx = [Math]::Max(0, $endIdx - $maxVisible + 1) } Clear-Host Write-Host '' # Top border $topLine = Get-PSMBGradientLine -Character $hLine -Length $innerWidth -StartRGB $amberRGB -EndRGB $roseRGB Write-Host (' {0}{1}{2}{3}' -f $palette.Surface, ([char]0x256D), $topLine, ([char]0x256E)) -NoNewline Write-Host $palette.Reset # Title $titleText = 'Versions for {0} ({1} total)' -f $ModuleName, $Versions.Count $titleClipped = & $fitText $titleText $titlePadded = (' ' + $titleClipped).PadRight($innerWidth) Write-Host (' {0}{1}{2}{3}{4}{5}{6}' -f $palette.Surface, $border, $palette.Amber, $palette.Bold, $titlePadded, $reset, ('{0}{1}{2}' -f $palette.Surface, $border, $reset)) # Separator $sepLine = Get-PSMBGradientLine -Character $hLine -Length $innerWidth -StartRGB $amberRGB -EndRGB $roseRGB Write-Host (' {0}{1}{2}{3}' -f $palette.Surface, ([char]0x251C), $sepLine, ([char]0x2524)) -NoNewline Write-Host $palette.Reset $emptyLine = ' {0}{1}{2}{3}{4}' -f $palette.Surface, $border, (' ' * $innerWidth), $border, $reset Write-Host $emptyLine for ($i = $startIdx; $i -le $endIdx; $i++) { if ($i -eq $selectedIdx) { $chevron = [char]0x276F $itemText = (' {0} {1}' -f $chevron, $Versions[$i]) $padded = (& $fitText $itemText).PadRight($innerWidth) $line = ' {0}{1}{2}{3}{4}{5}{6}{7}' -f $palette.Surface, $border, $palette.BgSelect, $palette.Amber, $palette.Bold, $padded, $reset, ('{0}{1}{2}' -f $palette.Surface, $border, $reset) } else { $itemText = (' {0}' -f $Versions[$i]) $padded = (& $fitText $itemText).PadRight($innerWidth) $line = ' {0}{1}{2}{3}{4}{5}' -f $palette.Surface, $border, $palette.Text, $padded, $reset, ('{0}{1}{2}' -f $palette.Surface, $border, $reset) } Write-Host $line } if ($Versions.Count -gt $maxVisible) { Write-Host $emptyLine $posText = (' {0} of {1}' -f ($selectedIdx + 1), $Versions.Count) $posPadded = (& $fitText $posText).PadRight($innerWidth) Write-Host (' {0}{1}{2}{3}{4}{5}' -f $palette.Surface, $border, $palette.Dim, $posPadded, $reset, ('{0}{1}{2}' -f $palette.Surface, $border, $reset)) } Write-Host $emptyLine # Separator Write-Host (' {0}{1}{2}{3}' -f $palette.Surface, ([char]0x251C), $sepLine, ([char]0x2524)) -NoNewline Write-Host $palette.Reset # Hint $hintText = ' Up/Down: Navigate Enter: Select Esc: Cancel' $hintPadded = (& $fitText $hintText).PadRight($innerWidth) Write-Host (' {0}{1}{2}{3}{4}{5}' -f $palette.Surface, $border, $palette.Dim, $hintPadded, $reset, ('{0}{1}{2}' -f $palette.Surface, $border, $reset)) # Bottom border $bottomLine = Get-PSMBGradientLine -Character $hLine -Length $innerWidth -StartRGB $amberRGB -EndRGB $roseRGB Write-Host (' {0}{1}{2}{3}' -f $palette.Surface, ([char]0x2570), $bottomLine, ([char]0x256F)) -NoNewline Write-Host $palette.Reset $key = [Console]::ReadKey($true) switch ($key.Key) { 'UpArrow' { if ($selectedIdx -gt 0) { $selectedIdx-- } } 'DownArrow' { if ($selectedIdx -lt $Versions.Count - 1) { $selectedIdx++ } } 'Enter' { return $Versions[$selectedIdx] } 'Escape' { return $null } } } } finally { [Console]::CursorVisible = $true Clear-Host } } |