Classes.psm1

<#
    PoshTui - UIRendering Class Library
 
    PowerShell Object Class Definitions used to render PoshTui forms-like Console Menus
#>


#region Enumerators

Enum PoshTuiMenuItemFocusStyleEnum {
    Highlight
    HighlightInverted
}

Enum PoshTuiBorderStyleEnum {
    NoBorder
    SingleLight
    SingleHeavy
    Double
    Rounded
}


#endregion


#region Pre-Configured Clases

<#
    Object Class Definitions with preset values
#>


Class PoshTuiMenuBorderDrawingGlyphsets {
    # No Border Defined
    [System.Management.Automation.OrderedHashtable]$NoBorder = @{}

    # Single Border Light
    [System.Management.Automation.OrderedHashtable]$SingleLight = @{
        CornerTopL         = '┌'
        CornerTopR         = '┐'
        Horizontal         = '─'
        CornerBtmL         = '└'
        CornerBtmR         = '┘'
        Vertical           = '│'
        VerticalSeparatorL = '├'
        VerticalSeparatorR = '┤'
        Separator          = '─'
        AltSeparator       = '┄'
        AccentChar         = '█'
    }

    # Single Border Heavy
    [System.Management.Automation.OrderedHashtable]$SingleHeavy = @{
        CornerTopL         = '┏'
        CornerTopR         = '┓'
        Horizontal         = '━'
        CornerBtmL         = '┗'
        CornerBtmR         = '┛'
        Vertical           = '┃'
        VerticalSeparatorL = '┠'
        VeritcalSeparatorR = '┨'
        Separator          = '─'
        AltSeparator       = '┄'
        AccentChar         = '█'
    }

    # Double Border
    [System.Management.Automation.OrderedHashtable]$Double = @{
        CornerTopL         = '╔'
        CornerTopR         = '╗'
        Horizontal         = '═'
        CornerBtmL         = '╚'
        CornerBtmR         = '╝'
        Vertical           = '║'
        VerticalSeparatorL = '╟'
        VerticalSeparatorR = '╢'
        Separator          = '─'
        AltSeparator       = '╍'
        AccentChar         = '█'
    }

    # Single Border Light with Rounded Corners
    [System.Management.Automation.OrderedHashtable]$Rounded = @{
        CornerTopL         = '╭'
        CornerTopR         = '╮'
        Horizontal         = '─'
        CornerBtmL         = '╰'
        CornerBtmR         = '╯'
        Vertical           = '│'
        VerticalSeparatorL = '├'
        VerticalSeparatorR = '┤'
        Separator          = '─'
        AltSeparator       = '┄'
        AccentChar         = '█'
    }

    PoshTuiMenuBorderDrawingGlyphsets(){}

}

#endregion


#region Base Classes

<#
    Object Class Definitions that must be instantiated and configued for menu builidng
#>


Class PoshTuiMenuItem {
    # The name rendered within the menu
    [string]$DisplayName
    # A brief, helpful description of the menu item, explaining the action(s) executed upon selection
    [string]$Description

    [ScriptBlock]$Action

    PoshTuiMenuItem([string]$DisplayName){
        $This.DisplayName = $DisplayName
    }

    AddItemDescription([string]$Description){
        $This.Description = $Description
    }

    AddActionScriptBlock([ScriptBlock]$Action){
        $This.Action = $Action
    }
}


Class PoshTuiConsoleFormColorscheme {
    hidden [string]$ResetColor = "`e[0m"
    [string]$UIBorderColor = "`e[38;5;230m"
    [string]$UIAccentColor = "`e[38;5;123m"
    [string]$FormTitleColor = "`e[38;5;51m"
    [string]$MenuHeaderColor = "`e[38;5;51m"
    [string]$MenuItemColor = "`e[38;5;243m"
    [string]$MenuItemHighlightColor = "`e[38;5;14m"
    [string]$MenuItemDescriptionHeaderColor = "`e[38;5;229m"
    [string]$MenuItemDescriptionColor = "`e[38;5;85m"
    [string]$UIHelpMenuTextColor = "`e[38;5;255m"
    [string]$VersionColor = "`e[38;5;240m"

    PoshTuiConsoleFormColorscheme(){}
}


Class PoshTuiConsoleForm {
    [int]$MenuId = 0
    [string]$Name = 'PoshTuiConsoleForm'
    [int]$UIWidth = 208
    [PoshTuiBorderStyleEnum]$UIBorderStyle = 'Rounded'
    [string]$FormTitle
    [string]$MenuHeader
    [PoshTuiMenuItemFocusStyleEnum]$MenuItemFocusStyle = 'HighlightInverted'
    [PoshTuiConsoleFormColorscheme]$UIColorscheme = [PoshTuiConsoleFormColorscheme]::new()
    [bool]$DisplayMenuItemDescription = $true
    hidden [string]$MenuItemDescriptionHeader = 'Item Details'
    [bool]$DisplayUIHelpMenu = $true
    hidden [string]$UIHelpMenuText = "[Up/Down - Navigate Menu] [ENTER - Confirm Selection] [ESC - Exit]"

    [PoshTuiMenuItem[]]$MenuItems

    PoshTuiConsoleForm(){}

    AddMenuItem([PoshTuiMenuItem[]]$MenuItem) {
        $This.MenuItems += $MenuItem
    }

    Initialize(){
        Initialize-PoshTuiConsoleForm $This
    }

}

#endregion