株式会社antsのホームページへようこそ。

Apolloアプリケーションのウィンドウ位置について

0
Posted in Lab. By tanaka

 GIZMOでは、特に何もしなくてもガジェットをドラッグして移動できます。また、ガジェットの座標をGIZMO側で管理しているため、ガジェット起動時は前回終了した位置に表示されます。Apolloで同様のことを行うには明示的にスクリプトを書く必要があります。


 アプリケーション上でマウスダウンしたタイミングで、

    stage.window.startMove();

とすると、そのままドラッグ移動できます。stage.windowプロパティがアプリケーション毎のウィンドウにあたります。マウスを放せば勝手に移動が終わるので、stopMove()といったメソッドはありません。
 で、Apolloはアプリの位置を覚えていてくれないので、このままアプリケーションを終了すると次回またデフォルト位置で起動してしまいます。これはちょっとアプリっぽくないですね。そこで、現在のウィンドウ位置をファイルに書き出し、起動時にそれを参照して位置を変えるという処理で解決します。この話題は、Adobe Labsからダウンロードできるオライリー本にも載っていますので参考にしました。P.81の「Saving and Restoring the Size and Position ofaWindow」という項です。ここではサイズまで含めた議論になっています。
 簡単に手順を説明すると、
・ウィンドウの移動 or リサイズを監視するリスナーを設定。
・上記イベントが発生したら、マウスアップイベントのリスナーを設定。
・マウスアップイベントを受けてウィンドウのboundsプロパティをファイル書き出し。
 同時にマウスアップイベントのリスナーは解除。
・アプリ起動時はapplicationCompleteのタイミングで上記ファイルを読み込み、
 ウィンドウのboundsプロパティに再設定。
という感じです。
 ここでちょっと問題が…ファイル読み込み時に使うFileStream.readObject()の戻り値は*型で、それを設定したいNativeWindow.boundsはRectangle型。本の通りだとキャストできないと言って怒られます。どう解決するのがスマートでしょうか?誰か教えてください。とりあえずはreadObject()の戻り値からx、yなど中身を取り出して使ってます。
(追記)registerClassAlias()が抜けていました。正しくエイリアスを登録すれば自動的に元の型に戻りました。