# All files / scripts/CDP/UI/listview StatusManager.ts

32.26% Statements 10/31
16.67% Branches 2/12
33.33% Functions 3/9
28.57% Lines 8/28

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    671x

    1x

    1x

    1x

    1x

    1x

    1x

    1x

     ﻿namespace CDP.UI {

        const TAG = "[CDP.UI.StatusManager] ";

        /**
         * @class StatusManager
         * @brief UI 用状態管理クラス
         *        StatusManager のインスタンスごとに任意の状態管理ができる
         *
         */
        export class StatusManager implements IStatusManager {

            private _status: any = {};    //!< statusScope() に使用される状態管理オブジェクト

            ///////////////////////////////////////////////////////////////////////
            // Implements: IStatusManager

            //! 状態変数の参照カウントのインクリメント
            public statusAddRef(status: string): number {
                if (!this._status[status]) {
                    this._status[status] = 1;
                } else {
                    this._status[status]++;
                }
                return this._status[status];
            }

            //! 状態変数の参照カウントのデクリメント
            public statusRelease(status: string): number {
                let retval: number;
                if (!this._status[status]) {
                    retval = 0;
                } else {
                    this._status[status]--;
                    retval = this._status[status];
                    if (0 === retval) {
                        delete this._status[status];
                    }
                }
                return retval;
            }

            //! 処理スコープ毎に状態変数を設定
            public statusScope(status: string, callback: () => void | Promise<any>): void {
                this.statusAddRef(status);
                const promise = callback();
                if (!promise) {
                    this.statusRelease(status);
                } else {
                    promise.then(
                        () => {
                            this.statusRelease(status);
                        },
                        () => {
                            this.statusRelease(status);
                        }
                    );
                }
            }

            //! 指定した状態中であるか確認
            public isStatusIn(status: string): boolean {
                return !!this._status[status];
            }
        }
    }