Skip to content

Commit ceb291d

Browse files
committed
PRE-MERGE #18917 Allow editing actions in the settings UI
2 parents c28610d + f4eda1b commit ceb291d

24 files changed

+3124
-611
lines changed

src/cascadia/TerminalSettingsEditor/Actions.cpp

Lines changed: 8 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -19,52 +19,17 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
1919
Automation::AutomationProperties::SetName(AddNewButton(), RS_(L"Actions_AddNewTextBlock/Text"));
2020
}
2121

22-
Automation::Peers::AutomationPeer Actions::OnCreateAutomationPeer()
23-
{
24-
_ViewModel.OnAutomationPeerAttached();
25-
return nullptr;
26-
}
27-
2822
void Actions::OnNavigatedTo(const NavigationEventArgs& e)
2923
{
3024
_ViewModel = e.Parameter().as<Editor::ActionsViewModel>();
31-
32-
// Subscribe to the view model's FocusContainer event.
33-
// Use the KeyBindingViewModel or index provided in the event to focus the corresponding container
34-
_ViewModel.FocusContainer([this](const auto& /*sender*/, const auto& args) {
35-
if (auto kbdVM{ args.try_as<KeyBindingViewModel>() })
36-
{
37-
if (const auto& container = KeyBindingsListView().ContainerFromItem(*kbdVM))
38-
{
39-
container.as<Controls::ListViewItem>().Focus(FocusState::Programmatic);
40-
}
41-
}
42-
else if (const auto& index = args.try_as<uint32_t>())
43-
{
44-
if (const auto& container = KeyBindingsListView().ContainerFromIndex(*index))
45-
{
46-
container.as<Controls::ListViewItem>().Focus(FocusState::Programmatic);
47-
}
48-
}
49-
});
50-
51-
// Subscribe to the view model's UpdateBackground event.
52-
// The view model does not have access to the page resources, so it asks us
53-
// to update the key binding's container background
54-
_ViewModel.UpdateBackground([this](const auto& /*sender*/, const auto& args) {
55-
if (auto kbdVM{ args.try_as<KeyBindingViewModel>() })
56-
{
57-
if (kbdVM->IsInEditMode())
58-
{
59-
const auto& containerBackground{ Resources().Lookup(box_value(L"ActionContainerBackgroundEditing")).as<Windows::UI::Xaml::Media::Brush>() };
60-
kbdVM->ContainerBackground(containerBackground);
61-
}
62-
else
63-
{
64-
const auto& containerBackground{ Resources().Lookup(box_value(L"ActionContainerBackground")).as<Windows::UI::Xaml::Media::Brush>() };
65-
kbdVM->ContainerBackground(containerBackground);
66-
}
67-
}
25+
_ViewModel.CurrentPage(ActionsSubPage::Base);
26+
auto vmImpl = get_self<ActionsViewModel>(_ViewModel);
27+
vmImpl->MarkAsVisited();
28+
_layoutUpdatedRevoker = LayoutUpdated(winrt::auto_revoke, [this](auto /*s*/, auto /*e*/) {
29+
// Only let this succeed once.
30+
_layoutUpdatedRevoker.revoke();
31+
32+
AddNewButton().Focus(FocusState::Programmatic);
6833
});
6934

7035
TraceLoggingWrite(
@@ -75,9 +40,4 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
7540
TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES),
7641
TelemetryPrivacyDataTag(PDT_ProductAndServiceUsage));
7742
}
78-
79-
void Actions::AddNew_Click(const IInspectable& /*sender*/, const RoutedEventArgs& /*eventArgs*/)
80-
{
81-
_ViewModel.AddNewKeybinding();
82-
}
8343
}

src/cascadia/TerminalSettingsEditor/Actions.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
1616
Actions();
1717

1818
void OnNavigatedTo(const winrt::Windows::UI::Xaml::Navigation::NavigationEventArgs& e);
19-
Windows::UI::Xaml::Automation::Peers::AutomationPeer OnCreateAutomationPeer();
20-
21-
void AddNew_Click(const IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& eventArgs);
2219

2320
til::property_changed_event PropertyChanged;
2421
WINRT_OBSERVABLE_PROPERTY(Editor::ActionsViewModel, ViewModel, PropertyChanged.raise, nullptr);
22+
23+
private:
24+
winrt::Windows::UI::Xaml::FrameworkElement::LayoutUpdated_revoker _layoutUpdatedRevoker;
2525
};
2626
}
2727

