Skip to content

Commit

Permalink
Finish detaching it from the popup
Browse files Browse the repository at this point in the history
(cherry picked from commit a172f53)
  • Loading branch information
zadjii-msft committed Mar 1, 2023
1 parent e544871 commit 173a830
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 106 deletions.
33 changes: 17 additions & 16 deletions src/cascadia/TerminalApp/SuggestionsControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1038,7 +1038,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 @@ -1052,14 +1052,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 @@ -1071,25 +1077,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);
}

}
11 changes: 2 additions & 9 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 @@ -201,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

1 comment on commit 173a830

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@check-spelling-bot Report

🔴 Please review

See the 📜action log for details.

Unrecognized words (4)

ecaa
horizonally
maintian
sxn

Previously acknowledged words that are now absent CLA cpprest demoable everytime Hirots inthread pplx reingest unmark websockets :arrow_right:
To accept ✔️ these unrecognized words as correct and remove the previously acknowledged and now absent words, run the following commands

... in a clone of the git@github.com:microsoft/terminal.git repository
on the dev/migrie/fhl-2023/pwsh-autocomplete-demo branch (ℹ️ how do I use this?):

curl -s -S -L 'https://raw.githubusercontent.com/check-spelling/check-spelling/v0.0.21/apply.pl' |
perl - 'https://github.com/microsoft/terminal/actions/runs/4304640847/attempts/1'
✏️ Contributor please read this

By default the command suggestion will generate a file named based on your commit. That's generally ok as long as you add the file to your commit. Someone can reorganize it later.

⚠️ The command is written for posix shells. If it doesn't work for you, you can manually add (one word per line) / remove items to expect.txt and the excludes.txt files.

If the listed items are:

  • ... misspelled, then please correct them instead of using the command.
  • ... names, please add them to .github/actions/spelling/allow/names.txt.
  • ... APIs, you can add them to a file in .github/actions/spelling/allow/.
  • ... just things you're using, please add them to an appropriate file in .github/actions/spelling/expect/.
  • ... tokens you only need in one place and shouldn't generally be used, you can add an item in an appropriate file in .github/actions/spelling/patterns/.

See the README.md in each directory for more information.

🔬 You can test your commits without appending to a PR by creating a new branch with that extra change and pushing it to your fork. The check-spelling action will run in response to your push -- it doesn't require an open pull request. By using such a branch, you can limit the number of typos your peers see you make. 😉

If the flagged items are 🤯 false positives

If items relate to a ...

  • binary file (or some other file you wouldn't want to check at all).

    Please add a file path to the excludes.txt file matching the containing file.

    File paths are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your files.

    ^ refers to the file's path from the root of the repository, so ^README\.md$ would exclude README.md (on whichever branch you're using).

  • well-formed pattern.

    If you can write a pattern that would match it,
    try adding it to the patterns.txt file.

    Patterns are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your lines.

    Note that patterns can't match multiline strings.

Please sign in to comment.