phaser/src/data/DataManager.js

434 lines
9.4 KiB
JavaScript
Raw Normal View History

2018-02-12 16:01:20 +00:00
/**
* @author Richard Davey <rich@photonstorm.com>
* @copyright 2018 Photon Storm Ltd.
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
*/
var Class = require('../utils/Class');
2018-03-19 21:43:48 +00:00
/**
* @callback DataEachCallback
*
2018-03-20 16:15:49 +00:00
* @param {*} parent - [description]
2018-03-19 21:43:48 +00:00
* @param {string} key - [description]
2018-03-20 16:15:49 +00:00
* @param {*} value - [description]
2018-03-19 21:43:48 +00:00
* @param {...*} [arguments] - Additional arguments that will be passed to the callback, after the game object, key, and data.
*/
2016-12-07 01:40:56 +00:00
/**
2018-02-12 22:16:18 +00:00
* @classdesc
* The Data Component features a means to store pieces of data specific to a Game Object, System or Plugin.
* You can then search, query it, and retrieve the data. The parent must either extend EventEmitter,
* or have a property called `events` that is an instance of it.
*
* @class DataManager
* @memberOf Phaser.Data
* @constructor
* @since 3.0.0
*
2018-03-20 16:15:49 +00:00
* @param {*} parent - [description]
2018-03-19 15:37:01 +00:00
* @param {EventEmitter} eventEmitter - [description]
2018-02-12 22:16:18 +00:00
*/
var DataManager = new Class({
2016-12-07 01:40:56 +00:00
initialize:
2017-01-30 00:00:45 +00:00
function DataManager (parent, eventEmitter)
{
2018-02-12 22:16:18 +00:00
/**
* [description]
*
* @name Phaser.Data.DataManager#parent
2018-03-20 16:15:49 +00:00
* @type {*}
2018-02-12 22:16:18 +00:00
* @since 3.0.0
*/
this.parent = parent;
2016-12-07 01:40:56 +00:00
2018-02-12 22:16:18 +00:00
/**
* [description]
*
* @name Phaser.Data.DataManager#events
2018-02-13 00:40:51 +00:00
* @type {EventEmitter}
2018-02-12 22:16:18 +00:00
* @since 3.0.0
*/
this.events = eventEmitter;
if (!eventEmitter)
{
this.events = (parent.events) ? parent.events : parent;
}
2016-12-07 01:40:56 +00:00
2018-02-12 22:16:18 +00:00
/**
* [description]
*
* @name Phaser.Data.DataManager#list
* @type {Object.<string, *>}
2018-02-12 22:16:18 +00:00
* @default {}
* @since 3.0.0
*/
this.list = {};
2016-12-07 01:40:56 +00:00
2018-02-12 22:16:18 +00:00
/**
* [description]
*
* @name Phaser.Data.DataManager#blockSet
* @type {boolean}
* @default false
* @since 3.0.0
*/
this.blockSet = false;
2016-12-07 01:40:56 +00:00
2018-02-12 22:16:18 +00:00
/**
* [description]
*
* @name Phaser.Data.DataManager#_frozen
* @type {boolean}
* @private
* @default false
* @since 3.0.0
*/
this._frozen = false;
this.events.once('destroy', this.destroy, this);
},
2016-12-07 01:40:56 +00:00
2018-02-12 22:16:18 +00:00
/**
* Retrieves the value for the given key, or undefined if it doesn't exist.
*
* @method Phaser.Data.DataManager#get
* @since 3.0.0
*
* @param {string} key - [description]
*
2018-03-20 16:15:49 +00:00
* @return {*} [description]
2018-02-12 22:16:18 +00:00
*/
2016-12-07 01:40:56 +00:00
get: function (key)
{
return this.list[key];
},
2018-02-12 22:16:18 +00:00
/**
* [description]
*
* @method Phaser.Data.DataManager#getAll
* @since 3.0.0
*
* @return {Object.<string, *>} [description]
2018-02-12 22:16:18 +00:00
*/
2016-12-07 01:40:56 +00:00
getAll: function ()
{
var results = {};
for (var key in this.list)
{
2018-03-19 18:03:00 +00:00
if(this.list.hasOwnProperty(key))
{
results[key] = this.list[key];
}
2016-12-07 01:40:56 +00:00
}
return results;
},
2018-02-12 22:16:18 +00:00
/**
* [description]
*
* @method Phaser.Data.DataManager#query
* @since 3.0.0
*
* @param {string} search - [description]
*
* @return {Object.<string, *>} [description]
2018-02-12 22:16:18 +00:00
*/
2016-12-07 01:40:56 +00:00
query: function (search)
{
var results = {};
for (var key in this.list)
{
2018-03-19 15:37:01 +00:00
if (this.list.hasOwnProperty(key) && key.match(search))
2016-12-07 01:40:56 +00:00
{
results[key] = this.list[key];
}
}
return results;
},
2018-02-12 22:16:18 +00:00
/**
* [description]
*
* @method Phaser.Data.DataManager#set
* @since 3.0.0
*
* @param {string} key - [description]
2018-03-20 16:15:49 +00:00
* @param {*} data - [description]
2018-02-12 22:16:18 +00:00
*
* @return {Phaser.Data.DataManager} This DataManager object.
*/
2016-12-07 01:40:56 +00:00
set: function (key, data)
{
if (this._frozen)
{
return this;
}
if (this.events.listenerCount('changedata') > 0)
2016-12-07 01:40:56 +00:00
{
this.blockSet = false;
2016-12-07 01:40:56 +00:00
var _this = this;
2016-12-07 01:40:56 +00:00
var resetFunction = function (value)
2016-12-07 01:40:56 +00:00
{
_this.blockSet = true;
_this.list[key] = value;
_this.events.emit('setdata', _this.parent, key, value);
};
2016-12-07 01:40:56 +00:00
this.events.emit('changedata', this.parent, key, data, resetFunction);
2017-01-30 00:00:45 +00:00
// One of the listeners blocked this update from being set, so abort
if (this.blockSet)
2016-12-07 01:40:56 +00:00
{
return this;
2016-12-07 01:40:56 +00:00
}
}
this.list[key] = data;
2016-12-07 01:40:56 +00:00
this.events.emit('setdata', this.parent, key, data);
2016-12-07 01:40:56 +00:00
return this;
2016-12-07 01:40:56 +00:00
},
/**
2018-02-12 22:16:18 +00:00
* Passes all data entries to the given callback. Stores the result of the callback.
*
* @method Phaser.Data.DataManager#each
* @since 3.0.0
*
2018-03-19 21:43:48 +00:00
* @param {DataEachCallback} callback - The function to call.
* @param {*} [scope] - Value to use as `this` when executing callback.
2018-02-12 22:16:18 +00:00
* @param {...*} [arguments] - Additional arguments that will be passed to the callback, after the game object, key, and data.
*
* @return {Phaser.Data.DataManager} This DataManager object.
*/
2016-12-07 01:40:56 +00:00
each: function (callback, scope)
{
var args = [ this.parent, null, undefined ];
for (var i = 1; i < arguments.length; i++)
{
args.push(arguments[i]);
}
for (var key in this.list)
{
args[1] = key;
args[2] = this.list[key];
callback.apply(scope, args);
}
return this;
2016-12-07 01:40:56 +00:00
},
2018-02-12 22:16:18 +00:00
/**
* [description]
*
* @method Phaser.Data.DataManager#merge
* @since 3.0.0
*
* @param {Object.<string, *>} data - [description]
2018-02-12 22:16:18 +00:00
* @param {boolean} overwrite - [description]
*
* @return {Phaser.Data.DataManager} This DataManager object.
*/
2016-12-07 01:40:56 +00:00
merge: function (data, overwrite)
{
if (overwrite === undefined) { overwrite = true; }
// Merge data from another component into this one
for (var key in data)
{
2018-03-19 15:37:01 +00:00
if (data.hasOwnProperty(key) && (overwrite || (!overwrite && !this.has(key))))
2016-12-07 01:40:56 +00:00
{
this.list[key] = data[key];
2016-12-07 01:40:56 +00:00
}
}
return this;
2016-12-07 01:40:56 +00:00
},
2018-02-12 22:16:18 +00:00
/**
* [description]
*
* @method Phaser.Data.DataManager#remove
* @since 3.0.0
*
* @param {string} key - [description]
*
* @return {Phaser.Data.DataManager} This DataManager object.
*/
2016-12-07 01:40:56 +00:00
remove: function (key)
{
if (!this._frozen && this.has(key))
{
var data = this.list[key];
2016-12-07 01:40:56 +00:00
delete this.list[key];
2016-12-07 01:40:56 +00:00
this.events.emit('removedata', this, key, data);
2016-12-07 01:40:56 +00:00
}
return this;
2016-12-07 01:40:56 +00:00
},
2018-02-12 22:16:18 +00:00
/**
* Gets the data associated with the given 'key', deletes it from this Data store, then returns it.
*
* @method Phaser.Data.DataManager#pop
* @since 3.0.0
*
* @param {string} key - [description]
*
2018-03-20 16:15:49 +00:00
* @return {*} [description]
2018-02-12 22:16:18 +00:00
*/
2016-12-07 01:40:56 +00:00
pop: function (key)
{
var data = undefined;
if (!this._frozen && this.has(key))
{
data = this.list[key];
delete this.list[key];
this.events.emit('removedata', this, key, data);
2016-12-07 01:40:56 +00:00
}
return data;
},
2018-02-12 22:16:18 +00:00
/**
* [description]
*
* @method Phaser.Data.DataManager#has
* @since 3.0.0
*
* @param {string} key - [description]
*
* @return {boolean} [description]
*/
2016-12-07 01:40:56 +00:00
has: function (key)
{
return this.list.hasOwnProperty(key);
},
2018-02-12 22:16:18 +00:00
/**
* [description]
*
* @method Phaser.Data.DataManager#setFreeze
* @since 3.0.0
*
* @param {boolean} value - [description]
*
* @return {Phaser.Data.DataManager} This DataManager object.
*/
setFreeze: function (value)
{
this._frozen = value;
return this;
},
2018-02-12 22:16:18 +00:00
/**
* [description]
*
* @method Phaser.Data.DataManager#reset
* @since 3.0.0
2018-03-19 15:37:01 +00:00
*
2018-02-12 22:16:18 +00:00
* @return {Phaser.Data.DataManager} This DataManager object.
*/
2016-12-07 01:40:56 +00:00
reset: function ()
{
for (var key in this.list)
{
delete this.list[key];
}
this.blockSet = false;
2016-12-07 01:40:56 +00:00
this._frozen = false;
2018-02-12 22:16:18 +00:00
return this;
},
2016-12-07 01:40:56 +00:00
2018-02-12 22:16:18 +00:00
/**
* [description]
*
* @method Phaser.Data.DataManager#destroy
* @since 3.0.0
*/
destroy: function ()
{
this.reset();
this.events.off('changedata');
this.events.off('setdata');
this.events.off('removedata');
this.parent = null;
},
2016-12-07 01:40:56 +00:00
/**
2018-02-12 22:16:18 +00:00
* Freeze this Data component, so no changes can be written to it.
*
* @name Phaser.Data.DataManager#freeze
* @type {boolean}
* @since 3.0.0
*/
2016-12-07 01:40:56 +00:00
freeze: {
get: function ()
{
return this._frozen;
},
set: function (value)
{
this._frozen = (value) ? true : false;
}
},
2018-02-12 22:16:18 +00:00
/**
* Return the total number of entries in this Data component.
*
* @name Phaser.Data.DataManager#count
* @type {integer}
* @since 3.0.0
*/
2016-12-07 01:40:56 +00:00
count: {
get: function ()
{
var i = 0;
for (var key in this.list)
{
if (this.list[key] !== undefined)
{
i++;
}
}
return i;
}
}
});
module.exports = DataManager;