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 * Overrided metadata worker's path. | 6 * Overrided metadata worker's path. |
7 * @type {string} | 7 * @type {string} |
8 */ | 8 */ |
9 ContentMetadataProvider.WORKER_SCRIPT = '/js/metadata_worker.js'; | 9 ContentMetadataProvider.WORKER_SCRIPT = '/js/metadata_worker.js'; |
10 | 10 |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 */ | 284 */ |
285 Gallery.prototype.load = function(selectedEntries) { | 285 Gallery.prototype.load = function(selectedEntries) { |
286 GalleryUtil.createEntrySet(selectedEntries).then(function(allEntries) { | 286 GalleryUtil.createEntrySet(selectedEntries).then(function(allEntries) { |
287 this.loadInternal_(allEntries, selectedEntries); | 287 this.loadInternal_(allEntries, selectedEntries); |
288 }.bind(this)); | 288 }.bind(this)); |
289 }; | 289 }; |
290 | 290 |
291 /** | 291 /** |
292 * Loads the content. | 292 * Loads the content. |
293 * | 293 * |
294 * @param {!Array.<!Entry>} entries Array of entries. | 294 * @param {!Array.<!FileEntry>} entries Array of entries. |
295 * @param {!Array.<!Entry>} selectedEntries Array of selected entries. | 295 * @param {!Array.<!FileEntry>} selectedEntries Array of selected entries. |
296 * @private | 296 * @private |
297 */ | 297 */ |
298 Gallery.prototype.loadInternal_ = function(entries, selectedEntries) { | 298 Gallery.prototype.loadInternal_ = function(entries, selectedEntries) { |
| 299 // Add the entries to data model. |
| 300 var items = []; |
| 301 for (var i = 0; i < entries.length; i++) { |
| 302 var locationInfo = this.volumeManager_.getLocationInfo(entries[i]); |
| 303 if (!locationInfo) // Skip the item, since gone. |
| 304 return; |
| 305 items.push(new Gallery.Item( |
| 306 entries[i], |
| 307 locationInfo, |
| 308 null, |
| 309 null, |
| 310 true)); |
| 311 } |
| 312 this.dataModel_.splice(0, this.dataModel_.length); |
| 313 this.updateThumbnails_(); // Remove the caches. |
| 314 |
| 315 GalleryDataModel.prototype.splice.apply( |
| 316 this.dataModel_, [0, 0].concat(items)); |
| 317 |
| 318 // Apply the selection. |
| 319 var selectedSet = {}; |
| 320 for (var i = 0; i < selectedEntries.length; i++) { |
| 321 selectedSet[selectedEntries[i].toURL()] = true; |
| 322 } |
| 323 for (var i = 0; i < items.length; i++) { |
| 324 if (!selectedSet[items[i].getEntry().toURL()]) |
| 325 continue; |
| 326 this.selectionModel_.setIndexSelected(i, true); |
| 327 } |
| 328 this.onSelection_(); |
| 329 |
299 // Obtains max chank size. | 330 // Obtains max chank size. |
300 var maxChunkSize = 20; | 331 var maxChunkSize = 20; |
301 var volumeInfo = this.volumeManager_.getVolumeInfo(entries[0]); | 332 var volumeInfo = this.volumeManager_.getVolumeInfo(entries[0]); |
302 if (volumeInfo) { | 333 if (volumeInfo) { |
303 if (volumeInfo.volumeType === VolumeManagerCommon.VolumeType.MTP) | 334 if (volumeInfo.volumeType === VolumeManagerCommon.VolumeType.MTP) |
304 maxChunkSize = 1; | 335 maxChunkSize = 1; |
305 if (volumeInfo.isReadOnly) | 336 if (volumeInfo.isReadOnly) |
306 this.context_.readonlyDirName = volumeInfo.label; | 337 this.context_.readonlyDirName = volumeInfo.label; |
307 } | 338 } |
308 | 339 |
309 // Make loading list. | 340 // If items are empty, stop initialization. |
310 var entrySet = {}; | 341 if (items.length === 0) { |
311 for (var i = 0; i < entries.length; i++) { | |
312 var entry = entries[i]; | |
313 entrySet[entry.toURL()] = { | |
314 entry: entry, | |
315 selected: false, | |
316 index: i | |
317 }; | |
318 } | |
319 for (var i = 0; i < selectedEntries.length; i++) { | |
320 var entry = selectedEntries[i]; | |
321 entrySet[entry.toURL()] = { | |
322 entry: entry, | |
323 selected: true, | |
324 index: i | |
325 }; | |
326 } | |
327 var loadingList = []; | |
328 for (var url in entrySet) { | |
329 loadingList.push(entrySet[url]); | |
330 } | |
331 loadingList = loadingList.sort(function(a, b) { | |
332 if (a.selected && !b.selected) | |
333 return -1; | |
334 else if (!a.selected && b.selected) | |
335 return 1; | |
336 else | |
337 return a.index - b.index; | |
338 }); | |
339 | |
340 if (loadingList.length === 0) { | |
341 this.dataModel_.splice(0, this.dataModel_.length); | 342 this.dataModel_.splice(0, this.dataModel_.length); |
342 return; | 343 return; |
343 } | 344 } |
344 | 345 |
345 // Load entries. | 346 // Load entries. |
346 // Use the self variable capture-by-closure because it is faster than bind. | 347 // Use the self variable capture-by-closure because it is faster than bind. |
347 var self = this; | 348 var self = this; |
348 var thumbnailModel = new ThumbnailModel(this.metadataModel_); | 349 var thumbnailModel = new ThumbnailModel(this.metadataModel_); |
349 var loadChunk = function(firstChunk) { | 350 var loadChunk = function(firstChunk) { |
350 // Extract chunk. | 351 // Extract chunk. |
351 var chunk = loadingList.splice(0, maxChunkSize); | 352 var chunk = items.splice(0, maxChunkSize); |
352 if (!chunk.length) | 353 if (!chunk.length) |
353 return; | 354 return; |
354 var entries = chunk.map(function(chunkItem) { | 355 var entries = chunk.map(function(chunkItem) { |
355 return chunkItem.entry; | 356 return chunkItem.getEntry(); |
356 }); | 357 }); |
357 var metadataPromise = self.metadataModel_.get( | 358 var metadataPromise = self.metadataModel_.get( |
358 entries, Gallery.PREFETCH_PROPERTY_NAMES); | 359 entries, Gallery.PREFETCH_PROPERTY_NAMES); |
359 var thumbnailPromise = thumbnailModel.get(entries); | 360 var thumbnailPromise = thumbnailModel.get(entries); |
360 return Promise.all([metadataPromise, thumbnailPromise]).then( | 361 return Promise.all([metadataPromise, thumbnailPromise]).then( |
361 function(metadataLists) { | 362 function(metadataLists) { |
362 // Remove all the previous items if it's the first chunk. | 363 // Add items to the model. |
363 // Do it here because prevent a flicker between removing all the items | 364 chunk.forEach(function(chunkItem, index) { |
364 // and adding new ones. | 365 chunkItem.setMetadataItem(metadataLists[0][index]); |
365 if (firstChunk) { | 366 chunkItem.setThumbnailMetadataItem(metadataLists[1][index]); |
366 self.dataModel_.splice(0, self.dataModel_.length); | |
367 self.updateThumbnails_(); // Remove the caches. | |
368 } | |
369 | 367 |
370 // Add items to the model. | 368 if (!firstChunk || self.initialized_) { |
371 var items = []; | 369 var event = new Event('content'); |
372 chunk.forEach(function(chunkItem, index) { | 370 event.item = chunkItem; |
373 var locationInfo = self.volumeManager_.getLocationInfo(chunkItem.entry); | 371 event.oldEntry = chunkItem.getEntry(); |
374 if (!locationInfo) // Skip the item, since gone. | 372 event.thumbnailChanged = true; |
375 return; | 373 self.dataModel_.dispatchEvent(event); |
376 items.push(new Gallery.Item( | 374 } |
377 chunkItem.entry, | |
378 locationInfo, | |
379 metadataLists[0][index], | |
380 metadataLists[1][index], | |
381 /* original */ true)); | |
382 }); | 375 }); |
383 self.dataModel_.push.apply(self.dataModel_, items); | |
384 | |
385 // Apply the selection. | |
386 var selectionUpdated = false; | |
387 for (var i = 0; i < chunk.length; i++) { | |
388 if (!chunk[i].selected) | |
389 continue; | |
390 var index = self.dataModel_.indexOf(items[i]); | |
391 if (index < 0) | |
392 continue; | |
393 self.selectionModel_.setIndexSelected(index, true); | |
394 selectionUpdated = true; | |
395 } | |
396 if (selectionUpdated) | |
397 self.onSelection_(); | |
398 | 376 |
399 // Init modes after the first chunk is loaded. | 377 // Init modes after the first chunk is loaded. |
400 if (firstChunk && !self.initialized_) { | 378 if (firstChunk && !self.initialized_) { |
401 // Determine the initial mode. | 379 // Determine the initial mode. |
402 var shouldShowMosaic = selectedEntries.length > 1 || | 380 var shouldShowMosaic = selectedEntries.length > 1 || |
403 (self.context_.pageState && | 381 (self.context_.pageState && |
404 self.context_.pageState.gallery === 'mosaic'); | 382 self.context_.pageState.gallery === 'mosaic'); |
405 self.setCurrentMode_( | 383 self.setCurrentMode_( |
406 shouldShowMosaic ? self.mosaicMode_ : self.slideMode_); | 384 shouldShowMosaic ? self.mosaicMode_ : self.slideMode_); |
407 | 385 |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
666 return 0 <= index && index < this.dataModel_.length; | 644 return 0 <= index && index < this.dataModel_.length; |
667 }.bind(this)); | 645 }.bind(this)); |
668 }; | 646 }; |
669 | 647 |
670 /** | 648 /** |
671 * Content change event handler. | 649 * Content change event handler. |
672 * @param {!Event} event Event. | 650 * @param {!Event} event Event. |
673 * @private | 651 * @private |
674 */ | 652 */ |
675 Gallery.prototype.onContentChange_ = function(event) { | 653 Gallery.prototype.onContentChange_ = function(event) { |
676 var index = this.dataModel_.indexOf(event.item); | |
677 if (index !== this.selectionModel_.selectedIndex) | |
678 console.error('Content changed for unselected item'); | |
679 this.updateSelectionAndState_(); | 654 this.updateSelectionAndState_(); |
680 }; | 655 }; |
681 | 656 |
682 /** | 657 /** |
683 * Keydown handler. | 658 * Keydown handler. |
684 * | 659 * |
685 * @param {!Event} event Event. | 660 * @param {!Event} event Event. |
686 * @private | 661 * @private |
687 */ | 662 */ |
688 Gallery.prototype.onKeyDown_ = function(event) { | 663 Gallery.prototype.onKeyDown_ = function(event) { |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
963 initializePromise.then(reload); | 938 initializePromise.then(reload); |
964 | 939 |
965 /** | 940 /** |
966 * Enteres the debug mode. | 941 * Enteres the debug mode. |
967 */ | 942 */ |
968 window.debugMe = function() { | 943 window.debugMe = function() { |
969 initializePromise.then(function() { | 944 initializePromise.then(function() { |
970 gallery.debugMe(); | 945 gallery.debugMe(); |
971 }); | 946 }); |
972 }; | 947 }; |
OLD | NEW |