Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Unified Diff: ui/file_manager/gallery/js/gallery_data_model.js

Issue 838993002: Gallery: Split GalleryDataModel from gallery.js. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix the year. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/file_manager/gallery/js/gallery.js ('k') | ui/file_manager/gallery/js/gallery_data_model_unittest.html » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/file_manager/gallery/js/gallery_data_model.js
diff --git a/ui/file_manager/gallery/js/gallery_data_model.js b/ui/file_manager/gallery/js/gallery_data_model.js
new file mode 100644
index 0000000000000000000000000000000000000000..45afe8d9bd44e169d6fa4428ebc5e4bc1fb10ce3
--- /dev/null
+++ b/ui/file_manager/gallery/js/gallery_data_model.js
@@ -0,0 +1,148 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * Data model for gallery.
+ *
+ * @param {!MetadataCache} metadataCache Metadata cache.
+ * @param {!EntryListWatcher=} opt_watcher Entry list watcher.
+ * @constructor
+ * @extends {cr.ui.ArrayDataModel}
+ */
+function GalleryDataModel(metadataCache, opt_watcher) {
+ cr.ui.ArrayDataModel.call(this, []);
+
+ /**
+ * Metadata cache.
+ * @type {!MetadataCache}
+ * @private
+ */
+ this.metadataCache_ = metadataCache;
+
+ /**
+ * Directory where the image is saved if the image is located in a read-only
+ * volume.
+ * @type {DirectoryEntry}
+ */
+ this.fallbackSaveDirectory = null;
+
+ // Start to watch file system entries.
+ var watcher = opt_watcher ? opt_watcher : new EntryListWatcher(this);
+ watcher.getEntry = function(item) { return item.getEntry(); };
+}
+
+/**
+ * Maximum number of full size image cache.
+ * @type {number}
+ * @const
+ * @private
+ */
+GalleryDataModel.MAX_FULL_IMAGE_CACHE_ = 3;
+
+/**
+ * Maximum number of screen size image cache.
+ * @type {number}
+ * @const
+ * @private
+ */
+GalleryDataModel.MAX_SCREEN_IMAGE_CACHE_ = 5;
+
+GalleryDataModel.prototype = {
+ __proto__: cr.ui.ArrayDataModel.prototype
+};
+
+/**
+ * Saves new image.
+ *
+ * @param {!VolumeManager} volumeManager Volume manager instance.
+ * @param {!Gallery.Item} item Original gallery item.
+ * @param {!HTMLCanvasElement} canvas Canvas containing new image.
+ * @param {boolean} overwrite Whether to overwrite the image to the item or not.
+ * @return {!Promise} Promise to be fulfilled with when the operation completes.
+ */
+GalleryDataModel.prototype.saveItem = function(
+ volumeManager, item, canvas, overwrite) {
+ var oldEntry = item.getEntry();
+ var oldMetadata = item.getMetadata();
+ var oldLocationInfo = item.getLocationInfo();
+ return new Promise(function(fulfill, reject) {
+ item.saveToFile(
+ volumeManager,
+ this.fallbackSaveDirectory,
+ overwrite,
+ canvas,
+ function(success) {
+ if (!success) {
+ reject('Failed to save the image.');
+ return;
+ }
+
+ // Current entry is updated.
+ // Dispatch an event.
+ var event = new Event('content');
+ event.item = item;
+ event.oldEntry = oldEntry;
+ event.metadata = item.getMetadata();
+ this.dispatchEvent(event);
+
+ if (!util.isSameEntry(oldEntry, item.getEntry())) {
+ // New entry is added and the item now tracks it.
+ // Add another item for the old entry.
+ var anotherItem = new Gallery.Item(
+ oldEntry,
+ oldLocationInfo,
+ oldMetadata,
+ this.metadataCache_,
+ item.isOriginal());
+ // The item must be added behind the existing item so that it does
+ // not change the index of the existing item.
+ // TODO(hirono): Update the item index of the selection model
+ // correctly.
+ this.splice(this.indexOf(item) + 1, 0, anotherItem);
+ }
+
+ fulfill();
+ }.bind(this));
+ }.bind(this));
+};
+
+/**
+ * Evicts image caches in the items.
+ */
+GalleryDataModel.prototype.evictCache = function() {
+ // Sort the item by the last accessed date.
+ var sorted = this.slice().sort(function(a, b) {
+ return b.getLastAccessedDate() - a.getLastAccessedDate();
+ });
+
+ // Evict caches.
+ var contentCacheCount = 0;
+ var screenCacheCount = 0;
+ for (var i = 0; i < sorted.length; i++) {
+ if (sorted[i].contentImage) {
+ if (++contentCacheCount > GalleryDataModel.MAX_FULL_IMAGE_CACHE_) {
+ if (sorted[i].contentImage.parentNode) {
+ console.error('The content image has a parent node.');
+ } else {
+ // Force to free the buffer of the canvas by assigning zero size.
+ sorted[i].contentImage.width = 0;
+ sorted[i].contentImage.height = 0;
+ sorted[i].contentImage = null;
+ }
+ }
+ }
+ if (sorted[i].screenImage) {
+ if (++screenCacheCount > GalleryDataModel.MAX_SCREEN_IMAGE_CACHE_) {
+ if (sorted[i].screenImage.parentNode) {
+ console.error('The screen image has a parent node.');
+ } else {
+ // Force to free the buffer of the canvas by assigning zero size.
+ sorted[i].screenImage.width = 0;
+ sorted[i].screenImage.height = 0;
+ sorted[i].screenImage = null;
+ }
+ }
+ }
+ }
+};
« no previous file with comments | « ui/file_manager/gallery/js/gallery.js ('k') | ui/file_manager/gallery/js/gallery_data_model_unittest.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698