~jstys-z/helioviewer.org/client5

« back to all changes in this revision

Viewing changes to src/Tiling/LayerManager.js

Preparing to merge in my branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**
 
2
 * @fileOverview Contains class definition for a simple layer manager
 
3
 * @author <a href="mailto:keith.hughitt@nasa.gov">Keith Hughitt</a>
 
4
 */
 
5
/*jslint browser: true, white: true, onevar: true, undef: true, nomen: false, eqeqeq: true, plusplus: true, 
 
6
bitwise: true, regexp: true, strict: true, newcap: true, immed: true, maxlen: 120, sub: true */
 
7
/*global Class, $ */
 
8
"use strict";
 
9
var LayerManager = Class.extend(
 
10
    /** @lends LayerManager.prototype */
 
11
    {
 
12
    /**
 
13
     * @constructs
 
14
     * @description Creates a new LayerManager
 
15
     */
 
16
    init: function () {
 
17
        this._layers    = [];
 
18
        this._maxLayerDimensions = {width: 0, height: 0};
 
19
    },
 
20
 
 
21
    /**
 
22
     * @description Add a new layer
 
23
     */
 
24
    addLayer: function (layer) {
 
25
        this._layers.push(layer);
 
26
    },
 
27
   
 
28
    /**
 
29
     * @description Gets the number of layers currently loaded 
 
30
     * @return {Integer} Number of layers present.
 
31
     */
 
32
    size: function () {
 
33
        return this._layers.length;
 
34
    },
 
35
    
 
36
    /**
 
37
     * Returns the index of the given layer if it exists, and -1 otherwise
 
38
     */
 
39
    indexOf: function (id) {
 
40
        var index = -1;
 
41
        
 
42
        $.each(this._layers, function (i, item) {
 
43
            if (item.id === id) {
 
44
                index = i;
 
45
            }
 
46
        });
 
47
        
 
48
        return index;
 
49
    },
 
50
    
 
51
    /**
 
52
     * Updates the stored maximum dimensions. If the specified dimensions for updated are {0,0}, e.g. after
 
53
     * a layer is removed, then all layers will be checked
 
54
     */
 
55
    updateMaxDimensions: function (event) {
 
56
        var type = event.type.split("-")[0];
 
57
        this.refreshMaxDimensions(type);
 
58
    },
 
59
    
 
60
    /**
 
61
     * Rechecks maximum dimensions after a layer is removed
 
62
     */
 
63
    refreshMaxDimensions: function (type) {
 
64
        var maxWidth = 0, maxHeight = 0,  old = this._maxLayerDimensions;
 
65
        
 
66
        $.each(this._layers, function () {
 
67
            var d = this.getDimensions();
 
68
                
 
69
            maxWidth  = Math.max(maxWidth, d.width);
 
70
            maxHeight = Math.max(maxHeight, d.height);
 
71
        });
 
72
        
 
73
        this._maxLayerDimensions = {
 
74
            width : maxWidth,
 
75
            height: maxHeight
 
76
        };
 
77
        
 
78
        if ((this._maxLayerDimensions.width !== old.width) || (this._maxLayerDimensions.height !== old.height)) {
 
79
            $(document).trigger("layer-max-dimensions-changed", [type, this._maxLayerDimensions]);
 
80
        }
 
81
    },
 
82
    
 
83
    /**
 
84
     * @description Returns the largest width and height of any layers (does not have to be from same layer)
 
85
     * @return {Object} The width and height of the largest layer
 
86
     */
 
87
    getMaxDimensions: function () {
 
88
        return this._maxLayerDimensions;
 
89
    },
 
90
 
 
91
    /**
 
92
     * @description Removes a layer
 
93
     * @param {string} The id of the layer to remove
 
94
     */
 
95
    removeLayer: function (id) {
 
96
        var type  = id.split("-")[0],
 
97
            index = this.indexOf(id), 
 
98
            layer = this._layers[index];
 
99
        
 
100
        layer.domNode.remove();
 
101
        this._layers = $.grep(this._layers, function (e, i) {
 
102
            return (e.id !== layer.id);
 
103
        });
 
104
        layer = null;
 
105
        
 
106
        this.refreshMaxDimensions(type);
 
107
    },
 
108
    
 
109
    /**
 
110
     * @description Iterates through layers
 
111
     */
 
112
    each: function (fn) {
 
113
        $.each(this._layers, fn);
 
114
    },
 
115
    
 
116
    /**
 
117
     * @description Returns a string representation of the layers currently being displayed
 
118
     */
 
119
    serialize: function () {
 
120
        var layers = "";
 
121
 
 
122
        $.each(this._layers, function () {
 
123
            layers += "[" + this.serialize() + "],";
 
124
        });
 
125
        
 
126
        // Remove trailing comma
 
127
        layers = layers.slice(0, -1);
 
128
        
 
129
        return layers;
 
130
    },
 
131
    
 
132
    /**
 
133
     * @description Returns a JSON representation of the layers currently being displayed
 
134
     */
 
135
    toJSON: function () {
 
136
        var layers = [];
 
137
        
 
138
        $.each(this._layers, function () {
 
139
            layers.push(this.toJSON());
 
140
        });
 
141
        
 
142
        return layers;       
 
143
    }
 
144
});