Skip to content

Commit

Permalink
Teach CommandPalette model to natively support tabs and command lines (
Browse files Browse the repository at this point in the history
…#8420)

First step towards #8415:
* Introduce `PaletteItem` and derive from it to provide native support
  for tabs and command lines (`ActionPaletteItem` / `TabPaletteItem`,
  `CommandLinePaltteItem`)
* Remove business logic behind PaletteItem from palette (aka dispatch
  commands and preview tabs externally)
  • Loading branch information
Don-Vito committed Dec 10, 2020
1 parent e1a8657 commit 89d82ff
Show file tree
Hide file tree
Showing 31 changed files with 585 additions and 327 deletions.
147 changes: 28 additions & 119 deletions src/cascadia/LocalTests_TerminalApp/FilteredCommandTests.cpp

Large diffs are not rendered by default.

28 changes: 14 additions & 14 deletions src/cascadia/LocalTests_TerminalApp/TabTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -865,14 +865,14 @@ namespace TerminalAppLocalTests
page->_OpenNewTab(newTerminalArgs);
page->_OpenNewTab(newTerminalArgs);
});
VERIFY_ARE_EQUAL(4u, page->_mruTabActions.Size());
VERIFY_ARE_EQUAL(4u, page->_mruTabs.Size());

Log::Comment(L"give alphabetical names to all switch tab actions");
RunOnUIThread([&page]() {
page->_tabs.GetAt(0).SwitchToTabCommand().Name(L"a");
page->_tabs.GetAt(1).SwitchToTabCommand().Name(L"b");
page->_tabs.GetAt(2).SwitchToTabCommand().Name(L"c");
page->_tabs.GetAt(3).SwitchToTabCommand().Name(L"d");
page->_GetTerminalTabImpl(page->_tabs.GetAt(0))->Title(L"a");
page->_GetTerminalTabImpl(page->_tabs.GetAt(1))->Title(L"b");
page->_GetTerminalTabImpl(page->_tabs.GetAt(2))->Title(L"c");
page->_GetTerminalTabImpl(page->_tabs.GetAt(3))->Title(L"d");
});

Log::Comment(L"Change the tab switch order to MRU switching");
Expand All @@ -888,11 +888,11 @@ namespace TerminalAppLocalTests
page->_UpdatedSelectedTab(3);
});

VERIFY_ARE_EQUAL(4u, page->_mruTabActions.Size());
VERIFY_ARE_EQUAL(L"d", page->_mruTabActions.GetAt(0).Name());
VERIFY_ARE_EQUAL(L"c", page->_mruTabActions.GetAt(1).Name());
VERIFY_ARE_EQUAL(L"b", page->_mruTabActions.GetAt(2).Name());
VERIFY_ARE_EQUAL(L"a", page->_mruTabActions.GetAt(3).Name());
VERIFY_ARE_EQUAL(4u, page->_mruTabs.Size());
VERIFY_ARE_EQUAL(L"d", page->_mruTabs.GetAt(0).Title());
VERIFY_ARE_EQUAL(L"c", page->_mruTabs.GetAt(1).Title());
VERIFY_ARE_EQUAL(L"b", page->_mruTabs.GetAt(2).Title());
VERIFY_ARE_EQUAL(L"a", page->_mruTabs.GetAt(3).Title());

Log::Comment(L"Switch to the next MRU tab, which is the third tab");
RunOnUIThread([&page]() {
Expand All @@ -906,9 +906,9 @@ namespace TerminalAppLocalTests

Log::Comment(L"Verify command palette preserves MRU order of tabs");
VERIFY_ARE_EQUAL(4u, palette->_filteredActions.Size());
VERIFY_ARE_EQUAL(L"d", palette->_filteredActions.GetAt(0).Command().Name());
VERIFY_ARE_EQUAL(L"c", palette->_filteredActions.GetAt(1).Command().Name());
VERIFY_ARE_EQUAL(L"b", palette->_filteredActions.GetAt(2).Command().Name());
VERIFY_ARE_EQUAL(L"a", palette->_filteredActions.GetAt(3).Command().Name());
VERIFY_ARE_EQUAL(L"d", palette->_filteredActions.GetAt(0).Item().Name());
VERIFY_ARE_EQUAL(L"c", palette->_filteredActions.GetAt(1).Item().Name());
VERIFY_ARE_EQUAL(L"b", palette->_filteredActions.GetAt(2).Item().Name());
VERIFY_ARE_EQUAL(L"a", palette->_filteredActions.GetAt(3).Item().Name());
}
}
50 changes: 50 additions & 0 deletions src/cascadia/TerminalApp/ActionPaletteItem.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

#include "pch.h"
#include "ActionPaletteItem.h"
#include <LibraryResources.h>

#include "ActionPaletteItem.g.cpp"

