Skip to content

Commit

Permalink
Finish detaching it from the popup
Browse files Browse the repository at this point in the history
  • Loading branch information
zadjii-msft committed Mar 1, 2023
1 parent 57a5327 commit a172f53
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 114 deletions.
33 changes: 17 additions & 16 deletions src/cascadia/TerminalApp/SuggestionsControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1047,7 +1047,7 @@ namespace winrt::TerminalApp::implementation
}
}

void SuggestionsControl::Direction(TerminalApp::SuggestionsDirection direction)
void SuggestionsControl::_setDirection(TerminalApp::SuggestionsDirection direction)
{
_direction = direction;
if (_direction == TerminalApp::SuggestionsDirection::TopDown)
Expand All @@ -1061,14 +1061,20 @@ namespace winrt::TerminalApp::implementation
}

void SuggestionsControl::Anchor(Windows::Foundation::Point anchor,
Windows::Foundation::Size space)
Windows::Foundation::Size space,
float characterHeight)
{
_anchor = anchor;
_space = space;

// TODO! do some clamping

const til::size actualSize{ til::math::rounding, ActualWidth(), ActualHeight() };
// Is there space in the window below the cursor to open the menu downwards?
const bool canOpenDownwards = (_anchor.Y + characterHeight + actualSize.height) < space.Height;
_setDirection(canOpenDownwards ? TerminalApp::SuggestionsDirection::TopDown :
TerminalApp::SuggestionsDirection::BottomUp);
// Set the anchor below by a character height
_anchor.Y += canOpenDownwards ? characterHeight : 0;

// First, position horizonally.
//
// We want to align the left edge of the text within the control to the
Expand All @@ -1080,25 +1086,20 @@ namespace winrt::TerminalApp::implementation
const auto maxX = gsl::narrow_cast<int>(space.Width - actualSize.width);
const auto clampedX = std::clamp(proposedX, 0, maxX);

// // Create a thickness for the new margins
// Create a thickness for the new margins
auto newMargin = Windows::UI::Xaml::ThicknessHelper::FromLengths(clampedX, 0, 0, 0);

// // SuggestionsPopup().HorizontalOffset(clampedX);

// // Now, position vertically.
// Now, position vertically.
if (_direction == TerminalApp::SuggestionsDirection::TopDown)
{
// // The control should open right below the cursor, with the list
// // extending below. This is easy, we can just use the cursor as the
// // origin (more or less)
// // SuggestionsPopup().VerticalOffset(realCursorPos.y + characterSize.Height);
// The control should open right below the cursor, with the list
// extending below. This is easy, we can just use the cursor as the
// origin (more or less)
newMargin.Top = (_anchor.Y);
}
else
{
// // Position at the cursor. The suggestions UI itself will maintian
// // its own offset such that it's always above its origin
// // SuggestionsPopup().VerticalOffset(realCursorPos.y);
// Position at the cursor. The suggestions UI itself will maintian
// its own offset such that it's always above its origin
newMargin.Top = (_anchor.Y - actualSize.height);
}
Margin(newMargin);
Expand Down
5 changes: 3 additions & 2 deletions src/cascadia/TerminalApp/SuggestionsControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,10 @@ namespace winrt::TerminalApp::implementation
void ScrollToBottom();

Windows::UI::Xaml::FrameworkElement SelectedItem();
void Direction(TerminalApp::SuggestionsDirection direction);

TerminalApp::SuggestionsMode Mode() const;
void Mode(TerminalApp::SuggestionsMode mode);
void Anchor(Windows::Foundation::Point anchor, Windows::Foundation::Size space);
void Anchor(Windows::Foundation::Point anchor, Windows::Foundation::Size space, float characterHeight);

WINRT_CALLBACK(PropertyChanged, Windows::UI::Xaml::Data::PropertyChangedEventHandler);
WINRT_OBSERVABLE_PROPERTY(winrt::hstring, NoMatchesText, _PropertyChangedHandlers);
Expand Down Expand Up @@ -104,6 +103,8 @@ namespace winrt::TerminalApp::implementation

void _switchToMode();

void _setDirection(TerminalApp::SuggestionsDirection direction);

std::wstring _getTrimmedInput();

Microsoft::Terminal::Settings::Model::IActionMapView _actionMap{ nullptr };
Expand Down
3 changes: 1 addition & 2 deletions src/cascadia/TerminalApp/SuggestionsControl.idl
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,7 @@ namespace TerminalApp
void SetActionMap(Microsoft.Terminal.Settings.Model.IActionMapView actionMap);
void SelectNextItem(Boolean moveDown);

void Direction(SuggestionsDirection direction);
void Anchor(Windows.Foundation.Point anchor, Windows.Foundation.Size space);
void Anchor(Windows.Foundation.Point anchor, Windows.Foundation.Size space, Single characterHeight);

event Windows.Foundation.TypedEventHandler<SuggestionsControl, Microsoft.Terminal.Settings.Model.Command> DispatchCommandRequested;
event Windows.Foundation.TypedEventHandler<Object, Microsoft.Terminal.Settings.Model.Command> PreviewAction;
Expand Down
81 changes: 4 additions & 77 deletions src/cascadia/TerminalApp/TerminalPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4510,7 +4510,6 @@ namespace winrt::TerminalApp::implementation
}
if (commandsCollection.Size() == 0)
{
// SuggestionsPopup().IsOpen(false);
SuggestionsUI().Visibility(Visibility::Collapsed);

co_return;
Expand All @@ -4530,91 +4529,19 @@ namespace winrt::TerminalApp::implementation
}
const auto& sxnUi{ SuggestionsUI() };

