Daniel@0: "use strict"; Daniel@0: Daniel@0: App.module("ContextModule", function(ContextModule, App, Backbone, Marionette, $, _, Logger) { Daniel@0: Daniel@0: // Define private variables Daniel@0: var logger = null; Daniel@0: Daniel@0: ContextModule.addInitializer(function(options){ Daniel@0: Daniel@0: logger = Logger.get("ContextModule.ConfigGrid"); Daniel@0: logger.setLevel(Logger.WARN); Daniel@0: Daniel@0: /** Daniel@0: * ConfigGrid stores the configuration of a grid that consists of entityConfigs and viewConfigs Daniel@0: * (both are Backbone.Collection of Config) Daniel@0: * Daniel@0: * In real situation entityConfigs are music collection configs and music recording configs Daniel@0: * Daniel@0: * two sub-collections can be interacted directly (without proxy methods) Daniel@0: * Daniel@0: * The grid can be given a read-only type on creation in order to easily to distinguish between collection and recording grid later Daniel@0: * getType() method is available for this purpose. The type of the grid is not being serialized or unserialized Daniel@0: * Daniel@0: * The following events are triggered: Daniel@0: * Daniel@0: * change_layout Daniel@0: * when both or any of the two collections of Config gets new objects, looses objects or shuffles Daniel@0: * (but not when parameters in individual parameter bags change) Daniel@0: * Daniel@0: * change_entity:c123 Daniel@0: * change_view:c123 Daniel@0: * when a particular parameter bag changes (c123 is replaced with a corresponding client id of an entity or a view) Daniel@0: * Daniel@0: * change_entity_neighbours:c123 Daniel@0: * change_view_neighbours:c123 Daniel@0: * when a Config, which is right before or right after the given parameter bag, changes Daniel@0: * This includes cases when neighbours are added or removed Daniel@0: * Daniel@0: * change_selection Daniel@0: * when selectedEntityConfigClientId or (and) selectedViewConfigClientId change Daniel@0: * Daniel@0: * change Daniel@0: * this event is triggered together with any of the above ones, but Daniel@0: * maximum once during a complex operation such as unserialize Daniel@0: */ Daniel@0: ContextModule.ConfigGrid = Backbone.Model.extend({ Daniel@0: defaults: { Daniel@0: entityConfigs: null, Daniel@0: viewConfigs: null, Daniel@0: selectedEntityConfigClientId: null, Daniel@0: selectedViewConfigClientId: null Daniel@0: }, Daniel@0: Daniel@0: /** Daniel@0: * @memberOf App.ContextModule.ConfigGrid Daniel@0: */ Daniel@0: initialize: function(type) { Daniel@0: Daniel@0: this.type = type; Daniel@0: Daniel@0: this.attributes.entityConfigs = new ContextModule.ConfigCollection(null, { Daniel@0: comparator: false, Daniel@0: configGridType: type, Daniel@0: dimension: "entity", Daniel@0: }); Daniel@0: this.attributes.viewConfigs = new ContextModule.ConfigCollection(null, { Daniel@0: comparator: false, Daniel@0: configGridType: type, Daniel@0: dimension: "view", Daniel@0: }); Daniel@0: Daniel@0: // Shortcuts for entity configs and view configs (for quicker access) Daniel@0: this.entityConfigs = this.attributes.entityConfigs; Daniel@0: this.viewConfigs = this.attributes.viewConfigs; Daniel@0: Daniel@0: this._modificationPropagationEnabled = true; Daniel@0: this._configCollectionsWereModified = false; Daniel@0: this._configsWereModified = false; Daniel@0: this._modifiedEntityConfigClientIds = []; Daniel@0: this._modifiedViewConfigClientIds = []; Daniel@0: this._lastSavedOrderedEntityClientIds = _.pluck(this.attributes.entityConfigs.models, "cid"); Daniel@0: this._lastSavedOrderedViewClientIds = _.pluck(this.attributes.viewConfigs.models, "cid"); Daniel@0: this._lastSavedSelectedEntityConfigClientId = this.attributes.selectedEntityConfigClientId; Daniel@0: this._lastSavedSelectedViewConfigClientId = this.attributes.selectedViewConfigClientId; Daniel@0: Daniel@0: this.entityConfigs.bind("add remove reset sort", this._registerModificationOfConfigCollectionForEntities, this); Daniel@0: this.viewConfigs.bind("add remove reset sort", this._registerModificationOfConfigCollectionForViews, this); Daniel@0: Daniel@0: this.entityConfigs.bind("change", this._registerModificationOfConfig, this); Daniel@0: this.viewConfigs.bind("change", this._registerModificationOfConfig, this); Daniel@0: Daniel@0: this.bind("change:selectedEntityConfigClientId", this._registerModificationOfAtomicProperty); Daniel@0: this.bind("change:selectedViewConfigClientId", this._registerModificationOfAtomicProperty); Daniel@0: this.bind("change:entityWidth", this._registerModificationOfStandardAtomicProperty); Daniel@0: }, Daniel@0: Daniel@0: /** Daniel@0: * @memberOf App.ContextModule.ConfigGrid Daniel@0: */ Daniel@0: getType: function() { Daniel@0: return this.type; Daniel@0: }, Daniel@0: Daniel@0: /** Daniel@0: * @memberOf App.ContextModule.ConfigGrid Daniel@0: */ Daniel@0: getPrevEntityNeighbour: function(entityConfig) { Daniel@0: return this._getNeighbour(this.attributes.entityConfigs, entityConfig, -1); Daniel@0: }, Daniel@0: Daniel@0: /** Daniel@0: * @memberOf App.ContextModule.ConfigGrid Daniel@0: */ Daniel@0: getNextEntityNeighbour: function(entityConfig) { Daniel@0: return this._getNeighbour(this.attributes.entityConfigs, entityConfig, 1); Daniel@0: }, Daniel@0: Daniel@0: /** Daniel@0: * @memberOf App.ContextModule.ConfigGrid Daniel@0: */ Daniel@0: getPrevViewNeighbour: function(viewConfig) { Daniel@0: return this._getNeighbour(this.attributes.viewConfigs, viewConfig, -1); Daniel@0: }, Daniel@0: Daniel@0: /** Daniel@0: * @memberOf App.ContextModule.ConfigGrid Daniel@0: */ Daniel@0: getNextViewNeighbour: function(viewConfig) { Daniel@0: return this._getNeighbour(this.attributes.viewConfigs, viewConfig, 1); Daniel@0: }, Daniel@0: Daniel@0: /** Daniel@0: * @memberOf App.ContextModule.ConfigGrid Daniel@0: */ Daniel@0: relocateEntityConfig: function(entityConfig, indexOrNextConfigOrNextConfigClientId) { Daniel@0: return this._relocate(this.attributes.entityConfigs, entityConfig, indexOrNextConfigOrNextConfigClientId); Daniel@0: }, Daniel@0: Daniel@0: /** Daniel@0: * @memberOf App.ContextModule.ConfigGrid Daniel@0: */ Daniel@0: relocateViewConfig: function(viewConfig, indexOrNextConfigOrNextConfigClientId) { Daniel@0: return this._relocate(this.attributes.viewConfigs, viewConfig, indexOrNextConfigOrNextConfigClientId); Daniel@0: }, Daniel@0: Daniel@0: /** Daniel@0: * @memberOf App.ContextModule.ConfigGrid Daniel@0: */ Daniel@0: serialize: function() { Daniel@0: logger.debug("method called: ConfigGrid::serialize"); Daniel@0: var _this = this; Daniel@0: Daniel@0: var result = { Daniel@0: entityConfigs: this.attributes.entityConfigs.map(function(config){ return config.serialize(); }), Daniel@0: viewConfigs: this.attributes.viewConfigs.map(function(config){ return config.serialize(); }) Daniel@0: }; Daniel@0: Daniel@0: if (this.attributes.selectedEntityConfigClientId) { Daniel@0: result.selectedEntityConfigClientId = this.attributes.selectedEntityConfigClientId; Daniel@0: } Daniel@0: if (this.attributes.selectedViewConfigClientId) { Daniel@0: result.selectedViewConfigClientId = this.attributes.selectedViewConfigClientId; Daniel@0: } Daniel@0: if (this.attributes.entityWidth) { Daniel@0: result.entityWidth = this.attributes.entityWidth; Daniel@0: } Daniel@0: Daniel@0: return result; Daniel@0: }, Daniel@0: Daniel@0: getSelectedEntityConfig: function() { Daniel@0: return this.attributes.entityConfigs.get(this.attributes.selectedEntityConfigClientId); Daniel@0: }, Daniel@0: Daniel@0: getSelectedViewConfig: function() { Daniel@0: return this.attributes.viewConfigs.get(this.attributes.selectedViewConfigClientId); Daniel@0: }, Daniel@0: Daniel@0: // getSelectedConfigAtGivenDimension: function(dimension) { Daniel@0: // if (dimension == "entity") { Daniel@0: // return this.getSelectedEntityConfig(); Daniel@0: // } else if (dimension == "view") { Daniel@0: // return this.getSelectedViewConfig(); Daniel@0: // } Daniel@0: // }, Daniel@0: // Daniel@0: addEntityAndSelectIt: function(entityConfig, indexOrNextConfigOrNextConfigClientId) { Daniel@0: this._addAndSelect(this.attributes.entityConfigs, entityConfig, _.isUndefined(indexOrNextConfigOrNextConfigClientId) ? null : indexOrNextConfigOrNextConfigClientId); Daniel@0: }, Daniel@0: Daniel@0: addViewAndSelectIt: function(viewConfig, indexOrNextConfigOrNextConfigClientId) { Daniel@0: this._addAndSelect(this.attributes.viewConfigs, viewConfig, _.isUndefined(indexOrNextConfigOrNextConfigClientId) ? null : indexOrNextConfigOrNextConfigClientId); Daniel@0: }, Daniel@0: Daniel@0: removeEntityAndSelectNeighbour: function(entityConfig) { Daniel@0: this._removeAndSelectNeighbour(this.attributes.entityConfigs, entityConfig); Daniel@0: }, Daniel@0: Daniel@0: removeViewAndSelectNeighbour: function(viewConfig) { Daniel@0: this._removeAndSelectNeighbour(this.attributes.viewConfigs, viewConfig); Daniel@0: }, Daniel@0: Daniel@0: _addAndSelect: function(configCollection, config, indexOrNextConfigOrNextConfigClientId) { Daniel@0: this._modificationPropagationEnabled = false; Daniel@0: Daniel@0: configCollection.add(config); Daniel@0: if (configCollection == this.attributes.entityConfigs) { Daniel@0: this.attributes.selectedEntityConfigClientId = config.getClientId(); Daniel@0: } else { Daniel@0: this.attributes.selectedViewConfigClientId = config.getClientId(); Daniel@0: } Daniel@0: this._relocate(configCollection, config, indexOrNextConfigOrNextConfigClientId); Daniel@0: Daniel@0: this._triggerModificationEventsIfNeeded(); Daniel@0: this._modificationPropagationEnabled = true; Daniel@0: Daniel@0: }, Daniel@0: Daniel@0: _removeAndSelectNeighbour: function(configCollection, config) { Daniel@0: this._modificationPropagationEnabled = false; Daniel@0: Daniel@0: var neighbourToSelect = this._getNeighbour(configCollection, config, 1); Daniel@0: if (!neighbourToSelect) { Daniel@0: neighbourToSelect = this._getNeighbour(configCollection, config, -1); Daniel@0: } Daniel@0: configCollection.remove(config); Daniel@0: if (configCollection == this.attributes.entityConfigs) { Daniel@0: this.attributes.selectedEntityConfigClientId = neighbourToSelect ? neighbourToSelect.getClientId() : null; Daniel@0: } else { Daniel@0: this.attributes.selectedViewConfigClientId = neighbourToSelect ? neighbourToSelect.getClientId() : null; Daniel@0: } Daniel@0: Daniel@0: this._triggerModificationEventsIfNeeded(); Daniel@0: this._modificationPropagationEnabled = true; Daniel@0: Daniel@0: }, Daniel@0: Daniel@0: /** Daniel@0: * @memberOf App.ContextModule.ConfigGrid Daniel@0: */ Daniel@0: unserialize: function(serializedAttributes) { Daniel@0: logger.debug("method called: ConfigGrid::unserialize"); Daniel@0: Daniel@0: this._modificationPropagationEnabled = false; Daniel@0: Daniel@0: var fixedSerializedAttributes = serializedAttributes; Daniel@0: if (!_.isSimpleObject(serializedAttributes)) { Daniel@0: logger.warn("ConfigGrid::unserialize called for not an object: ", serializedAttributes); Daniel@0: fixedSerializedAttributes = {}; Daniel@0: } Daniel@0: Daniel@0: // entityConfigs Daniel@0: var newConfigs = []; Daniel@0: var fixedSerializedConfigs = fixedSerializedAttributes.entityConfigs; Daniel@0: if (!_.isArray(fixedSerializedConfigs)) { Daniel@0: if (_.isSimpleObject(serializedAttributes)) { Daniel@0: logger.warn("ConfigGrid::unserialize called for an object with faulty entityConfigs: ", fixedSerializedConfigs); Daniel@0: } Daniel@0: fixedSerializedConfigs = []; Daniel@0: }; Daniel@0: for (var i = 0; i < fixedSerializedConfigs.length; i++) { Daniel@0: var serializedConfig = fixedSerializedConfigs[i]; Daniel@0: var config = this.attributes.entityConfigs.get(serializedConfig.clientId); Daniel@0: if (!config) { Daniel@0: config = new App.ContextModule.Config(serializedConfig); Daniel@0: } else { Daniel@0: config.unserialize(serializedConfig); Daniel@0: } Daniel@0: newConfigs.push(config); Daniel@0: } Daniel@0: this.attributes.entityConfigs.reset(newConfigs); Daniel@0: Daniel@0: // viewConfigs Daniel@0: var newConfigs = []; Daniel@0: var fixedSerializedConfigs = fixedSerializedAttributes.viewConfigs; Daniel@0: if (!_.isArray(fixedSerializedConfigs)) { Daniel@0: if (_.isSimpleObject(serializedAttributes)) { Daniel@0: logger.warn("ConfigGrid::unserialize called for an object with faulty viewConfigs: ", fixedSerializedConfigs); Daniel@0: } Daniel@0: fixedSerializedConfigs = []; Daniel@0: }; Daniel@0: for (var i = 0; i < fixedSerializedConfigs.length; i++) { Daniel@0: var serializedConfig = fixedSerializedConfigs[i]; Daniel@0: var config = this.attributes.viewConfigs.get(serializedConfig.clientId); Daniel@0: if (!config) { Daniel@0: config = new App.ContextModule.Config(serializedConfig); Daniel@0: } else { Daniel@0: config.unserialize(serializedConfig); Daniel@0: } Daniel@0: newConfigs.push(config); Daniel@0: } Daniel@0: this.attributes.viewConfigs.reset(newConfigs); Daniel@0: Daniel@0: // selectedEntityConfigClientId, selectedViewConfigClientId Daniel@0: this.attributes.selectedEntityConfigClientId = fixedSerializedAttributes.selectedEntityConfigClientId; Daniel@0: this.attributes.selectedViewConfigClientId = fixedSerializedAttributes.selectedViewConfigClientId; Daniel@0: Daniel@0: this.attributes.entityWidth = fixedSerializedAttributes.entityWidth; Daniel@0: Daniel@0: this._triggerModificationEventsIfNeeded(); Daniel@0: this._modificationPropagationEnabled = true; Daniel@0: }, Daniel@0: Daniel@0: _getNeighbour: function(configCollection, config, offset) { Daniel@0: var index = configCollection.indexOf(config); Daniel@0: if (index === -1) { Daniel@0: throw _.str.sprintf("Can't find config %s", JSON.stringify(config.serialize())); Daniel@0: } Daniel@0: return configCollection.at(index + offset); Daniel@0: }, Daniel@0: Daniel@0: _relocate: function(configCollection, config, indexOrNextConfigOrNextConfigClientId) { Daniel@0: var clientIds = _.pluck(configCollection.models, "cid"); Daniel@0: var nextConfigClientId = null; Daniel@0: Daniel@0: if (_.isNumber(indexOrNextConfigOrNextConfigClientId) && indexOrNextConfigOrNextConfigClientId != clientIds.length) { Daniel@0: nextConfigClientId = clientIds[indexOrNextConfigOrNextConfigClientId]; Daniel@0: } Daniel@0: if (_.isObject(indexOrNextConfigOrNextConfigClientId)) { Daniel@0: nextConfigClientId = indexOrNextConfigOrNextConfigClientId.getClientId(); Daniel@0: } Daniel@0: if (_.isString(indexOrNextConfigOrNextConfigClientId)) { Daniel@0: if (clientIds.indexOf(indexOrNextConfigOrNextConfigClientId) !== -1) { Daniel@0: nextConfigClientId = indexOrNextConfigOrNextConfigClientId; Daniel@0: } Daniel@0: } Daniel@0: if (!nextConfigClientId && !_.isNull(indexOrNextConfigOrNextConfigClientId) && indexOrNextConfigOrNextConfigClientId != configCollection.size()) { Daniel@0: throw _.str.sprintf("Wrong value for indexOrNextConfigOrNextConfigClientId %s", indexOrNextConfigOrNextConfigClientId); Daniel@0: } Daniel@0: Daniel@0: var configClientId = config.getClientId(); Daniel@0: if (!configClientId || clientIds.indexOf(configClientId) == -1) { Daniel@0: var flattenedConfig = config; Daniel@0: if (_.isObject(flattenedConfig)) { Daniel@0: flattenedConfig = JSON.stringify(flattenedConfig); Daniel@0: } Daniel@0: throw _.str.sprintf("Config %s with cid %s is either not a Config or does not belong to a corresponding configCollection with cids [%s]", flattenedConfig, _.isObject(config ) ? config.getClientId() : undefined, clientIds.join(", ")); Daniel@0: } Daniel@0: if (configCollection.get(configClientId) !== config) { Daniel@0: throw _.str.sprintf("Config %s with cid %s is is a clone of what is stored in the grid. Relocation is not possible.", JSON.stringify(config), config.cid); Daniel@0: } Daniel@0: var newClientIds = _.without(clientIds, configClientId); Daniel@0: if (_.isNull(nextConfigClientId)) { Daniel@0: newClientIds.push(configClientId); Daniel@0: } else { Daniel@0: var nextConfigIndex = newClientIds.indexOf(nextConfigClientId); Daniel@0: //if (nextConfigIndex) Daniel@0: var tempClientIds = newClientIds.slice(0, nextConfigIndex); Daniel@0: tempClientIds.push(configClientId); Daniel@0: newClientIds = tempClientIds.concat(newClientIds.slice(nextConfigIndex)); Daniel@0: } Daniel@0: Daniel@0: var oldComparator = configCollection.comparator; Daniel@0: configCollection.comparator = function(model) { Daniel@0: return newClientIds.indexOf(model.getClientId()); Daniel@0: }; Daniel@0: configCollection.sort(); Daniel@0: configCollection.comparator = oldComparator; Daniel@0: }, Daniel@0: Daniel@0: _registerModificationOfConfigCollectionForEntities: function(modelOrModels, options) { Daniel@0: if (!_.isEqual(this._lastSavedOrderedEntityClientIds, _.pluck(this.attributes.entityConfigs.models, "cid"))) { Daniel@0: this._configCollectionsWereModified = true; Daniel@0: if (this._modificationPropagationEnabled) { Daniel@0: this._triggerModificationEventsIfNeeded(); Daniel@0: }; Daniel@0: } Daniel@0: }, Daniel@0: Daniel@0: _registerModificationOfConfigCollectionForViews: function(modelOrModels, options) { Daniel@0: if (!_.isEqual(this._lastSavedOrderedViewClientIds, _.pluck(this.attributes.viewConfigs.models, "cid"))) { Daniel@0: this._configCollectionsWereModified = true; Daniel@0: if (this._modificationPropagationEnabled) { Daniel@0: this._triggerModificationEventsIfNeeded(); Daniel@0: }; Daniel@0: } Daniel@0: }, Daniel@0: Daniel@0: _registerModificationOfConfig: function() { Daniel@0: for (var i = 0; i < this.attributes.entityConfigs.length; i++) { Daniel@0: if(this.attributes.entityConfigs.at(i).hasChanged()) { Daniel@0: this._configsWereModified = true; Daniel@0: this._modifiedEntityConfigClientIds.push(this.attributes.entityConfigs.at(i).getClientId()); Daniel@0: } Daniel@0: } Daniel@0: for (var i = 0; i < this.attributes.viewConfigs.length; i++) { Daniel@0: if(this.attributes.viewConfigs.at(i).hasChanged()) { Daniel@0: this._configsWereModified = true; Daniel@0: this._modifiedViewConfigClientIds.push(this.attributes.viewConfigs.at(i).getClientId()); Daniel@0: } Daniel@0: } Daniel@0: if (this._modificationPropagationEnabled) { Daniel@0: this._triggerModificationEventsIfNeeded(); Daniel@0: }; Daniel@0: }, Daniel@0: Daniel@0: _registerModificationOfAtomicProperty: function() { Daniel@0: if (this._modificationPropagationEnabled) { Daniel@0: this._triggerModificationEventsIfNeeded(true); Daniel@0: }; Daniel@0: }, Daniel@0: Daniel@0: _registerModificationOfStandardAtomicProperty: function() { Daniel@0: if (this._modificationPropagationEnabled) { Daniel@0: this._triggerModificationEventsIfNeeded(); Daniel@0: }; Daniel@0: }, Daniel@0: Daniel@0: _triggerModificationEventsIfNeeded: function(specialCaseForRegisterModificationOfSelection) { Daniel@0: Daniel@0: var triggeredAtLeastSomething = false; Daniel@0: if (this._configCollectionsWereModified) { Daniel@0: triggeredAtLeastSomething = true; Daniel@0: this.trigger("change_layout"); Daniel@0: } Daniel@0: Daniel@0: var newOrderedEntityClientIds = null; Daniel@0: var newOrderedViewClientIds = null; Daniel@0: if (this._configCollectionsWereModified || this._modifiedEntityConfigClientIds.length || this._modifiedViewConfigClientIds.length) { Daniel@0: newOrderedEntityClientIds = _.pluck(this.attributes.entityConfigs.models, "cid"); Daniel@0: newOrderedViewClientIds = _.pluck(this.attributes.viewConfigs.models, "cid"); Daniel@0: Daniel@0: // change_entity:c123 Daniel@0: if (this._modifiedEntityConfigClientIds.length) { Daniel@0: for (var i = 0; i < newOrderedEntityClientIds.length; i++) { Daniel@0: if (_.indexOf(this._modifiedEntityConfigClientIds, newOrderedEntityClientIds[i]) !== -1) { Daniel@0: triggeredAtLeastSomething = true; Daniel@0: this.trigger("change_entity:" + newOrderedEntityClientIds[i]); Daniel@0: } Daniel@0: } Daniel@0: } Daniel@0: // change_view:c123 Daniel@0: if (this._modifiedViewConfigClientIds.length) { Daniel@0: for (var i = 0; i < newOrderedViewClientIds.length; i++) { Daniel@0: if (_.indexOf(this._modifiedViewConfigClientIds, newOrderedViewClientIds[i]) !== -1) { Daniel@0: triggeredAtLeastSomething = true; Daniel@0: this.trigger("change_view:" + newOrderedViewClientIds[i]); Daniel@0: } Daniel@0: } Daniel@0: } Daniel@0: Daniel@0: // change_entity_neighbours:c123 Daniel@0: for (var i = 0; i < newOrderedEntityClientIds.length; i++) { Daniel@0: var entityClientId = newOrderedEntityClientIds[i]; Daniel@0: var oldEntityIndex = this._lastSavedOrderedEntityClientIds.indexOf(entityClientId); Daniel@0: if (oldEntityIndex == -1) { Daniel@0: continue; Daniel@0: } Daniel@0: var newPrevEntityClientId = newOrderedEntityClientIds[i - 1]; Daniel@0: var newNextEntityClientId = newOrderedEntityClientIds[i + 1]; Daniel@0: var oldPrevEntityClientId = this._lastSavedOrderedEntityClientIds[oldEntityIndex - 1]; Daniel@0: var oldNextEntityClientId = this._lastSavedOrderedEntityClientIds[oldEntityIndex + 1]; Daniel@0: Daniel@0: if (newPrevEntityClientId != oldPrevEntityClientId Daniel@0: || newNextEntityClientId != oldNextEntityClientId Daniel@0: || this._modifiedEntityConfigClientIds.indexOf(newPrevEntityClientId) !== -1 Daniel@0: || this._modifiedEntityConfigClientIds.indexOf(newNextEntityClientId) !== -1 Daniel@0: ) { Daniel@0: triggeredAtLeastSomething = true; Daniel@0: this.trigger("change_entity_neighbours:" + entityClientId); Daniel@0: }; Daniel@0: } Daniel@0: Daniel@0: // change_view_neighbours:c123 Daniel@0: for (var i = 0; i < newOrderedViewClientIds.length; i++) { Daniel@0: var viewClientId = newOrderedViewClientIds[i]; Daniel@0: var oldViewIndex = this._lastSavedOrderedViewClientIds.indexOf(viewClientId); Daniel@0: if (oldViewIndex == -1) { Daniel@0: continue; Daniel@0: } Daniel@0: var newPrevViewClientId = newOrderedViewClientIds[i - 1]; Daniel@0: var newNextViewClientId = newOrderedViewClientIds[i + 1]; Daniel@0: var oldPrevViewClientId = this._lastSavedOrderedViewClientIds[oldViewIndex - 1]; Daniel@0: var oldNextViewClientId = this._lastSavedOrderedViewClientIds[oldViewIndex + 1]; Daniel@0: Daniel@0: if (newPrevViewClientId != oldPrevViewClientId Daniel@0: || newNextViewClientId != oldNextViewClientId Daniel@0: || this._modifiedViewConfigClientIds.indexOf(newPrevViewClientId) !== -1 Daniel@0: || this._modifiedViewConfigClientIds.indexOf(newNextViewClientId) !== -1 Daniel@0: ) { Daniel@0: triggeredAtLeastSomething = true; Daniel@0: this.trigger("change_view_neighbours:" + viewClientId); Daniel@0: }; Daniel@0: }; Daniel@0: } Daniel@0: Daniel@0: this._lastSavedOrderedEntityClientIds = _.pluck(this.attributes.entityConfigs.models, "cid"); Daniel@0: this._lastSavedOrderedViewClientIds = _.pluck(this.attributes.viewConfigs.models, "cid"); Daniel@0: Daniel@0: // Fix selection Daniel@0: if (!this.attributes.entityConfigs.get(this.attributes.selectedEntityConfigClientId)) { Daniel@0: this.attributes.selectedEntityConfigClientId = null; Daniel@0: } Daniel@0: if (!this.attributes.viewConfigs.get(this.attributes.selectedViewConfigClientId)) { Daniel@0: this.attributes.selectedViewConfigClientId = null; Daniel@0: } Daniel@0: if (this._lastSavedSelectedEntityConfigClientId != this.attributes.selectedEntityConfigClientId Daniel@0: || this._lastSavedSelectedViewConfigClientId != this.attributes.selectedViewConfigClientId Daniel@0: ) { Daniel@0: if (!specialCaseForRegisterModificationOfSelection) { Daniel@0: triggeredAtLeastSomething = true; Daniel@0: } Daniel@0: this.trigger("change_selection"); Daniel@0: } Daniel@0: Daniel@0: if (this._lastSavedEntityWidth != this.attributes.entityWidth) { Daniel@0: triggeredAtLeastSomething = true; Daniel@0: } Daniel@0: Daniel@0: this._configCollectionsWereModified = false; Daniel@0: this._configsWereModified = false; Daniel@0: this._selectionWasModified = false; Daniel@0: this._modifiedEntityConfigClientIds = []; Daniel@0: this._modifiedViewConfigClientIds = []; Daniel@0: this._lastSavedSelectedEntityConfigClientId = this.attributes.selectedEntityConfigClientId; Daniel@0: this._lastSavedSelectedViewConfigClientId = this.attributes.selectedViewConfigClientId; Daniel@0: this._lastSavedEntityWidth = this.attributes.entityWidth; Daniel@0: Daniel@0: if (triggeredAtLeastSomething) { Daniel@0: this.trigger("change"); Daniel@0: } Daniel@0: }, Daniel@0: }); Daniel@0: }); Daniel@0: }, Logger);