All files / src/builder screenBuilder.ts

100% Statements 22/22
100% Branches 5/5
100% Functions 5/5
100% Lines 22/22

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 67 68 69 70 71 72 73 7422x 22x             22x           117x                               7x 6x 6x   1x                 1x 1x   1x 1x   1x 1x       118x 116x   118x 116x   118x 118x               117x 117x      
import { ScreenConfigure, ScreenConfigureImpl } from './screenConfigure'
import { ScreenConfigSupplier } from '../value/screenConfig'
 
/**
 * 生放送環境 ({@link Screen}) を簡便に作るためのクラス.
 *
 * Screen は本クラスを用いて作成してください.
 */
export class ScreenBuilder extends ScreenConfigureImpl {
  private static lastUsedScene?: g.Scene
  private static defaultConfig?: ScreenConfigSupplier
  private static defaultConfigure?: ScreenConfigure
 
  constructor (scene: g.Scene) {
    super(false, scene, new ScreenConfigSupplier(ScreenBuilder.getDefaultConfig(scene).get()))
  }
 
  /**
   * 作成する Screen のライブラリ利用者が自由に使えるフィールドを取得します.
   */
  override vars (): unknown
 
  /**
   * 作成する Screen のライブラリ利用者が自由に使えるフィールドを設定します.
   *
   * @param vars ライブラリ利用者が自由に使えるフィールド
   */
  override vars (vars: unknown): ScreenBuilder
 
  override vars (args?: unknown): unknown | ScreenBuilder {
    if (arguments.length > 0) {
      super.vars(args)
      return this
    }
    return super.vars()
  }
 
  /**
   * 各属性値に値を設定しなかった際に使用されるデフォルト値を設定します.
   *
   * @param scene 現在の scene を指定してください.
   */
  static getDefault (scene: g.Scene): ScreenConfigure {
    if (ScreenBuilder.lastUsedScene !== scene) {
      ScreenBuilder.resetDefault()
    }
    if (!ScreenBuilder.defaultConfigure) {
      ScreenBuilder.defaultConfigure = new ScreenConfigureImpl(true, scene, ScreenBuilder.getDefaultConfig(scene))
    }
    ScreenBuilder.lastUsedScene = scene
    return ScreenBuilder.defaultConfigure
  }
 
  private static getDefaultConfig (scene: g.Scene): ScreenConfigSupplier {
    if (ScreenBuilder.lastUsedScene !== scene) {
      ScreenBuilder.resetDefault()
    }
    if (!ScreenBuilder.defaultConfig) {
      ScreenBuilder.defaultConfig = new ScreenConfigSupplier({ vars: undefined })
    }
    ScreenBuilder.lastUsedScene = scene
    return ScreenBuilder.defaultConfig
  }
 
  /**
   * {@link getDefault} で設定した変更を消去します.
   * @internal
   */
  private static resetDefault () {
    delete ScreenBuilder.defaultConfig
    delete ScreenBuilder.defaultConfigure
  }
}