// A handy local to know how much space the suggestions UI might take up.
static const Windows::Foundation::Size maxSize{ 300, 300 };
sxnUi.Mode(mode);
sxnUi.SetCommands(commandsCollection);
sxnUi.Visibility(commandsCollection.Size() > 0 ? Visibility::Visible : Visibility::Collapsed);

const auto characterSize{ control.CharacterDimensions() };
// This is in control-relative space. We'll need to convert it to page-relative space.
const til::point cursorPos{ control.CursorPositionInDips() };
const auto controlTransform = control.TransformToVisual(this->Root());
const til::point controlOrigin{ til::math::rounding, controlTransform.TransformPoint(Windows::Foundation::Point{ 0, 0 }) };
const til::point realCursorPos = controlOrigin + cursorPos;
// const til::point anchor = realCursorPos + til::point{ 0, characterSize.Height };

const auto currentWindow = CoreWindow::GetForCurrentThread();
const auto currentWindowBounds = currentWindow.Bounds();
// Using CoreWindow::GetForCurrentThread().Bounds().{Width, Height}
// seemed like a dead end. Those were both just 1. I suspect that
// doesn't work for XAML Islands at all.
const til::point windowOrigin{ til::math::rounding, currentWindowBounds.X, currentWindowBounds.Y };
// Fortunately, we can just use the Actual{Width,Height} of ourselves.
const til::size windowDimensions{ til::math::rounding, ActualWidth(), ActualHeight() };

// Is there space in the window below the cursor to open the menu downwards?
// const bool canOpenDownwards = ((realCursorPos.y) + characterSize.Height + maxSize.Height) < windowDimensions.height;

// const auto direction = canOpenDownwards ? TerminalApp::SuggestionsDirection::TopDown :
// TerminalApp::SuggestionsDirection::BottomUp;
const til::size actualSuggestionsSizeBefore{ til::math::rounding, sxnUi.ActualWidth(), sxnUi.ActualHeight() };
actualSuggestionsSizeBefore;
// sxnUi.Direction(direction);
// sxnUi.Anchor(realCursorPos.to_winrt_point(), windowDimensions.to_winrt_size());
sxnUi.Mode(mode);

// SuggestionsPopup().IsOpen(true);
sxnUi.SetCommands(commandsCollection);
sxnUi.Visibility(commandsCollection.Size() > 0 ? Visibility::Visible : Visibility::Collapsed);
const til::size actualSuggestionsSizeAfter{ til::math::rounding, sxnUi.ActualWidth(), sxnUi.ActualHeight() };
actualSuggestionsSizeAfter;

