WoT の GUI 基本要素である View の作成についての解説その2です。 今回はウィンドウを閉じる処理について解説します。

概要

前回 で作成したウィンドウはクローズアイコンをクリックしてもウィンドウが閉じませんでした。 今回はウィンドウを閉じる処理について解説します。

ウィンドウを閉じる処理の追加

前回定義した中身が空のクラス MyView に、 下記のような onTryClosing と onWindowClose メソッドを追加します。 これらは AS3 側から呼び出されるメソッドなので正確にこの名称でなければなりません。

また、onTryClosing は True を返すようにし、 onWindowClose では MyView のメソッド destroy を内部で実行するようにします。

class MyView(View):

    def onTryClosing(self):
        return True

    def onWindowClose(self):
        self.destroy()

このように定義した MyView であればウィンドウのクローズアイコンをクリクすることでウィンドウを閉じることができるようになります。

クローズアイコンを押したときの処理の流れ

ウィンドウのクローズアイコンをクリックすると、 Python 側の View の onTryClosing が呼び出されます。

onTryClosing は Boolean を返すことが想定されており、 ここで True を返すとクローズ処理を続行し、 Flase を返すとクローズ処理をキャンセルしたものとして扱われます。

クローズ処理が続行する場合、 Python 側の onWindowClose を呼び出します。 そこで View のメソッド destroy を実行することにより、 実際のウィンドウを閉じる処理が行われます。

AS3 側処理の詳細

AS3 側では onTryClosing はクラス WindowViewMeta で、 onWindowClose はクラス WrapperViewMeta で定義されています。 いずれも AbstractWindowView のスーパークラスで、 ライブラリ gui_base-1.0-SNAPSHOT.swc に含まれています。

WindowViewMeta での onTryClosing に関連する箇所は以下のようなコードになっています。

package net.wg.infrastructure.base.meta.impl
{
    ...
    public class WindowViewMeta extends AbstractWrapperView
    {
        ...
        public var onTryClosing:Function;
        ...
        public function onTryClosingS() : Boolean
        {
            App.utils.asserter.assertNotNull(this.onTryClosing, "onTryClosing" + Errors.CANT_NULL);
            return this.onTryClosing();
        }
        ...
    }
}

ここで onTryClosing は外部関数で、Python 側の View に同名のメソッドがあればそれが呼び出されます。 onTryClosingS は onTryClosing に対するラッパー関数です。 onTryClosingS の帰り値の型は Boolean になっており、 onTryClosing も Boolean を返すことが期待されていることがわかります。

クローズアイコンを押したときのイベント処理は AbstractWindowView で行われています。 実際の処理は以下のようになっており、 ラッパー関数 onTryClosingS, onWindowCloseS が呼ばれていることが確認できます。

package net.wg.infrastructure.base
{
    ...
    public class AbstractWindowView extends WindowViewMeta implements IAbstractWindowView
    {
    ...
        override public function handleInput(param1:InputEvent) : void
        {
            ...
                if (onTryClosingS()) {
                    this.onClosingApproved();
                    onWindowCloseS();
                } else {
                    this.onClosingDeclined();
                }
            ...
        }
    ...
    }
}