Enable embedding non-terminal controls in panes
This adds a _super_ simple dummy RichTextBox as a control in a pane adjacent to a terminal pane
This commit is contained in:
parent
e5d88c3909
commit
dd212dde74
|
@ -508,6 +508,7 @@ namespace winrt::TerminalApp::implementation
|
|||
bindings.MoveFocus([this](const auto direction) { _MoveFocus(direction); });
|
||||
bindings.CopyText([this](const auto trimWhitespace) { _CopyText(trimWhitespace); });
|
||||
bindings.PasteText([this]() { _PasteText(); });
|
||||
bindings.OpenTestPane([this]() { _OpenTestPane(); });
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
|
@ -920,13 +921,15 @@ namespace winrt::TerminalApp::implementation
|
|||
TerminalConnection::ITerminalConnection connection = TerminalConnection::ConhostConnection(settings.Commandline(), settings.StartingDirectory(), 30, 80, winrt::guid());
|
||||
|
||||
TermControl term{ settings, connection };
|
||||
TermControlHost controlHost{ term };
|
||||
|
||||
// Add the new tab to the list of our tabs.
|
||||
auto newTab = _tabs.emplace_back(std::make_shared<Tab>(profileGuid, term));
|
||||
auto newTab = _tabs.emplace_back(std::make_shared<Tab>(profileGuid, controlHost));
|
||||
|
||||
const auto* const profile = _settings->FindProfile(profileGuid);
|
||||
|
||||
// Hookup our event handlers to the new terminal
|
||||
// TODO: non-terminal tabs? what do for these events?
|
||||
_RegisterTerminalEvents(term, newTab);
|
||||
|
||||
auto tabViewItem = newTab->GetTabViewItem();
|
||||
|
@ -1307,6 +1310,7 @@ namespace winrt::TerminalApp::implementation
|
|||
// this is nullopt, use the default profile.
|
||||
void App::_SplitPane(const Pane::SplitState splitType, const std::optional<GUID>& profileGuid)
|
||||
{
|
||||
// TODO: how do we split for non-terminal controls?
|
||||
// Do nothing if we're requesting no split.
|
||||
if (splitType == Pane::SplitState::None)
|
||||
{
|
||||
|
@ -1321,15 +1325,39 @@ namespace winrt::TerminalApp::implementation
|
|||
TerminalConnection::ITerminalConnection controlConnection = TerminalConnection::ConhostConnection(controlSettings.Commandline(), controlSettings.StartingDirectory(), 30, 80, winrt::guid());
|
||||
|
||||
TermControl newControl{ controlSettings, controlConnection };
|
||||
TermControlHost controlHost{ newControl };
|
||||
|
||||
const int focusedTabIndex = _GetFocusedTabIndex();
|
||||
auto focusedTab = _tabs[focusedTabIndex];
|
||||
|
||||
// TODO: what do we do about these events that might not make sense for non-terminal controls
|
||||
// Hookup our event handlers to the new terminal
|
||||
_RegisterTerminalEvents(newControl, focusedTab);
|
||||
|
||||
return splitType == Pane::SplitState::Horizontal ? focusedTab->AddHorizontalSplit(realGuid, newControl) :
|
||||
focusedTab->AddVerticalSplit(realGuid, newControl);
|
||||
return splitType == Pane::SplitState::Horizontal ? focusedTab->AddHorizontalSplit(realGuid, controlHost) :
|
||||
focusedTab->AddVerticalSplit(realGuid, controlHost);
|
||||
}
|
||||
|
||||
void App::_OpenTestPane()
|
||||
{
|
||||
const auto splitType = Pane::SplitState::Vertical;
|
||||
|
||||
// TODO: how do we split for non-terminal controls?
|
||||
// Do nothing if we're requesting no split.
|
||||
|
||||
GUID realGuid = { 0 };
|
||||
|
||||
TextBlockControlHost controlHost{};
|
||||
|
||||
const int focusedTabIndex = _GetFocusedTabIndex();
|
||||
auto focusedTab = _tabs[focusedTabIndex];
|
||||
|
||||
// // TODO: what do we do about these events that might not make sense for non-terminal controls
|
||||
// // Hookup our event handlers to the new terminal
|
||||
// _RegisterTerminalEvents(newControl, focusedTab);
|
||||
|
||||
return splitType == Pane::SplitState::Horizontal ? focusedTab->AddHorizontalSplit(realGuid, controlHost) :
|
||||
focusedTab->AddVerticalSplit(realGuid, controlHost);
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
|
|
|
@ -117,6 +117,7 @@ namespace winrt::TerminalApp::implementation
|
|||
void _SplitVertical(const std::optional<GUID>& profileGuid);
|
||||
void _SplitHorizontal(const std::optional<GUID>& profileGuid);
|
||||
void _SplitPane(const Pane::SplitState splitType, const std::optional<GUID>& profileGuid);
|
||||
void _OpenTestPane();
|
||||
|
||||
// Todo: add more event implementations here
|
||||
// MSFT:20641986: Add keybindings for New Window
|
||||
|
|
|
@ -181,6 +181,11 @@ namespace winrt::TerminalApp::implementation
|
|||
case ShortcutAction::MoveFocusDown:
|
||||
_MoveFocusHandlers(Direction::Down);
|
||||
return true;
|
||||
|
||||
case ShortcutAction::OpenTestPane:
|
||||
_OpenTestPaneHandlers();
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
@ -263,5 +268,6 @@ namespace winrt::TerminalApp::implementation
|
|||
DEFINE_EVENT(AppKeyBindings, OpenSettings, _OpenSettingsHandlers, TerminalApp::OpenSettingsEventArgs);
|
||||
DEFINE_EVENT(AppKeyBindings, ResizePane, _ResizePaneHandlers, TerminalApp::ResizePaneEventArgs);
|
||||
DEFINE_EVENT(AppKeyBindings, MoveFocus, _MoveFocusHandlers, TerminalApp::MoveFocusEventArgs);
|
||||
DEFINE_EVENT(AppKeyBindings, OpenTestPane, _OpenTestPaneHandlers, TerminalApp::OpenTestPaneEventArgs);
|
||||
// clang-format on
|
||||
}
|
||||
|
|
|
@ -62,6 +62,7 @@ namespace winrt::TerminalApp::implementation
|
|||
DECLARE_EVENT(OpenSettings, _OpenSettingsHandlers, TerminalApp::OpenSettingsEventArgs);
|
||||
DECLARE_EVENT(ResizePane, _ResizePaneHandlers, TerminalApp::ResizePaneEventArgs);
|
||||
DECLARE_EVENT(MoveFocus, _MoveFocusHandlers, TerminalApp::MoveFocusEventArgs);
|
||||
DECLARE_EVENT(OpenTestPane, _OpenTestPaneHandlers, TerminalApp::OpenTestPaneEventArgs);
|
||||
// clang-format on
|
||||
|
||||
private:
|
||||
|
|
|
@ -57,7 +57,8 @@ namespace TerminalApp
|
|||
MoveFocusRight,
|
||||
MoveFocusUp,
|
||||
MoveFocusDown,
|
||||
OpenSettings
|
||||
OpenSettings,
|
||||
OpenTestPane
|
||||
};
|
||||
|
||||
delegate void CopyTextEventArgs(Boolean trimWhitespace);
|
||||
|
@ -82,6 +83,7 @@ namespace TerminalApp
|
|||
delegate void OpenSettingsEventArgs();
|
||||
delegate void ResizePaneEventArgs(Direction direction);
|
||||
delegate void MoveFocusEventArgs(Direction direction);
|
||||
delegate void OpenTestPaneEventArgs();
|
||||
|
||||
[default_interface] runtimeclass AppKeyBindings : Microsoft.Terminal.Settings.IKeyBindings
|
||||
{
|
||||
|
@ -112,5 +114,6 @@ namespace TerminalApp
|
|||
event OpenSettingsEventArgs OpenSettings;
|
||||
event ResizePaneEventArgs ResizePane;
|
||||
event MoveFocusEventArgs MoveFocus;
|
||||
event OpenTestPaneEventArgs OpenTestPane;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,6 +59,7 @@ static constexpr std::string_view MoveFocusLeftKey{ "moveFocusLeft" };
|
|||
static constexpr std::string_view MoveFocusRightKey{ "moveFocusRight" };
|
||||
static constexpr std::string_view MoveFocusUpKey{ "moveFocusUp" };
|
||||
static constexpr std::string_view MoveFocusDownKey{ "moveFocusDown" };
|
||||
static constexpr std::string_view OpenTestPaneKey{ "openTestPane" };
|
||||
|
||||
// Specifically use a map here over an unordered_map. We want to be able to
|
||||
// iterate over these entries in-order when we're serializing the keybindings.
|
||||
|
@ -114,6 +115,7 @@ static const std::map<std::string_view, ShortcutAction, std::less<>> commandName
|
|||
{ MoveFocusUpKey, ShortcutAction::MoveFocusUp },
|
||||
{ MoveFocusDownKey, ShortcutAction::MoveFocusDown },
|
||||
{ OpenSettingsKey, ShortcutAction::OpenSettings },
|
||||
{ OpenTestPaneKey, ShortcutAction::OpenTestPane },
|
||||
};
|
||||
|
||||
// Function Description:
|
||||
|
|
19
src/cascadia/TerminalApp/IControlHost.idl
Normal file
19
src/cascadia/TerminalApp/IControlHost.idl
Normal file
|
@ -0,0 +1,19 @@
|
|||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
namespace TerminalApp
|
||||
{
|
||||
delegate void ClosedEventArgs();
|
||||
|
||||
interface IControlHost
|
||||
{
|
||||
Windows.UI.Xaml.Controls.Control GetControl();
|
||||
|
||||
event Windows.Foundation.TypedEventHandler<IControlHost, ClosedEventArgs> CloseRequested;
|
||||
void Close();
|
||||
|
||||
event Windows.Foundation.TypedEventHandler<IControlHost, Microsoft.Terminal.TerminalControl.TitleChangedEventArgs> TitleChanged;
|
||||
String GetTitle();
|
||||
Windows.Foundation.Size MinimumSize { get; };
|
||||
}
|
||||
}
|
|
@ -14,13 +14,38 @@ using namespace winrt::TerminalApp;
|
|||
static const int PaneSeparatorSize = 4;
|
||||
static const float Half = 0.50f;
|
||||
|
||||
Pane::Pane(const GUID& profile, const TermControl& control, const bool lastFocused) :
|
||||
// Pane::Pane(const GUID& profile, const TermControl& control, const bool lastFocused) :
|
||||
// _control{ control },
|
||||
// _lastFocused{ lastFocused },
|
||||
// _profile{ profile }
|
||||
// {
|
||||
// _root.Children().Append(_control.GetControl());
|
||||
// _connectionClosedToken = _control.ConnectionClosed({ this, &Pane::_ControlClosedHandler });
|
||||
|
||||
// // Set the background of the pane to match that of the theme's default grid
|
||||
// // background. This way, we'll match the small underline under the tabs, and
|
||||
// // the UI will be consistent on bot light and dark modes.
|
||||
// const auto res = Application::Current().Resources();
|
||||
// const auto key = winrt::box_value(L"BackgroundGridThemeStyle");
|
||||
// if (res.HasKey(key))
|
||||
// {
|
||||
// const auto g = res.Lookup(key);
|
||||
// const auto style = g.try_as<winrt::Windows::UI::Xaml::Style>();
|
||||
// // try_as fails by returning nullptr
|
||||
// if (style)
|
||||
// {
|
||||
// _root.Style(style);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
Pane::Pane(const GUID& profile, const IControlHost& control, const bool lastFocused) :
|
||||
_control{ control },
|
||||
_lastFocused{ lastFocused },
|
||||
_profile{ profile }
|
||||
{
|
||||
_root.Children().Append(_control.GetControl());
|
||||
_connectionClosedToken = _control.ConnectionClosed({ this, &Pane::_ControlClosedHandler });
|
||||
_connectionClosedToken = _control.CloseRequested({ this, &Pane::_ControlClosedHandler2 });
|
||||
|
||||
// Set the background of the pane to match that of the theme's default grid
|
||||
// background. This way, we'll match the small underline under the tabs, and
|
||||
|
@ -39,6 +64,11 @@ Pane::Pane(const GUID& profile, const TermControl& control, const bool lastFocus
|
|||
}
|
||||
}
|
||||
|
||||
void Pane::_ControlClosedHandler2(const winrt::Windows::Foundation::IInspectable& sender, const winrt::TerminalApp::ClosedEventArgs& args)
|
||||
{
|
||||
_ControlClosedHandler();
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Update the size of this pane. Resizes each of our columns so they have the
|
||||
// same relative sizes, given the newSize.
|
||||
|
@ -301,11 +331,12 @@ void Pane::_ControlClosedHandler()
|
|||
return;
|
||||
}
|
||||
|
||||
if (_control.ShouldCloseOnExit())
|
||||
{
|
||||
// Fire our Closed event to tell our parent that we should be removed.
|
||||
_closedHandlers();
|
||||
}
|
||||
// TODO: move this to the TerminalControlHost
|
||||
// if (_control.ShouldCloseOnExit())
|
||||
// {
|
||||
// // Fire our Closed event to tell our parent that we should be removed.
|
||||
// _closedHandlers();
|
||||
// }
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
|
@ -361,7 +392,13 @@ std::shared_ptr<Pane> Pane::GetFocusedPane()
|
|||
TermControl Pane::GetFocusedTerminalControl()
|
||||
{
|
||||
auto lastFocused = GetFocusedPane();
|
||||
return lastFocused ? lastFocused->_control : nullptr;
|
||||
// return lastFocused ? lastFocused->_control : nullptr;
|
||||
if (lastFocused)
|
||||
{
|
||||
auto termControlHost = lastFocused->_control.try_as<TermControlHost>();
|
||||
return termControlHost ? termControlHost.Terminal() : nullptr;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
|
@ -483,9 +520,13 @@ void Pane::UpdateSettings(const TerminalSettings& settings, const GUID& profile)
|
|||
}
|
||||
else
|
||||
{
|
||||
// TODO check if out profile is nullopt. If it is, then we don't have a terminal
|
||||
if (profile == _profile)
|
||||
{
|
||||
_control.UpdateSettings(settings);
|
||||
if (auto termControlHost = _control.try_as<TermControlHost>())
|
||||
{
|
||||
termControlHost.Terminal().UpdateSettings(settings);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -525,7 +566,8 @@ void Pane::_CloseChild(const bool closeFirst)
|
|||
_profile = remainingChild->_profile;
|
||||
|
||||
// Add our new event handler before revoking the old one.
|
||||
_connectionClosedToken = _control.ConnectionClosed({ this, &Pane::_ControlClosedHandler });
|
||||
// _connectionClosedToken = _control.ConnectionClosed({ this, &Pane::_ControlClosedHandler });
|
||||
_connectionClosedToken = _control.CloseRequested({ this, &Pane::_ControlClosedHandler2 });
|
||||
|
||||
// Revoke the old event handlers. Remove both the handlers for the panes
|
||||
// themselves closing, and remove their handlers for their controls
|
||||
|
@ -533,8 +575,10 @@ void Pane::_CloseChild(const bool closeFirst)
|
|||
// they'll trigger only our event handler for the control's close.
|
||||
_firstChild->Closed(_firstClosedToken);
|
||||
_secondChild->Closed(_secondClosedToken);
|
||||
closedChild->_control.ConnectionClosed(closedChild->_connectionClosedToken);
|
||||
remainingChild->_control.ConnectionClosed(remainingChild->_connectionClosedToken);
|
||||
// closedChild->_control.ConnectionClosed(closedChild->_connectionClosedToken);
|
||||
// remainingChild->_control.ConnectionClosed(remainingChild->_connectionClosedToken);
|
||||
closedChild->_control.CloseRequested(closedChild->_connectionClosedToken);
|
||||
remainingChild->_control.CloseRequested(remainingChild->_connectionClosedToken);
|
||||
|
||||
// If either of our children was focused, we want to take that focus from
|
||||
// them.
|
||||
|
@ -589,7 +633,8 @@ void Pane::_CloseChild(const bool closeFirst)
|
|||
// Revoke event handlers on old panes and controls
|
||||
oldFirst->Closed(oldFirstToken);
|
||||
oldSecond->Closed(oldSecondToken);
|
||||
closedChild->_control.ConnectionClosed(closedChild->_connectionClosedToken);
|
||||
// closedChild->_control.ConnectionClosed(closedChild->_connectionClosedToken);
|
||||
closedChild->_control.CloseRequested(closedChild->_connectionClosedToken);
|
||||
|
||||
// Reset our UI:
|
||||
_root.Children().Clear();
|
||||
|
@ -774,7 +819,8 @@ void Pane::_ApplySplitDefinitions()
|
|||
// - control: A TermControl to use in the new pane.
|
||||
// Return Value:
|
||||
// - <none>
|
||||
void Pane::SplitVertical(const GUID& profile, const TermControl& control)
|
||||
// void Pane::SplitVertical(const GUID& profile, const TermControl& control)
|
||||
void Pane::SplitVertical(const GUID& profile, const IControlHost& control)
|
||||
{
|
||||
// If we're not the leaf, recurse into our children to split them.
|
||||
if (!_IsLeaf())
|
||||
|
@ -803,7 +849,8 @@ void Pane::SplitVertical(const GUID& profile, const TermControl& control)
|
|||
// - control: A TermControl to use in the new pane.
|
||||
// Return Value:
|
||||
// - <none>
|
||||
void Pane::SplitHorizontal(const GUID& profile, const TermControl& control)
|
||||
// void Pane::SplitHorizontal(const GUID& profile, const TermControl& control)
|
||||
void Pane::SplitHorizontal(const GUID& profile, const IControlHost& control)
|
||||
{
|
||||
if (!_IsLeaf())
|
||||
{
|
||||
|
@ -831,14 +878,16 @@ void Pane::SplitHorizontal(const GUID& profile, const TermControl& control)
|
|||
// - control: A TermControl to use in the new pane.
|
||||
// Return Value:
|
||||
// - <none>
|
||||
void Pane::_Split(SplitState splitType, const GUID& profile, const TermControl& control)
|
||||
// void Pane::_Split(SplitState splitType, const GUID& profile, const TermControl& control)
|
||||
void Pane::_Split(SplitState splitType, const GUID& profile, const IControlHost& control)
|
||||
{
|
||||
// Lock the create/close lock so that another operation won't concurrently
|
||||
// modify our tree
|
||||
std::unique_lock lock{ _createCloseLock };
|
||||
|
||||
// revoke our handler - the child will take care of the control now.
|
||||
_control.ConnectionClosed(_connectionClosedToken);
|
||||
// _control.ConnectionClosed(_connectionClosedToken);
|
||||
_control.CloseRequested(_connectionClosedToken);
|
||||
_connectionClosedToken.value = 0;
|
||||
|
||||
_splitState = splitType;
|
||||
|
|
|
@ -33,7 +33,8 @@ public:
|
|||
Horizontal = 2
|
||||
};
|
||||
|
||||
Pane(const GUID& profile, const winrt::Microsoft::Terminal::TerminalControl::TermControl& control, const bool lastFocused = false);
|
||||
// Pane(const GUID& profile, const winrt::Microsoft::Terminal::TerminalControl::TermControl& control, const bool lastFocused = false);
|
||||
Pane(const GUID& profile, const winrt::TerminalApp::IControlHost& control, const bool lastFocused = false);
|
||||
|
||||
std::shared_ptr<Pane> GetFocusedPane();
|
||||
winrt::Microsoft::Terminal::TerminalControl::TermControl GetFocusedTerminalControl();
|
||||
|
@ -49,15 +50,18 @@ public:
|
|||
bool ResizePane(const winrt::TerminalApp::Direction& direction);
|
||||
bool NavigateFocus(const winrt::TerminalApp::Direction& direction);
|
||||
|
||||
void SplitHorizontal(const GUID& profile, const winrt::Microsoft::Terminal::TerminalControl::TermControl& control);
|
||||
void SplitVertical(const GUID& profile, const winrt::Microsoft::Terminal::TerminalControl::TermControl& control);
|
||||
// void SplitHorizontal(const GUID& profile, const winrt::Microsoft::Terminal::TerminalControl::TermControl& control);
|
||||
// void SplitVertical(const GUID& profile, const winrt::Microsoft::Terminal::TerminalControl::TermControl& control);
|
||||
void SplitHorizontal(const GUID& profile, const winrt::TerminalApp::IControlHost& control);
|
||||
void SplitVertical(const GUID& profile, const winrt::TerminalApp::IControlHost& control);
|
||||
|
||||
DECLARE_EVENT(Closed, _closedHandlers, winrt::Microsoft::Terminal::TerminalControl::ConnectionClosedEventArgs);
|
||||
|
||||
private:
|
||||
winrt::Windows::UI::Xaml::Controls::Grid _root{};
|
||||
winrt::Windows::UI::Xaml::Controls::Grid _separatorRoot{ nullptr };
|
||||
winrt::Microsoft::Terminal::TerminalControl::TermControl _control{ nullptr };
|
||||
// winrt::Microsoft::Terminal::TerminalControl::TermControl _control{ nullptr };
|
||||
winrt::TerminalApp::IControlHost _control{ nullptr };
|
||||
|
||||
std::shared_ptr<Pane> _firstChild{ nullptr };
|
||||
std::shared_ptr<Pane> _secondChild{ nullptr };
|
||||
|
@ -77,7 +81,8 @@ private:
|
|||
bool _HasFocusedChild() const noexcept;
|
||||
void _SetupChildCloseHandlers();
|
||||
|
||||
void _Split(SplitState splitType, const GUID& profile, const winrt::Microsoft::Terminal::TerminalControl::TermControl& control);
|
||||
// void _Split(SplitState splitType, const GUID& profile, const winrt::Microsoft::Terminal::TerminalControl::TermControl& control);
|
||||
void _Split(SplitState splitType, const GUID& profile, const winrt::TerminalApp::IControlHost& control);
|
||||
void _CreateRowColDefinitions(const winrt::Windows::Foundation::Size& rootSize);
|
||||
void _CreateSplitContent();
|
||||
void _ApplySplitDefinitions();
|
||||
|
@ -89,6 +94,7 @@ private:
|
|||
|
||||
void _FocusFirstChild();
|
||||
void _ControlClosedHandler();
|
||||
void _ControlClosedHandler2(const winrt::Windows::Foundation::IInspectable& sender, const winrt::TerminalApp::ClosedEventArgs& args);
|
||||
|
||||
std::pair<float, float> _GetPaneSizes(const float& fullSize);
|
||||
|
||||
|
|
|
@ -8,10 +8,11 @@ using namespace winrt::Windows::UI::Xaml;
|
|||
using namespace winrt::Windows::UI::Core;
|
||||
using namespace winrt::Microsoft::Terminal::Settings;
|
||||
using namespace winrt::Microsoft::Terminal::TerminalControl;
|
||||
using namespace winrt::TerminalApp;
|
||||
|
||||
static const int TabViewFontSize = 12;
|
||||
|
||||
Tab::Tab(const GUID& profile, const TermControl& control)
|
||||
Tab::Tab(const GUID& profile, const IControlHost& control)
|
||||
{
|
||||
_rootPane = std::make_shared<Pane>(profile, control, true);
|
||||
|
||||
|
@ -195,7 +196,7 @@ void Tab::Scroll(const int delta)
|
|||
// - control: A TermControl to use in the new pane.
|
||||
// Return Value:
|
||||
// - <none>
|
||||
void Tab::AddVerticalSplit(const GUID& profile, TermControl& control)
|
||||
void Tab::AddVerticalSplit(const GUID& profile, const IControlHost& control)
|
||||
{
|
||||
_rootPane->SplitVertical(profile, control);
|
||||
}
|
||||
|
@ -208,7 +209,7 @@ void Tab::AddVerticalSplit(const GUID& profile, TermControl& control)
|
|||
// - control: A TermControl to use in the new pane.
|
||||
// Return Value:
|
||||
// - <none>
|
||||
void Tab::AddHorizontalSplit(const GUID& profile, TermControl& control)
|
||||
void Tab::AddHorizontalSplit(const GUID& profile, const IControlHost& control)
|
||||
{
|
||||
_rootPane->SplitHorizontal(profile, control);
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
class Tab
|
||||
{
|
||||
public:
|
||||
Tab(const GUID& profile, const winrt::Microsoft::Terminal::TerminalControl::TermControl& control);
|
||||
Tab(const GUID& profile, const winrt::TerminalApp::IControlHost& control);
|
||||
|
||||
winrt::Microsoft::UI::Xaml::Controls::TabViewItem GetTabViewItem();
|
||||
winrt::Windows::UI::Xaml::UIElement GetRootElement();
|
||||
|
@ -19,8 +19,8 @@ public:
|
|||
void SetFocused(const bool focused);
|
||||
|
||||
void Scroll(const int delta);
|
||||
void AddVerticalSplit(const GUID& profile, winrt::Microsoft::Terminal::TerminalControl::TermControl& control);
|
||||
void AddHorizontalSplit(const GUID& profile, winrt::Microsoft::Terminal::TerminalControl::TermControl& control);
|
||||
void AddVerticalSplit(const GUID& profile, const winrt::TerminalApp::IControlHost& control);
|
||||
void AddHorizontalSplit(const GUID& profile, const winrt::TerminalApp::IControlHost& control);
|
||||
|
||||
void UpdateFocus();
|
||||
void ResizeContent(const winrt::Windows::Foundation::Size& newSize);
|
||||
|
|
40
src/cascadia/TerminalApp/TermControlHost.cpp
Normal file
40
src/cascadia/TerminalApp/TermControlHost.cpp
Normal file
|
@ -0,0 +1,40 @@
|
|||
#include "pch.h"
|
||||
#include "TermControlHost.h"
|
||||
#include "TermControlHost.g.cpp"
|
||||
|
||||
namespace winrt::TerminalApp::implementation
|
||||
{
|
||||
TermControlHost::TermControlHost(Microsoft::Terminal::TerminalControl::TermControl control) :
|
||||
_control{ control }
|
||||
{
|
||||
// TODO: Hookup the control's titlechanged event, closed event
|
||||
}
|
||||
|
||||
Windows::UI::Xaml::Controls::Control TermControlHost::GetControl()
|
||||
{
|
||||
return _control.GetControl();
|
||||
}
|
||||
|
||||
void TermControlHost::Close()
|
||||
{
|
||||
_control.Close();
|
||||
}
|
||||
|
||||
hstring TermControlHost::GetTitle()
|
||||
{
|
||||
return _control.Title();
|
||||
}
|
||||
|
||||
Microsoft::Terminal::TerminalControl::TermControl TermControlHost::Terminal()
|
||||
{
|
||||
return _control;
|
||||
}
|
||||
|
||||
winrt::Windows::Foundation::Size TermControlHost::MinimumSize() const
|
||||
{
|
||||
return _control.MinimumSize();
|
||||
}
|
||||
|
||||
DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(TermControlHost, CloseRequested, _closeRequestedHandlers, TerminalApp::IControlHost, TerminalApp::ClosedEventArgs);
|
||||
DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(TermControlHost, TitleChanged, _titleChangedHandlers, TerminalApp::IControlHost, Microsoft::Terminal::TerminalControl::TitleChangedEventArgs);
|
||||
}
|
31
src/cascadia/TerminalApp/TermControlHost.h
Normal file
31
src/cascadia/TerminalApp/TermControlHost.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
#pragma once
|
||||
#include "TermControlHost.g.h"
|
||||
#include "../../cascadia/inc/cppwinrt_utils.h"
|
||||
#include <winrt/Microsoft.Terminal.TerminalControl.h>
|
||||
|
||||
namespace winrt::TerminalApp::implementation
|
||||
{
|
||||
struct TermControlHost : TermControlHostT<TermControlHost>
|
||||
{
|
||||
TermControlHost(Microsoft::Terminal::TerminalControl::TermControl control);
|
||||
|
||||
Windows::UI::Xaml::Controls::Control GetControl();
|
||||
|
||||
void Close();
|
||||
hstring GetTitle();
|
||||
Microsoft::Terminal::TerminalControl::TermControl Terminal();
|
||||
Windows::Foundation::Size MinimumSize() const;
|
||||
|
||||
DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(CloseRequested, _closeRequestedHandlers, TerminalApp::IControlHost, TerminalApp::ClosedEventArgs);
|
||||
DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(TitleChanged, _titleChangedHandlers, TerminalApp::IControlHost, Microsoft::Terminal::TerminalControl::TitleChangedEventArgs);
|
||||
|
||||
private:
|
||||
Microsoft::Terminal::TerminalControl::TermControl _control{ nullptr };
|
||||
};
|
||||
}
|
||||
namespace winrt::TerminalApp::factory_implementation
|
||||
{
|
||||
struct TermControlHost : TermControlHostT<TermControlHost, implementation::TermControlHost>
|
||||
{
|
||||
};
|
||||
}
|
18
src/cascadia/TerminalApp/TermControlHost.idl
Normal file
18
src/cascadia/TerminalApp/TermControlHost.idl
Normal file
|
@ -0,0 +1,18 @@
|
|||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
// Even though this is in the same directory, we're building from a child
|
||||
// directory, so the midl compiler gets confused. TODO: This shouldn't need the
|
||||
// "../". Maybe there's a build rule we can add (gross) or we can just live with
|
||||
// it.
|
||||
import "../IControlHost.idl";
|
||||
|
||||
namespace TerminalApp
|
||||
{
|
||||
[default_interface] runtimeclass TermControlHost : IControlHost
|
||||
{
|
||||
TermControlHost(Microsoft.Terminal.TerminalControl.TermControl control);
|
||||
Microsoft.Terminal.TerminalControl.TermControl Terminal { get; };
|
||||
};
|
||||
|
||||
}
|
41
src/cascadia/TerminalApp/TextBlockControlHost.cpp
Normal file
41
src/cascadia/TerminalApp/TextBlockControlHost.cpp
Normal file
|
@ -0,0 +1,41 @@
|
|||
#include "pch.h"
|
||||
#include "TextBlockControlHost.h"
|
||||
#include "TextBlockControlHost.g.cpp"
|
||||
|
||||
using namespace winrt::Windows::UI::Xaml;
|
||||
using namespace winrt::Windows::UI::Core;
|
||||
|
||||
namespace winrt::TerminalApp::implementation
|
||||
{
|
||||
TextBlockControlHost::TextBlockControlHost() :
|
||||
_textBox{}
|
||||
{
|
||||
_textBox.HorizontalAlignment(HorizontalAlignment::Stretch);
|
||||
_textBox.VerticalAlignment(VerticalAlignment::Stretch);
|
||||
|
||||
// _textBox.IsEnabled(true);
|
||||
// _textBox.Text(L"I am a TextBox");
|
||||
}
|
||||
|
||||
Windows::UI::Xaml::Controls::Control TextBlockControlHost::GetControl()
|
||||
{
|
||||
return _textBox;
|
||||
}
|
||||
void TextBlockControlHost::Close()
|
||||
{
|
||||
throw hresult_not_implemented();
|
||||
}
|
||||
|
||||
hstring TextBlockControlHost::GetTitle()
|
||||
{
|
||||
return L"foo";
|
||||
}
|
||||
|
||||
winrt::Windows::Foundation::Size TextBlockControlHost::MinimumSize() const
|
||||
{
|
||||
return { 32, 32 };
|
||||
}
|
||||
|
||||
DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(TextBlockControlHost, CloseRequested, _closeRequestedHandlers, TerminalApp::IControlHost, TerminalApp::ClosedEventArgs);
|
||||
DEFINE_EVENT_WITH_TYPED_EVENT_HANDLER(TextBlockControlHost, TitleChanged, _titleChangedHandlers, TerminalApp::IControlHost, Microsoft::Terminal::TerminalControl::TitleChangedEventArgs);
|
||||
}
|
28
src/cascadia/TerminalApp/TextBlockControlHost.h
Normal file
28
src/cascadia/TerminalApp/TextBlockControlHost.h
Normal file
|
@ -0,0 +1,28 @@
|
|||
#pragma once
|
||||
#include "TextBlockControlHost.g.h"
|
||||
#include "../../cascadia/inc/cppwinrt_utils.h"
|
||||
|
||||
namespace winrt::TerminalApp::implementation
|
||||
{
|
||||
struct TextBlockControlHost : TextBlockControlHostT<TextBlockControlHost>
|
||||
{
|
||||
TextBlockControlHost();
|
||||
|
||||
Windows::UI::Xaml::Controls::Control GetControl();
|
||||
void Close();
|
||||
hstring GetTitle();
|
||||
Windows::Foundation::Size MinimumSize() const;
|
||||
|
||||
DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(CloseRequested, _closeRequestedHandlers, TerminalApp::IControlHost, TerminalApp::ClosedEventArgs);
|
||||
DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(TitleChanged, _titleChangedHandlers, TerminalApp::IControlHost, Microsoft::Terminal::TerminalControl::TitleChangedEventArgs);
|
||||
|
||||
private:
|
||||
winrt::Windows::UI::Xaml::Controls::RichEditBox _textBox{ nullptr };
|
||||
};
|
||||
}
|
||||
namespace winrt::TerminalApp::factory_implementation
|
||||
{
|
||||
struct TextBlockControlHost : TextBlockControlHostT<TextBlockControlHost, implementation::TextBlockControlHost>
|
||||
{
|
||||
};
|
||||
}
|
17
src/cascadia/TerminalApp/TextBlockControlHost.idl
Normal file
17
src/cascadia/TerminalApp/TextBlockControlHost.idl
Normal file
|
@ -0,0 +1,17 @@
|
|||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
// Even though this is in the same directory, we're building from a child
|
||||
// directory, so the midl compiler gets confused. TODO: This shouldn't need the
|
||||
// "../". Maybe there's a build rule we can add (gross) or we can just live with
|
||||
// it.
|
||||
import "../IControlHost.idl";
|
||||
|
||||
namespace TerminalApp
|
||||
{
|
||||
[default_interface] runtimeclass TextBlockControlHost : IControlHost
|
||||
{
|
||||
TextBlockControlHost();
|
||||
};
|
||||
|
||||
}
|
|
@ -57,10 +57,18 @@
|
|||
<ClInclude Include="../KeyChordSerialization.h" />
|
||||
<ClInclude Include="../Utils.h" />
|
||||
<ClInclude Include="pch.h" />
|
||||
<ClInclude Include="../AppKeyBindings.h" />
|
||||
<ClInclude Include="../AppKeyBindings.h" >
|
||||
<DependentUpon>../AppKeyBindings.idl</DependentUpon>
|
||||
</ClInclude>
|
||||
<ClInclude Include="../App.h" >
|
||||
<DependentUpon>../App.xaml</DependentUpon>
|
||||
</ClInclude>
|
||||
<ClInclude Include="../TermControlHost.h" >
|
||||
<DependentUpon>../TermControlHost.idl</DependentUpon>
|
||||
</ClInclude>
|
||||
<ClInclude Include="../TextBlockControlHost.h" >
|
||||
<DependentUpon>../TextBlockControlHost.idl</DependentUpon>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
|
||||
<!-- ========================= Cpp Files ======================== -->
|
||||
|
@ -91,6 +99,12 @@
|
|||
<ClCompile Include="../App.cpp" >
|
||||
<DependentUpon>../App.xaml</DependentUpon>
|
||||
</ClCompile>
|
||||
<ClCompile Include="../TermControlHost.cpp" >
|
||||
<DependentUpon>../TermControlHost.idl</DependentUpon>
|
||||
</ClCompile>
|
||||
<ClCompile Include="../TextBlockControlHost.cpp" >
|
||||
<DependentUpon>../TextBlockControlHost.idl</DependentUpon>
|
||||
</ClCompile>
|
||||
|
||||
<!-- You _NEED_ to include this file and the jsoncpp IncludePath (below) if
|
||||
you want to use jsoncpp -->
|
||||
|
@ -116,6 +130,9 @@
|
|||
<DependentUpon>../TerminalPage.xaml</DependentUpon>
|
||||
<SubType>Code</SubType>
|
||||
</Midl>
|
||||
<Midl Include="../IControlHost.idl" />
|
||||
<Midl Include="../TermControlHost.idl" />
|
||||
<Midl Include="../TextBlockControlHost.idl" />
|
||||
</ItemGroup>
|
||||
|
||||
<!-- ========================= Misc Files ======================== -->
|
||||
|
|
Loading…
Reference in a new issue