Skip to content

Commit

Permalink
Settings in a window vs inline
Browse files Browse the repository at this point in the history
  • Loading branch information
niels9001 committed Jan 24, 2025
1 parent 4d464bc commit 518f01b
Show file tree
Hide file tree
Showing 19 changed files with 506 additions and 290 deletions.
1 change: 1 addition & 0 deletions src/modules/cmdpal/Microsoft.CmdPal.UI/App.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<!-- Other merged dictionaries here -->
<ResourceDictionary Source="Styles/Button.xaml" />
<ResourceDictionary Source="Styles/TextBox.xaml" />
<ResourceDictionary Source="Styles/Settings.xaml" />
<ResourceDictionary Source="Controls/Tag.xaml" />
<ResourceDictionary Source="Controls/KeyVisual/KeyVisual.xaml" />
</ResourceDictionary.MergedDictionaries>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public List<object> Keys
set { SetValue(KeysProperty, value); }
}

public static readonly DependencyProperty KeysProperty = DependencyProperty.Register("Keys", typeof(List<object>), typeof(SettingsPage), new PropertyMetadata(default(string)));
public static readonly DependencyProperty KeysProperty = DependencyProperty.Register("Keys", typeof(List<object>), typeof(ShortcutDialogContentControl), new PropertyMetadata(default(string)));

