diff --git a/src/cascadia/TerminalApp/SuggestionsControl.cpp b/src/cascadia/TerminalApp/SuggestionsControl.cpp index 52860e492a4..f6d1499c841 100644 --- a/src/cascadia/TerminalApp/SuggestionsControl.cpp +++ b/src/cascadia/TerminalApp/SuggestionsControl.cpp @@ -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) @@ -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 @@ -1080,25 +1086,20 @@ namespace winrt::TerminalApp::implementation const auto maxX = gsl::narrow_cast(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); diff --git a/src/cascadia/TerminalApp/SuggestionsControl.h b/src/cascadia/TerminalApp/SuggestionsControl.h index 3f09754286c..72e98283213 100644 --- a/src/cascadia/TerminalApp/SuggestionsControl.h +++ b/src/cascadia/TerminalApp/SuggestionsControl.h @@ -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); @@ -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 }; diff --git a/src/cascadia/TerminalApp/SuggestionsControl.idl b/src/cascadia/TerminalApp/SuggestionsControl.idl index ccb55b5d058..efb6adf0aa4 100644 --- a/src/cascadia/TerminalApp/SuggestionsControl.idl +++ b/src/cascadia/TerminalApp/SuggestionsControl.idl @@ -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 DispatchCommandRequested; event Windows.Foundation.TypedEventHandler PreviewAction; diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 9eacb0c0275..cee6b5c22aa 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -4510,7 +4510,6 @@ namespace winrt::TerminalApp::implementation } if (commandsCollection.Size() == 0) { - // SuggestionsPopup().IsOpen(false); SuggestionsUI().Visibility(Visibility::Collapsed); co_return; @@ -4530,8 +4529,9 @@ 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. @@ -4539,82 +4539,9 @@ namespace winrt::TerminalApp::implementation 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(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); } } diff --git a/src/cascadia/TerminalApp/TerminalPage.xaml b/src/cascadia/TerminalApp/TerminalPage.xaml index ee0244ae624..da572d25e92 100644 --- a/src/cascadia/TerminalApp/TerminalPage.xaml +++ b/src/cascadia/TerminalApp/TerminalPage.xaml @@ -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. @@ -189,14 +189,6 @@ - -