OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 * @param {Element} container Content container. | 8 * @param {Element} container Content container. |
9 * @param {cr.ui.ArrayDataModel} dataModel Data model. | 9 * @param {cr.ui.ArrayDataModel} dataModel Data model. |
10 * @param {cr.ui.ListSelectionModel} selectionModel Selection model. | 10 * @param {cr.ui.ListSelectionModel} selectionModel Selection model. |
11 * @param {MetadataCache} metadataCache Metadata cache. | 11 * @param {MetadataCache} metadataCache Metadata cache. |
12 * @param {VolumeManagerWrapper} volumeManager Volume manager. | |
12 * @param {function} toggleMode Function to switch to the Slide mode. | 13 * @param {function} toggleMode Function to switch to the Slide mode. |
13 * @constructor | 14 * @constructor |
14 */ | 15 */ |
15 function MosaicMode( | 16 function MosaicMode( |
16 container, dataModel, selectionModel, metadataCache, toggleMode) { | 17 container, dataModel, selectionModel, metadataCache, volumeManager, |
18 toggleMode) { | |
17 this.mosaic_ = new Mosaic( | 19 this.mosaic_ = new Mosaic( |
18 container.ownerDocument, dataModel, selectionModel, metadataCache); | 20 container.ownerDocument, dataModel, selectionModel, metadataCache, |
21 volumeManager); | |
19 container.appendChild(this.mosaic_); | 22 container.appendChild(this.mosaic_); |
20 | 23 |
21 this.toggleMode_ = toggleMode; | 24 this.toggleMode_ = toggleMode; |
22 this.mosaic_.addEventListener('dblclick', this.toggleMode_); | 25 this.mosaic_.addEventListener('dblclick', this.toggleMode_); |
23 this.showingTimeoutID_ = null; | 26 this.showingTimeoutID_ = null; |
24 } | 27 } |
25 | 28 |
26 /** | 29 /** |
27 * @return {Mosaic} The mosaic control. | 30 * @return {Mosaic} The mosaic control. |
28 */ | 31 */ |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
66 | 69 |
67 //////////////////////////////////////////////////////////////////////////////// | 70 //////////////////////////////////////////////////////////////////////////////// |
68 | 71 |
69 /** | 72 /** |
70 * Mosaic control. | 73 * Mosaic control. |
71 * | 74 * |
72 * @param {Document} document Document. | 75 * @param {Document} document Document. |
73 * @param {cr.ui.ArrayDataModel} dataModel Data model. | 76 * @param {cr.ui.ArrayDataModel} dataModel Data model. |
74 * @param {cr.ui.ListSelectionModel} selectionModel Selection model. | 77 * @param {cr.ui.ListSelectionModel} selectionModel Selection model. |
75 * @param {MetadataCache} metadataCache Metadata cache. | 78 * @param {MetadataCache} metadataCache Metadata cache. |
79 * @param {VolumeManagerWrapper} volumeManager Volume manager. | |
76 * @return {Element} Mosaic element. | 80 * @return {Element} Mosaic element. |
77 * @constructor | 81 * @constructor |
78 */ | 82 */ |
79 function Mosaic(document, dataModel, selectionModel, metadataCache) { | 83 function Mosaic(document, dataModel, selectionModel, metadataCache, |
84 volumeManager) { | |
80 var self = document.createElement('div'); | 85 var self = document.createElement('div'); |
81 Mosaic.decorate(self, dataModel, selectionModel, metadataCache); | 86 Mosaic.decorate( |
87 self, dataModel, selectionModel, metadataCache, volumeManager); | |
82 return self; | 88 return self; |
83 } | 89 } |
84 | 90 |
85 /** | 91 /** |
86 * Inherits from HTMLDivElement. | 92 * Inherits from HTMLDivElement. |
87 */ | 93 */ |
88 Mosaic.prototype.__proto__ = HTMLDivElement.prototype; | 94 Mosaic.prototype.__proto__ = HTMLDivElement.prototype; |
89 | 95 |
90 /** | 96 /** |
91 * Default layout delay in ms. | 97 * Default layout delay in ms. |
(...skipping 10 matching lines...) Expand all Loading... | |
102 */ | 108 */ |
103 Mosaic.ANIMATED_SCROLL_DURATION = 500; | 109 Mosaic.ANIMATED_SCROLL_DURATION = 500; |
104 | 110 |
105 /** | 111 /** |
106 * Decorates a Mosaic instance. | 112 * Decorates a Mosaic instance. |
107 * | 113 * |
108 * @param {Mosaic} self Self pointer. | 114 * @param {Mosaic} self Self pointer. |
109 * @param {cr.ui.ArrayDataModel} dataModel Data model. | 115 * @param {cr.ui.ArrayDataModel} dataModel Data model. |
110 * @param {cr.ui.ListSelectionModel} selectionModel Selection model. | 116 * @param {cr.ui.ListSelectionModel} selectionModel Selection model. |
111 * @param {MetadataCache} metadataCache Metadata cache. | 117 * @param {MetadataCache} metadataCache Metadata cache. |
118 * @param {VolumeManagerWrapper} volumeManager Volume manager. | |
112 */ | 119 */ |
113 Mosaic.decorate = function(self, dataModel, selectionModel, metadataCache) { | 120 Mosaic.decorate = function( |
121 self, dataModel, selectionModel, metadataCache, volumeManager) { | |
114 self.__proto__ = Mosaic.prototype; | 122 self.__proto__ = Mosaic.prototype; |
115 self.className = 'mosaic'; | 123 self.className = 'mosaic'; |
116 | 124 |
117 self.dataModel_ = dataModel; | 125 self.dataModel_ = dataModel; |
118 self.selectionModel_ = selectionModel; | 126 self.selectionModel_ = selectionModel; |
119 self.metadataCache_ = metadataCache; | 127 self.metadataCache_ = metadataCache; |
128 self.volumeManager_ = volumeManager; | |
hirono
2014/01/09 04:05:39
Is this member used?
mtomasz
2014/01/10 01:40:10
Yes, in #149.
| |
120 | 129 |
121 // Initialization is completed lazily on the first call to |init|. | 130 // Initialization is completed lazily on the first call to |init|. |
122 }; | 131 }; |
123 | 132 |
124 /** | 133 /** |
125 * Initializes the mosaic element. | 134 * Initializes the mosaic element. |
126 */ | 135 */ |
127 Mosaic.prototype.init = function() { | 136 Mosaic.prototype.init = function() { |
128 if (this.tiles_) | 137 if (this.tiles_) |
129 return; // Already initialized, nothing to do. | 138 return; // Already initialized, nothing to do. |
130 | 139 |
131 this.layoutModel_ = new Mosaic.Layout(); | 140 this.layoutModel_ = new Mosaic.Layout(); |
132 this.onResize_(); | 141 this.onResize_(); |
133 | 142 |
134 this.selectionController_ = | 143 this.selectionController_ = |
135 new Mosaic.SelectionController(this.selectionModel_, this.layoutModel_); | 144 new Mosaic.SelectionController(this.selectionModel_, this.layoutModel_); |
136 | 145 |
137 this.tiles_ = []; | 146 this.tiles_ = []; |
138 for (var i = 0; i !== this.dataModel_.length; i++) | 147 for (var i = 0; i !== this.dataModel_.length; i++) { |
139 this.tiles_.push(new Mosaic.Tile(this, this.dataModel_.item(i))); | 148 var locationInfo = |
149 this.volumeManager_.getLocationInfo(this.dataModel_.item(i).getEntry()); | |
150 this.tiles_.push( | |
151 new Mosaic.Tile(this, this.dataModel_.item(i), locationInfo)); | |
152 } | |
140 | 153 |
141 this.selectionModel_.selectedIndexes.forEach(function(index) { | 154 this.selectionModel_.selectedIndexes.forEach(function(index) { |
142 this.tiles_[index].select(true); | 155 this.tiles_[index].select(true); |
143 }.bind(this)); | 156 }.bind(this)); |
144 | 157 |
145 this.initTiles_(this.tiles_); | 158 this.initTiles_(this.tiles_); |
146 | 159 |
147 // The listeners might be called while some tiles are still loading. | 160 // The listeners might be called while some tiles are still loading. |
148 this.initListeners_(); | 161 this.initListeners_(); |
149 }; | 162 }; |
(...skipping 1465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1615 } | 1628 } |
1616 }; | 1629 }; |
1617 | 1630 |
1618 //////////////////////////////////////////////////////////////////////////////// | 1631 //////////////////////////////////////////////////////////////////////////////// |
1619 | 1632 |
1620 /** | 1633 /** |
1621 * A single tile of the image mosaic. | 1634 * A single tile of the image mosaic. |
1622 * | 1635 * |
1623 * @param {Element} container Container element. | 1636 * @param {Element} container Container element. |
1624 * @param {Gallery.Item} item Gallery item associated with this tile. | 1637 * @param {Gallery.Item} item Gallery item associated with this tile. |
1638 * @param {EntryLocation} locationInfo Location information for the tile. | |
hirono
2014/01/09 04:05:39
How about passing hidpiEmbedded flag instead of lo
mtomasz
2014/01/10 01:40:10
I was thinking about it. This would limit dependen
hirono
2014/01/10 03:18:23
So how about getting the flag in the constructor o
| |
1625 * @return {Element} The new tile element. | 1639 * @return {Element} The new tile element. |
1626 * @constructor | 1640 * @constructor |
1627 */ | 1641 */ |
1628 Mosaic.Tile = function(container, item) { | 1642 Mosaic.Tile = function(container, item, locationInfo) { |
1629 var self = container.ownerDocument.createElement('div'); | 1643 var self = container.ownerDocument.createElement('div'); |
1630 Mosaic.Tile.decorate(self, container, item); | 1644 Mosaic.Tile.decorate(self, container, item, locationInfo); |
1631 return self; | 1645 return self; |
1632 }; | 1646 }; |
1633 | 1647 |
1634 /** | 1648 /** |
1635 * @param {Element} self Self pointer. | 1649 * @param {Element} self Self pointer. |
1636 * @param {Element} container Container element. | 1650 * @param {Element} container Container element. |
1637 * @param {Gallery.Item} item Gallery item associated with this tile. | 1651 * @param {Gallery.Item} item Gallery item associated with this tile. |
1652 * @param {EntryLocation} locationInfo Location info for the tile image. | |
1638 */ | 1653 */ |
1639 Mosaic.Tile.decorate = function(self, container, item) { | 1654 Mosaic.Tile.decorate = function(self, container, item, locationInfo) { |
1640 self.__proto__ = Mosaic.Tile.prototype; | 1655 self.__proto__ = Mosaic.Tile.prototype; |
1641 self.className = 'mosaic-tile'; | 1656 self.className = 'mosaic-tile'; |
1642 | 1657 |
1643 self.container_ = container; | 1658 self.container_ = container; |
1644 self.item_ = item; | 1659 self.item_ = item; |
1660 self.locationInfo_ = locationInfo; | |
1645 self.left_ = null; // Mark as not laid out. | 1661 self.left_ = null; // Mark as not laid out. |
1646 }; | 1662 }; |
1647 | 1663 |
1648 /** | 1664 /** |
1649 * Load mode for the tile's image. | 1665 * Load mode for the tile's image. |
1650 * @enum {number} | 1666 * @enum {number} |
1651 */ | 1667 */ |
1652 Mosaic.Tile.LoadMode = { | 1668 Mosaic.Tile.LoadMode = { |
1653 LOW_DPI: 0, | 1669 LOW_DPI: 0, |
1654 HIGH_DPI: 1 | 1670 HIGH_DPI: 1 |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1770 * @param {function()} onImageMeasured Image measured callback. | 1786 * @param {function()} onImageMeasured Image measured callback. |
1771 */ | 1787 */ |
1772 Mosaic.Tile.prototype.init = function(metadata, onImageMeasured) { | 1788 Mosaic.Tile.prototype.init = function(metadata, onImageMeasured) { |
1773 this.markUnloaded(); | 1789 this.markUnloaded(); |
1774 this.left_ = null; // Mark as not laid out. | 1790 this.left_ = null; // Mark as not laid out. |
1775 | 1791 |
1776 // Set higher priority for the selected elements to load them first. | 1792 // Set higher priority for the selected elements to load them first. |
1777 var priority = this.getAttribute('selected') ? 2 : 3; | 1793 var priority = this.getAttribute('selected') ? 2 : 3; |
1778 | 1794 |
1779 // Use embedded thumbnails on Drive, since they have higher resolution. | 1795 // Use embedded thumbnails on Drive, since they have higher resolution. |
1780 // TODO(mtomasz): Use Entry instead of paths. | 1796 var hidpiEmbedded = this.locationInfo_ && this.locationInfo_.isDriveBased; |
1781 var hidpiEmbedded = | |
1782 PathUtil.isDriveBasedPath(this.getItem().getEntry().fullPath); | |
1783 this.thumbnailLoader_ = new ThumbnailLoader( | 1797 this.thumbnailLoader_ = new ThumbnailLoader( |
1784 this.getItem().getEntry(), | 1798 this.getItem().getEntry(), |
1785 ThumbnailLoader.LoaderType.CANVAS, | 1799 ThumbnailLoader.LoaderType.CANVAS, |
1786 metadata, | 1800 metadata, |
1787 undefined, // Media type. | 1801 undefined, // Media type. |
1788 hidpiEmbedded ? ThumbnailLoader.UseEmbedded.USE_EMBEDDED : | 1802 hidpiEmbedded ? ThumbnailLoader.UseEmbedded.USE_EMBEDDED : |
1789 ThumbnailLoader.UseEmbedded.NO_EMBEDDED, | 1803 ThumbnailLoader.UseEmbedded.NO_EMBEDDED, |
1790 priority); | 1804 priority); |
1791 | 1805 |
1792 // If no hidpi embedded thumbnail available, then use the low resolution | 1806 // If no hidpi embedded thumbnail available, then use the low resolution |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2005 return new Rect(this.left_ - this.container_.scrollLeft, this.top_, | 2019 return new Rect(this.left_ - this.container_.scrollLeft, this.top_, |
2006 this.width_, this.height_).inflate(-margin, -margin); | 2020 this.width_, this.height_).inflate(-margin, -margin); |
2007 }; | 2021 }; |
2008 | 2022 |
2009 /** | 2023 /** |
2010 * @return {number} X coordinate of the tile center. | 2024 * @return {number} X coordinate of the tile center. |
2011 */ | 2025 */ |
2012 Mosaic.Tile.prototype.getCenterX = function() { | 2026 Mosaic.Tile.prototype.getCenterX = function() { |
2013 return this.left_ + Math.round(this.width_ / 2); | 2027 return this.left_ + Math.round(this.width_ / 2); |
2014 }; | 2028 }; |
OLD | NEW |