Photoshop Extensionの開発37 PhotoshopのイベントをCEPで管理する

Adobe一般, javascript, Photoshop

前回の記事ではJSXでのイベントに触れました。JSX上で設定した場合ぱっと見イベントの設定がわからないので思わぬ場面で動く場合もあります、というわけでここはExtensionパネルの出番です。イベントのオン、オフをパネル上で表示させればユーザー側にイベントの可否を視覚的に表示することが可能です。やはりhtmlとcssでインターフェイスを作れるのは強い。

CEPでのイベントですがDOMと同じようにイベントを追加してイベント発火時にコールバック関数が動く。そして何かしらの処理がPhotoshopに走るという具合なのですがイベントIDをjsxから取得したり固有のイベントオブジェクトを生成する必要があったり一筋縄ではいきません。以下サンプルコード。

見慣れないオブジェクトとメソッドがたくさん出てきました。dispatchEvent関数に一連のイベント追加のメソッドをまとめています。まずCSEventからイベントオブジェクトインスタンスを生成して各種プロパティーを代入します。event.type にはcom.adobe.PhotoshopRegisterEvent、event.scopeにはAPPLICATIONを代入。この辺は決まったstringを代入するだけですevent.appIdにはAdobeのアプリケーションのID、event.extensionIdにはExtensionのIDをこのあたりはcsInterfaceの各種メソッドから取得できます。但しここで問題なのはevent.dataにPhotoshopイベントのeventIDを代入しますがこれはjsxから出ないと取得できないのでcsInterfaceのevalScriptメソッドでJSXにアクセスして取得した後にパネル側にコールバックで受け取っています。このtypeID自体はcharIDToTypeIDメソッドでjsxから取得できるが引数で受け取るイベント名は前回の記事同様AdobeのPhotoshop script referenceを参照するなりscript event listener で探すなりするしかありません。ちなみにトリミングイベント(crop)の場合は以下のような番号が取得できます。

eventType
csInterfaceのdispatchEventメソッドの引数に生成したイベントを渡してイベントを設定。さらにここからコールバック関数をイベントに設定します。csInterfaceaddEventListenerメソッドでイベント発火時のイベントの処理を設定。第一引数にcom.adobe.PhotoshopJSONCallbackとextensionのIDを渡して第二引数にコールバック関数を渡せば発火時にコールバック関数が動きます。今回はイベント発火時にPhotoshopCallbackUnique関数が動いてcaution.jsxにアクセス。トリミングの度にアラートが鳴ります。ここはDOMのeventlistenerと同じなのでわかりやすい。eventを外したい場合はもちろんremoveEventListenerで全く同じ引数を渡せば何も起こらないようになります。イベント設定時と外した時にわかりやすいようにhtmlでON,OFFを表示させるとわかりやすい。デフォルト設定だとパネルを閉じた時に全てのイベントは消去されます。(persistence設定時はパネルを閉じた状態でイベントを保持させることが可能)jsxと違って思わぬ間に発火することもあまりないだろう。

サンプルのコードをgithubにあげています。

Beer 寄付してサイトを応援する。