private/output/New-ProgressPanel.ps1


function New-ProgressPanel {
    <#
    .SYNOPSIS
        Creates a progress panel with support for nested progress activities.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [hashtable]$Colors
    )

    # Progress panel - supports multiple nested progress bars (keyed by ActivityId)
    $progressPanel = [System.Windows.Controls.StackPanel]@{
        Orientation = 'Vertical'
        Margin      = [System.Windows.Thickness]::new(12, 0, 12, 8)
        Visibility  = 'Collapsed'
    }
    [System.Windows.Controls.DockPanel]::SetDock($progressPanel, 'Top')

    # Dictionary to track multiple progress activities (keyed by ActivityId)
    $progressActivities = @{}

    # Helper function to create a progress bar UI element for an activity
    $createProgressUI = {
        param($activityId, $isChild)

        $stack = [System.Windows.Controls.StackPanel]@{
            Orientation = 'Vertical'
            Margin      = if ($isChild) { [System.Windows.Thickness]::new(24, 2, 12, 2) } else { [System.Windows.Thickness]::new(12, 4, 12, 4) }
        }

        $label = [System.Windows.Controls.TextBlock]@{
            FontSize   = if ($isChild) { 10 } else { 11 }
            Foreground = ConvertTo-UiBrush $Colors.SecondaryText
            Margin     = [System.Windows.Thickness]::new(0, 0, 0, 2)
        }
        [void]$stack.Children.Add($label)

        $bar = [System.Windows.Controls.ProgressBar]@{
            IsIndeterminate = $true
            Height          = if ($isChild) { 3 } else { 4 }
            Background      = ConvertTo-UiBrush $Colors.ControlBg
            Foreground      = if ($isChild) { ConvertTo-UiBrush $Colors.SecondaryText } else { ConvertTo-UiBrush $Colors.Accent }
        }
        Set-ProgressBarStyle -ProgressBar $bar
        [void]$stack.Children.Add($bar)

        return @{
            Container = $stack
            Label     = $label
            Bar       = $bar
            IsChild   = $isChild
        }
    }

    # Create default progress bar (ActivityId = 0) but DON'T add to panel yet
    $defaultProgressUI             = & $createProgressUI 0 $false
    $defaultProgressUI.Label.Text  = "Processing..."

    # Alias for backward compatibility
    $progressBar = $defaultProgressUI.Bar

    return @{
        Panel               = $progressPanel
        Activities          = $progressActivities
        DefaultUI           = $defaultProgressUI
        ProgressBar         = $progressBar
        CreateProgressUI    = $createProgressUI
    }
}