Photoshop UXP 2022 executeAsModal
ついにリリースされましたPhotoshop2022。巷では草を生やす機能がもっぱら人気ですが今回は草を生
やさずにUXPを触ってみました。今回大幅にアップデートされてるので2021と大きく変わった仕様もあるという事で簡単に触れます。
PhotoshopCore module
今回新しく追加されたモジュールです。Photoshopのアプリケーションにアクセスするためのモジュールで今後かなり重要になると思います。Photoshop2021まではどこからでもアプリケーションにアクセスできましたが今後アプリケーション側の処理はPhotoshop coreモジュールのexecuteAsModalメソッド内に書いていく事になります。
executeAsModal
executeAsModal内にPhotoshopの処理を書くことでPhotoshopにアクセスできます具体的には以下の通りです。
executeAsModal外でPhotoshop関係のメソッドを呼び出すと以下のように怒られます。
これを知らないと入り口からはまるでしょう。既存のUXPプラグインを配布している方も最新バージョン向けにコードをある程度修正する必要もあるでしょう。CEPのようにmanifestのバージョンのみ直して終わり、というわけにはいかなそうです。
ただしこのexecuteAsModal内にPhotoshop関係のメソッドを呼び出すことでプログレスバーの呼び出し、キャンセルボタンをUXPのシステムがデフォルトで実装してくれます。
このダイアログの状態ですがcallback関数の引数から受け取ります。
詳しくは公式ドキュメントに書いてありますが大まかに説明すると、キャンセルの状態の取得、プログレスバーの状態もしくは更新、ダイアログのタイトル、ヒストリーの状態です。
ダイアログのタイトルはcallback関数実行前に渡すことも可能で。上のコード上ではcommandNameプロパティーの”My Script Command”をexecuteAsModalメソッドの第二引数に渡しています。
Photoshop側の処理が実行されている途中に状態を変更する場合はexecutionControlオブジェクトのreportProgressメソッドを呼び出します。
commandNameがダイアログのタイトル、valueがプログレスバーの値、0~1の間の数値を渡します。簡単いダイアログの実装が可能ですね。
またユーザーによりキャンセルが押された時の状態も確認できます。
executionControl.isCancelledよりキャンセル状態かどうかbooleanが取得できます。trueだったらキャンセル済、falseだったらボタンが押されていない状態。上のコードではloop処理の中でキャンセルボタンが押されるとErrorオブジェクトを返してloopを抜けるようになっています。
その他hisotryの状態も管理できます。例えば一連のscriptによる処理を一つのhisotryにまとめたい場合などです。executionControlのhostControlオブジェクトのメソッドより操作します。
hisotryの進行を止める前にdocumentのidを取得しています。そしてsuspendHistoryメソッドが実行されて以降hisotryの更新が止まります。メソッド実行時にdocumentのidをhistoryに登録する名前をオブジェクトとして引数に渡すのも忘れないでください。最後にhistoryの更新を再開する時にresumeHistoryメソッドを呼び出します。引数には事前にsuspendHistorメソッドより返ってきたsuspend idを渡しています。
ご覧のようにレイヤーを複数作成する一連の流れがcreate my layerとして一つにhistoryに登録されresumeHistoryメソッドが実行された後のレイヤーを複製するメソッドのみ通常通りに別個のhistoryとして登録されました。
以上簡単なexecuteAsModalメソッドの説明でした。より深く触るには公式のドキュメントを見るといいでしょう。またこのアップデートの流れを見る限り配布するUXPプラグインの更新がアプリケーションの更新の度に今後大変なりそうな予感。