Chromium Code Reviews| 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. |
| 165 this.dragClone.firstChild.classList.add('deleting'); | 157 if (this.tilePage) |
| 166 return; | 158 this.tilePage.positionTile_(this.index); |
| 159 | |
| 160 // Take an appropriate action with the drag clone. | |
| 161 if (this.landedOnTrash) { | |
| 162 this.dragClone.classList.add('deleting'); | |
| 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 this.dragClone.classList.add('dropped-on-other-page'); | |
| 178 } | |
| 167 } | 179 } |
| 168 | 180 |
| 169 this.tilePage.positionTile_(this.index); | 181 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 }, | 182 }, |
| 189 | 183 |
| 190 /** | 184 /** |
| 191 * Creates a clone of this node offset by the coordinates. Used for the | 185 * 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 | 186 * dragging effect where a tile appears to float off one side of the grid |
| 193 * and re-appear on the other. | 187 * and re-appear on the other. |
| 194 * @param {number} x x-axis offset, in pixels. | 188 * @param {number} x x-axis offset, in pixels. |
| 195 * @param {number} y y-axis offset, in pixels. | 189 * @param {number} y y-axis offset, in pixels. |
| 196 */ | 190 */ |
| 197 showDoppleganger: function(x, y) { | 191 showDoppleganger: function(x, y) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 243 */ | 237 */ |
| 244 finalizeDrag_: function() { | 238 finalizeDrag_: function() { |
| 245 assert(this.classList.contains('dragging')); | 239 assert(this.classList.contains('dragging')); |
| 246 | 240 |
| 247 var clone = this.dragClone; | 241 var clone = this.dragClone; |
| 248 this.dragClone = null; | 242 this.dragClone = null; |
| 249 | 243 |
| 250 clone.parentNode.removeChild(clone); | 244 clone.parentNode.removeChild(clone); |
| 251 this.eventTracker.remove(clone, 'webkitTransitionEnd'); | 245 this.eventTracker.remove(clone, 'webkitTransitionEnd'); |
| 252 this.classList.remove('dragging'); | 246 this.classList.remove('dragging'); |
| 247 if (this.firstChild.finalizeDrag) | |
| 248 this.firstChild.finalizeDrag(); | |
| 253 }, | 249 }, |
| 254 | 250 |
| 255 /** | 251 /** |
| 256 * Called when the drag representation node is done migrating to its final | 252 * Called when the drag representation node is done migrating to its final |
| 257 * resting spot. | 253 * resting spot. |
| 258 * @param {Event} e The transition end event. | 254 * @param {Event} e The transition end event. |
| 259 */ | 255 */ |
| 260 onDragCloneTransitionEnd_: function(e) { | 256 onDragCloneTransitionEnd_: function(e) { |
| 261 if (this.classList.contains('dragging') && | 257 if (this.classList.contains('dragging') && |
| 262 (e.propertyName == 'left' || e.propertyName == 'top' || | 258 (e.propertyName == 'left' || e.propertyName == 'top' || |
| (...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 888 * @private | 884 * @private |
| 889 */ | 885 */ |
| 890 doDrop: function(e) { | 886 doDrop: function(e) { |
| 891 e.stopPropagation(); | 887 e.stopPropagation(); |
| 892 | 888 |
| 893 var index = this.currentDropIndex_; | 889 var index = this.currentDropIndex_; |
| 894 // Only change data if this was not a 'null drag'. | 890 // Only change data if this was not a 'null drag'. |
| 895 if (!((index == this.dragItemIndex_) && this.withinPageDrag_)) { | 891 if (!((index == this.dragItemIndex_) && this.withinPageDrag_)) { |
| 896 var adjustedIndex = this.currentDropIndex_ + | 892 var adjustedIndex = this.currentDropIndex_ + |
| 897 (index > this.dragItemIndex_ ? 1 : 0); | 893 (index > this.dragItemIndex_ ? 1 : 0); |
| 898 if (currentlyDraggingTile) { | 894 if (this.withinPageDrag_) { |
| 899 var originalPage = currentlyDraggingTile.tilePage; | |
| 900 this.tileGrid_.insertBefore( | 895 this.tileGrid_.insertBefore( |
| 901 currentlyDraggingTile, | 896 currentlyDraggingTile, |
| 902 this.tileElements_[adjustedIndex]); | 897 this.tileElements_[adjustedIndex]); |
| 898 this.tileMoved(currentlyDraggingTile); | |
| 899 } else { | |
| 900 this.addDragData(e.dataTransfer, adjustedIndex); | |
| 901 currentlyDraggingTile.tilePage.cleanupDrag(); | |
| 902 } | |
| 903 | 903 |
| 904 if (originalPage != this) | 904 // Dropping the icon may cause topMargin to change, but changing it |
| 905 originalPage.cleanupDrag(); | 905 // now would cause everything to move (annoying), so we leave it |
| 906 this.tileMoved(currentlyDraggingTile); | 906 // alone. The top margin will be re-calculated next time the window is |
| 907 | 907 // 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 } | 908 } |
| 916 | 909 |
| 917 this.classList.remove('animating-tile-page'); | 910 this.classList.remove('animating-tile-page'); |
| 918 this.cleanupDrag(); | 911 this.cleanupDrag(); |
| 919 }, | 912 }, |
| 920 | 913 |
| 921 /** | 914 /** |
| 922 * Appends the currently dragged tile to the end of the page. Called | 915 * 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. | 916 * from outside the page, e.g. when dropping on a nav dot. |
| 924 */ | 917 */ |
| 925 appendDraggingTile: function() { | 918 appendDraggingTile: function() { |
| 926 var originalPage = currentlyDraggingTile.tilePage; | 919 var originalPage = currentlyDraggingTile.tilePage; |
| 927 if (originalPage == this) | 920 if (originalPage == this) |
| 928 return; | 921 return; |
| 929 | 922 |
| 930 this.tileGrid_.appendChild(currentlyDraggingTile); | 923 this.addDragData(null, this.tileElements_.length - 1); |
|
Rick Byers
2011/08/08 18:37:03
Seems a little ugly that you have to pass null as
Evan Stade
2011/08/08 20:42:55
Done.
| |
| 931 originalPage.cleanupDrag(); | 924 originalPage.cleanupDrag(); |
| 932 this.tileMoved(currentlyDraggingTile); | |
| 933 }, | 925 }, |
| 934 | 926 |
| 935 /** | 927 /** |
| 936 * Makes sure all the tiles are in the right place after a drag is over. | 928 * Makes sure all the tiles are in the right place after a drag is over. |
| 937 * @private | 929 * @private |
| 938 */ | 930 */ |
| 939 cleanupDrag: function() { | 931 cleanupDrag: function() { |
| 940 for (var i = 0; i < this.tileElements_.length; i++) { | 932 for (var i = 0; i < this.tileElements_.length; i++) { |
| 941 // The current drag tile will be positioned in its dragend handler. | 933 // The current drag tile will be positioned in its dragend handler. |
| 942 if (this.tileElements_[i] == currentlyDraggingTile) | 934 if (this.tileElements_[i] == currentlyDraggingTile) |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 978 * Checks if a page can accept a drag with the given data. | 970 * 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 | 971 * @param {Event} e The drag event if the drag object. Implementations will |
| 980 * likely want to check |e.dataTransfer|. | 972 * likely want to check |e.dataTransfer|. |
| 981 * @return {boolean} True if this page can handle the drag. | 973 * @return {boolean} True if this page can handle the drag. |
| 982 */ | 974 */ |
| 983 shouldAcceptDrag: function(e) { | 975 shouldAcceptDrag: function(e) { |
| 984 return false; | 976 return false; |
| 985 }, | 977 }, |
| 986 | 978 |
| 987 /** | 979 /** |
| 988 * Called to accept a drag drop. | 980 * 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 | 981 * @param {Object} dataTransfer The data transfer object that holds the drop |
| 990 * data. | 982 * data. |
| 991 * @param {number} index The tile index at which the drop occurred. | 983 * @param {number} index The tile index at which the drop occurred. |
| 992 */ | 984 */ |
| 993 addOutsideData: function(dataTransfer, index) { | 985 addDragData: function(dataTransfer, index) { |
| 994 // This should not get called unless there is a non-default | |
| 995 // implementation. | |
| 996 assert(false); | 986 assert(false); |
| 997 }, | 987 }, |
| 998 | 988 |
| 999 /** | 989 /** |
| 1000 * Called when a tile has been moved (via dragging). Override this to make | 990 * Called when a tile has been moved (via dragging). Override this to make |
| 1001 * backend updates. | 991 * backend updates. |
| 1002 * @param {Node} draggedTile The tile that was dropped. | 992 * @param {Node} draggedTile The tile that was dropped. |
| 1003 */ | 993 */ |
| 1004 tileMoved: function(draggedTile) { | 994 tileMoved: function(draggedTile) { |
| 1005 }, | 995 }, |
| 1006 }; | 996 }; |
| 1007 | 997 |
| 1008 return { | 998 return { |
| 1009 getCurrentlyDraggingTile: getCurrentlyDraggingTile, | 999 getCurrentlyDraggingTile: getCurrentlyDraggingTile, |
| 1010 TilePage: TilePage, | 1000 TilePage: TilePage, |
| 1011 }; | 1001 }; |
| 1012 }); | 1002 }); |
| OLD | NEW |