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

Side by Side Diff: chrome/browser/resources/ntp4/tile_page.js

Issue 8637001: [NTP4] Auto-deletion of empty apps panes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebasing rbyers and csilv's changes Created 9 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 */ 283 */
284 onDragCloneTransitionEnd_: function(e) { 284 onDragCloneTransitionEnd_: function(e) {
285 if (this.classList.contains('dragging') && 285 if (this.classList.contains('dragging') &&
286 (e.propertyName == 'left' || e.propertyName == 'top' || 286 (e.propertyName == 'left' || e.propertyName == 'top' ||
287 e.propertyName == '-webkit-transform')) { 287 e.propertyName == '-webkit-transform')) {
288 this.finalizeDrag_(); 288 this.finalizeDrag_();
289 } 289 }
290 }, 290 },
291 291
292 /** 292 /**
293 * Called when an app is removed from Chrome. Animates its disappearance. 293 * Called when a tile is removed from a tilePage. Animates its disappearance
294 * if |opt_animate| is truthy.
295 * @param {=boolean} opt_animate Whether the removal should be animated.
296 * @param {=boolean} opt_dontDelete Whether we should auto-delete an empty
297 * apps page if the last tile is removed.
298 * @return {Element} The tile being removed.
294 */ 299 */
295 doRemove: function() { 300 remove: function(opt_animate, opt_dontDelete) {
296 this.firstChild.classList.add('removing-tile-contents'); 301 var owningPage = this.tilePage;
302 if (opt_animate)
303 owningPage.classList.add('animating-tile-page');
304 this.parentNode.removeChild(this);
305 owningPage.calculateLayoutValues_();
306 owningPage.cleanupDrag();
307 if (owningPage instanceof ntp4.AppsPage && !opt_dontDelete)
Evan Stade 2011/12/02 00:53:24 don't do this, use inheritance or whatever (same a
Dan Beam 2011/12/02 01:25:11 So do something like .removeIfEmpty() on TilePage
Evan Stade 2011/12/02 02:39:49 no, I just meant in this context. Superclass is no
Dan Beam 2011/12/05 18:07:13 Done. (still ironing out the issues with this smal
308 ntp4.removeAppsPageIfEmpty(owningPage, opt_animate);
309 return this;
297 }, 310 },
298 311
299 /** 312 /**
300 * Callback for the webkitAnimationEnd event on the tile's contents. 313 * Callback for the webkitAnimationEnd event on the tile's contents.
301 * @param {Event} e The event object. 314 * @param {Event} e The event object.
302 */ 315 */
303 onContentsAnimationEnd_: function(e) { 316 onContentsAnimationEnd_: function(e) {
304 if (this.firstChild.classList.contains('new-tile-contents')) 317 if (this.firstChild.classList.contains('new-tile-contents'))
305 this.firstChild.classList.remove('new-tile-contents'); 318 this.firstChild.classList.remove('new-tile-contents');
306 if (this.firstChild.classList.contains('removing-tile-contents')) 319 if (this.firstChild.classList.contains('removing-tile-contents'))
307 this.tilePage.removeTile(this, true); 320 this.remove(true);
308 }, 321 },
309 }; 322 };
310 323
311 /** 324 /**
312 * Gives the proportion of the row width that is devoted to a single icon. 325 * Gives the proportion of the row width that is devoted to a single icon.
313 * @param {number} rowTileCount The number of tiles in a row. 326 * @param {number} rowTileCount The number of tiles in a row.
314 * @param {number} tileSpacingFraction The proportion of the tile width which 327 * @param {number} tileSpacingFraction The proportion of the tile width which
315 * will be used as spacing between tiles. 328 * will be used as spacing between tiles.
316 * @return {number} The ratio between icon width and row width. 329 * @return {number} The ratio between icon width and row width.
317 */ 330 */
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 /** 504 /**
492 * Returns any extra padding to insert to the bottom of a tile page. By 505 * Returns any extra padding to insert to the bottom of a tile page. By
493 * default there is none, but subclasses can override. 506 * default there is none, but subclasses can override.
494 * @type {number} 507 * @type {number}
495 */ 508 */
496 get extraBottomPadding() { 509 get extraBottomPadding() {
497 return 0; 510 return 0;
498 }, 511 },
499 512
500 /** 513 /**
514 * Removes the tilePage from the DOM and cleans up event handlers.
515 */
516 remove: function() {
517 // This checks arguments.length as most remove functions have a boolean
518 // |opt_animate| argument, but that's not necesarilly applicable to
519 // removing a tilePage. Selecting a different card in an animated way and
520 // deleting the card afterward is probably a better choice.
521 assert(typeof arguments[0] != 'boolean',
522 'This function takes no |opt_animate| argument.');
523 assert(this.tileCount == 0, 'Only removal of an empty page is allowed.');
524 this.tearDown_();
525 this.parentNode.removeChild(this);
526 },
527
528 /**
501 * Cleans up resources that are no longer needed after this TilePage 529 * Cleans up resources that are no longer needed after this TilePage
502 * instance is removed from the DOM. 530 * instance is removed from the DOM.
531 * @private
503 */ 532 */
504 tearDown: function() { 533 tearDown_: function() {
505 this.eventTracker.removeAll(); 534 this.eventTracker.removeAll();
506 }, 535 },
507 536
508 /** 537 /**
509 * Appends a tile to the end of the tile grid. 538 * Appends a tile to the end of the tile grid.
510 * @param {HTMLElement} tileElement The contents of the tile. 539 * @param {HTMLElement} tileElement The contents of the tile.
511 * @param {?boolean} animate If true, the append will be animated. 540 * @param {?boolean} animate If true, the append will be animated.
512 * @protected 541 * @protected
513 */ 542 */
514 appendTile: function(tileElement, animate) { 543 appendTile: function(tileElement, animate) {
(...skipping 19 matching lines...) Expand all
534 this.tileGrid_.insertBefore(wrapperDiv, 563 this.tileGrid_.insertBefore(wrapperDiv,
535 this.tileElements_[index]); 564 this.tileElements_[index]);
536 } 565 }
537 this.calculateLayoutValues_(); 566 this.calculateLayoutValues_();
538 this.heightChanged_(); 567 this.heightChanged_();
539 568
540 this.positionTile_(index); 569 this.positionTile_(index);
541 }, 570 },
542 571
543 /** 572 /**
544 * Removes the given tile and animates the respositioning of the other
545 * tiles.
546 * @param {HTMLElement} tile The tile to remove from |tileGrid_|.
547 * @param {?boolean} animate If true, remaining tiles will animate.
548 */
549 removeTile: function(tile, animate) {
550 if (animate)
551 this.classList.add('animating-tile-page');
552 var index = tile.index;
553 tile.parentNode.removeChild(tile);
554 this.calculateLayoutValues_();
555 this.cleanupDrag();
556 },
557
558 /**
559 * Removes all tiles from the page. 573 * Removes all tiles from the page.
560 */ 574 */
561 removeAllTiles: function() { 575 removeAllTiles: function() {
562 this.tileGrid_.innerHTML = ''; 576 this.tileGrid_.innerHTML = '';
563 }, 577 },
564 578
565 /** 579 /**
566 * Called when the page is selected (in the card selector). 580 * Called when the page is selected (in the card selector).
567 * @param {Event} e A custom cardselected event. 581 * @param {Event} e A custom cardselected event.
568 * @private 582 * @private
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after
1111 (index > this.dragItemIndex_ ? 1 : 0); 1125 (index > this.dragItemIndex_ ? 1 : 0);
1112 if (this.withinPageDrag_) { 1126 if (this.withinPageDrag_) {
1113 this.tileGrid_.insertBefore( 1127 this.tileGrid_.insertBefore(
1114 currentlyDraggingTile, 1128 currentlyDraggingTile,
1115 this.tileElements_[adjustedIndex]); 1129 this.tileElements_[adjustedIndex]);
1116 this.tileMoved(currentlyDraggingTile, this.dragItemIndex_); 1130 this.tileMoved(currentlyDraggingTile, this.dragItemIndex_);
1117 } else { 1131 } else {
1118 var originalPage = currentlyDraggingTile ? 1132 var originalPage = currentlyDraggingTile ?
1119 currentlyDraggingTile.tilePage : null; 1133 currentlyDraggingTile.tilePage : null;
1120 this.addDragData(e.dataTransfer, adjustedIndex); 1134 this.addDragData(e.dataTransfer, adjustedIndex);
1121 if (originalPage) 1135 if (originalPage) {
1122 originalPage.cleanupDrag(); 1136 originalPage.cleanupDrag();
1137 if (originalPage instanceof ntp4.AppsPage)
1138 ntp4.removeAppsPageIfEmpty(originalPage, true);
1139 }
1123 } 1140 }
1124 1141
1125 // Dropping the icon may cause topMargin to change, but changing it 1142 // Dropping the icon may cause topMargin to change, but changing it
1126 // now would cause everything to move (annoying), so we leave it 1143 // now would cause everything to move (annoying), so we leave it
1127 // alone. The top margin will be re-calculated next time the window is 1144 // alone. The top margin will be re-calculated next time the window is
1128 // resized or the page is selected. 1145 // resized or the page is selected.
1129 } 1146 }
1130 1147
1131 this.classList.remove('animating-tile-page'); 1148 this.classList.remove('animating-tile-page');
1132 this.cleanupDrag(); 1149 this.cleanupDrag();
1133 }, 1150 },
1134 1151
1135 /** 1152 /**
1136 * Appends the currently dragged tile to the end of the page. Called 1153 * Appends the currently dragged tile to the end of the page. Called
1137 * from outside the page, e.g. when dropping on a nav dot. 1154 * from outside the page, e.g. when dropping on a nav dot.
1138 */ 1155 */
1139 appendDraggingTile: function() { 1156 appendDraggingTile: function() {
1140 var originalPage = currentlyDraggingTile.tilePage; 1157 var originalPage = currentlyDraggingTile.tilePage;
1141 if (originalPage == this) 1158 if (originalPage == this)
1142 return; 1159 return;
1143 1160
1144 this.addDragData(null, this.tileElements_.length); 1161 this.addDragData(null, this.tileElements_.length);
1145 originalPage.cleanupDrag(); 1162 if (originalPage instanceof ntp4.AppsPage)
1163 ntp4.removeAppsPageIfEmpty(originalPage, true);
1164 if (originalPage)
1165 originalPage.cleanupDrag();
1146 }, 1166 },
1147 1167
1148 /** 1168 /**
1149 * Makes sure all the tiles are in the right place after a drag is over. 1169 * Makes sure all the tiles are in the right place after a drag is over.
1150 */ 1170 */
1151 cleanupDrag: function() { 1171 cleanupDrag: function() {
1152 this.repositionTiles_(currentlyDraggingTile); 1172 this.repositionTiles_(currentlyDraggingTile);
1153 // Remove the drag mask. 1173 // Remove the drag mask.
1154 this.updateMask_(); 1174 this.updateMask_();
1155 }, 1175 },
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1230 assert(false); 1250 assert(false);
1231 }, 1251 },
1232 }; 1252 };
1233 1253
1234 return { 1254 return {
1235 getCurrentlyDraggingTile: getCurrentlyDraggingTile, 1255 getCurrentlyDraggingTile: getCurrentlyDraggingTile,
1236 setCurrentDropEffect: setCurrentDropEffect, 1256 setCurrentDropEffect: setCurrentDropEffect,
1237 TilePage: TilePage, 1257 TilePage: TilePage,
1238 }; 1258 };
1239 }); 1259 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698