src/cascadia/TerminalSettingsEditor/Actions.xaml

Lines changed: 20 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@
123123
<Style x:Key="KeyBindingContainerStyle"
124124
BasedOn="{StaticResource DefaultListViewItemStyle}"
125125
TargetType="ListViewItem">
126-
<Setter Property="Padding" Value="4" />
126+
<Setter Property="Padding" Value="12,4,4,4" />
127127
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
128128
<Setter Property="XYFocusKeyboardNavigation" Value="Enabled" />
129129
</Style>
@@ -138,24 +138,6 @@
138138
<Setter Property="HorizontalAlignment" Value="Right" />
139139
<Setter Property="VerticalAlignment" Value="Center" />
140140
</Style>
141-
<x:Int32 x:Key="EditButtonSize">32</x:Int32>
142-
<x:Double x:Key="EditButtonIconSize">14</x:Double>
143-
<Style x:Key="EditButtonStyle"
144-
BasedOn="{StaticResource DefaultButtonStyle}"
145-
TargetType="Button">
146-
<Setter Property="Padding" Value="0" />
147-
<Setter Property="VerticalAlignment" Value="Center" />
148-
<Setter Property="Height" Value="{StaticResource EditButtonSize}" />
149-
<Setter Property="Width" Value="{StaticResource EditButtonSize}" />
150-
</Style>
151-
<Style x:Key="AccentEditButtonStyle"
152-
BasedOn="{StaticResource AccentButtonStyle}"
153-
TargetType="Button">
154-
<Setter Property="Padding" Value="4" />
155-
<Setter Property="VerticalAlignment" Value="Center" />
156-
<Setter Property="Height" Value="{StaticResource EditButtonSize}" />
157-
<Setter Property="Width" Value="{StaticResource EditButtonSize}" />
158-
</Style>
159141

160142
<!-- Converters & Misc. -->
161143
<SolidColorBrush x:Key="ActionContainerBackgroundEditing"
@@ -164,162 +146,35 @@
164146
Color="Transparent" />
165147

166148
<!-- Templates -->
167-
<DataTemplate x:Key="KeyBindingTemplate"
168-
x:DataType="local:KeyBindingViewModel">
169-
<ListViewItem AutomationProperties.AcceleratorKey="{x:Bind KeyChordText, Mode=OneWay}"
170-
AutomationProperties.Name="{x:Bind Name, Mode=OneWay}"
171-
Background="{x:Bind ContainerBackground, Mode=OneWay}"
172-
GotFocus="{x:Bind ActionGotFocus}"
173-
LostFocus="{x:Bind ActionLostFocus}"
174-
PointerEntered="{x:Bind EnterHoverMode}"
175-
PointerExited="{x:Bind ExitHoverMode}"
149+
<DataTemplate x:Key="CommandTemplate"
150+
x:DataType="local:CommandViewModel">
151+
<ListViewItem AutomationProperties.Name="{x:Bind DisplayNameAndKeyChordAutomationPropName, Mode=OneWay}"
176152
Style="{StaticResource KeyBindingContainerStyle}">
177153
<Grid ColumnSpacing="8">
178154
<Grid.ColumnDefinitions>
179155
<!-- command name -->
180156
<ColumnDefinition Width="*" />
181157
<!-- key chord -->
182158
<ColumnDefinition Width="auto" />
183-
<!-- edit buttons -->
184-
<!--
185-
This needs to be 112 because that is the width of the row of buttons in edit mode + padding.
186-
3 buttons: 32+32+32
187-
Padding: 8+ 8
188-
This allows the "edit" button to align with the "cancel" button seamlessly
189-
-->
190-
<ColumnDefinition Width="112" />
191159
</Grid.ColumnDefinitions>
192160

