お世話になっております。
Navigationを利用してボタンウィジェットなどのマウスクリック可能なウィジェットに対してゲームパッドで選択可能なウィジェットを作成しております。
そこでダイアログとなる別のウィジェットをビューポートに追加して表示するケースで、ダイアログを表示している間だけ奥にあるウィジェットに対してNavigationのフォーカスを受け付けないようにしたいと考えております。
<br/>
フォーカス関連の処理を調べたところ、ウィジェットのフォーカスの追加処理はSlateApplication.cppの2894行目にあるSWidget::SupportsKeyboardFocus()の返り値でフォーカス可能なウィジェットに対してフォーカス追加をしているのですが、SButton::SupportsKeyboardFocus()の返り値で使われてるbIsFocusableは外部からアクセスできないようになっているので、ランタイムで変更することができないので、一時的なフォーカス受付を実現することができませんでした。
<br/>
上記の問題の対処としてエンジン改造するかSButtonの派生クラスを用意して制御するか方法がありますが、それ以外の方法で一時的なフォーカス受付を無効にする手段をご存知でしたらご教授お願いします。
お世話になっております。
ご質問ありがとうございます。
念のための確認となりますが、こちらはあくまでも「一時的なフォーカス受付の禁止」(ダイアログが開いてからは、奥にあるウィジェットにゲームパッドの方向キーでカーソルを当てることはできない)であり、マウスやスクリーンタッチで直接ボタンにインタラクションを仕掛ける分には機能する・・・という要件理解で合っておりますでしょうか?
もしナビゲーションの無効化だけでなく、インタラクションも無効化して構わないのであれば、ウィジェットのVisibilityをNot Hit-Testableに設定することで「フォーカス不可」の状態を作ることが可能です。ただし、すでにフォーカスがあたっていた場合にフォーカスを追い出すことはしませんので、SetFocusなどで別のウィジェットにフォーカスを当て直すようケアが必要です。たとえば、ダイアログが開いたときにフォーカスを遷移させ、奥のウィジェットのVisibilityを変えてしまうというアプローチが考えられます。
簡易なサンプルを作成して添付しましたので、ご要件を満たせそうかどうか、ご確認いただけますと幸いです。PIEをスタートさせ5秒待つと(モーダルダイアログを想定した)Closeボタンが表示され、ほかのボタンにフォーカス・直接インタラクション不可となります。Closeボタンを押すと、ボタンが消え、ほかのボタンが再度ナビゲーション可能に戻ります。その5秒後に再度Closeボタンが表示されます。
以上、よろしくお願いいたします。
>こちらはあくまでも「一時的なフォーカス受付の禁止」(ダイアログが開いてからは、奥にあるウィジェットにゲームパッドの方向キーでカーソルを当てることはできない)であり、マウスやスクリーンタッチで直接ボタンにインタラクションを仕掛ける分には機能する・・・という要件理解で合っておりますでしょうか?
説明が不十分で申し訳ありませんでした。マウスなどのインタラクションの無効化も含めた意味でのフォーカス受付の禁止という意味でした。
サンプルプロジェクトを参考にフォーカスがあたるウィジェットに対して一時的にVisibilityを変更するアプローチを試みたところ、想定通りにフォーカス受付を無効にすることができました。
ご回答いただきありがとうございました。
ご確認ありがとうございます。
要件が無事解決したと聞き、安心いたしました。
それでは本件は回答済みとしてCloseさせていただきます。
以上、よろしくお願いいたします。