UNPKG

ecspresso

Version:

A minimal Entity-Component-System library for typescript and javascript.

129 lines (128 loc) 4.95 kB
/** * Screen/State management for ECSpresso ECS framework */ import type EventBus from './event-bus'; import type { ScreenDefinition, ScreenResource, ScreenEvents, ScreenConfigurator, ScreenConfig, ScreenState } from './screen-types'; /** Structural interface covering only the AssetManager methods ScreenManager uses. */ interface ScreenManagerAssetDeps { isLoaded(key: string): boolean; loadAsset(key: string): Promise<unknown>; isGroupLoaded(group: string): boolean; loadAssetGroup(group: string): Promise<void>; } /** * Manages screen/state transitions for ECSpresso */ export default class ScreenManager<Screens extends Record<string, ScreenDefinition<any, any>> = Record<string, never>> { private readonly screens; private currentScreen; private screenStack; private eventBus; private assetManager; private ecs; /** * Set dependencies for screen transitions * @internal */ setDependencies(eventBus: EventBus<ScreenEvents<keyof Screens & string>>, assetManager: ScreenManagerAssetDeps | null, ecs: unknown): void; private requireEcs; /** * Register a screen definition */ register<K extends string, Config extends Record<string, unknown>, State extends Record<string, unknown>>(name: K, definition: ScreenDefinition<Config, State>): void; /** * Transition to a new screen, clearing the stack */ setScreen<K extends keyof Screens>(name: K, config: Screens[K] extends ScreenDefinition<infer C, any> ? C : never): Promise<void>; /** * Push a screen onto the stack (overlay) */ pushScreen<K extends keyof Screens>(name: K, config: Screens[K] extends ScreenDefinition<infer C, any> ? C : never): Promise<void>; /** * Pop the current screen and return to the previous one */ popScreen(): Promise<void>; /** * Exit a screen by name (internal helper) */ private exitScreen; /** * Verify required assets are loaded before screen transition */ private verifyRequiredAssets; /** * Get the current screen name */ getCurrentScreen(): keyof Screens | null; /** * Get the current screen config (immutable). * If `screen` is provided, asserts that the current screen matches. */ getConfig(screen?: keyof Screens): Readonly<ScreenConfig<Screens[keyof Screens]>>; /** * Get the current screen config or undefined. * If `screen` is provided, returns undefined when the current screen doesn't match. */ tryGetConfig(screen?: keyof Screens): Readonly<ScreenConfig<Screens[keyof Screens]>> | undefined; /** * Get the current screen state (mutable). * If `screen` is provided, asserts that the current screen matches. */ getState(screen?: keyof Screens): ScreenState<Screens[keyof Screens]>; /** * Get the current screen state or undefined. * If `screen` is provided, returns undefined when the current screen doesn't match. */ tryGetState(screen?: keyof Screens): ScreenState<Screens[keyof Screens]> | undefined; /** * Update the current screen state. * If `screen` is provided, asserts that the current screen matches. */ updateState(update: unknown, screen?: keyof Screens): void; /** * Get the screen stack depth */ getStackDepth(): number; /** * Check if current screen is an overlay */ isOverlay(): boolean; /** * Check if a screen is active (current or in stack) */ isActive(screenName: keyof Screens): boolean; /** * Check if a screen is the current screen */ isCurrent(screenName: keyof Screens): boolean; /** * Create the $screen resource object */ createResource(): ScreenResource<Screens>; /** * Get all registered screen names */ getScreenNames(): Array<keyof Screens>; /** * Check if a screen is registered */ hasScreen(name: keyof Screens): boolean; } /** * Implementation of ScreenConfigurator for builder pattern */ export declare class ScreenConfiguratorImpl<Screens extends Record<string, ScreenDefinition<any, any>>, W = unknown> implements ScreenConfigurator<Screens, W> { private readonly manager; constructor(manager: ScreenManager<Screens>); add<K extends string, Config extends Record<string, unknown>, State extends Record<string, unknown>>(name: K, definition: ScreenDefinition<Config, State, W>): ScreenConfigurator<Screens & Record<K, ScreenDefinition<Config, State, W>>, W>; /** * Get the underlying manager * @internal */ getManager(): ScreenManager<Screens>; } /** * Create a new ScreenConfigurator for builder pattern usage */ export declare function createScreenConfigurator<Screens extends Record<string, ScreenDefinition<any, any>> = Record<string, never>, W = unknown>(manager?: ScreenManager<Screens>): ScreenConfiguratorImpl<Screens, W>; export {};