193161
<!-- Command Name -->
194162
<TextBlock Grid.Column="0"
195163
FontWeight="Normal"
196164
Style="{StaticResource KeyBindingNameTextBlockStyle}"
197-
Text="{x:Bind Name, Mode=OneWay}"
198-
Visibility="{x:Bind mtu:Converters.InvertedBooleanToVisibility(IsInEditMode), Mode=OneWay}" />
199-
200-
<!-- Edit Mode: Action Combo-box -->
201-
<ComboBox x:Uid="Actions_ActionComboBox"
202-
Grid.Column="0"
203-
VerticalAlignment="Center"
204-
ItemsSource="{x:Bind AvailableActions, Mode=OneWay}"
205-
SelectedItem="{x:Bind ProposedAction, Mode=TwoWay}"
206-
Visibility="{x:Bind IsInEditMode, Mode=OneWay}" />
207-
165+
Text="{x:Bind DisplayName, Mode=OneWay}" />
208166
<!-- Key Chord Text -->
209167
<Border Grid.Column="1"
210-
Padding="2,0,2,0"
168+
Padding="8,4,8,4"
211169
HorizontalAlignment="Right"
212170
VerticalAlignment="Center"
213171
Style="{ThemeResource KeyChordBorderStyle}"
214-
Visibility="{x:Bind mtu:Converters.InvertedBooleanToVisibility(IsInEditMode), Mode=OneWay}">
215-
172+
Visibility="{x:Bind mtu:Converters.StringNotEmptyToVisibility(FirstKeyChordText)}">
216173
<TextBlock FontSize="14"
217174
Style="{ThemeResource KeyChordTextBlockStyle}"
218-
Text="{x:Bind KeyChordText, Mode=OneWay}"
175+
Text="{x:Bind FirstKeyChordText, Mode=OneWay}"
219176
TextWrapping="WrapWholeWords" />
220177
</Border>
221-
222-
<!-- Edit Mode: Key Chord Listener -->
223-
<local:KeyChordListener Grid.Column="1"
224-
Keys="{x:Bind ProposedKeys, Mode=TwoWay}"
225-
Style="{StaticResource KeyChordEditorStyle}"
226-
Visibility="{x:Bind IsInEditMode, Mode=OneWay}" />
227-
228-
<!-- Edit Button -->
229-
<Button x:Uid="Actions_EditButton"
230-
Grid.Column="2"
231-
AutomationProperties.Name="{x:Bind EditButtonName}"
232-
Background="Transparent"
233-
Click="{x:Bind ToggleEditMode}"
234-
GettingFocus="{x:Bind EditButtonGettingFocus}"
235-
LosingFocus="{x:Bind EditButtonLosingFocus}"
236-
Style="{StaticResource EditButtonStyle}"
237-
Visibility="{x:Bind ShowEditButton, Mode=OneWay}">
238-
<Button.Content>
239-
<FontIcon FontSize="{StaticResource EditButtonIconSize}"
240-
Glyph="&#xE70F;" />
241-
</Button.Content>
242-
<Button.Resources>
243-
<ResourceDictionary>
244-
<ResourceDictionary.ThemeDictionaries>
245-
<ResourceDictionary x:Key="Light">
246-
<SolidColorBrush x:Key="ButtonForegroundPointerOver"
247-
Color="{StaticResource SystemAccentColor}" />
248-
<SolidColorBrush x:Key="ButtonForegroundPressed"
249-
Color="{StaticResource SystemAccentColor}" />
250-
</ResourceDictionary>
251-
<ResourceDictionary x:Key="Dark">
252-
<SolidColorBrush x:Key="ButtonForegroundPointerOver"
253-
Color="{StaticResource SystemAccentColor}" />
254-
<SolidColorBrush x:Key="ButtonForegroundPressed"
255-
Color="{StaticResource SystemAccentColor}" />
256-
</ResourceDictionary>
257-
<ResourceDictionary x:Key="HighContrast">
258-
<SolidColorBrush x:Key="ButtonBackground"
259-
Color="{ThemeResource SystemColorButtonFaceColor}" />
260-
<SolidColorBrush x:Key="ButtonBackgroundPointerOver"
261-
Color="{ThemeResource SystemColorHighlightColor}" />
262-
<SolidColorBrush x:Key="ButtonBackgroundPressed"
263-
Color="{ThemeResource SystemColorHighlightColor}" />
264-
<SolidColorBrush x:Key="ButtonForeground"
265-
Color="{ThemeResource SystemColorButtonTextColor}" />
266-
<SolidColorBrush x:Key="ButtonForegroundPointerOver"
267-
Color="{ThemeResource SystemColorHighlightTextColor}" />
268-
<SolidColorBrush x:Key="ButtonForegroundPressed"
269-
Color="{ThemeResource SystemColorHighlightTextColor}" />
270-
</ResourceDictionary>
271-
</ResourceDictionary.ThemeDictionaries>
272-
</ResourceDictionary>
273-
</Button.Resources>
274-
</Button>
275-
276-
<!-- Edit Mode: Buttons -->
277-
<StackPanel Grid.Column="2"
278-
Orientation="Horizontal"
279-
Visibility="{x:Bind IsInEditMode, Mode=OneWay}">
280-
281-
<!-- Cancel editing the action -->
282-
<Button x:Uid="Actions_CancelButton"
283-
AutomationProperties.Name="{x:Bind CancelButtonName}"
284-
Click="{x:Bind CancelChanges}"
285-
Style="{StaticResource EditButtonStyle}">
286-
<FontIcon FontSize="{StaticResource EditButtonIconSize}"
287-
Glyph="&#xE711;" />
288-
</Button>
289-
290-
<!-- Accept changes -->
291-
<Button x:Uid="Actions_AcceptButton"
292-
Margin="8,0,0,0"
293-
AutomationProperties.Name="{x:Bind AcceptButtonName}"
294-
Click="{x:Bind AttemptAcceptChanges}"
295-
Flyout="{x:Bind AcceptChangesFlyout, Mode=OneWay}"
296-
Style="{StaticResource AccentEditButtonStyle}">
297-
<FontIcon FontSize="{StaticResource EditButtonIconSize}"
298-
Glyph="&#xE8FB;" />
299-
</Button>
300-
301-
<!-- Delete the current key binding -->
302-
<Button x:Uid="Actions_DeleteButton"
303-
Margin="8,0,0,0"
304-
AutomationProperties.Name="{x:Bind DeleteButtonName}"
305-
Style="{StaticResource DeleteSmallButtonStyle}"
306-
Visibility="{x:Bind mtu:Converters.InvertedBooleanToVisibility(IsNewlyAdded), Mode=OneWay}">
307-
<Button.Content>
308-
<FontIcon FontSize="{StaticResource EditButtonIconSize}"
309-
Glyph="&#xE74D;" />
310-
</Button.Content>
311-
<Button.Flyout>
312-
<Flyout FlyoutPresenterStyle="{StaticResource CustomFlyoutPresenterStyle}">
313-
<StackPanel>
314-
<TextBlock x:Uid="Actions_DeleteConfirmationMessage"
315-
Style="{StaticResource CustomFlyoutTextStyle}" />
316-
<Button x:Uid="Actions_DeleteConfirmationButton"
317-
Click="{x:Bind DeleteKeyBinding}" />
318-
</StackPanel>
319-
</Flyout>
320-
</Button.Flyout>
321-
</Button>
322-
</StackPanel>
323178
</Grid>
324179
</ListViewItem>
325180
</DataTemplate>
@@ -331,10 +186,14 @@
331186
HorizontalAlignment="Left"
332187
Spacing="8"
333188
Style="{StaticResource SettingsStackStyle}">
189+
<HyperlinkButton x:Uid="Actions_Disclaimer"
190+
Margin="0"
191+
Padding="0"
192+
NavigateUri="https://go.microsoft.com/fwlink/?linkid=2341386" />
334193
<!-- Add New Button -->
335194
<Button x:Name="AddNewButton"
336195
Margin="0,12,0,0"
337-
Click="AddNew_Click">
196+
Click="{x:Bind ViewModel.AddNewCommand}">
338197
<Button.Content>
339198
<StackPanel Orientation="Horizontal">
340199
<FontIcon FontSize="{StaticResource StandardIconSize}"
@@ -345,11 +204,13 @@
345204
</Button.Content>
346205
</Button>
347206

348-
<!-- Keybindings -->
349-
<ListView x:Name="KeyBindingsListView"
350-
ItemTemplate="{StaticResource KeyBindingTemplate}"
351-
ItemsSource="{x:Bind ViewModel.KeyBindingList, Mode=OneWay}"
352-
SelectionMode="None" />
207+
<!-- Commands -->
208+
<ListView x:Name="CommandsListView"
209+
Margin="-8,0,0,0"
210+
IsItemClickEnabled="True"
211+
ItemClick="{x:Bind ViewModel.CmdListItemClicked}"
212+
ItemTemplate="{StaticResource CommandTemplate}"
213+
ItemsSource="{x:Bind ViewModel.CommandList, Mode=OneWay}" />
353214
</StackPanel>
354215
</Border>
355216
</Page>

0 commit comments

Comments
 (0)