diff --git a/src/cascadia/TerminalSettingsEditor/MainPage.cpp b/src/cascadia/TerminalSettingsEditor/MainPage.cpp index 69d52294ed8..87b094c6be0 100644 --- a/src/cascadia/TerminalSettingsEditor/MainPage.cpp +++ b/src/cascadia/TerminalSettingsEditor/MainPage.cpp @@ -8,6 +8,7 @@ #include "Interaction.h" #include "Rendering.h" #include "Actions.h" +#include "ReadOnlyActions.h" #include "Profiles.h" #include "GlobalAppearance.h" #include "ColorSchemes.h" @@ -293,7 +294,21 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation } else if (clickedItemTag == actionsTag) { - contentFrame().Navigate(xaml_typename(), winrt::make(_settingsClone)); + if constexpr (Feature_EditableActionsPage::IsEnabled()) + { + contentFrame().Navigate(xaml_typename(), winrt::make(_settingsClone)); + } + else + { + auto actionsState{ winrt::make(_settingsClone) }; + actionsState.OpenJson([weakThis = get_weak()](auto&&, auto&& arg) { + if (auto self{ weakThis.get() }) + { + self->_OpenJsonHandlers(nullptr, arg); + } + }); + contentFrame().Navigate(xaml_typename(), actionsState); + } } else if (clickedItemTag == colorSchemesTag) { diff --git a/src/cascadia/TerminalSettingsEditor/Microsoft.Terminal.Settings.Editor.vcxproj b/src/cascadia/TerminalSettingsEditor/Microsoft.Terminal.Settings.Editor.vcxproj index a3df5993279..00d3442d55d 100644 --- a/src/cascadia/TerminalSettingsEditor/Microsoft.Terminal.Settings.Editor.vcxproj +++ b/src/cascadia/TerminalSettingsEditor/Microsoft.Terminal.Settings.Editor.vcxproj @@ -99,6 +99,9 @@ Profiles.xaml Code + + ReadOnlyActions.xaml + Rendering.xaml @@ -137,6 +140,9 @@ Designer + + Designer + Designer @@ -209,6 +215,9 @@ Profiles.xaml Code + + ReadOnlyActions.xaml + Rendering.xaml @@ -248,6 +257,10 @@ Interaction.xaml Code + + ReadOnlyActions.xaml + Code + Rendering.xaml Code @@ -338,4 +351,4 @@ - \ No newline at end of file + diff --git a/src/cascadia/TerminalSettingsEditor/ReadOnlyActions.cpp b/src/cascadia/TerminalSettingsEditor/ReadOnlyActions.cpp new file mode 100644 index 00000000000..50403383d88 --- /dev/null +++ b/src/cascadia/TerminalSettingsEditor/ReadOnlyActions.cpp @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +#include "pch.h" +#include "ReadOnlyActions.h" +#include "ReadOnlyActions.g.cpp" +#include "ReadOnlyActionsPageNavigationState.g.cpp" +#include "EnumEntry.h" + +using namespace winrt::Windows::Foundation; +using namespace winrt::Windows::System; +using namespace winrt::Windows::UI::Core; +using namespace winrt::Windows::UI::Xaml::Navigation; +using namespace winrt::Microsoft::Terminal::Settings::Model; + +namespace winrt::Microsoft::Terminal::Settings::Editor::implementation +{ + ReadOnlyActions::ReadOnlyActions() + { + InitializeComponent(); + + _filteredActions = winrt::single_threaded_observable_vector(); + } + + void ReadOnlyActions::OnNavigatedTo(const NavigationEventArgs& e) + { + _State = e.Parameter().as(); + + std::vector keyBindingList; + for (const auto& [_, command] : _State.Settings().GlobalSettings().ActionMap().NameMap()) + { + // Filter out nested commands, and commands that aren't bound to a + // key. This page is currently just for displaying the actions that + // _are_ bound to keys. + if (command.HasNestedCommands() || !command.Keys()) + { + continue; + } + keyBindingList.push_back(command); + } + std::sort(begin(keyBindingList), end(keyBindingList), CommandComparator{}); + _filteredActions = single_threaded_observable_vector(std::move(keyBindingList)); + } + + Collections::IObservableVector ReadOnlyActions::FilteredActions() + { + return _filteredActions; + } + + void ReadOnlyActions::_OpenSettingsClick(const IInspectable& /*sender*/, + const Windows::UI::Xaml::RoutedEventArgs& /*eventArgs*/) + { + const CoreWindow window = CoreWindow::GetForCurrentThread(); + const auto rAltState = window.GetKeyState(VirtualKey::RightMenu); + const auto lAltState = window.GetKeyState(VirtualKey::LeftMenu); + const bool altPressed = WI_IsFlagSet(lAltState, CoreVirtualKeyStates::Down) || + WI_IsFlagSet(rAltState, CoreVirtualKeyStates::Down); + + const auto target = altPressed ? SettingsTarget::DefaultsFile : SettingsTarget::SettingsFile; + + _State.RequestOpenJson(target); + } + +} diff --git a/src/cascadia/TerminalSettingsEditor/ReadOnlyActions.h b/src/cascadia/TerminalSettingsEditor/ReadOnlyActions.h new file mode 100644 index 00000000000..786dabf8c4a --- /dev/null +++ b/src/cascadia/TerminalSettingsEditor/ReadOnlyActions.h @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +#pragma once + +#include "ReadOnlyActions.g.h" +#include "ReadOnlyActionsPageNavigationState.g.h" +#include "Utils.h" + +namespace winrt::Microsoft::Terminal::Settings::Editor::implementation +{ + struct CommandComparator + { + bool operator()(const Model::Command& lhs, const Model::Command& rhs) const + { + return lhs.Name() < rhs.Name(); + } + }; + + struct ReadOnlyActionsPageNavigationState : ReadOnlyActionsPageNavigationStateT + { + public: + ReadOnlyActionsPageNavigationState(const Model::CascadiaSettings& settings) : + _Settings{ settings } {} + + void RequestOpenJson(const Model::SettingsTarget target) + { + _OpenJsonHandlers(nullptr, target); + } + + WINRT_PROPERTY(Model::CascadiaSettings, Settings, nullptr) + TYPED_EVENT(OpenJson, Windows::Foundation::IInspectable, Model::SettingsTarget); + }; + + struct ReadOnlyActions : ReadOnlyActionsT + { + public: + ReadOnlyActions(); + + void OnNavigatedTo(const winrt::Windows::UI::Xaml::Navigation::NavigationEventArgs& e); + + Windows::Foundation::Collections::IObservableVector FilteredActions(); + + WINRT_PROPERTY(Editor::ReadOnlyActionsPageNavigationState, State, nullptr); + + private: + friend struct ReadOnlyActionsT; // for Xaml to bind events + Windows::Foundation::Collections::IObservableVector _filteredActions{ nullptr }; + + void _OpenSettingsClick(const IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& eventArgs); + }; +} + +namespace winrt::Microsoft::Terminal::Settings::Editor::factory_implementation +{ + BASIC_FACTORY(ReadOnlyActions); +} diff --git a/src/cascadia/TerminalSettingsEditor/ReadOnlyActions.idl b/src/cascadia/TerminalSettingsEditor/ReadOnlyActions.idl new file mode 100644 index 00000000000..49e01bf5769 --- /dev/null +++ b/src/cascadia/TerminalSettingsEditor/ReadOnlyActions.idl @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import "EnumEntry.idl"; + +namespace Microsoft.Terminal.Settings.Editor +{ + runtimeclass ReadOnlyActionsPageNavigationState + { + Microsoft.Terminal.Settings.Model.CascadiaSettings Settings; + void RequestOpenJson(Microsoft.Terminal.Settings.Model.SettingsTarget target); + event Windows.Foundation.TypedEventHandler OpenJson; + }; + + [default_interface] runtimeclass ReadOnlyActions : Windows.UI.Xaml.Controls.Page + { + ReadOnlyActions(); + ReadOnlyActionsPageNavigationState State { get; }; + + IObservableVector FilteredActions { get; }; + + } +} diff --git a/src/cascadia/TerminalSettingsEditor/ReadOnlyActions.xaml b/src/cascadia/TerminalSettingsEditor/ReadOnlyActions.xaml new file mode 100644 index 00000000000..ec1a685fb72 --- /dev/null +++ b/src/cascadia/TerminalSettingsEditor/ReadOnlyActions.xaml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +