Source: components/AppHelperComponent.js

import { BaseComponent } from './BaseComponent';
import { Grid } from '../objects/Grid';

const __ = {
	private: Symbol('private'),
}

/**
 * @class AppHelperComponent
 * The application helper component.
 * @memberof THING
 * @extends THING.BaseComponent
 * @public
 */
class AppHelperComponent extends BaseComponent {

	/**
	 * The application helper to show many useful information.
	 */
	constructor() {
		super();

		this[__.private] = {};
	}

	// #region BaseComponent Interface

	onAdd(object) {
		super.onAdd(object);
	}

	onRemove() {
		super.onRemove();
	}

	// #endregion

	/**
	 * @typedef {Object} AppDebuggerComponentEvents
	 * @property {Array<ObjectListenerInfo>} activatedEvents The activated events.
	 * @property {Array<ObjectListenerInfo>} pausedEvents The paused events.
	 * @private
	 */

	/**
	 * Get events.
	 * @type {AppDebuggerComponentEvents}
	 * @private
	 */
	get events() {
		let allEvents = this.object.eventManager.getAllEventListeners();

		let events = {
			activatedEvents: (function () {
				return allEvents.filter(event => {
					if (event.paused) {
						return false;
					}

					return true;
				});
			})(),
			pausedEvents: (function () {
				return allEvents.filter(event => {
					if (!event.paused) {
						return false;
					}

					return true;
				});
			})(),
		};

		return events;
	}

	/**
	 * @typedef {Object} AppDebuggerComponentObjects
	 * @property {Array<THING.BaseObject>} objects The objects.
	 * @property {Array<THING.BaseObject>} tickableObjects The tickable objects.
	 * @property {Array<THING.BaseObject>} resizableObjects The resizable objects.
	 * @property {Array<THING.BaseObject>} dirtyObjects The dirty objects.
	 * @private
	 */

	/**
	 * Get objects.
	 * @type {AppDebuggerComponentObjects}
	 * @private
	 */
	get objects() {
		let app = this.object;
		let objectManager = app.objectManager;

		let objects = [];
		objectManager.objects.forEach(object => {
			objects.push(object);
		});

		return {
			objects: objects,
			tickableObjects: objectManager.tickableObjects,
			resizableObjects: objectManager.resizableObjects,
			dirtyObjects: objectManager.dirtyObjects,
		};
	}

	/**
	 * Get Info.
	 * @type {Object}
	 * @private
	 */
	get info() {
		return {
			events: this.events,
			objects: this.objects
		};
	}

	/**
	 * Set grid helper.
	 * @type {Boolean | Object}
	 *  @example
	 * 	app.helper.grid = true;
	 * 	@example
	 * 	app.helper.grid = { width: 100, height: 100, density: 10}
	 * @public
	 */
	set grid(value) {
		let _private = this[__.private];

		if (value) {
			if (_private.grid) {
				let size = value === true ? { length: 60, width: 60, density: 1 } : value;
				if (!Object.keys(size).length) {
					size = { length: 60, width: 60, density: 1 };
				}

				if (size.length === _private.grid.length && size.width === _private.grid.width && size.density === _private.grid.density) {
					return;
				}
				else {
					_private.grid.destroy();
					_private.grid = null;
				}
			}

			if (value === true) {
				_private.grid = new Grid();
			}
			else {
				_private.grid = new Grid({ size: value });
			}
			_private.grid.queryable = false;
		}
		else {
			if (_private.grid) {
				_private.grid.destroy();
				_private.grid = null;
			}
		}
	}

}

export { AppHelperComponent }