2026-02-27 07:24:23 -06:00
// Copyright (c) Microsoft Corporation
// The Microsoft Corporation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
2026-03-27 12:54:58 -05:00
using System.Collections.Immutable ;
2026-02-27 07:24:23 -06:00
using System.Text.Json.Serialization ;
using Windows.UI ;
namespace Microsoft.CmdPal.UI.ViewModels.Settings ;
#pragma warning disable SA1402 // File may only contain a single type
/// <summary>
/// Settings for the Dock. These are settings for _the whole dock_. Band-specific
/// settings are in <see cref="DockBandSettings"/>.
/// </summary>
2026-03-27 12:54:58 -05:00
public record DockSettings
2026-02-27 07:24:23 -06:00
{
2026-03-27 12:54:58 -05:00
public DockSide Side { get ; init ; } = DockSide . Top ;
2026-02-27 07:24:23 -06:00
2026-03-27 12:54:58 -05:00
public DockSize DockSize { get ; init ; } = DockSize . Small ;
2026-02-27 07:24:23 -06:00
2026-03-27 12:54:58 -05:00
public DockSize DockIconsSize { get ; init ; } = DockSize . Small ;
2026-02-27 07:24:23 -06:00
// <Theme settings>
2026-03-27 12:54:58 -05:00
public DockBackdrop Backdrop { get ; init ; } = DockBackdrop . Acrylic ;
2026-02-27 07:24:23 -06:00
2026-03-27 12:54:58 -05:00
public UserTheme Theme { get ; init ; } = UserTheme . Default ;
2026-02-27 07:24:23 -06:00
2026-03-27 12:54:58 -05:00
public ColorizationMode ColorizationMode { get ; init ; }
2026-02-27 07:24:23 -06:00
2026-03-27 12:54:58 -05:00
public Color CustomThemeColor { get ; init ; } = new ( ) { A = 0 , R = 255 , G = 255 , B = 255 } ; // Transparent — avoids WinUI3 COM dependency on Colors.Transparent and COM in class init
2026-02-27 07:24:23 -06:00
2026-03-27 12:54:58 -05:00
public int CustomThemeColorIntensity { get ; init ; } = 100 ;
2026-02-27 07:24:23 -06:00
2026-03-27 12:54:58 -05:00
public int BackgroundImageOpacity { get ; init ; } = 20 ;
2026-02-27 07:24:23 -06:00
2026-03-27 12:54:58 -05:00
public int BackgroundImageBlurAmount { get ; init ; }
2026-02-27 07:24:23 -06:00
2026-03-27 12:54:58 -05:00
public int BackgroundImageBrightness { get ; init ; }
2026-02-27 07:24:23 -06:00
2026-03-27 12:54:58 -05:00
public BackgroundImageFit BackgroundImageFit { get ; init ; }
2026-02-27 07:24:23 -06:00
2026-03-27 12:54:58 -05:00
public string? BackgroundImagePath { get ; init ; }
2026-02-27 07:24:23 -06:00
// </Theme settings>
2026-03-27 12:54:58 -05:00
public ImmutableList < DockBandSettings > StartBands { get ; init ; } = ImmutableList . Create (
new DockBandSettings
2026-02-27 07:24:23 -06:00
{
ProviderId = "com.microsoft.cmdpal.builtin.core" ,
CommandId = "com.microsoft.cmdpal.home" ,
2026-03-27 12:54:58 -05:00
} ,
new DockBandSettings
2026-02-27 07:24:23 -06:00
{
ProviderId = "WinGet" ,
CommandId = "com.microsoft.cmdpal.winget" ,
ShowLabels = false ,
} ) ;
2026-03-27 12:54:58 -05:00
public ImmutableList < DockBandSettings > CenterBands { get ; init ; } = ImmutableList < DockBandSettings > . Empty ;
public ImmutableList < DockBandSettings > EndBands { get ; init ; } = ImmutableList . Create (
new DockBandSettings
2026-02-27 07:24:23 -06:00
{
ProviderId = "PerformanceMonitor" ,
CommandId = "com.microsoft.cmdpal.performanceWidget" ,
2026-03-27 12:54:58 -05:00
} ,
new DockBandSettings
2026-02-27 07:24:23 -06:00
{
ProviderId = "com.microsoft.cmdpal.builtin.datetime" ,
CommandId = "com.microsoft.cmdpal.timedate.dockBand" ,
} ) ;
2026-03-27 12:54:58 -05:00
public bool ShowLabels { get ; init ; } = true ;
[JsonIgnore]
public IEnumerable < ( string ProviderId , string CommandId ) > AllPinnedCommands = >
StartBands . Select ( b = > ( b . ProviderId , b . CommandId ) )
. Concat ( CenterBands . Select ( b = > ( b . ProviderId , b . CommandId ) ) )
. Concat ( EndBands . Select ( b = > ( b . ProviderId , b . CommandId ) ) ) ;
2026-02-27 07:24:23 -06:00
}
/// <summary>
/// Settings for a specific dock band. These are per-band settings stored
/// within the overall <see cref="DockSettings"/>.
/// </summary>
2026-03-27 12:54:58 -05:00
public record DockBandSettings
2026-02-27 07:24:23 -06:00
{
2026-03-27 12:54:58 -05:00
public required string ProviderId { get ; init ; }
2026-02-27 07:24:23 -06:00
2026-03-27 12:54:58 -05:00
public required string CommandId { get ; init ; }
2026-02-27 07:24:23 -06:00
/// <summary>
/// Gets or sets whether titles are shown for items in this band.
/// If null, falls back to dock-wide ShowLabels setting.
/// </summary>
2026-03-27 12:54:58 -05:00
public bool? ShowTitles { get ; init ; }
2026-02-27 07:24:23 -06:00
/// <summary>
/// Gets or sets whether subtitles are shown for items in this band.
/// If null, falls back to dock-wide ShowLabels setting.
/// </summary>
2026-03-27 12:54:58 -05:00
public bool? ShowSubtitles { get ; init ; }
2026-02-27 07:24:23 -06:00
/// <summary>
/// Gets or sets a value for backward compatibility. Maps to ShowTitles.
/// </summary>
[System.Text.Json.Serialization.JsonIgnore]
public bool? ShowLabels
{
get = > ShowTitles ;
2026-03-27 12:54:58 -05:00
init = > ShowTitles = value ;
2026-02-27 07:24:23 -06:00
}
/// <summary>
/// Resolves the effective value of <see cref="ShowTitles"/> for this band.
/// If this band doesn't have a specific value set, we'll fall back to the
/// dock-wide setting (passed as <paramref name="defaultValue"/>).
/// </summary>
public bool ResolveShowTitles ( bool defaultValue ) = > ShowTitles ? ? defaultValue ;
/// <summary>
/// Resolves the effective value of <see cref="ShowSubtitles"/> for this band.
/// If this band doesn't have a specific value set, we'll fall back to the
/// dock-wide setting (passed as <paramref name="defaultValue"/>).
/// </summary>
public bool ResolveShowSubtitles ( bool defaultValue ) = > ShowSubtitles ? ? defaultValue ;
}
public enum DockSide
{
Left = 0 ,
Top = 1 ,
Right = 2 ,
Bottom = 3 ,
}
public enum DockSize
{
Small ,
Medium ,
Large ,
}
public enum DockBackdrop
{
Transparent ,
Acrylic ,
}
#pragma warning restore SA1402 // File may only contain a single type