先日投稿した記事ですが、エディタでリンクを生成するたびに 右クリック
スクリプトアクション
を実行する手間がなかなかに面倒なので、キーボードショートカットを用意することにしました。
コマンドの定義
class FUnrealProtocolContentBrowserCommands final : public TCommands<FUnrealProtocolContentBrowserCommands>
{
public:
FUnrealProtocolContentBrowserCommands() :
TCommands( TEXT( "UnrealProtocolEditorCommands" ),
NSLOCTEXT( "Contexts", "FUnrealProtocolEditorModule", "Unreal Protocol Editor Plugin" ), FName(),
FAppStyle::GetAppStyleSetName() )
{
}
// TCommands<> interface
virtual void RegisterCommands() override
{
UI_COMMAND( CopyLink, "Copy Link", "copy custom protocol link.",
EUserInterfaceActionType::Button,
FInputChord( EModifierKey::Control | EModifierKey::Shift, EKeys::C ) );
}
public:
TSharedPtr<FUICommandInfo> CopyLink;
};
void FUnrealProtocolEdModule::StartModule()
{
FUnrealProtocolContentBrowserCommands::Register();
}
まずは TCommand
を継承したクラスを用意して、実行するコマンドを登録していきます。Ctrl
C
のように、同時入力の登録も可能です。ただし同時入力できるキーは Ctrl
Shift
Alt
Command
に限られます。
入力キーが既に登録済みだった場合?
FUICommandList で先に登録されたキー入力が優先されます。入力が効かないときは被らないように設定してみましょう。FUICommandList::ConditionalProcessCommandBindings
辺りを参照。
ショートカットのユーザー設定を変更する
エディタの環境設定
キーボードショートカット
で、コマンドごとに項目が追加されます。適当なキーで上書き可能。
膨大な量のショートカットが用意されていますが、UI_COMMAND
で渡す FriendlyName
(第二引数)の文字列のみがフィルタされるようで。カテゴリなどでは絞り込めないので注意。
コマンドの登録
キー入力をバインドしたら、実際の呼び出し箇所へ登録する必要があります。今回はコンテンツブラウザ上で実行するので、エディタの既存実装を拡張します。
自作の Slate などで登録する場合は FUICommandList::ProcessCommandBindings
を自身で呼ぶ必要がある。
void OnExtendContentBrowserCommands( TSharedRef<FUICommandList> CommandList, FOnContentBrowserGetSelection GetSelectionDelegate )
{
CommandList->MapAction( FUnrealProtocolContentBrowserCommands::Get().CopyLink,
FExecuteAction::CreateLambda( [] { //
UUnrealProtocol_AssetOpen::StaticClass()
->GetDefaultObject<UUnrealProtocol_AssetOpen>()
->CopyLink();
} ) );
}
void FUnrealProtocolEdModule::StartModule()
{
// ...
FContentBrowserModule& ContentBrowserModule =
FModuleManager::LoadModuleChecked<FContentBrowserModule>( TEXT( "ContentBrowser" ) );
DH_ContentBrowserCommandExtender =
ContentBrowserModule.GetAllContentBrowserCommandExtenders()
.Emplace_GetRef( FContentBrowserCommandExtender::CreateStatic( &OnExtendContentBrowserCommands ) )
.GetHandle();
}
これでショートカットが実行できるようになりました。
サンプルコード
Github に公開してます。