diff --git a/src/cascadia/TerminalApp/Command.idl b/src/cascadia/TerminalApp/Command.idl index 3aa55c64420..beb0a43f10c 100644 --- a/src/cascadia/TerminalApp/Command.idl +++ b/src/cascadia/TerminalApp/Command.idl @@ -15,7 +15,7 @@ namespace TerminalApp Windows.UI.Xaml.Controls.IconSource IconSource; - Boolean HasNestedCommands(); + Boolean HasNestedCommands { get; }; Windows.Foundation.Collections.IMapView NestedCommands { get; }; } } diff --git a/src/cascadia/TerminalApp/CommandPalette.cpp b/src/cascadia/TerminalApp/CommandPalette.cpp index c6c2061b004..e1c96bc00d0 100644 --- a/src/cascadia/TerminalApp/CommandPalette.cpp +++ b/src/cascadia/TerminalApp/CommandPalette.cpp @@ -343,6 +343,7 @@ namespace winrt::TerminalApp::implementation // action. Instead, display a new list of commands for the user // to pick from. _nestedActionStack.Append(command); + ParentCommandName(command.Name()); _currentNestedCommands.Clear(); for (const auto& nameAndCommand : command.NestedCommands()) { @@ -764,6 +765,8 @@ namespace winrt::TerminalApp::implementation _searchBox().Text(L""); _nestedActionStack.Clear(); + + ParentCommandName(L""); _currentNestedCommands.Clear(); } diff --git a/src/cascadia/TerminalApp/CommandPalette.h b/src/cascadia/TerminalApp/CommandPalette.h index 641f0606f19..97a18ac28cb 100644 --- a/src/cascadia/TerminalApp/CommandPalette.h +++ b/src/cascadia/TerminalApp/CommandPalette.h @@ -33,6 +33,7 @@ namespace winrt::TerminalApp::implementation OBSERVABLE_GETSET_PROPERTY(winrt::hstring, NoMatchesText, _PropertyChangedHandlers); OBSERVABLE_GETSET_PROPERTY(winrt::hstring, SearchBoxText, _PropertyChangedHandlers); OBSERVABLE_GETSET_PROPERTY(winrt::hstring, ControlName, _PropertyChangedHandlers); + OBSERVABLE_GETSET_PROPERTY(winrt::hstring, ParentCommandName, _PropertyChangedHandlers); private: friend struct CommandPaletteT; // for Xaml to bind events diff --git a/src/cascadia/TerminalApp/CommandPalette.idl b/src/cascadia/TerminalApp/CommandPalette.idl index 8286077a4e4..93d5851f60d 100644 --- a/src/cascadia/TerminalApp/CommandPalette.idl +++ b/src/cascadia/TerminalApp/CommandPalette.idl @@ -12,6 +12,7 @@ namespace TerminalApp String NoMatchesText { get; }; String SearchBoxText { get; }; String ControlName { get; }; + String ParentCommandName { get; }; Windows.Foundation.Collections.IObservableVector FilteredActions { get; }; diff --git a/src/cascadia/TerminalApp/CommandPalette.xaml b/src/cascadia/TerminalApp/CommandPalette.xaml index 50b35e8bbb6..015ce7677d6 100644 --- a/src/cascadia/TerminalApp/CommandPalette.xaml +++ b/src/cascadia/TerminalApp/CommandPalette.xaml @@ -9,8 +9,8 @@ the MIT License. See LICENSE in the project root for license information. --> xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:Windows10version1903="http://schemas.microsoft.com/winfx/2006/xaml/presentation?IsApiContractPresent(Windows.Foundation.UniversalApiContract, 8)" - TabNavigation="Cycle" - IsTabStop="True" + TabNavigation="Cycle" + IsTabStop="True" AllowFocusOnInteraction="True" PointerPressed="_rootPointerPressed" PreviewKeyDown="_previewKeyDownHandler" @@ -27,7 +27,9 @@ the MIT License. See LICENSE in the project root for license information. --> - + + + @@ -170,12 +172,23 @@ the MIT License. See LICENSE in the project root for license information. --> + Padding="16, 0, 16, 4" + x:Name="_parentCommandText" + FontStyle="Italic" + Visibility="{x:Bind ParentCommandName, + Mode=OneWay, + Converter={StaticResource ParentCommandVisibilityConverter}}" + Grid.Row="1" + Text="{x:Bind ParentCommandName, Mode=OneWay}"> + + + Text="{x:Bind KeyChordText, Mode=OneWay}" /> + + + + + + + + diff --git a/src/cascadia/TerminalApp/CommandKeyChordVisibilityConverter.cpp b/src/cascadia/TerminalApp/EmptyStringVisibilityConverter.cpp similarity index 69% rename from src/cascadia/TerminalApp/CommandKeyChordVisibilityConverter.cpp rename to src/cascadia/TerminalApp/EmptyStringVisibilityConverter.cpp index 24af0da0029..ed4bec4f7ae 100644 --- a/src/cascadia/TerminalApp/CommandKeyChordVisibilityConverter.cpp +++ b/src/cascadia/TerminalApp/EmptyStringVisibilityConverter.cpp @@ -1,6 +1,6 @@ #include "pch.h" -#include "CommandKeyChordVisibilityConverter.h" -#include "CommandKeyChordVisibilityConverter.g.cpp" +#include "EmptyStringVisibilityConverter.h" +#include "EmptyStringVisibilityConverter.g.cpp" using namespace winrt::Windows; using namespace winrt::Windows::UI::Xaml; @@ -9,7 +9,7 @@ namespace winrt::TerminalApp::implementation { // Method Description: // - Attempt to convert something into another type. For the - // CommandKeyChordVisibilityConverter, we're gonna check if `value` is a + // EmptyStringVisibilityConverter, we're gonna check if `value` is a // string, and try and convert it into a Visibility value. If the input // param wasn't a string, or was the empty string, we'll return // Visibility::Collapsed. Otherwise, we'll return Visible. @@ -18,20 +18,20 @@ namespace winrt::TerminalApp::implementation // - value: the input object to attempt to convert into a Visibility. // Return Value: // - Visible if the object was a string and wasn't the empty string. - Foundation::IInspectable CommandKeyChordVisibilityConverter::Convert(Foundation::IInspectable const& value, - Windows::UI::Xaml::Interop::TypeName const& /* targetType */, - Foundation::IInspectable const& /* parameter */, - hstring const& /* language */) + Foundation::IInspectable EmptyStringVisibilityConverter::Convert(Foundation::IInspectable const& value, + Windows::UI::Xaml::Interop::TypeName const& /* targetType */, + Foundation::IInspectable const& /* parameter */, + hstring const& /* language */) { const auto& name = winrt::unbox_value_or(value, L""); return winrt::box_value(name.empty() ? Visibility::Collapsed : Visibility::Visible); } // unused for one-way bindings - Foundation::IInspectable CommandKeyChordVisibilityConverter::ConvertBack(Foundation::IInspectable const& /* value */, - Windows::UI::Xaml::Interop::TypeName const& /* targetType */, - Foundation::IInspectable const& /* parameter */, - hstring const& /* language */) + Foundation::IInspectable EmptyStringVisibilityConverter::ConvertBack(Foundation::IInspectable const& /* value */, + Windows::UI::Xaml::Interop::TypeName const& /* targetType */, + Foundation::IInspectable const& /* parameter */, + hstring const& /* language */) { throw hresult_not_implemented(); } diff --git a/src/cascadia/TerminalApp/CommandKeyChordVisibilityConverter.h b/src/cascadia/TerminalApp/EmptyStringVisibilityConverter.h similarity index 75% rename from src/cascadia/TerminalApp/CommandKeyChordVisibilityConverter.h rename to src/cascadia/TerminalApp/EmptyStringVisibilityConverter.h index 298f6ac0a0f..bf6b9bbe9a2 100644 --- a/src/cascadia/TerminalApp/CommandKeyChordVisibilityConverter.h +++ b/src/cascadia/TerminalApp/EmptyStringVisibilityConverter.h @@ -1,13 +1,13 @@ #pragma once -#include "CommandKeyChordVisibilityConverter.g.h" +#include "EmptyStringVisibilityConverter.g.h" #include "..\inc\cppwinrt_utils.h" namespace winrt::TerminalApp::implementation { - struct CommandKeyChordVisibilityConverter : CommandKeyChordVisibilityConverterT + struct EmptyStringVisibilityConverter : EmptyStringVisibilityConverterT { - CommandKeyChordVisibilityConverter() = default; + EmptyStringVisibilityConverter() = default; Windows::Foundation::IInspectable Convert(Windows::Foundation::IInspectable const& value, Windows::UI::Xaml::Interop::TypeName const& targetType, @@ -23,5 +23,5 @@ namespace winrt::TerminalApp::implementation namespace winrt::TerminalApp::factory_implementation { - BASIC_FACTORY(CommandKeyChordVisibilityConverter); + BASIC_FACTORY(EmptyStringVisibilityConverter); } diff --git a/src/cascadia/TerminalApp/CommandKeyChordVisibilityConverter.idl b/src/cascadia/TerminalApp/EmptyStringVisibilityConverter.idl similarity index 60% rename from src/cascadia/TerminalApp/CommandKeyChordVisibilityConverter.idl rename to src/cascadia/TerminalApp/EmptyStringVisibilityConverter.idl index b293224e64d..fd03a0021bb 100644 --- a/src/cascadia/TerminalApp/CommandKeyChordVisibilityConverter.idl +++ b/src/cascadia/TerminalApp/EmptyStringVisibilityConverter.idl @@ -6,14 +6,14 @@ namespace TerminalApp // See https://docs.microsoft.com/en-us/windows/uwp/data-binding/data-binding-quickstart // We use the default attribute to declare IValueConverter as the default - // interface. In the listing, CommandKeyChordVisibilityConverter has only a + // interface. In the listing, EmptyStringVisibilityConverter has only a // constructor, and no methods, so no default interface is generated for it. // The default attribute is optimal if you won't be adding instance members - // to CommandKeyChordVisibilityConverter, because no QueryInterface will be + // to EmptyStringVisibilityConverter, because no QueryInterface will be // required to call the IValueConverter methods - runtimeclass CommandKeyChordVisibilityConverter : [default] Windows.UI.Xaml.Data.IValueConverter + runtimeclass EmptyStringVisibilityConverter : [default] Windows.UI.Xaml.Data.IValueConverter { - CommandKeyChordVisibilityConverter(); + EmptyStringVisibilityConverter(); }; } diff --git a/src/cascadia/TerminalApp/HasNestedCommandsVisibilityConverter.cpp b/src/cascadia/TerminalApp/HasNestedCommandsVisibilityConverter.cpp new file mode 100644 index 00000000000..d398dbc40bd --- /dev/null +++ b/src/cascadia/TerminalApp/HasNestedCommandsVisibilityConverter.cpp @@ -0,0 +1,38 @@ +#include "pch.h" +#include "HasNestedCommandsVisibilityConverter.h" +#include "HasNestedCommandsVisibilityConverter.g.cpp" + +using namespace winrt::Windows; +using namespace winrt::Windows::UI::Xaml; + +namespace winrt::TerminalApp::implementation +{ + // Method Description: + // - Attempt to convert something into another type. For the + // HasNestedCommandsVisibilityConverter, we're gonna check if `value` is a + // string, and try and convert it into a Visibility value. If the input + // param wasn't a string, or was the empty string, we'll return + // Visibility::Collapsed. Otherwise, we'll return Visible. + + // Arguments: + // - value: the input object to attempt to convert into a Visibility. + // Return Value: + // - Visible if the object was a string and wasn't the empty string. + Foundation::IInspectable HasNestedCommandsVisibilityConverter::Convert(Foundation::IInspectable const& value, + Windows::UI::Xaml::Interop::TypeName const& /* targetType */, + Foundation::IInspectable const& /* parameter */, + hstring const& /* language */) + { + const auto& hasNestedCommands = winrt::unbox_value_or(value, false); + return winrt::box_value(hasNestedCommands ? Visibility::Visible : Visibility::Collapsed); + } + + // unused for one-way bindings + Foundation::IInspectable HasNestedCommandsVisibilityConverter::ConvertBack(Foundation::IInspectable const& /* value */, + Windows::UI::Xaml::Interop::TypeName const& /* targetType */, + Foundation::IInspectable const& /* parameter */, + hstring const& /* language */) + { + throw hresult_not_implemented(); + } +} diff --git a/src/cascadia/TerminalApp/HasNestedCommandsVisibilityConverter.h b/src/cascadia/TerminalApp/HasNestedCommandsVisibilityConverter.h new file mode 100644 index 00000000000..e8526b8b48f --- /dev/null +++ b/src/cascadia/TerminalApp/HasNestedCommandsVisibilityConverter.h @@ -0,0 +1,27 @@ +#pragma once + +#include "HasNestedCommandsVisibilityConverter.g.h" +#include "..\inc\cppwinrt_utils.h" + +namespace winrt::TerminalApp::implementation +{ + struct HasNestedCommandsVisibilityConverter : HasNestedCommandsVisibilityConverterT + { + HasNestedCommandsVisibilityConverter() = default; + + Windows::Foundation::IInspectable Convert(Windows::Foundation::IInspectable const& value, + Windows::UI::Xaml::Interop::TypeName const& targetType, + Windows::Foundation::IInspectable const& parameter, + hstring const& language); + + Windows::Foundation::IInspectable ConvertBack(Windows::Foundation::IInspectable const& value, + Windows::UI::Xaml::Interop::TypeName const& targetType, + Windows::Foundation::IInspectable const& parameter, + hstring const& language); + }; +} + +namespace winrt::TerminalApp::factory_implementation +{ + BASIC_FACTORY(HasNestedCommandsVisibilityConverter); +} diff --git a/src/cascadia/TerminalApp/HasNestedCommandsVisibilityConverter.idl b/src/cascadia/TerminalApp/HasNestedCommandsVisibilityConverter.idl new file mode 100644 index 00000000000..6d28f5dea67 --- /dev/null +++ b/src/cascadia/TerminalApp/HasNestedCommandsVisibilityConverter.idl @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +namespace TerminalApp +{ + // See https://docs.microsoft.com/en-us/windows/uwp/data-binding/data-binding-quickstart + + // We use the default attribute to declare IValueConverter as the default + // interface. In the listing, HasNestedCommandsVisibilityConverter has only a + // constructor, and no methods, so no default interface is generated for it. + // The default attribute is optimal if you won't be adding instance members + // to HasNestedCommandsVisibilityConverter, because no QueryInterface will be + // required to call the IValueConverter methods + runtimeclass HasNestedCommandsVisibilityConverter : [default] Windows.UI.Xaml.Data.IValueConverter + { + HasNestedCommandsVisibilityConverter(); + }; + +} diff --git a/src/cascadia/TerminalApp/lib/TerminalAppLib.vcxproj b/src/cascadia/TerminalApp/lib/TerminalAppLib.vcxproj index aecf0ef0847..9a719753252 100644 --- a/src/cascadia/TerminalApp/lib/TerminalAppLib.vcxproj +++ b/src/cascadia/TerminalApp/lib/TerminalAppLib.vcxproj @@ -94,8 +94,11 @@ ../Command.idl - - ../CommandKeyChordVisibilityConverter.idl + + ../EmptyStringVisibilityConverter.idl + + + ../HasNestedCommandsVisibilityConverter.idl ../Tab.idl @@ -168,8 +171,11 @@ ../Command.idl - - ../CommandKeyChordVisibilityConverter.idl + + ../EmptyStringVisibilityConverter.idl + + + ../HasNestedCommandsVisibilityConverter.idl ../Tab.idl @@ -261,7 +267,8 @@ Code - + +