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 'use strict'; | 5 'use strict'; |
6 | 6 |
7 /** | 7 /** |
8 * Called from the main frame when unloading. | 8 * Called from the main frame when unloading. |
9 * @param {boolean=} opt_exiting True if the app is exiting. | 9 * @param {boolean=} opt_exiting True if the app is exiting. |
10 */ | 10 */ |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 */ | 58 */ |
59 GalleryDataModel.MAX_SCREEN_IMAGE_CACHE_ = 5; | 59 GalleryDataModel.MAX_SCREEN_IMAGE_CACHE_ = 5; |
60 | 60 |
61 GalleryDataModel.prototype = { | 61 GalleryDataModel.prototype = { |
62 __proto__: cr.ui.ArrayDataModel.prototype | 62 __proto__: cr.ui.ArrayDataModel.prototype |
63 }; | 63 }; |
64 | 64 |
65 /** | 65 /** |
66 * Saves new image. | 66 * Saves new image. |
67 * | 67 * |
| 68 * @param {VolumeManager} volumeManager Volume manager instance. |
68 * @param {Gallery.Item} item Original gallery item. | 69 * @param {Gallery.Item} item Original gallery item. |
69 * @param {Canvas} canvas Canvas containing new image. | 70 * @param {Canvas} canvas Canvas containing new image. |
70 * @param {boolean} overwrite Whether to overwrite the image to the item or not. | 71 * @param {boolean} overwrite Whether to overwrite the image to the item or not. |
71 * @return {Promise} Promise to be fulfilled with when the operation completes. | 72 * @return {Promise} Promise to be fulfilled with when the operation completes. |
72 */ | 73 */ |
73 GalleryDataModel.prototype.saveItem = function(item, canvas, overwrite) { | 74 GalleryDataModel.prototype.saveItem = function( |
| 75 volumeManager, item, canvas, overwrite) { |
74 var oldEntry = item.getEntry(); | 76 var oldEntry = item.getEntry(); |
75 var oldMetadata = item.getMetadata(); | 77 var oldMetadata = item.getMetadata(); |
| 78 var oldLocationInfo = item.getLocationInfo(); |
76 var metadataEncoder = ImageEncoder.encodeMetadata( | 79 var metadataEncoder = ImageEncoder.encodeMetadata( |
77 item.getMetadata(), canvas, 1 /* quality */); | 80 item.getMetadata(), canvas, 1 /* quality */); |
78 var newMetadata = ContentProvider.ConvertContentMetadata( | 81 var newMetadata = ContentProvider.ConvertContentMetadata( |
79 metadataEncoder.getMetadata(), | 82 metadataEncoder.getMetadata(), |
80 MetadataCache.cloneMetadata(item.getMetadata())); | 83 MetadataCache.cloneMetadata(item.getMetadata())); |
81 if (newMetadata.filesystem) | 84 if (newMetadata.filesystem) |
82 newMetadata.filesystem.modificationTime = new Date(); | 85 newMetadata.filesystem.modificationTime = new Date(); |
83 if (newMetadata.drive) | 86 if (newMetadata.external) |
84 newMetadata.drive.present = true; | 87 newMetadata.external.present = true; |
85 | 88 |
86 return new Promise(function(fulfill, reject) { | 89 return new Promise(function(fulfill, reject) { |
87 item.saveToFile( | 90 item.saveToFile( |
| 91 volumeManager, |
88 this.fallbackSaveDirectory, | 92 this.fallbackSaveDirectory, |
89 overwrite, | 93 overwrite, |
90 canvas, | 94 canvas, |
91 metadataEncoder, | 95 metadataEncoder, |
92 function(success) { | 96 function(success) { |
93 if (!success) { | 97 if (!success) { |
94 reject('Failed to save the image.'); | 98 reject('Failed to save the image.'); |
95 return; | 99 return; |
96 } | 100 } |
97 | 101 |
(...skipping 12 matching lines...) Expand all Loading... |
110 // Need an update of metdataCache. | 114 // Need an update of metdataCache. |
111 this.metadataCache_.set( | 115 this.metadataCache_.set( |
112 item.getEntry(), | 116 item.getEntry(), |
113 Gallery.METADATA_TYPE, | 117 Gallery.METADATA_TYPE, |
114 newMetadata); | 118 newMetadata); |
115 } else { | 119 } else { |
116 // New entry is added and the item now tracks it. | 120 // New entry is added and the item now tracks it. |
117 // Add another item for the old entry. | 121 // Add another item for the old entry. |
118 var anotherItem = new Gallery.Item( | 122 var anotherItem = new Gallery.Item( |
119 oldEntry, | 123 oldEntry, |
| 124 oldLocationInfo, |
120 oldMetadata, | 125 oldMetadata, |
121 this.metadataCache_, | 126 this.metadataCache_, |
122 item.isOriginal(), | 127 item.isOriginal()); |
123 item.isReadOnly()); | |
124 // The item must be added behind the existing item so that it does | 128 // The item must be added behind the existing item so that it does |
125 // not change the index of the existing item. | 129 // not change the index of the existing item. |
126 // TODO(hirono): Update the item index of the selection model | 130 // TODO(hirono): Update the item index of the selection model |
127 // correctly. | 131 // correctly. |
128 this.splice(this.indexOf(item) + 1, 0, anotherItem); | 132 this.splice(this.indexOf(item) + 1, 0, anotherItem); |
129 } | 133 } |
130 | 134 |
131 fulfill(); | 135 fulfill(); |
132 }.bind(this)); | 136 }.bind(this)); |
133 }.bind(this)); | 137 }.bind(this)); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 loadTimeData: {} | 204 loadTimeData: {} |
201 }; | 205 }; |
202 this.container_ = document.querySelector('.gallery'); | 206 this.container_ = document.querySelector('.gallery'); |
203 this.document_ = document; | 207 this.document_ = document; |
204 this.metadataCache_ = this.context_.metadataCache; | 208 this.metadataCache_ = this.context_.metadataCache; |
205 this.volumeManager_ = volumeManager; | 209 this.volumeManager_ = volumeManager; |
206 this.selectedEntry_ = null; | 210 this.selectedEntry_ = null; |
207 this.metadataCacheObserverId_ = null; | 211 this.metadataCacheObserverId_ = null; |
208 this.onExternallyUnmountedBound_ = this.onExternallyUnmounted_.bind(this); | 212 this.onExternallyUnmountedBound_ = this.onExternallyUnmounted_.bind(this); |
209 | 213 |
210 this.dataModel_ = new GalleryDataModel(this.context_.metadataCache); | 214 this.dataModel_ = new GalleryDataModel( |
| 215 this.context_.metadataCache); |
211 var downloadVolumeInfo = this.volumeManager_.getCurrentProfileVolumeInfo( | 216 var downloadVolumeInfo = this.volumeManager_.getCurrentProfileVolumeInfo( |
212 VolumeManagerCommon.VolumeType.DOWNLOADS); | 217 VolumeManagerCommon.VolumeType.DOWNLOADS); |
213 downloadVolumeInfo.resolveDisplayRoot().then(function(entry) { | 218 downloadVolumeInfo.resolveDisplayRoot().then(function(entry) { |
214 this.dataModel_.fallbackSaveDirectory = entry; | 219 this.dataModel_.fallbackSaveDirectory = entry; |
215 }.bind(this)).catch(function(error) { | 220 }.bind(this)).catch(function(error) { |
216 console.error( | 221 console.error( |
217 'Failed to obtain the fallback directory: ' + (error.stack || error)); | 222 'Failed to obtain the fallback directory: ' + (error.stack || error)); |
218 }); | 223 }); |
219 this.selectionModel_ = new cr.ui.ListSelectionModel(); | 224 this.selectionModel_ = new cr.ui.ListSelectionModel(); |
220 | 225 |
(...skipping 26 matching lines...) Expand all Loading... |
247 * @const | 252 * @const |
248 * @type {number} | 253 * @type {number} |
249 */ | 254 */ |
250 Gallery.MOSAIC_BACKGROUND_INIT_DELAY = 1000; | 255 Gallery.MOSAIC_BACKGROUND_INIT_DELAY = 1000; |
251 | 256 |
252 /** | 257 /** |
253 * Types of metadata Gallery uses (to query the metadata cache). | 258 * Types of metadata Gallery uses (to query the metadata cache). |
254 * @const | 259 * @const |
255 * @type {string} | 260 * @type {string} |
256 */ | 261 */ |
257 Gallery.METADATA_TYPE = 'thumbnail|filesystem|media|drive'; | 262 Gallery.METADATA_TYPE = 'thumbnail|filesystem|media|external'; |
258 | 263 |
259 /** | 264 /** |
260 * Initializes listeners. | 265 * Initializes listeners. |
261 * @private | 266 * @private |
262 */ | 267 */ |
263 Gallery.prototype.initListeners_ = function() { | 268 Gallery.prototype.initListeners_ = function() { |
264 this.keyDownBound_ = this.onKeyDown_.bind(this); | 269 this.keyDownBound_ = this.onKeyDown_.bind(this); |
265 this.document_.body.addEventListener('keydown', this.keyDownBound_); | 270 this.document_.body.addEventListener('keydown', this.keyDownBound_); |
266 | 271 |
267 this.inactivityWatcher_ = new MouseInactivityWatcher( | 272 this.inactivityWatcher_ = new MouseInactivityWatcher( |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 this.volumeManager_, | 379 this.volumeManager_, |
375 this.toggleMode_.bind(this, null)); | 380 this.toggleMode_.bind(this, null)); |
376 | 381 |
377 this.slideMode_ = new SlideMode(this.container_, | 382 this.slideMode_ = new SlideMode(this.container_, |
378 content, | 383 content, |
379 this.toolbar_, | 384 this.toolbar_, |
380 this.prompt_, | 385 this.prompt_, |
381 this.dataModel_, | 386 this.dataModel_, |
382 this.selectionModel_, | 387 this.selectionModel_, |
383 this.context_, | 388 this.context_, |
| 389 this.volumeManager_, |
384 this.toggleMode_.bind(this), | 390 this.toggleMode_.bind(this), |
385 str); | 391 str); |
386 | 392 |
387 this.slideMode_.addEventListener('image-displayed', function() { | 393 this.slideMode_.addEventListener('image-displayed', function() { |
388 cr.dispatchSimpleEvent(this, 'image-displayed'); | 394 cr.dispatchSimpleEvent(this, 'image-displayed'); |
389 }.bind(this)); | 395 }.bind(this)); |
390 this.slideMode_.addEventListener('image-saved', function() { | 396 this.slideMode_.addEventListener('image-saved', function() { |
391 cr.dispatchSimpleEvent(this, 'image-saved'); | 397 cr.dispatchSimpleEvent(this, 'image-saved'); |
392 }.bind(this)); | 398 }.bind(this)); |
393 | 399 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 // Obtains metadata for chunk. | 488 // Obtains metadata for chunk. |
483 var entries = chunk.map(function(chunkItem) { | 489 var entries = chunk.map(function(chunkItem) { |
484 return chunkItem.entry; | 490 return chunkItem.entry; |
485 }); | 491 }); |
486 self.metadataCache_.get(entries, Gallery.METADATA_TYPE, fulfill); | 492 self.metadataCache_.get(entries, Gallery.METADATA_TYPE, fulfill); |
487 }).then(function(metadataList) { | 493 }).then(function(metadataList) { |
488 if (chunk.length !== metadataList.length) | 494 if (chunk.length !== metadataList.length) |
489 return Promise.reject('Failed to load metadata.'); | 495 return Promise.reject('Failed to load metadata.'); |
490 | 496 |
491 // Add items to the model. | 497 // Add items to the model. |
492 var items = chunk.map(function(chunkItem, index) { | 498 var items = []; |
493 var volumeInfo = self.volumeManager_.getVolumeInfo(chunkItem.entry); | 499 chunk.forEach(function(chunkItem, index) { |
| 500 var locationInfo = self.volumeManager_.getLocationInfo(chunkItem.entry); |
| 501 if (!locationInfo) // Skip the item, since gone. |
| 502 return; |
494 var clonedMetadata = MetadataCache.cloneMetadata(metadataList[index]); | 503 var clonedMetadata = MetadataCache.cloneMetadata(metadataList[index]); |
495 return new Gallery.Item( | 504 items.push(new Gallery.Item( |
496 chunkItem.entry, | 505 chunkItem.entry, |
| 506 locationInfo, |
497 clonedMetadata, | 507 clonedMetadata, |
498 self.metadataCache_, | 508 self.metadataCache_, |
499 /* original */ true, | 509 /* original */ true)); |
500 /* readonly */ !!(volumeInfo && volumeInfo.isReadOnly)); | |
501 }); | 510 }); |
502 self.dataModel_.push.apply(self.dataModel_, items); | 511 self.dataModel_.push.apply(self.dataModel_, items); |
503 | 512 |
504 // Apply the selection. | 513 // Apply the selection. |
505 var selectionUpdated = false; | 514 var selectionUpdated = false; |
506 for (var i = 0; i < chunk.length; i++) { | 515 for (var i = 0; i < chunk.length; i++) { |
507 if (!chunk[i].selected) | 516 if (!chunk[i].selected) |
508 continue; | 517 continue; |
509 var index = self.dataModel_.indexOf(items[i]); | 518 var index = self.dataModel_.indexOf(items[i]); |
510 if (index < 0) | 519 if (index < 0) |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
843 this.selectedEntry_ = selectedItem.getEntry(); | 852 this.selectedEntry_ = selectedItem.getEntry(); |
844 selectedEntryURL = this.selectedEntry_.toURL(); | 853 selectedEntryURL = this.selectedEntry_.toURL(); |
845 | 854 |
846 // Update cache. | 855 // Update cache. |
847 selectedItem.touch(); | 856 selectedItem.touch(); |
848 this.dataModel_.evictCache(); | 857 this.dataModel_.evictCache(); |
849 | 858 |
850 // Update the title and the display name. | 859 // Update the title and the display name. |
851 if (numSelectedItems === 1) { | 860 if (numSelectedItems === 1) { |
852 document.title = this.selectedEntry_.name; | 861 document.title = this.selectedEntry_.name; |
853 this.filenameEdit_.disabled = selectedItem.isReadOnly(); | 862 this.filenameEdit_.disabled = selectedItem.getLocationInfo().isReadOnly; |
854 this.filenameEdit_.value = | 863 this.filenameEdit_.value = |
855 ImageUtil.getDisplayNameFromName(this.selectedEntry_.name); | 864 ImageUtil.getDisplayNameFromName(this.selectedEntry_.name); |
856 this.shareButton_.hidden = !selectedItem.isOnDrive(); | 865 this.shareButton_.hidden = !selectedItem.getLocationInfo().isDriveBased; |
857 } else { | 866 } else { |
858 if (this.context_.curDirEntry) { | 867 if (this.context_.curDirEntry) { |
859 // If the Gallery was opened on search results the search query will not | 868 // If the Gallery was opened on search results the search query will not |
860 // be recorded in the app state and the relaunch will just open the | 869 // be recorded in the app state and the relaunch will just open the |
861 // gallery in the curDirEntry directory. | 870 // gallery in the curDirEntry directory. |
862 document.title = this.context_.curDirEntry.name; | 871 document.title = this.context_.curDirEntry.name; |
863 } else { | 872 } else { |
864 document.title = ''; | 873 document.title = ''; |
865 } | 874 } |
866 this.filenameEdit_.disabled = true; | 875 this.filenameEdit_.disabled = true; |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 window.loadTimeData.data = backgroundComponents.stringData; | 1025 window.loadTimeData.data = backgroundComponents.stringData; |
1017 gallery = new Gallery(backgroundComponents.volumeManager); | 1026 gallery = new Gallery(backgroundComponents.volumeManager); |
1018 }; | 1027 }; |
1019 | 1028 |
1020 /** | 1029 /** |
1021 * Loads entries. | 1030 * Loads entries. |
1022 */ | 1031 */ |
1023 window.loadEntries = function(entries, selectedEntries) { | 1032 window.loadEntries = function(entries, selectedEntries) { |
1024 gallery.load(entries, selectedEntries); | 1033 gallery.load(entries, selectedEntries); |
1025 }; | 1034 }; |
OLD | NEW |