OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 cr.define('ntp4', function() { | 5 cr.define('ntp4', function() { |
6 'use strict'; | 6 'use strict'; |
7 | 7 |
8 // We can't pass the currently dragging tile via dataTransfer because of | 8 // We can't pass the currently dragging tile via dataTransfer because of |
9 // http://crbug.com/31037 | 9 // http://crbug.com/31037 |
10 var currentlyDraggingTile = null; | 10 var currentlyDraggingTile = null; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
83 this.style.right = x + 'px'; | 83 this.style.right = x + 'px'; |
84 this.style.top = y + 'px'; | 84 this.style.top = y + 'px'; |
85 }, | 85 }, |
86 | 86 |
87 /** | 87 /** |
88 * The handler for dragstart events fired on |this|. | 88 * The handler for dragstart events fired on |this|. |
89 * @param {Event} e The event for the drag. | 89 * @param {Event} e The event for the drag. |
90 * @private | 90 * @private |
91 */ | 91 */ |
92 onDragStart_: function(e) { | 92 onDragStart_: function(e) { |
93 // TODO(estade): most visited dragging is disabled for now, remove this | |
94 // when it does something useful. | |
95 if (this.querySelector('.most-visited')) { | |
96 e.preventDefault(); | |
97 e.stopPropagation(); | |
98 return; | |
99 } | |
100 | |
101 // The user may start dragging again during a previous drag's finishing | 93 // The user may start dragging again during a previous drag's finishing |
102 // animation. | 94 // animation. |
103 if (this.classList.contains('dragging')) | 95 if (this.classList.contains('dragging')) |
104 this.finalizeDrag_(); | 96 this.finalizeDrag_(); |
105 | 97 |
106 setCurrentlyDraggingTile(this); | 98 setCurrentlyDraggingTile(this); |
107 | 99 |
108 e.dataTransfer.effectAllowed = 'copyMove'; | 100 e.dataTransfer.effectAllowed = 'copyMove'; |
109 // TODO(estade): fill this in. | 101 // TODO(estade): fill this in. |
110 e.dataTransfer.setData('text/plain', 'foo'); | 102 e.dataTransfer.setData('text/plain', 'foo'); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
154 * @param {Event} e The event for the drag. | 146 * @param {Event} e The event for the drag. |
155 * @private | 147 * @private |
156 */ | 148 */ |
157 onDragEnd_: function(e) { | 149 onDragEnd_: function(e) { |
158 // The drag clone can still be hidden from the last drag move event. | 150 // The drag clone can still be hidden from the last drag move event. |
159 this.dragClone.classList.remove('hidden'); | 151 this.dragClone.classList.remove('hidden'); |
160 this.dragClone.classList.add('placing'); | 152 this.dragClone.classList.add('placing'); |
161 | 153 |
162 setCurrentlyDraggingTile(null); | 154 setCurrentlyDraggingTile(null); |
163 | 155 |
164 if (!this.tilePage) { | 156 // tilePage will be null if we've already been removed. |
157 if (this.tilePage) | |
158 this.tilePage.positionTile_(this.index); | |
159 | |
160 // Take an appropriate action with the drag clone. | |
161 if (this.landedOnTrash) { | |
165 this.dragClone.firstChild.classList.add('deleting'); | 162 this.dragClone.firstChild.classList.add('deleting'); |
166 return; | 163 } else if (this.tilePage) { |
164 if (this.tilePage.selected) { | |
165 // The tile's contents may have moved following the respositioning; | |
166 // adjust for that. | |
167 var contentDiffX = this.dragClone.firstChild.offsetLeft - | |
168 this.firstChild.offsetLeft; | |
169 var contentDiffY = this.dragClone.firstChild.offsetTop - | |
170 this.firstChild.offsetTop; | |
171 this.dragClone.style.left = (this.gridX + this.parentNode.offsetLeft - | |
172 contentDiffX) + 'px'; | |
173 this.dragClone.style.top = | |
174 (this.gridY + this.parentNode.getBoundingClientRect().top - | |
175 contentDiffY) + 'px'; | |
176 } else { | |
177 // When we're showing another page and a drag fails or gets cancelled, | |
178 // the tile shrinks to a dot. | |
179 this.dragClone.firstChild.style.webkitTransform = 'scale(0)'; | |
Rick Byers
2011/08/08 15:24:15
shouldn't you really leave this presentation detai
Evan Stade
2011/08/08 18:26:58
Done.
| |
180 } | |
167 } | 181 } |
168 | 182 |
169 this.tilePage.positionTile_(this.index); | 183 this.landedOnTrash = false; |
170 | |
171 if (this.tilePage.selected) { | |
172 // The tile's contents may have moved following the respositioning; | |
173 // adjust for that. | |
174 var contentDiffX = this.dragClone.firstChild.offsetLeft - | |
175 this.firstChild.offsetLeft; | |
176 var contentDiffY = this.dragClone.firstChild.offsetTop - | |
177 this.firstChild.offsetTop; | |
178 this.dragClone.style.left = (this.gridX + this.parentNode.offsetLeft - | |
179 contentDiffX) + 'px'; | |
180 this.dragClone.style.top = | |
181 (this.gridY + this.parentNode.getBoundingClientRect().top - | |
182 contentDiffY) + 'px'; | |
183 } else { | |
184 // When we're showing another page and a drag fails or gets cancelled, | |
185 // the tile shrinks to a dot. | |
186 this.dragClone.firstChild.style.webkitTransform = 'scale(0)'; | |
187 } | |
188 }, | 184 }, |
189 | 185 |
190 /** | 186 /** |
191 * Creates a clone of this node offset by the coordinates. Used for the | 187 * Creates a clone of this node offset by the coordinates. Used for the |
192 * dragging effect where a tile appears to float off one side of the grid | 188 * dragging effect where a tile appears to float off one side of the grid |
193 * and re-appear on the other. | 189 * and re-appear on the other. |
194 * @param {number} x x-axis offset, in pixels. | 190 * @param {number} x x-axis offset, in pixels. |
195 * @param {number} y y-axis offset, in pixels. | 191 * @param {number} y y-axis offset, in pixels. |
196 */ | 192 */ |
197 showDoppleganger: function(x, y) { | 193 showDoppleganger: function(x, y) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
243 */ | 239 */ |
244 finalizeDrag_: function() { | 240 finalizeDrag_: function() { |
245 assert(this.classList.contains('dragging')); | 241 assert(this.classList.contains('dragging')); |
246 | 242 |
247 var clone = this.dragClone; | 243 var clone = this.dragClone; |
248 this.dragClone = null; | 244 this.dragClone = null; |
249 | 245 |
250 clone.parentNode.removeChild(clone); | 246 clone.parentNode.removeChild(clone); |
251 this.eventTracker.remove(clone, 'webkitTransitionEnd'); | 247 this.eventTracker.remove(clone, 'webkitTransitionEnd'); |
252 this.classList.remove('dragging'); | 248 this.classList.remove('dragging'); |
249 if (this.firstChild.finalizeDrag) | |
250 this.firstChild.finalizeDrag(); | |
253 }, | 251 }, |
254 | 252 |
255 /** | 253 /** |
256 * Called when the drag representation node is done migrating to its final | 254 * Called when the drag representation node is done migrating to its final |
257 * resting spot. | 255 * resting spot. |
258 * @param {Event} e The transition end event. | 256 * @param {Event} e The transition end event. |
259 */ | 257 */ |
260 onDragCloneTransitionEnd_: function(e) { | 258 onDragCloneTransitionEnd_: function(e) { |
261 if (this.classList.contains('dragging') && | 259 if (this.classList.contains('dragging') && |
262 (e.propertyName == 'left' || e.propertyName == 'top' || | 260 (e.propertyName == 'left' || e.propertyName == 'top' || |
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
888 * @private | 886 * @private |
889 */ | 887 */ |
890 doDrop: function(e) { | 888 doDrop: function(e) { |
891 e.stopPropagation(); | 889 e.stopPropagation(); |
892 | 890 |
893 var index = this.currentDropIndex_; | 891 var index = this.currentDropIndex_; |
894 // Only change data if this was not a 'null drag'. | 892 // Only change data if this was not a 'null drag'. |
895 if (!((index == this.dragItemIndex_) && this.withinPageDrag_)) { | 893 if (!((index == this.dragItemIndex_) && this.withinPageDrag_)) { |
896 var adjustedIndex = this.currentDropIndex_ + | 894 var adjustedIndex = this.currentDropIndex_ + |
897 (index > this.dragItemIndex_ ? 1 : 0); | 895 (index > this.dragItemIndex_ ? 1 : 0); |
898 if (currentlyDraggingTile) { | 896 if (this.withinPageDrag_) { |
899 var originalPage = currentlyDraggingTile.tilePage; | |
900 this.tileGrid_.insertBefore( | 897 this.tileGrid_.insertBefore( |
901 currentlyDraggingTile, | 898 currentlyDraggingTile, |
902 this.tileElements_[adjustedIndex]); | 899 this.tileElements_[adjustedIndex]); |
900 this.tileMoved(currentlyDraggingTile); | |
901 } else { | |
902 this.addDragData(e.dataTransfer, adjustedIndex); | |
903 currentlyDraggingTile.tilePage.cleanupDrag(); | |
904 } | |
903 | 905 |
904 if (originalPage != this) | 906 // Dropping the icon may cause topMargin to change, but changing it |
905 originalPage.cleanupDrag(); | 907 // now would cause everything to move (annoying), so we leave it |
906 this.tileMoved(currentlyDraggingTile); | 908 // alone. The top margin will be re-calculated next time the window is |
907 | 909 // resized or the page is selected. |
908 // Dropping the icon may cause topMargin to change, but changing it | |
909 // now would cause everything to move (annoying), so we leave it | |
910 // alone. The top margin will be re-calculated next time the window is | |
911 // resized or the page is selected. | |
912 } else { | |
913 this.addOutsideData(e.dataTransfer, adjustedIndex); | |
914 } | |
915 } | 910 } |
916 | 911 |
917 this.classList.remove('animating-tile-page'); | 912 this.classList.remove('animating-tile-page'); |
918 this.cleanupDrag(); | 913 this.cleanupDrag(); |
919 }, | 914 }, |
920 | 915 |
921 /** | 916 /** |
922 * Appends the currently dragged tile to the end of the page. Called | 917 * Appends the currently dragged tile to the end of the page. Called |
923 * from outside the page, e.g. when dropping on a nav dot. | 918 * from outside the page, e.g. when dropping on a nav dot. |
924 */ | 919 */ |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
978 * Checks if a page can accept a drag with the given data. | 973 * Checks if a page can accept a drag with the given data. |
979 * @param {Event} e The drag event if the drag object. Implementations will | 974 * @param {Event} e The drag event if the drag object. Implementations will |
980 * likely want to check |e.dataTransfer|. | 975 * likely want to check |e.dataTransfer|. |
981 * @return {boolean} True if this page can handle the drag. | 976 * @return {boolean} True if this page can handle the drag. |
982 */ | 977 */ |
983 shouldAcceptDrag: function(e) { | 978 shouldAcceptDrag: function(e) { |
984 return false; | 979 return false; |
985 }, | 980 }, |
986 | 981 |
987 /** | 982 /** |
988 * Called to accept a drag drop. | 983 * Called to accept a drag drop. Will not be called for in-page drops. |
989 * @param {Object} dataTransfer The data transfer object that holds the drop | 984 * @param {Object} dataTransfer The data transfer object that holds the drop |
990 * data. | 985 * data. |
991 * @param {number} index The tile index at which the drop occurred. | 986 * @param {number} index The tile index at which the drop occurred. |
992 */ | 987 */ |
993 addOutsideData: function(dataTransfer, index) { | 988 addDragData: function(dataTransfer, index) { |
994 // This should not get called unless there is a non-default | |
995 // implementation. | |
996 assert(false); | 989 assert(false); |
997 }, | 990 }, |
998 | 991 |
999 /** | 992 /** |
1000 * Called when a tile has been moved (via dragging). Override this to make | 993 * Called when a tile has been moved (via dragging). Override this to make |
1001 * backend updates. | 994 * backend updates. |
1002 * @param {Node} draggedTile The tile that was dropped. | 995 * @param {Node} draggedTile The tile that was dropped. |
1003 */ | 996 */ |
1004 tileMoved: function(draggedTile) { | 997 tileMoved: function(draggedTile) { |
1005 }, | 998 }, |
1006 }; | 999 }; |
1007 | 1000 |
1008 return { | 1001 return { |
1009 getCurrentlyDraggingTile: getCurrentlyDraggingTile, | 1002 getCurrentlyDraggingTile: getCurrentlyDraggingTile, |
1010 TilePage: TilePage, | 1003 TilePage: TilePage, |
1011 }; | 1004 }; |
1012 }); | 1005 }); |
OLD | NEW |