using namespace winrt;
using namespace winrt::TerminalApp;
using namespace winrt::Windows::UI::Core;
using namespace winrt::Windows::UI::Xaml;
using namespace winrt::Windows::System;
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Foundation::Collections;
using namespace winrt::Microsoft::Terminal::Settings::Model;

namespace winrt::TerminalApp::implementation
{
ActionPaletteItem::ActionPaletteItem(Microsoft::Terminal::Settings::Model::Command const& command) :
_Command(command)
{
Name(command.Name());
KeyChordText(command.KeyChordText());
Icon(command.Icon());

_commandChangedRevoker = command.PropertyChanged(winrt::auto_revoke, [weakThis{ get_weak() }](auto& sender, auto& e) {
auto item{ weakThis.get() };
auto senderCommand{ sender.try_as<Microsoft::Terminal::Settings::Model::Command>() };

if (item && senderCommand)
{
auto changedProperty = e.PropertyName();
if (changedProperty == L"Name")
{
item->Name(senderCommand.Name());
}
else if (changedProperty == L"KeyChordText")
{
item->KeyChordText(senderCommand.KeyChordText());
}
else if (changedProperty == L"Icon")
{
item->Icon(senderCommand.Icon());
}
}
});
}
}
27 changes: 27 additions & 0 deletions src/cascadia/TerminalApp/ActionPaletteItem.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

#pragma once

#include "PaletteItem.h"
#include "ActionPaletteItem.g.h"
#include "inc/cppwinrt_utils.h"

namespace winrt::TerminalApp::implementation
{
struct ActionPaletteItem : ActionPaletteItemT<ActionPaletteItem, PaletteItem>
{
ActionPaletteItem() = default;
ActionPaletteItem(Microsoft::Terminal::Settings::Model::Command const& command);

GETSET_PROPERTY(Microsoft::Terminal::Settings::Model::Command, Command, nullptr);

private:
Windows::UI::Xaml::Data::INotifyPropertyChanged::PropertyChanged_revoker _commandChangedRevoker;
};
}

namespace winrt::TerminalApp::factory_implementation
{
BASIC_FACTORY(ActionPaletteItem);
}
14 changes: 14 additions & 0 deletions src/cascadia/TerminalApp/ActionPaletteItem.idl
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

import "PaletteItem.idl";

namespace TerminalApp
{
[default_interface] runtimeclass ActionPaletteItem : PaletteItem
{
ActionPaletteItem(Microsoft.Terminal.Settings.Model.Command command);

Microsoft.Terminal.Settings.Model.Command Command { get; };
}
}
2 changes: 1 addition & 1 deletion src/cascadia/TerminalApp/AppActionHandlers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -536,7 +536,7 @@ namespace winrt::TerminalApp::implementation
const ActionEventArgs& args)
{
// Tab search is always in-order.
_UpdatePaletteWithInOrderTabs();
CommandPalette().SetTabs(_tabs, true);

auto opt = _GetFocusedTabIndex();
uint32_t startIdx = opt.value_or(0);
Expand Down
26 changes: 26 additions & 0 deletions src/cascadia/TerminalApp/CommandLinePaletteItem.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

#include "pch.h"
#include "CommandLinePaletteItem.h"
#include <LibraryResources.h>

#include "CommandLinePaletteItem.g.cpp"

using namespace winrt;
using namespace winrt::TerminalApp;
using namespace winrt::Windows::UI::Core;
using namespace winrt::Windows::UI::Xaml;
using namespace winrt::Windows::System;
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Foundation::Collections;
using namespace winrt::Microsoft::Terminal::Settings::Model;

namespace winrt::TerminalApp::implementation
{
CommandLinePaletteItem::CommandLinePaletteItem(winrt::hstring const& commandLine) :
_CommandLine(commandLine)
{
Name(commandLine);
}
}
24 changes: 24 additions & 0 deletions src/cascadia/TerminalApp/CommandLinePaletteItem.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

#pragma once

#include "PaletteItem.h"
#include "CommandLinePaletteItem.g.h"
#include "inc/cppwinrt_utils.h"

namespace winrt::TerminalApp::implementation
{
struct CommandLinePaletteItem : CommandLinePaletteItemT<CommandLinePaletteItem, PaletteItem>
{
CommandLinePaletteItem() = default;
CommandLinePaletteItem(winrt::hstring const& commandLine);

GETSET_PROPERTY(winrt::hstring, CommandLine);
};
}

namespace winrt::TerminalApp::factory_implementation
{
BASIC_FACTORY(CommandLinePaletteItem);
}
12 changes: 12 additions & 0 deletions src/cascadia/TerminalApp/CommandLinePaletteItem.idl
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import "PaletteItem.idl";
import "TabBase.idl";

namespace TerminalApp
{
[default_interface] runtimeclass CommandLinePaletteItem : PaletteItem
{
CommandLinePaletteItem(String commandLine);

String CommandLine { get; };
}
}
Loading

0 comments on commit 89d82ff

Please sign in to comment.