public bool IsError
{
Expand Down
4 changes: 2 additions & 2 deletions src/modules/cmdpal/Microsoft.CmdPal.UI/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:Microsoft.CmdPal.UI"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:pages="using:Microsoft.CmdPal.UI.Pages"
xmlns:viewmodels="using:Microsoft.CmdPal.UI.ViewModels"
Activated="MainWindow_Activated"
Closed="MainWindow_Closed"
mc:Ignorable="d">

<local:ShellPage x:Name="RootShellPage" />
<pages:ShellPage x:Name="RootShellPage" />
</Window>
1 change: 1 addition & 0 deletions src/modules/cmdpal/Microsoft.CmdPal.UI/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Runtime.InteropServices;
using CommunityToolkit.Mvvm.Messaging;
using Microsoft.CmdPal.Common.Services;
using Microsoft.CmdPal.UI.Pages;
using Microsoft.CmdPal.UI.ViewModels;
using Microsoft.CmdPal.UI.ViewModels.Messages;
using Microsoft.CmdPal.UI.ViewModels.Settings;
Expand Down
28 changes: 24 additions & 4 deletions src/modules/cmdpal/Microsoft.CmdPal.UI/Microsoft.CmdPal.UI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,12 @@
<None Remove="ListDetailPage.xaml" />
<None Remove="LoadingPage.xaml" />
<None Remove="MainPage.xaml" />
<None Remove="Pages\Settings\ExtensionsPage.xaml" />
<None Remove="Pages\Settings\GeneralPage.xaml" />
<None Remove="SettingsWindow.xaml" />
<None Remove="ShellPage.xaml" />
<None Remove="SettingsPage.xaml" />
<None Remove="Styles\Button.xaml" />
<None Remove="Styles\Settings.xaml" />
<None Remove="Styles\TextBox.xaml" />
</ItemGroup>

Expand Down Expand Up @@ -128,9 +131,6 @@
<Page Update="MainPage.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Update="SettingsPage.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Update="Controls\SearchBar.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
Expand Down Expand Up @@ -162,6 +162,26 @@
<Content Include="$(PkgAdaptiveCards_ObjectModel_WinUI3)\$(AdaptiveCardsNative)\AdaptiveCards.ObjectModel.WinUI3.dll" Link="AdaptiveCards.ObjectModel.WinUI3.dll" CopyToOutputDirectory="PreserveNewest" />
<Content Include="$(PkgAdaptiveCards_Rendering_WinUI3)\$(AdaptiveCardsNative)\AdaptiveCards.Rendering.WinUI3.dll" Link="AdaptiveCards.Rendering.WinUI3.dll" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup>
<Page Update="Styles\Settings.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Page Update="Pages\Settings\ExtensionsPage.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Page Update="SettingsWindow.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Page Update="Pages\Settings\GeneralPage.xaml">
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<!-- </AdaptiveCardsWorkaround> -->

</Project>
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
<?xml version="1.0" encoding="utf-8" ?>
<Page
x:Class="Microsoft.CmdPal.UI.LoadingPage"
x:Class="Microsoft.CmdPal.UI.Pages.LoadingPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:Microsoft.CmdPal.UI"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Navigation;

namespace Microsoft.CmdPal.UI;
namespace Microsoft.CmdPal.UI.Pages;

/// <summary>
/// We use this page to do initialization of our extensions and cache loading to hydrate our ViewModels.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
<?xml version="1.0" encoding="utf-8" ?>
<Page
x:Class="Microsoft.CmdPal.UI.Pages.ExtensionsPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:CommunityToolkit.WinUI.Controls"
xmlns:converters="using:CommunityToolkit.WinUI.Converters"
xmlns:cpcontrols="using:Microsoft.CmdPal.UI.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:helpers="using:Microsoft.CmdPal.UI.Helpers"
xmlns:local="using:Microsoft.CmdPal.UI.Pages"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="using:CommunityToolkit.WinUI"
xmlns:viewmodels="using:Microsoft.CmdPal.UI.ViewModels"
mc:Ignorable="d">

<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock
MaxWidth="1000"
Style="{StaticResource TitleTextBlockStyle}"
Text="Extensions" />
<ScrollViewer Grid.Row="1" Padding="0,0,8,0">
<Grid Padding="8,16,8,8">
<StackPanel
MaxWidth="1000"
HorizontalAlignment="Stretch"
Spacing="{StaticResource SettingsCardSpacing}">

<ItemsRepeater ItemsSource="{x:Bind ViewModel.CommandProviders, Mode=OneWay}" Layout="{StaticResource VerticalStackLayout}">
<ItemsRepeater.ItemTemplate>
<DataTemplate x:DataType="viewmodels:ProviderSettingsViewModel">
<controls:SettingsCard ContentAlignment="Left" IsClickEnabled="True">
<!--
What we're doing here is 90% stupid.
The SettingsCard APIs only explicitly allow an
Icon as the content for the HeaderIcon property.
We of course, have to do the goofy async IconBox thing.
To manage this, we have to basically re-create
the layout of the SettingsCard HeaderIcon,
Header & Description, all within the Content.
Most of what follows is lifted directly from
https://github.com/CommunityToolkit/Windows/blob/main/components/SettingsControls/src/SettingsCard/SettingsCard.xaml
-->
<Grid Margin="0,-12,0,0" HorizontalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" MinWidth="0" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>

<Viewbox
Grid.RowSpan="1"
MaxWidth="20"
MaxHeight="20"
Margin="2,0,20,0">
<cpcontrols:IconBox
Width="20"
Height="20"
Margin="0,0,0,0"
AutomationProperties.AccessibilityView="Raw"
SourceKey="{x:Bind Icon, Mode=OneWay}"
SourceRequested="{x:Bind helpers:IconCacheProvider.SourceRequested}" />
</Viewbox>

<StackPanel
Grid.Column="1"
Margin="0,0,24,0"
VerticalAlignment="Center"
Orientation="Vertical">
<ContentPresenter
Grid.Column="1"
HorizontalAlignment="Left"
Content="{x:Bind DisplayName, Mode=OneWay}"
HighContrastAdjustment="None"
TextWrapping="Wrap" />

<ContentPresenter
Content="{x:Bind ExtensionName, Mode=OneWay}"
FontSize="12"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
TextWrapping="Wrap" />
</StackPanel>

<!--
Because of this insane XAML thing we're
doing, we can't effectively put content
here on the right. Sad.
-->

<!--<ContentPresenter
Grid.Column="2"
HorizontalAlignment="Right"
VerticalAlignment="Center"
HorizontalContentAlignment="Right">
<ToggleSwitch IsOn="{x:Bind IsEnabled, Mode=TwoWay}"/>
</ContentPresenter>-->
</Grid>
</controls:SettingsCard>
</DataTemplate>
</ItemsRepeater.ItemTemplate>
</ItemsRepeater>
</StackPanel>
</Grid>
</ScrollViewer>
</Grid>
</Page>
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// 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.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Microsoft.CmdPal.UI.ViewModels;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using Windows.Foundation;
using Windows.Foundation.Collections;

namespace Microsoft.CmdPal.UI.Pages;

public sealed partial class ExtensionsPage : Page
{
private readonly TaskScheduler _mainTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();

public SettingsViewModel? ViewModel
{
get => (SettingsViewModel?)GetValue(ViewModelProperty);
set => SetValue(ViewModelProperty, value);
}

// Using a DependencyProperty as the backing store for ViewModel. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ViewModelProperty =
DependencyProperty.Register(nameof(ViewModel), typeof(SettingsViewModel), typeof(ExtensionsPage), new PropertyMetadata(null, null));

public ExtensionsPage()
{
this.InitializeComponent();

var settings = App.Current.Services.GetService<SettingsModel>()!;
ViewModel = new SettingsViewModel(settings, App.Current.Services, _mainTaskScheduler);
}
}
108 changes: 108 additions & 0 deletions src/modules/cmdpal/Microsoft.CmdPal.UI/Pages/Settings/GeneralPage.xaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
<?xml version="1.0" encoding="utf-8" ?>
<Page
x:Class="Microsoft.CmdPal.UI.Pages.GeneralPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:CommunityToolkit.WinUI.Controls"
xmlns:converters="using:CommunityToolkit.WinUI.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:Microsoft.CmdPal.UI.Pages"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ptControls="using:Microsoft.CmdPal.UI.Controls"
xmlns:ui="using:CommunityToolkit.WinUI"
xmlns:viewmodels="using:Microsoft.CmdPal.UI.ViewModels"
mc:Ignorable="d">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock
MaxWidth="1000"
Style="{StaticResource TitleTextBlockStyle}"
Text="General" />
<ScrollViewer Grid.Row="1" Padding="0,0,8,0">
<Grid Padding="8,16,8,8">
<StackPanel
MaxWidth="1000"
HorizontalAlignment="Stretch"
Spacing="{StaticResource SettingsCardSpacing}">

<!--
I got these from the samples, but they break XAML hot-reloading,
so I commented them out.
-->

<!--<StackPanel.ChildrenTransitions>
<EntranceThemeTransition FromVerticalOffset="50" />
<RepositionThemeTransition IsStaggeringEnabled="False" />
</StackPanel.ChildrenTransitions>-->

<controls:SettingsExpander
Description="This key will open the Command Palette"
Header="Activation key"
HeaderIcon="{ui:FontIcon Glyph=&#xEDA7;}"
IsExpanded="True">
<ptControls:ShortcutControl HotkeySettings="{x:Bind ViewModel.Hotkey, Mode=TwoWay}" />

<controls:SettingsExpander.Items>
<controls:SettingsCard
Description="If enabled, the Command Palette will return to the home page when activated"
Header="Go home when activated"
HeaderIcon="{ui:FontIcon Glyph=&#xE80F;}">
<ToggleSwitch IsOn="{x:Bind ViewModel.HotkeyGoesHome, Mode=TwoWay}" />
</controls:SettingsCard>
<controls:SettingsCard Description="When enabled, the previous search text will be selected when the app is opened" Header="Highlight search on activate">
<ToggleSwitch IsOn="{x:Bind ViewModel.HighlightSearchOnActivate, Mode=TwoWay}" />
</controls:SettingsCard>
</controls:SettingsExpander.Items>
</controls:SettingsExpander>

<controls:SettingsCard
Description="Controls if app details are automatically expanded or not"
Header="Show app details"
HeaderIcon="{ui:FontIcon Glyph=&#xE8A0;}">
<ToggleSwitch IsOn="{x:Bind ViewModel.ShowAppDetails, Mode=TwoWay}" />
</controls:SettingsCard>

<controls:SettingsCard
Description="When enabled, pressing backspace when the search text is empty will take you back"
Header="Backspace goes back"
HeaderIcon="{ui:FontIcon Glyph=&#xE750;}">
<ToggleSwitch IsOn="{x:Bind ViewModel.BackspaceGoesBack, Mode=TwoWay}" />
</controls:SettingsCard>

<controls:SettingsCard
Description="When enabled, single click activates list items. When disabled, single click selects and double click activates."
Header="Single-click activates"
HeaderIcon="{ui:FontIcon Glyph=&#xE962;}">
<ToggleSwitch IsOn="{x:Bind ViewModel.SingleClickActivates, Mode=TwoWay}" />
</controls:SettingsCard>

<!-- Example 'About' section -->
<TextBlock x:Uid="AboutSettingsHeader" Style="{StaticResource SettingsSectionHeaderTextBlockStyle}" />

<controls:SettingsExpander
Description="© 2025. All rights reserved."
Header="Windows Command Palette"
HeaderIcon="{ui:BitmapIcon Source=ms-appx:///Assets/StoreLogo.png}">
<TextBlock
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
IsTextSelectionEnabled="True"
Text="Version 0.0.1" />
<controls:SettingsExpander.Items>
<controls:SettingsCard HorizontalContentAlignment="Left" ContentAlignment="Left">
<StackPanel Margin="-12,0,0,0" Orientation="Vertical">
<HyperlinkButton Content="Link 1" />
<HyperlinkButton Content="Link 2" />
<HyperlinkButton Content="Link 3" />
</StackPanel>
</controls:SettingsCard>
</controls:SettingsExpander.Items>
</controls:SettingsExpander>
<HyperlinkButton Margin="0,8,0,0" Content="Send feedback" />
</StackPanel>
</Grid>
</ScrollViewer>
</Grid>
</Page>
Loading

0 comments on commit 518f01b

Please sign in to comment.