From e01ff4faf022b22ae9d53826b10dd015495bfb74 Mon Sep 17 00:00:00 2001 From: Carlos Zamora Date: Tue, 14 Oct 2025 11:46:31 -0700 Subject: [PATCH 01/25] Introduce SearchMetadata and navigation by name - SearchMetadata is unsused, but it is designed to hold information so that we can navigate to a setting - Updated all pages to... - have an x:Name on relevant setting containers - have a NavigateToXArgs used in the OnNavigatedTo() function - update the NavigateToXArgs to include the name of an element to scroll down to - Add BringIntoViewWhenLoaded() to HasScrollViewer which scrolls down to the element with a given name These components aren't fully hooked up together yet and there's a few TODO CARLOS's throughout. Main upcoming work: - indexing - runtime indexing - search box UI - search results UI based on https://github.com/microsoft/PowerToys/blob/079c69b8beced55211485c352f41308426930e47/doc/specs/settings-search.md --- .../TerminalSettingsEditor/Actions.cpp | 6 ++- src/cascadia/TerminalSettingsEditor/Actions.h | 15 ++++++ .../TerminalSettingsEditor/Actions.idl | 6 +++ .../TerminalSettingsEditor/AddProfile.cpp | 1 + .../TerminalSettingsEditor/AddProfile.h | 6 ++- .../TerminalSettingsEditor/AddProfile.idl | 2 + .../TerminalSettingsEditor/Appearances.xaml | 19 ++++++++ .../TerminalSettingsEditor/ColorSchemes.cpp | 6 ++- .../TerminalSettingsEditor/ColorSchemes.h | 15 ++++++ .../TerminalSettingsEditor/ColorSchemes.idl | 6 +++ .../TerminalSettingsEditor/Compatibility.cpp | 4 +- .../TerminalSettingsEditor/Compatibility.h | 15 ++++++ .../TerminalSettingsEditor/Compatibility.idl | 6 +++ .../TerminalSettingsEditor/Compatibility.xaml | 13 +++-- .../EditColorScheme.xaml | 2 + .../TerminalSettingsEditor/Extensions.cpp | 6 ++- .../TerminalSettingsEditor/Extensions.h | 15 ++++++ .../TerminalSettingsEditor/Extensions.idl | 6 +++ .../TerminalSettingsEditor/Extensions.xaml | 1 + .../GlobalAppearance.cpp | 4 +- .../TerminalSettingsEditor/GlobalAppearance.h | 15 ++++++ .../GlobalAppearance.idl | 6 +++ .../GlobalAppearance.xaml | 45 ++++++++++++------ .../TerminalSettingsEditor/Interaction.cpp | 4 +- .../TerminalSettingsEditor/Interaction.h | 15 ++++++ .../TerminalSettingsEditor/Interaction.idl | 6 +++ .../TerminalSettingsEditor/Interaction.xaml | 47 +++++++++++++------ .../TerminalSettingsEditor/Launch.cpp | 5 +- src/cascadia/TerminalSettingsEditor/Launch.h | 15 ++++++ .../TerminalSettingsEditor/Launch.idl | 6 +++ .../TerminalSettingsEditor/Launch.xaml | 21 ++++++--- .../TerminalSettingsEditor/MainPage.cpp | 30 ++++++------ ...Microsoft.Terminal.Settings.Editor.vcxproj | 10 ++++ ...t.Terminal.Settings.Editor.vcxproj.filters | 1 + .../TerminalSettingsEditor/NewTabMenu.cpp | 6 ++- .../TerminalSettingsEditor/NewTabMenu.h | 15 ++++++ .../TerminalSettingsEditor/NewTabMenu.idl | 6 +++ .../TerminalSettingsEditor/ProfileViewModel.h | 7 ++- .../ProfileViewModel.idl | 1 + .../Profiles_Advanced.cpp | 1 + .../Profiles_Appearance.cpp | 3 ++ .../Profiles_Appearance.h | 3 +- .../Profiles_Appearance.xaml | 18 +++++-- .../TerminalSettingsEditor/Profiles_Base.cpp | 1 + .../TerminalSettingsEditor/Profiles_Base.xaml | 9 +++- .../Profiles_Terminal.cpp | 4 +- .../Profiles_Terminal.xaml | 5 ++ .../TerminalSettingsEditor/Rendering.cpp | 4 +- .../TerminalSettingsEditor/Rendering.h | 15 ++++++ .../TerminalSettingsEditor/Rendering.idl | 6 +++ .../TerminalSettingsEditor/Rendering.xaml | 9 ++-- .../TerminalSettingsEditor/SearchMetadata.cpp | 45 ++++++++++++++++++ .../TerminalSettingsEditor/SearchMetadata.h | 40 ++++++++++++++++ .../TerminalSettingsEditor/SearchMetadata.idl | 19 ++++++++ src/cascadia/TerminalSettingsEditor/Utils.h | 30 ++++++++++++ src/cascadia/inc/cppwinrt_utils.h | 33 +++++++++++++ 56 files changed, 580 insertions(+), 80 deletions(-) create mode 100644 src/cascadia/TerminalSettingsEditor/SearchMetadata.cpp create mode 100644 src/cascadia/TerminalSettingsEditor/SearchMetadata.h create mode 100644 src/cascadia/TerminalSettingsEditor/SearchMetadata.idl diff --git a/src/cascadia/TerminalSettingsEditor/Actions.cpp b/src/cascadia/TerminalSettingsEditor/Actions.cpp index f27d89eb27d..cf2d4a50248 100644 --- a/src/cascadia/TerminalSettingsEditor/Actions.cpp +++ b/src/cascadia/TerminalSettingsEditor/Actions.cpp @@ -27,7 +27,11 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void Actions::OnNavigatedTo(const NavigationEventArgs& e) { - _ViewModel = e.Parameter().as(); + const auto args = e.Parameter().as(); + _ViewModel = args.ViewModel(); + + // TODO CARLOS: runtime indexing and retrieval support + BringIntoViewWhenLoaded(args.ElementToFocus()); // Subscribe to the view model's FocusContainer event. // Use the KeyBindingViewModel or index provided in the event to focus the corresponding container diff --git a/src/cascadia/TerminalSettingsEditor/Actions.h b/src/cascadia/TerminalSettingsEditor/Actions.h index a79003afbfb..e4468924190 100644 --- a/src/cascadia/TerminalSettingsEditor/Actions.h +++ b/src/cascadia/TerminalSettingsEditor/Actions.h @@ -4,12 +4,27 @@ #pragma once #include "Actions.g.h" +#include "NavigateToActionsArgs.g.h" #include "ActionsViewModel.h" #include "Utils.h" #include "ViewModelHelpers.h" namespace winrt::Microsoft::Terminal::Settings::Editor::implementation { + struct NavigateToActionsArgs : NavigateToActionsArgsT + { + NavigateToActionsArgs(Editor::ActionsViewModel vm, hstring elementToFocus = {}) : + _ViewModel(vm), + _ElementToFocus(elementToFocus) {} + + Editor::ActionsViewModel ViewModel() const noexcept { return _ViewModel; } + hstring ElementToFocus() const noexcept { return _ElementToFocus; } + + private: + Editor::ActionsViewModel _ViewModel{ nullptr }; + hstring _ElementToFocus{}; + }; + struct Actions : public HasScrollViewer, ActionsT { public: diff --git a/src/cascadia/TerminalSettingsEditor/Actions.idl b/src/cascadia/TerminalSettingsEditor/Actions.idl index ec7444d2410..1da06382b1f 100644 --- a/src/cascadia/TerminalSettingsEditor/Actions.idl +++ b/src/cascadia/TerminalSettingsEditor/Actions.idl @@ -5,6 +5,12 @@ import "ActionsViewModel.idl"; namespace Microsoft.Terminal.Settings.Editor { + runtimeclass NavigateToActionsArgs + { + ActionsViewModel ViewModel { get; }; + String ElementToFocus { get; }; + } + [default_interface] runtimeclass Actions : Windows.UI.Xaml.Controls.Page { Actions(); diff --git a/src/cascadia/TerminalSettingsEditor/AddProfile.cpp b/src/cascadia/TerminalSettingsEditor/AddProfile.cpp index 03864e855e0..db14375ff37 100644 --- a/src/cascadia/TerminalSettingsEditor/AddProfile.cpp +++ b/src/cascadia/TerminalSettingsEditor/AddProfile.cpp @@ -29,6 +29,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void AddProfile::OnNavigatedTo(const NavigationEventArgs& e) { _State = e.Parameter().as(); + BringIntoViewWhenLoaded(_State.ElementToFocus()); TraceLoggingWrite( g_hTerminalSettingsEditorProvider, diff --git a/src/cascadia/TerminalSettingsEditor/AddProfile.h b/src/cascadia/TerminalSettingsEditor/AddProfile.h index 7bfa0654f20..f4f7501d3cb 100644 --- a/src/cascadia/TerminalSettingsEditor/AddProfile.h +++ b/src/cascadia/TerminalSettingsEditor/AddProfile.h @@ -26,8 +26,9 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation struct AddProfilePageNavigationState : AddProfilePageNavigationStateT { public: - AddProfilePageNavigationState(const Model::CascadiaSettings& settings) : - _Settings{ settings } {} + AddProfilePageNavigationState(const Model::CascadiaSettings& settings, const hstring& elementToFocus = {}) : + _Settings{ settings }, + _ElementToFocus{ elementToFocus } {} void RequestAddNew() { @@ -42,6 +43,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation til::event AddNew; WINRT_PROPERTY(Model::CascadiaSettings, Settings, nullptr); + WINRT_PROPERTY(hstring, ElementToFocus); }; struct AddProfile : public HasScrollViewer, AddProfileT diff --git a/src/cascadia/TerminalSettingsEditor/AddProfile.idl b/src/cascadia/TerminalSettingsEditor/AddProfile.idl index 480c69bcbe1..c8d7bd85cdb 100644 --- a/src/cascadia/TerminalSettingsEditor/AddProfile.idl +++ b/src/cascadia/TerminalSettingsEditor/AddProfile.idl @@ -8,6 +8,8 @@ namespace Microsoft.Terminal.Settings.Editor runtimeclass AddProfilePageNavigationState { Microsoft.Terminal.Settings.Model.CascadiaSettings Settings; + String ElementToFocus { get; }; + void RequestAddNew(); void RequestDuplicate(Guid profile); event AddNewArgs AddNew; diff --git a/src/cascadia/TerminalSettingsEditor/Appearances.xaml b/src/cascadia/TerminalSettingsEditor/Appearances.xaml index 23e117a8ae4..a1a7617d42f 100644 --- a/src/cascadia/TerminalSettingsEditor/Appearances.xaml +++ b/src/cascadia/TerminalSettingsEditor/Appearances.xaml @@ -73,6 +73,7 @@ @@ -440,6 +450,7 @@ @@ -449,6 +460,7 @@ @@ -458,6 +470,7 @@ @@ -476,6 +489,7 @@ @@ -488,6 +502,7 @@ diff --git a/src/cascadia/TerminalSettingsEditor/ColorSchemes.cpp b/src/cascadia/TerminalSettingsEditor/ColorSchemes.cpp index 899cc5f8263..b0daa6817ee 100644 --- a/src/cascadia/TerminalSettingsEditor/ColorSchemes.cpp +++ b/src/cascadia/TerminalSettingsEditor/ColorSchemes.cpp @@ -35,9 +35,13 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void ColorSchemes::OnNavigatedTo(const NavigationEventArgs& e) { - _ViewModel = e.Parameter().as(); + const auto args = e.Parameter().as(); + _ViewModel = args.ViewModel(); _ViewModel.CurrentPage(ColorSchemesSubPage::Base); + // TODO CARLOS: runtime indexing and retrieval support + BringIntoViewWhenLoaded(args.ElementToFocus()); + _layoutUpdatedRevoker = LayoutUpdated(winrt::auto_revoke, [this](auto /*s*/, auto /*e*/) { // Only let this succeed once. _layoutUpdatedRevoker.revoke(); diff --git a/src/cascadia/TerminalSettingsEditor/ColorSchemes.h b/src/cascadia/TerminalSettingsEditor/ColorSchemes.h index c8e7786e8ec..37376c83477 100644 --- a/src/cascadia/TerminalSettingsEditor/ColorSchemes.h +++ b/src/cascadia/TerminalSettingsEditor/ColorSchemes.h @@ -5,12 +5,27 @@ #include "ColorTableEntry.g.h" #include "ColorSchemes.g.h" +#include "NavigateToColorSchemesArgs.g.h" #include "ColorSchemeViewModel.h" #include "ColorSchemesPageViewModel.h" #include "Utils.h" namespace winrt::Microsoft::Terminal::Settings::Editor::implementation { + struct NavigateToColorSchemesArgs : NavigateToColorSchemesArgsT + { + NavigateToColorSchemesArgs(const Editor::ColorSchemesPageViewModel& vm, const hstring& elementToFocus = {}) : + _ViewModel(vm), + _ElementToFocus(elementToFocus) {} + + Editor::ColorSchemesPageViewModel ViewModel() const noexcept { return _ViewModel; } + hstring ElementToFocus() const noexcept { return _ElementToFocus; } + + private: + Editor::ColorSchemesPageViewModel _ViewModel{ nullptr }; + hstring _ElementToFocus{}; + }; + struct ColorSchemes : public HasScrollViewer, ColorSchemesT { public: diff --git a/src/cascadia/TerminalSettingsEditor/ColorSchemes.idl b/src/cascadia/TerminalSettingsEditor/ColorSchemes.idl index e92408dd56e..772627f3469 100644 --- a/src/cascadia/TerminalSettingsEditor/ColorSchemes.idl +++ b/src/cascadia/TerminalSettingsEditor/ColorSchemes.idl @@ -6,6 +6,12 @@ import "ColorSchemesPageViewModel.idl"; namespace Microsoft.Terminal.Settings.Editor { + runtimeclass NavigateToColorSchemesArgs + { + ColorSchemesPageViewModel ViewModel { get; }; + String ElementToFocus { get; }; + } + [default_interface] runtimeclass ColorSchemes : Windows.UI.Xaml.Controls.Page, Windows.UI.Xaml.Data.INotifyPropertyChanged { ColorSchemes(); diff --git a/src/cascadia/TerminalSettingsEditor/Compatibility.cpp b/src/cascadia/TerminalSettingsEditor/Compatibility.cpp index 9fa7b81ecfb..4e28b8802c1 100644 --- a/src/cascadia/TerminalSettingsEditor/Compatibility.cpp +++ b/src/cascadia/TerminalSettingsEditor/Compatibility.cpp @@ -54,7 +54,9 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void Compatibility::OnNavigatedTo(const NavigationEventArgs& e) { - _ViewModel = e.Parameter().as(); + const auto args = e.Parameter().as(); + _ViewModel = args.ViewModel(); + BringIntoViewWhenLoaded(args.ElementToFocus()); TraceLoggingWrite( g_hTerminalSettingsEditorProvider, diff --git a/src/cascadia/TerminalSettingsEditor/Compatibility.h b/src/cascadia/TerminalSettingsEditor/Compatibility.h index 54e81f52522..37a9811552b 100644 --- a/src/cascadia/TerminalSettingsEditor/Compatibility.h +++ b/src/cascadia/TerminalSettingsEditor/Compatibility.h @@ -4,12 +4,27 @@ #pragma once #include "Compatibility.g.h" +#include "NavigateToCompatibilityArgs.g.h" #include "CompatibilityViewModel.g.h" #include "ViewModelHelpers.h" #include "Utils.h" namespace winrt::Microsoft::Terminal::Settings::Editor::implementation { + struct NavigateToCompatibilityArgs : NavigateToCompatibilityArgsT + { + NavigateToCompatibilityArgs(const Editor::CompatibilityViewModel& vm, const hstring& elementToFocus = {}) : + _ViewModel(vm), + _ElementToFocus(elementToFocus) {} + + Editor::CompatibilityViewModel ViewModel() const noexcept { return _ViewModel; } + hstring ElementToFocus() const noexcept { return _ElementToFocus; } + + private: + Editor::CompatibilityViewModel _ViewModel{ nullptr }; + hstring _ElementToFocus{}; + }; + struct CompatibilityViewModel : CompatibilityViewModelT, ViewModelHelper { public: diff --git a/src/cascadia/TerminalSettingsEditor/Compatibility.idl b/src/cascadia/TerminalSettingsEditor/Compatibility.idl index b9f13ffe6e6..f107200e2e7 100644 --- a/src/cascadia/TerminalSettingsEditor/Compatibility.idl +++ b/src/cascadia/TerminalSettingsEditor/Compatibility.idl @@ -7,6 +7,12 @@ import "EnumEntry.idl"; namespace Microsoft.Terminal.Settings.Editor { + runtimeclass NavigateToCompatibilityArgs + { + CompatibilityViewModel ViewModel { get; }; + String ElementToFocus { get; }; + } + runtimeclass CompatibilityViewModel : Windows.UI.Xaml.Data.INotifyPropertyChanged { CompatibilityViewModel(Microsoft.Terminal.Settings.Model.CascadiaSettings settings); diff --git a/src/cascadia/TerminalSettingsEditor/Compatibility.xaml b/src/cascadia/TerminalSettingsEditor/Compatibility.xaml index cb666963120..39810efd003 100644 --- a/src/cascadia/TerminalSettingsEditor/Compatibility.xaml +++ b/src/cascadia/TerminalSettingsEditor/Compatibility.xaml @@ -26,13 +26,15 @@ - + - + - + + + + + (); _Profile = args.Profile(); _windowRoot = args.WindowRoot(); + BringIntoViewWhenLoaded(args.ElementToFocus()); // Check the use parent directory box if the starting directory is empty if (_Profile.StartingDirectory().empty()) diff --git a/src/cascadia/TerminalSettingsEditor/Profiles_Base.xaml b/src/cascadia/TerminalSettingsEditor/Profiles_Base.xaml index 813cada4c54..4737c045e42 100644 --- a/src/cascadia/TerminalSettingsEditor/Profiles_Base.xaml +++ b/src/cascadia/TerminalSettingsEditor/Profiles_Base.xaml @@ -41,6 +41,7 @@ so the name will always be overridden. --> @@ -49,7 +50,7 @@ - - @@ -235,6 +239,7 @@ diff --git a/src/cascadia/TerminalSettingsEditor/Profiles_Terminal.cpp b/src/cascadia/TerminalSettingsEditor/Profiles_Terminal.cpp index fd8899dff1b..467945b65a8 100644 --- a/src/cascadia/TerminalSettingsEditor/Profiles_Terminal.cpp +++ b/src/cascadia/TerminalSettingsEditor/Profiles_Terminal.cpp @@ -21,7 +21,9 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void Profiles_Terminal::OnNavigatedTo(const NavigationEventArgs& e) { - _Profile = e.Parameter().as(); + const auto args = e.Parameter().as(); + _Profile = args.Profile(); + BringIntoViewWhenLoaded(args.ElementToFocus()); TraceLoggingWrite( g_hTerminalSettingsEditorProvider, diff --git a/src/cascadia/TerminalSettingsEditor/Profiles_Terminal.xaml b/src/cascadia/TerminalSettingsEditor/Profiles_Terminal.xaml index dfe5954d4fe..c70519de6e3 100644 --- a/src/cascadia/TerminalSettingsEditor/Profiles_Terminal.xaml +++ b/src/cascadia/TerminalSettingsEditor/Profiles_Terminal.xaml @@ -33,6 +33,7 @@ @@ -42,6 +43,7 @@ @@ -51,6 +53,7 @@ @@ -60,6 +63,7 @@ @@ -69,6 +73,7 @@ (); + const auto args = e.Parameter().as(); + _ViewModel = args.ViewModel(); + BringIntoViewWhenLoaded(args.ElementToFocus()); TraceLoggingWrite( g_hTerminalSettingsEditorProvider, diff --git a/src/cascadia/TerminalSettingsEditor/Rendering.h b/src/cascadia/TerminalSettingsEditor/Rendering.h index dd202b1c7e8..bda0034c6bb 100644 --- a/src/cascadia/TerminalSettingsEditor/Rendering.h +++ b/src/cascadia/TerminalSettingsEditor/Rendering.h @@ -4,10 +4,25 @@ #pragma once #include "Rendering.g.h" +#include "NavigateToRenderingArgs.g.h" #include "Utils.h" namespace winrt::Microsoft::Terminal::Settings::Editor::implementation { + struct NavigateToRenderingArgs : NavigateToRenderingArgsT + { + NavigateToRenderingArgs(const Editor::RenderingViewModel& vm, const hstring& elementToFocus = {}) : + _ViewModel(vm), + _ElementToFocus(elementToFocus) {} + + Editor::RenderingViewModel ViewModel() const noexcept { return _ViewModel; } + hstring ElementToFocus() const noexcept { return _ElementToFocus; } + + private: + Editor::RenderingViewModel _ViewModel{ nullptr }; + hstring _ElementToFocus{}; + }; + struct Rendering : public HasScrollViewer, RenderingT { Rendering(); diff --git a/src/cascadia/TerminalSettingsEditor/Rendering.idl b/src/cascadia/TerminalSettingsEditor/Rendering.idl index 21dc7d8023f..3b59b6de6f5 100644 --- a/src/cascadia/TerminalSettingsEditor/Rendering.idl +++ b/src/cascadia/TerminalSettingsEditor/Rendering.idl @@ -5,6 +5,12 @@ import "RenderingViewModel.idl"; namespace Microsoft.Terminal.Settings.Editor { + runtimeclass NavigateToRenderingArgs + { + RenderingViewModel ViewModel { get; }; + String ElementToFocus { get; }; + } + [default_interface] runtimeclass Rendering : Windows.UI.Xaml.Controls.Page { Rendering(); diff --git a/src/cascadia/TerminalSettingsEditor/Rendering.xaml b/src/cascadia/TerminalSettingsEditor/Rendering.xaml index 4b9534167d0..7df8c136d0c 100644 --- a/src/cascadia/TerminalSettingsEditor/Rendering.xaml +++ b/src/cascadia/TerminalSettingsEditor/Rendering.xaml @@ -24,7 +24,8 @@ - + - + - + diff --git a/src/cascadia/TerminalSettingsEditor/SearchMetadata.cpp b/src/cascadia/TerminalSettingsEditor/SearchMetadata.cpp new file mode 100644 index 00000000000..6bbad407163 --- /dev/null +++ b/src/cascadia/TerminalSettingsEditor/SearchMetadata.cpp @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +#include "pch.h" +#include "SearchMetadata.h" +#include "SearchMetadata.g.cpp" +#include "LibraryResources.h" + +using namespace winrt::Windows::UI::Xaml; + +namespace winrt::Microsoft::Terminal::Settings::Editor::implementation +{ + DependencyProperty SearchMetadata::_ParentPageProperty{ nullptr }; + DependencyProperty SearchMetadata::_SettingNameProperty{ nullptr }; + + SearchMetadata::SearchMetadata() + { + _InitializeProperties(); + } + + void SearchMetadata::_InitializeProperties() + { + // Initialize any dependency properties here. + // This performs a lazy load on these properties, instead of + // initializing them when the DLL loads. + if (!_ParentPageProperty) + { + _ParentPageProperty = + DependencyProperty::RegisterAttached( + L"ParentPage", + xaml_typename(), + xaml_typename(), + PropertyMetadata{ nullptr }); + } + if (!_SettingNameProperty) + { + _SettingNameProperty = + DependencyProperty::RegisterAttached( + L"SettingName", + xaml_typename(), + xaml_typename(), + PropertyMetadata{ box_value(L"") }); + } + } +} diff --git a/src/cascadia/TerminalSettingsEditor/SearchMetadata.h b/src/cascadia/TerminalSettingsEditor/SearchMetadata.h new file mode 100644 index 00000000000..aa03f7cb77a --- /dev/null +++ b/src/cascadia/TerminalSettingsEditor/SearchMetadata.h @@ -0,0 +1,40 @@ +/*++ +Copyright (c) Microsoft Corporation +Licensed under the MIT license. + +Module Name: +- SearchMetadata + +Abstract: +- A custom XAML attached property (like AutomationProperties) + to hold metadata for search in the settings editor. + +Author(s): +- Carlos Zamora - October 2025 + +--*/ + +#pragma once + +#include "SearchMetadata.g.h" +#include "Utils.h" + +namespace winrt::Microsoft::Terminal::Settings::Editor::implementation +{ + struct SearchMetadata : SearchMetadataT + { + public: + SearchMetadata(); + + ATTACHED_DEPENDENCY_PROPERTY(winrt::Windows::UI::Xaml::Interop::TypeName, ParentPage); + ATTACHED_DEPENDENCY_PROPERTY(winrt::hstring, SettingName); + + private: + static void _InitializeProperties(); + }; +} + +namespace winrt::Microsoft::Terminal::Settings::Editor::factory_implementation +{ + BASIC_FACTORY(SearchMetadata); +} diff --git a/src/cascadia/TerminalSettingsEditor/SearchMetadata.idl b/src/cascadia/TerminalSettingsEditor/SearchMetadata.idl new file mode 100644 index 00000000000..b5e66a8046f --- /dev/null +++ b/src/cascadia/TerminalSettingsEditor/SearchMetadata.idl @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +namespace Microsoft.Terminal.Settings.Editor +{ + [default_interface] + runtimeclass SearchMetadata : Windows.UI.Xaml.DependencyObject + { + SearchMetadata(); + + static Windows.UI.Xaml.DependencyProperty ParentPageProperty { get; }; + static Windows.UI.Xaml.Interop.TypeName GetParentPage(Windows.UI.Xaml.DependencyObject target); + static void SetParentPage(Windows.UI.Xaml.DependencyObject target, Windows.UI.Xaml.Interop.TypeName val); + + static Windows.UI.Xaml.DependencyProperty SettingNameProperty { get; }; + static String GetSettingName(Windows.UI.Xaml.DependencyObject target); + static void SetSettingName(Windows.UI.Xaml.DependencyObject target, String val); + } +} diff --git a/src/cascadia/TerminalSettingsEditor/Utils.h b/src/cascadia/TerminalSettingsEditor/Utils.h index 37fe4a81ec8..6ac8a6b9bdf 100644 --- a/src/cascadia/TerminalSettingsEditor/Utils.h +++ b/src/cascadia/TerminalSettingsEditor/Utils.h @@ -116,4 +116,34 @@ struct HasScrollViewer DismissAllPopups(uielem.XamlRoot()); } } + + // Finds the element with the given name and brings it into view + void BringIntoViewWhenLoaded(const winrt::hstring elementName) + { + if (elementName.empty()) + { + return; + } + + auto* pThis = static_cast(this); + _loadedRevoker = pThis->Loaded(winrt::auto_revoke, [weakThis{ pThis->get_weak() }, elementName](auto&&, auto&&) { + if (auto page{ weakThis.get() }) + { + if (const auto& elementToFocus{ page->FindName(elementName).try_as() }) + { + // We need to wait for the page to be loaded + // or else the call to StartBringIntoView() + // will end up doing nothing + elementToFocus.StartBringIntoView(); + + // TODO CARLOS: ensure this works in all scenarios (easiest to test when navigating to page by keyboard) + elementToFocus.Focus(winrt::Windows::UI::Xaml::FocusState::Programmatic); + } + page->_loadedRevoker.revoke(); + } + }); + } + +protected: + winrt::Windows::UI::Xaml::FrameworkElement::Loaded_revoker _loadedRevoker; }; diff --git a/src/cascadia/inc/cppwinrt_utils.h b/src/cascadia/inc/cppwinrt_utils.h index e7a85278185..985d4995979 100644 --- a/src/cascadia/inc/cppwinrt_utils.h +++ b/src/cascadia/inc/cppwinrt_utils.h @@ -253,6 +253,39 @@ private: static winrt::Windows::UI::Xaml::DependencyProperty _##name##Property; #endif +#ifndef ATTACHED_DEPENDENCY_PROPERTY +#define ATTACHED_DEPENDENCY_PROPERTY(type, name) \ +public: \ + static winrt::Windows::UI::Xaml::DependencyProperty name##Property() \ + { \ + return _##name##Property; \ + } \ + static type Get##name(winrt::Windows::UI::Xaml::DependencyObject const& target) \ + { \ + auto&& temp{ target.GetValue(_##name##Property) }; \ + if (temp) \ + { \ + return winrt::unbox_value(temp); \ + } \ + \ + if constexpr (std::is_base_of_v) \ + { \ + return { nullptr }; \ + } \ + else \ + { \ + return {}; \ + } \ + } \ + static void Set##name(winrt::Windows::UI::Xaml::DependencyObject const& target, const type& value) \ + { \ + target.SetValue(_##name##Property, winrt::box_value(value)); \ + } \ + \ +private: \ + static winrt::Windows::UI::Xaml::DependencyProperty _##name##Property; +#endif + // Use this macro for quickly defining the factory_implementation part of a // class. CppWinrt requires these for the compiler, but more often than not, // they require no customization. See From 1b8c99dff87c21c2c4d86991d4de41c68aeae310 Mon Sep 17 00:00:00 2001 From: Carlos Zamora Date: Wed, 15 Oct 2025 15:42:43 -0700 Subject: [PATCH 02/25] Load build time index for search - Adds referential XAML names to components of interest. - Adds a script that generates the build time entries to be loaded - Invokes the script in Editor.vcxproj --- .../TerminalSettingsEditor/AddProfile.xaml | 3 +- .../TerminalSettingsEditor/MainPage.cpp | 1 + ...Microsoft.Terminal.Settings.Editor.vcxproj | 8 + .../TerminalSettingsEditor/NewTabMenu.xaml | 7 + .../Profiles_Advanced.xaml | 14 ++ .../Profiles_Base_Orphaned.xaml | 9 +- tools/GenerateSettingsIndex.ps1 | 159 ++++++++++++++++++ 7 files changed, 197 insertions(+), 4 deletions(-) create mode 100644 tools/GenerateSettingsIndex.ps1 diff --git a/src/cascadia/TerminalSettingsEditor/AddProfile.xaml b/src/cascadia/TerminalSettingsEditor/AddProfile.xaml index 1db1bbd4d3b..323b7f959d3 100644 --- a/src/cascadia/TerminalSettingsEditor/AddProfile.xaml +++ b/src/cascadia/TerminalSettingsEditor/AddProfile.xaml @@ -37,7 +37,8 @@ - + +#include "GeneratedSettingsIndex.g.h" #include #include diff --git a/src/cascadia/TerminalSettingsEditor/Microsoft.Terminal.Settings.Editor.vcxproj b/src/cascadia/TerminalSettingsEditor/Microsoft.Terminal.Settings.Editor.vcxproj index 17ee5591bb3..b91a24b7519 100644 --- a/src/cascadia/TerminalSettingsEditor/Microsoft.Terminal.Settings.Editor.vcxproj +++ b/src/cascadia/TerminalSettingsEditor/Microsoft.Terminal.Settings.Editor.vcxproj @@ -165,6 +165,7 @@ + @@ -363,6 +364,7 @@ PreviewConnection.h + @@ -534,4 +536,10 @@ + + + \ No newline at end of file diff --git a/src/cascadia/TerminalSettingsEditor/NewTabMenu.xaml b/src/cascadia/TerminalSettingsEditor/NewTabMenu.xaml index 70285aaccca..7066e42a542 100644 --- a/src/cascadia/TerminalSettingsEditor/NewTabMenu.xaml +++ b/src/cascadia/TerminalSettingsEditor/NewTabMenu.xaml @@ -325,6 +325,7 @@ @@ -334,6 +335,7 @@ @@ -341,6 +343,7 @@ @@ -354,6 +357,7 @@ @@ -403,6 +407,7 @@ - + - - - - - - - - - - @@ -449,8 +449,8 @@ - @@ -459,8 +459,8 @@ - @@ -469,8 +469,8 @@ - @@ -488,8 +488,8 @@ Style="{StaticResource TextBlockSubHeaderStyle}" /> - @@ -501,8 +501,8 @@ - - - - - diff --git a/src/cascadia/TerminalSettingsEditor/Compatibility.xaml b/src/cascadia/TerminalSettingsEditor/Compatibility.xaml index 39810efd003..54354f3ed40 100644 --- a/src/cascadia/TerminalSettingsEditor/Compatibility.xaml +++ b/src/cascadia/TerminalSettingsEditor/Compatibility.xaml @@ -26,15 +26,15 @@ - + - + - - + - -