LoginSignup
2
0

エディタコマンドをキーボードショートカットに登録する

Last updated at Posted at 2024-02-15

image.png

先日投稿した記事ですが、エディタでリンクを生成するたびに 右クリック スクリプトアクション を実行する手間がなかなかに面倒なので、キーボードショートカットを用意することにしました。

コマンドの定義

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 辺りを参照。

ショートカットのユーザー設定を変更する

image.png
エディタの環境設定 キーボードショートカット で、コマンドごとに項目が追加されます。適当なキーで上書き可能。

膨大な量のショートカットが用意されていますが、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 に公開してます。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0