| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * @typedef {?{ | 6 * @typedef {?{ |
| 7 * url: string, | 7 * url: string, |
| 8 * title: string, | 8 * title: string, |
| 9 * artist: string, | 9 * artist: string, |
| 10 * artwork: Object, | 10 * artwork: Object, |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 value: false, | 49 value: false, |
| 50 observer: 'shuffleChanged' | 50 observer: 'shuffleChanged' |
| 51 } | 51 } |
| 52 }, | 52 }, |
| 53 | 53 |
| 54 /** | 54 /** |
| 55 * Initializes an element. This method is called automatically when the | 55 * Initializes an element. This method is called automatically when the |
| 56 * element is ready. | 56 * element is ready. |
| 57 */ | 57 */ |
| 58 ready: function() { | 58 ready: function() { |
| 59 this.observeTrackList(); | |
| 60 | |
| 61 window.addEventListener('resize', this.onWindowResize_.bind(this)); | 59 window.addEventListener('resize', this.onWindowResize_.bind(this)); |
| 62 }, | 60 }, |
| 63 | 61 |
| 64 observeTrackList: function() { | |
| 65 // Unobserve the previous track list. | |
| 66 if (this.unobserveTrackList_) | |
| 67 this.unobserveTrackList_(); | |
| 68 | |
| 69 // Observe the new track list. | |
| 70 var observer = this.tracksValueChanged_.bind(this); | |
| 71 Array.observe(this.tracks, observer); | |
| 72 | |
| 73 // Set the function to unobserve it. | |
| 74 this.unobserveTrackList_ = function(tracks, observer) { | |
| 75 Array.unobserve(tracks, observer); | |
| 76 }.bind(null, this.tracks, observer); | |
| 77 }, | |
| 78 | |
| 79 /** | 62 /** |
| 80 * Play order of the tracks. Each value is the index of 'this.tracks'. | 63 * Play order of the tracks. Each value is the index of 'this.tracks'. |
| 81 * @type {Array<number>} | 64 * @type {Array<number>} |
| 82 */ | 65 */ |
| 83 playOrder: [], | 66 playOrder: [], |
| 84 | 67 |
| 85 /** | 68 /** |
| 86 * Invoked when 'shuffle' property is changed. | 69 * Invoked when 'shuffle' property is changed. |
| 87 * @param {boolean} newValue New value. | 70 * @param {boolean} newValue New value. |
| 88 * @param {boolean} oldValue Old value. | 71 * @param {boolean} oldValue Old value. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 | 106 |
| 124 /** | 107 /** |
| 125 * Invoked when 'tracks' property is changed. | 108 * Invoked when 'tracks' property is changed. |
| 126 * @param {Array<!TrackInfo>} newValue New value. | 109 * @param {Array<!TrackInfo>} newValue New value. |
| 127 * @param {Array<!TrackInfo>} oldValue Old value. | 110 * @param {Array<!TrackInfo>} oldValue Old value. |
| 128 */ | 111 */ |
| 129 tracksChanged: function(newValue, oldValue) { | 112 tracksChanged: function(newValue, oldValue) { |
| 130 // Note: Sometimes both oldValue and newValue are null though the actual | 113 // Note: Sometimes both oldValue and newValue are null though the actual |
| 131 // values are not null. Maybe it's a bug of Polymer. | 114 // values are not null. Maybe it's a bug of Polymer. |
| 132 | 115 |
| 133 // Re-register the observer of 'this.tracks'. | |
| 134 this.observeTrackList(); | |
| 135 | |
| 136 if (this.tracks.length !== 0) { | 116 if (this.tracks.length !== 0) { |
| 137 // Restore the active track. | 117 // Restore the active track. |
| 138 if (this.currentTrackIndex !== -1 && | 118 if (this.currentTrackIndex !== -1 && |
| 139 this.currentTrackIndex < this.tracks.length) { | 119 this.currentTrackIndex < this.tracks.length) { |
| 140 this.set('tracks.' + this.currentTrackIndex + '.active', true); | 120 this.set('tracks.' + this.currentTrackIndex + '.active', true); |
| 141 } | 121 } |
| 142 | 122 |
| 143 // Reset play order and current index. | 123 // Reset play order and current index. |
| 144 this.generatePlayOrder(false /* no need to keep the current track */); | 124 this.generatePlayOrder(false /* no need to keep the current track */); |
| 145 } else { | 125 } else { |
| 146 this.playOrder = []; | 126 this.playOrder = []; |
| 147 this.currentTrackIndex = -1; | 127 this.currentTrackIndex = -1; |
| 148 } | 128 } |
| 149 }, | 129 }, |
| 150 | 130 |
| 151 /** | 131 /** |
| 152 * Invoked when the value in the 'tracks' is changed. | |
| 153 * @param {Array<Object>} changes The detail of the change. | |
| 154 */ | |
| 155 tracksValueChanged_: function(changes) { | |
| 156 if (this.tracks.length === 0) | |
| 157 this.currentTrackIndex = -1; | |
| 158 else | |
| 159 this.set('tracks.' + this.currentTrackIndex + '.active', true); | |
| 160 }, | |
| 161 | |
| 162 /** | |
| 163 * Invoked when the track element is clicked. | 132 * Invoked when the track element is clicked. |
| 164 * @param {Event} event Click event. | 133 * @param {Event} event Click event. |
| 165 */ | 134 */ |
| 166 trackClicked: function(event) { | 135 trackClicked: function(event) { |
| 167 var index = ~~event.currentTarget.getAttribute('index'); | 136 var index = ~~event.currentTarget.getAttribute('index'); |
| 168 var track = this.tracks[index]; | 137 var track = this.tracks[index]; |
| 169 if (track) { | 138 if (track) { |
| 170 if (event.target.classList.contains('icon')) { | 139 if (event.target.classList.contains('icon')) { |
| 171 // If the play icon on the track is clicked, change the current track | 140 // If the play icon on the track is clicked, change the current track |
| 172 // and start playing it regardless of current play state. | 141 // and start playing it regardless of current play state. |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 | 297 |
| 329 var newTrackIndex = this.playOrder[newPlayOrder]; | 298 var newTrackIndex = this.playOrder[newPlayOrder]; |
| 330 console.assert( | 299 console.assert( |
| 331 (0 <= newTrackIndex && newTrackIndex < this.tracks.length), | 300 (0 <= newTrackIndex && newTrackIndex < this.tracks.length), |
| 332 'Insufficient TrackList.playOrder. New Play Order: ' + newPlayOrder); | 301 'Insufficient TrackList.playOrder. New Play Order: ' + newPlayOrder); |
| 333 | 302 |
| 334 return newTrackIndex; | 303 return newTrackIndex; |
| 335 }, | 304 }, |
| 336 }); | 305 }); |
| 337 })(); // Anonymous closure | 306 })(); // Anonymous closure |
| OLD | NEW |