お世話になっております。
タイトルに記載しております通り、以下2点についてお伺いさせていただきたいです。
①.フォーカス可能なウィジェット外をクリックした際にフォーカスを維持する対処、実装方法
②.アプリケーションウィンドウが非アクティブの際、入力によるナビゲーションを完全に無効化する方法
まず①についてですが、実現したいこととして「アプリケーションウィンドウ内の非UI(フォーカス可能でない部分)をクリックした場合でもフォーカスを維持し続ける」という内容があります。
こちらについて、現在私の環境では以下の実装を行うことで対処しております。
`void UFocusRetainButton::NativeOnMouseEnter(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent)
{
if(bHasFocused) { return; }
Super::NativeOnMouseEnter(InGeometry, InMouseEvent);
if(!IsValid(Button)) { return; }
if (const UWorld* World = GetWorld())
{
if (ULocalPlayer* LocalPlayer = World->GetFirstLocalPlayerFromController())
{
// EFocusCause::Navigationとしてパラメータを渡す
LocalPlayer->GetSlateOperations().SetUserFocus(Button->TakeWidget(), EFocusCause::Navigation);
}
}
}`
`void UFocusRetainButton::NativeOnRemovedFromFocusPath(const FFocusEvent& InFocusEvent)
{
if(!bHasFocused) { return; }
Super::NativeOnRemovedFromFocusPath(InFocusEvent);
if(!IsValid(Button)) { return; }
const EFocusCause Cause = InFocusEvent.GetCause();
const bool bIsRetainFocus = (bRetainFocus) && (Cause == EFocusCause::Mouse);
if (bIsRetainFocus)
{
// ボタン外をクリックした場合はキーボードフォーカスが失われないようにする
if (const UWorld* World = GetWorld())
{
if (ULocalPlayer* LocalPlayer = World->GetFirstLocalPlayerFromController())
{
LocalPlayer->GetSlateOperations().SetUserFocus(Button->TakeWidget(), EFocusCause::Navigation);
}
}
}
}`上記の実装につきまして、問題などありますでしょうか?
また、上記実装以外により良い対処方法がありましたらご教示いただけますと幸いです。
次に②についてですが、実現したいこととして「アプリケーションウィンドウを非アクティブ(ウィンドウ外をクリック)にした際、入力によるナビゲーションを完全に無効化にする」という内容があります。
こちら詳細をご説明させていただきますと、アプリケーションウィンドウが非アクティブの際、キーボード、マウスによる入力は受け付けないものの、パッドによるナビゲーション入力が生きたままとなってしまっているため、これを無効化したいです。
上記問題に対する対処方法がありましたらご教示いただけますと幸いです。
参考までに、本問題を再現したプロジェクトを添付させていただきます。
以上です。宜しくお願いいたします。