const bool canOpenDownwards = ((realCursorPos.y) + characterSize.Height + actualSuggestionsSizeAfter.height) < windowDimensions.height;
const auto direction = canOpenDownwards ? TerminalApp::SuggestionsDirection::TopDown :
TerminalApp::SuggestionsDirection::BottomUp;
const auto anchor = realCursorPos + til::point{ til::math::rounding, 0.0f, canOpenDownwards ? characterSize.Height : 0 };
sxnUi.Anchor(anchor.to_winrt_point(), windowDimensions.to_winrt_size());
sxnUi.Direction(direction);

// // Position the suggestions UI relative to the actual term control.
// //
// // This needs to be done _after_ it is set to be visible. If not, then
// // the control won't have an Actual{Width, Height} yet.
// const til::size actualSuggestionsSize{ til::math::rounding,
// sxnUi.ActualWidth(),
// sxnUi.ActualHeight() };

// // First, position horizonally.
// //
// // We want to align the left edge of the text within the control to the
// // cursor position. We'll need to scoot a little to the left, to align
// // text with cursor
// const auto proposedX = realCursorPos.x - 40;
// // If the control is too wide to fit in the window, clamp it fit inside
// // the window.
// const auto maxX = gsl::narrow_cast<int>(windowDimensions.width - actualSuggestionsSize.width);
// const auto clampedX = std::clamp(proposedX, 0, maxX);

// // Create a thickness for the new margins
// auto newMargin = Windows::UI::Xaml::ThicknessHelper::FromLengths(clampedX, 0, 0, 0);

// // SuggestionsPopup().HorizontalOffset(clampedX);

// // Now, position vertically.
// if (direction == TerminalApp::SuggestionsDirection::TopDown)
// {
// // The control should open right below the cursor, with the list
// // extending below. This is easy, we can just use the cursor as the
// // origin (more or less)
// // SuggestionsPopup().VerticalOffset(realCursorPos.y + characterSize.Height);
// newMargin.Top = (realCursorPos.y + characterSize.Height);
// }
// else
// {
// // Position at the cursor. The suggestions UI itself will maintian
// // its own offset such that it's always above its origin
// // SuggestionsPopup().VerticalOffset(realCursorPos.y);
// newMargin.Top = (realCursorPos.y);
// }
// sxnUi.Margin(newMargin);
sxnUi.Anchor(realCursorPos.to_winrt_point(), windowDimensions.to_winrt_size(), characterSize.Height);
}

}
19 changes: 2 additions & 17 deletions src/cascadia/TerminalApp/TerminalPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,11 @@
ContentDialog a Row, I believe it's assigned Row 0 by default. So,
when the dialog gets opened, the dialog seemingly causes a giant
hole to appear in the body of the app.
Assigning all the dialogs to Row 2 (where the rest of the content
is) makes the "hole" appear in the same space as the rest of the
TabContent, fixing the issue.
Note that the actual content in a content dialog gets parented to
the PopupRoot, so it actually always appeared in the correct place, it's
just this weird hole that appeared in Row 0.
Expand Down Expand Up @@ -189,14 +189,6 @@
</TextBlock>
</ContentDialog>

<!--
TODO!
A lost comment from moons ago: Putting the SuggestionsUI in a Popup
creates all sorts of hacky weirdness. Notably, if it's in Palette
mode, and the user clicks on the text box to focus the Terminal
window, it'll seem as though it has, yet _not_ bring the Terminal to
the foreground.
-->
<local:CommandPalette x:Name="CommandPalette"
Grid.Row="2"
VerticalAlignment="Stretch"
Expand All @@ -209,13 +201,6 @@
VerticalAlignment="Top"
PreviewKeyDown="_KeyDownHandler"
Visibility="Collapsed" />
<!--<Popup x:Name="SuggestionsPopup"
HorizontalOffset="200"
IsOpen="False"
ShouldConstrainToRootBounds="False"
VerticalOffset="200">
</Popup>-->

<!--
A TeachingTip with IsLightDismissEnabled="True" will immediately
Expand Down

0 comments on commit a172f53

Please sign in to comment.