Private/Initialize-PoshTuiConsoleForm.ps1
function Initialize-PoshTuiConsoleForm { [CmdletBinding()] param( [Parameter(Mandatory)] [PoshTuiConsoleForm]$InputObject ) begin{ $Form = $InputObject $Border = [PoshTuiMenuBorderDrawingGlyphsets]::new()."$($Form.UIBorderStyle)" $Color = $Form.UIColorscheme $CharFillCount = ($Form.UIWidth - 2) $EmptyFill = (" " * $CharFillCount) $HorizontalFill = ($Border.Horizontal * $CharFillCount) $SeparatorFill = ($Border.Separator * $CharFillCount) $SeparatorAltFill = ($Border.AltSeparator * $CharFillCount) $AccentFill = ($Border.AccentChar * $CharFillCount) $MenuHeaderPadding = [Math]::Floor(($Form.UIWidth - $Form.MenuHeader.Length) / 2) $CenteredMenuHeader = $Form.MenuHeader.PadLeft($Form.MenuHeader.Length + $MenuHeaderPadding).PadRight($Form.UIWidth - 2) $MenuHelpPadding = [Math]::Floor(($Form.UIWidth - $Form.UIHelpMenuText.Length) / 2) $CenteredMenuHelp = $Form.UIHelpMenuText.PadLeft($Form.UIHelpMenuText.Length + $MenuHelpPadding).PadRight($Form.UIWidth - 2) $VersionSpacing = (" " * ($Form.UIWidth - 38)) $CurrentVersion = $PoshTui_CurrentVersion $LineBorderTop = "$($Color.UIBorderColor)" + $Border.CornerTopL + $HorizontalFill + $Border.CornerTopR + "$($Color.Reset)" # Form Titlebar $LineFormTitle = "$($Color.UIBorderColor)" + $Border.Vertical + " " + "$($Color.FormTitleColor)" + " [$($Form.FormTitle)]" + "$($Color.Reset)" + (" " * ($Form.UIWidth - ($Form.FormTitle.Length) - 6)) + "$($Color.UIBorderColor)" + $Border.Vertical + "$($Color.Reset)" # Separator $LineBorderSeparator = "$($Color.UIBorderColor)" + $Border.Vertical + $SeparatorFill + $Border.Vertical + "$($Color.Reset)" # Selection Menu Titlebar $LineMenuTitle = "$($Color.UIBorderColor)" + $Border.Vertical + "$($Color.MenuHeaderColor)" + $CenteredMenuHeader + "$($Color.UIBorderColor)" + $Border.Vertical + "$($Color.Reset)" # Empty line $LineEmpty = "$($Color.UIBorderColor)" + $Border.Vertical + $EmptyFill + $Border.Vertical + "$($Color.Reset)" # Alternate Separator $LineBorderSeparatorAlt = "$($Color.UIBorderColor)" + $Border.Vertical + $SeparatorAltFill + $Border.Vertical + "$($Color.Reset)" # Empty/Void Lines $LineBorderEmpty = "$($Color.UIBorderColor)" + $Border.Vertical + $EmptyFill + $Border.Vertical + "$($Color.Reset)" # Full Block Line $LineFullBlock = "$($Color.UIBorderColor)" + $Border.Vertical + "$($Color.UIAccentColor)" + $AccentFill + $($Color.UIBorderColor) + $Border.Vertical + "$($Color.Reset)" $LineMenuHelp = "$($Color.UIBorderColor)" + $Border.Vertical + "$($Color.UIMenuHelpTextColor)" + "$CenteredMenuHelp" + "$($Color.UIBorderColor)" + $Border.Vertical + "$($Color.Reset)" <# # PoshUI Version Information Line $LineBorderVersionInfo = "$($Color.UIBorderColor)" + $Border.Vertical + $VersionSpacing + "$($($Color.VersionColor))" + $CurrentVersion + "$($Color.Reset)" + "$($Color.UIBorderColor) " + $Border.Vertical + "$($Color.Reset)" #> # Bottom of Form Border $LineBorderBottom = "$($Color.UIBorderColor)" + $Border.CornerBtmL + $HorizontalFill + $Border.CornerBtmR + "$($Color.Reset)" } process{ $SelectedIndex = 0 [System.Console]::CursorVisible = $false # Drawing Form Write-Host "`e[2J" # Clears the screen Write-Host "`e[H" # Reset cursor position to 0,0 Write-Host $LineBorderTop Write-Host $LineFormTitle Write-Host $LineBorderSeparator Write-Host $LineMenuTitle Write-Host $LineBorderSeparatorAlt Write-Host $LineEmpty # Render Options $SelectedIndex = 0 Do{ # Drawing Form Write-Host "`e[2J" # Clears the screen Write-Host "`e[H" # Reset cursor position to 0,0 Write-Host $LineBorderTop Write-Host $LineFormTitle Write-Host $LineBorderSeparator Write-Host $LineMenuTitle Write-Host $LineBorderSeparatorAlt Write-Host $LineEmpty For ($i = 0; $i -lt $Form.MenuItems.Count; $i++) { $FGColor = [Console]::ForegroundColor $BGColor = [Console]::BackgroundColor $MenuItem = $Form.MenuItems[$i] $MenuItemFocus = "$($MenuItem.DisplayName)" $MenuItemPadding = [math]::Floor(($Form.UIWidth - $MenuItem.DisplayName.Length) / 2) $centeredItem = $MenuItem.DisplayName.PadLeft($MenuItem.DisplayName.Length + $MenuItemPadding).PadRight($Form.UIWidth - 2) $MenuItemFocusPadding = [math]::Floor(($Form.UIWidth - $MenuItemFocus.Length) / 2) $centeredItemFocus = $MenuItemFocus.PadLeft($MenuItemFocus.Length + $MenuItemFocusPadding).PadRight($Form.UIWidth - 2) if ($i -eq $SelectedIndex) { Write-Host "$($Color.UIBorderColor)$($Border.Vertical)" -NoNewLine if ($Form.MenuItemFocusStyle -eq 'Highlight') { Write-Host "$($Color.MenuItemHighlightColor)$CenteredItemFocus" -NoNewLine } elseif ($Form.MenuItemFocusStyle -eq 'HighlightInverted') { Write-Host "$CenteredItemFocus" -ForegroundColor $BGColor -BackgroundColor $FGColor -NoNewLine } Write-Host "$($Color.UIBorderColor)$($Border.Vertical)$($Color.Reset)" } else { Write-Host "$($Color.UIBorderColor)$($Border.Vertical)$($Color.MenuItemColor)$CenteredItem$($Color.UIBorderColor)$($Border.Vertical)$($Color.Reset)" } } #HERE $DetailsTitlePadding = [math]::Floor(($Form.UIWidth - $Form.MenuItemDescriptionHeader.Length) / 2) $ItemInfoPadding = [math]::Floor(($Form.UIWidth - $Form.MenuItems[$selectedIndex].Description.Length) / 2) $centeredInfoTag = $Form.MenuItemDescriptionHeader.PadLeft($Form.MenuItemDescriptionHeader.Length + $DetailsTitlePadding).PadRight($Form.UIWidth - 2) $centeredInfo = ($Form.MenuItems[$selectedIndex].Description.PadLeft($Form.MenuItems[$selectedIndex].Description.Length + $ItemInfoPadding).PadRight($Form.UIWidth - 2)) Write-Host $LineEmpty Write-Host $LineBorderSeparator Write-Host "$BorderColor$($Border.Vertical)$($Form.ItemInfoHeaderColor)$CenteredInfoTag$BorderColor$($Border.Vertical)$ColorReset" Write-Host $LineBorderSeparator Write-Host $LineEmpty Write-Host "$BorderColor$($Border.Vertical)$($Form.ItemInfoColor)$CenteredInfo$BorderColor$($Border.Vertical)$ColorReset" Write-Host $LineEmpty Write-Host $LineBorderSeparator Write-Host $LineFullBlock # Write-Host $LineMenuHelp # Write-Host $LineFullBlock Write-Host $LineBorderSeparator Write-Host $LineEmpty Write-Host $LineBorderBottom $Key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown").VirtualKeyCode switch($Key){ 38{ #UP $SelectedIndex = ($SelectedIndex - 1) % $Form.MenuItems.Count if ($SelectedIndex -lt 0) { $SelectedIndex = $Form.MenuItems.Count - 1 } } 40{ #DOWN $SelectedIndex = ($SelectedIndex + 1) % $Form.MenuItems.Count } 13{ #ENTER Clear-Host . $Form.MenuItems[$SelectedIndex].Action return } } } While($True) } } |