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

Unified Diff: chrome/browser/resources/ntp_search/tile_page.js

Issue 10829131: Refactoring NTP5: new implementation of TilePage and MostVisitedPage (which now inherits from Thumb… (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years, 5 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
Index: chrome/browser/resources/ntp_search/tile_page.js
diff --git a/chrome/browser/resources/ntp_search/tile_page.js b/chrome/browser/resources/ntp_search/tile_page.js
index 924600e3bf2a45a23914cfbc594aec9e53e85cb3..136f8c46d969d88897cb27ab89709065606dd8ab 100644
--- a/chrome/browser/resources/ntp_search/tile_page.js
+++ b/chrome/browser/resources/ntp_search/tile_page.js
@@ -5,8 +5,58 @@
cr.define('ntp', function() {
'use strict';
+
+ function Tile(gridValues) {
+ throw 'Tile is a virtual class and is not supposed to be instantiated';
+ }
+
+ Tile.subclass = function(Subclass) {
+ var Base = Tile.prototype;
+ for (var name in Base) {
+ if (!Subclass.hasOwnProperty(name)) {
+ Subclass[name] = Base[name];
+ }
+ }
+ for (var name in TileGetters) {
+ if (!Subclass.hasOwnProperty(name)) {
+ Subclass.__defineGetter__(name, TileGetters[name]);
+ }
+ }
+ return Subclass;
+ };
+
+ Tile.prototype = {
+ initialize: function(gridValues) {
+ // TODO: rename to tile
+ this.className = 'tile-content ' + gridValues.tileClassName;
+
+ // TODO set using CSS?
+ if (gridValues.reinforceStyles) {
+ var style = this.style;
+ style.width = gridValues.tileWidth + 'px';
+ style.height = gridValues.tileHeight + 'px';
+ style.borderWidth = gridValues.tileBorderWidth + 'px';
+ }
+ },
+
+ tearDown_: function() {
+ },
+ };
+
+ var TileGetters = {
+ 'tile': function() {
+ return findAncestorByClass(this, 'tile-cell');
+ },
+ 'index': function() {
+ return this.tile.index;
+ }
+ };
+
+
+
// We can't pass the currently dragging tile via dataTransfer because of
// http://crbug.com/31037
+ // TODO(xci) drag
var currentlyDraggingTile = null;
function getCurrentlyDraggingTile() {
return currentlyDraggingTile;
@@ -26,6 +76,7 @@ cr.define('ntp', function() {
* @param {DataTransfer} dataTransfer A dataTransfer object from a drag event.
* @param {string} effect A drop effect to change to (i.e. copy, move, none).
*/
+ // TODO(xci) drag
function setCurrentDropEffect(dataTransfer, effect) {
dataTransfer.dropEffect = effect;
if (currentlyDraggingTile)
@@ -33,68 +84,57 @@ cr.define('ntp', function() {
}
/**
- * Creates a new Tile object. Tiles wrap content on a TilePage, providing
+ * Creates a new TileCell object. Tiles wrap content on a TilePage, providing
* some styling and drag functionality.
* @constructor
* @extends {HTMLDivElement}
*/
- function Tile(contents) {
- var tile = cr.doc.createElement('div');
- tile.__proto__ = Tile.prototype;
- tile.initialize(contents);
+ function TileCell(tile, gridValues) {
jeremycho_google 2012/08/02 00:19:11 Since we're planning to remove drag functionality,
pedrosimonetti2 2012/08/03 18:14:12 No, we need TileCell class because it will handle
+ var tileCell = cr.doc.createElement('div');
+ tileCell.__proto__ = TileCell.prototype;
+ tileCell.initialize(tile, gridValues);
- return tile;
+ return tileCell;
}
- Tile.prototype = {
+ TileCell.prototype = {
__proto__: HTMLDivElement.prototype,
- initialize: function(contents) {
+ initialize: function(tile, gridValues) {
// 'real' as opposed to doppleganger.
- this.className = 'tile real';
- this.appendChild(contents);
- contents.tile = this;
-
- this.addEventListener('dragstart', this.onDragStart_);
- this.addEventListener('drag', this.onDragMove_);
- this.addEventListener('dragend', this.onDragEnd_);
-
- this.firstChild.addEventListener(
- 'webkitAnimationEnd', this.onContentsAnimationEnd_.bind(this));
+ // TODO: rename to tile-cell
jeremycho_google 2012/08/02 00:19:11 Delete?
pedrosimonetti2 2012/08/03 18:14:12 Done.
+ this.className = 'tile-cell real';
+
+ if (gridValues.reinforceStyles) {
+ var style = this.style;
+ var borderWidth = 2 * gridValues.tileBorderWidth;
+ style.width = gridValues.tileWidth + borderWidth + 'px';
+ style.height = gridValues.tileHeight + borderWidth + 'px';
+ style.marginLeft = gridValues.tileHorMargin + 'px';
jeremycho_google 2012/08/02 00:19:11 i88n?
pedrosimonetti2 2012/08/03 18:14:12 What do you mean here? On 2012/08/02 00:19:11, je
+ style.marginBottom = gridValues.tileVerMargin + 'px';
+ }
- this.eventTracker = new EventTracker();
+ this.assign_(tile);
},
get index() {
- return Array.prototype.indexOf.call(this.tilePage.tileElements_, this);
+ return Array.prototype.indexOf.call(this.tilePage.tileElements_,
+ this.firstChild);
},
get tilePage() {
return findAncestorByClass(this, 'tile-page');
},
- /**
- * Position the tile at |x, y|, and store this as the grid location, i.e.
- * where the tile 'belongs' when it's not being dragged.
- * @param {number} x The x coordinate, in pixels.
- * @param {number} y The y coordinate, in pixels.
- */
- setGridPosition: function(x, y) {
- this.gridX = x;
- this.gridY = y;
- this.moveTo(x, y);
+ assign_: function(tile) {
+ if (this.firstChild) {
+ this.replaceChild(tile, this.firstChild);
+ } else {
+ this.appendChild(tile);
+ }
},
- /**
- * Position the tile at |x, y|.
- * @param {number} x The x coordinate, in pixels.
- * @param {number} y The y coordinate, in pixels.
- */
- moveTo: function(x, y) {
- // left overrides right in LTR, and right takes precedence in RTL.
- this.style.left = toCssPx(x);
- this.style.right = toCssPx(x);
- this.style.top = toCssPx(y);
+ tearDown_: function() {
},
/**
@@ -102,6 +142,7 @@ cr.define('ntp', function() {
* @param {Event} e The event for the drag.
* @private
*/
+ // TODO(xci) drag
onDragStart_: function(e) {
// The user may start dragging again during a previous drag's finishing
// animation.
@@ -141,6 +182,7 @@ cr.define('ntp', function() {
* @param {Event} e The event for the drag.
* @private
*/
+ // TODO(xci) drag
onDragMove_: function(e) {
if (e.view != window || (e.x == 0 && e.y == 0)) {
this.dragClone.hidden = true;
@@ -157,6 +199,7 @@ cr.define('ntp', function() {
* @param {Event} e The event for the drag.
* @private
*/
+ // TODO(xci) drag
onDragEnd_: function(e) {
this.dragClone.hidden = false;
this.dragClone.classList.add('placing');
@@ -166,7 +209,7 @@ cr.define('ntp', function() {
// tilePage will be null if we've already been removed.
var tilePage = this.tilePage;
if (tilePage)
- tilePage.positionTile_(this.index);
+ //tilePage.positionTile_(this.index); // TODO(xci) function was deleted!
// Take an appropriate action with the drag clone.
if (this.landedOnTrash) {
@@ -219,6 +262,7 @@ cr.define('ntp', function() {
* @param {number} x x-axis offset, in pixels.
* @param {number} y y-axis offset, in pixels.
*/
+ // TODO(xci) drag
showDoppleganger: function(x, y) {
// We always have to clear the previous doppleganger to make sure we get
// style updates for the contents of this tile.
@@ -245,6 +289,7 @@ cr.define('ntp', function() {
/**
* Destroys the current doppleganger.
*/
+ // TODO(xci) drag
clearDoppleganger: function() {
if (this.doppleganger_) {
this.removeChild(this.doppleganger_);
@@ -256,6 +301,7 @@ cr.define('ntp', function() {
* Returns status of doppleganger.
* @return {boolean} True if there is a doppleganger showing for |this|.
*/
+ // TODO(xci) drag
hasDoppleganger: function() {
return !!this.doppleganger_;
},
@@ -266,6 +312,7 @@ cr.define('ntp', function() {
* the next drag starts (if the user starts a 2nd drag very quickly).
* @private
*/
+ // TODO(xci) drag
finalizeDrag_: function() {
assert(this.classList.contains('dragging'));
@@ -284,6 +331,7 @@ cr.define('ntp', function() {
* resting spot.
* @param {Event} e The transition end event.
*/
+ // TODO(xci) drag
onDragCloneTransitionEnd_: function(e) {
if (this.classList.contains('dragging') &&
(e.propertyName == 'left' || e.propertyName == 'top' ||
@@ -316,43 +364,6 @@ cr.define('ntp', function() {
};
/**
- * Gives the proportion of the row width that is devoted to a single icon.
- * @param {number} rowTileCount The number of tiles in a row.
- * @param {number} tileSpacingFraction The proportion of the tile width which
- * will be used as spacing between tiles.
- * @return {number} The ratio between icon width and row width.
- */
- function tileWidthFraction(rowTileCount, tileSpacingFraction) {
- return rowTileCount + (rowTileCount - 1) * tileSpacingFraction;
- }
-
- /**
- * Calculates an assortment of tile-related values for a grid with the
- * given dimensions.
- * @param {number} width The pixel width of the grid.
- * @param {number} numRowTiles The number of tiles in a row.
- * @param {number} tileSpacingFraction The proportion of the tile width which
- * will be used as spacing between tiles.
- * @return {Object} A mapping of pixel values.
- */
- function tileValuesForGrid(width, numRowTiles, tileSpacingFraction) {
- var tileWidth = width / tileWidthFraction(numRowTiles, tileSpacingFraction);
- var offsetX = tileWidth * (1 + tileSpacingFraction);
- var interTileSpacing = offsetX - tileWidth;
-
- return {
- tileWidth: tileWidth,
- offsetX: offsetX,
- interTileSpacing: interTileSpacing,
- };
- }
-
- // The smallest amount of horizontal blank space to display on the sides when
- // displaying a wide arrangement. There is an additional 26px of margin from
- // the tile page padding.
- var MIN_WIDE_MARGIN = 18;
-
- /**
* Creates a new TilePage object. This object contains tiles and controls
* their layout.
* @param {Object} gridValues Pixel values that define the size and layout
jeremycho_google 2012/08/02 00:19:11 Delete
pedrosimonetti2 2012/08/03 18:14:12 Done.
@@ -360,107 +371,91 @@ cr.define('ntp', function() {
* @constructor
* @extends {HTMLDivElement}
*/
- function TilePage(gridValues) {
+ function TilePage() {
var el = cr.doc.createElement('div');
- el.gridValues_ = gridValues;
el.__proto__ = TilePage.prototype;
el.initialize();
return el;
}
- /**
- * Takes a collection of grid layout pixel values and updates them with
- * additional tiling values that are calculated from TilePage constants.
- * @param {Object} grid The grid layout pixel values to update.
- */
- TilePage.initGridValues = function(grid) {
- // The amount of space we need to display a narrow grid (all narrow grids
- // are this size).
- grid.narrowWidth =
- grid.minTileWidth * tileWidthFraction(grid.minColCount,
- grid.tileSpacingFraction);
- // The minimum amount of space we need to display a wide grid.
- grid.minWideWidth =
- grid.minTileWidth * tileWidthFraction(grid.maxColCount,
- grid.tileSpacingFraction);
- // The largest we will ever display a wide grid.
- grid.maxWideWidth =
- grid.maxTileWidth * tileWidthFraction(grid.maxColCount,
- grid.tileSpacingFraction);
- // Tile-related pixel values for the narrow display.
- grid.narrowTileValues = tileValuesForGrid(grid.narrowWidth,
- grid.minColCount,
- grid.tileSpacingFraction);
- // Tile-related pixel values for the minimum narrow display.
- grid.wideTileValues = tileValuesForGrid(grid.minWideWidth,
- grid.maxColCount,
- grid.tileSpacingFraction);
- };
-
TilePage.prototype = {
__proto__: HTMLDivElement.prototype,
+ // The grid values should be defined by each TilePage subclass.
+ gridValues_: {
+ tileWidth: 0,
+ tileHeight: 0,
+ tileHorMargin: 0, // TODO margin with CSS / there's no margin in first col
+ tileVerMargin: 0,
+ tileBorderWidth: 0,
+ bottomPanelHorMargin: 0, // TODO it doesn't make sense having this here.
+
+ tileCount: 0, // TODO remove this dependency. rename it to maxTileCount.
+ tileClassName: '',
+ reinforceStyles: true,
jeremycho_google 2012/08/02 00:19:11 Is there ever a case when this would be false?
pedrosimonetti2 2012/08/03 18:14:12 Yes, if you want to set the TileCell and Tile size
+
+ // debug
+ slowFactor: 1,
jeremycho_google 2012/08/02 00:19:11 Unused?
pedrosimonetti2 2012/08/03 18:14:12 Just for now. I need to add the debug features bac
+ debug: false
+ },
+
initialize: function() {
this.className = 'tile-page';
- // Div that acts as a custom scrollbar. The scrollbar has to live
- // outside the content div so it doesn't flicker when scrolling (due to
- // repainting after the scroll, then repainting again when moved in the
- // onScroll handler). |scrollbar_| is only aesthetic, and it only
- // represents the thumb. Actual events are still handled by the invisible
- // native scrollbars. This div gives us more flexibility with the visuals.
- this.scrollbar_ = this.ownerDocument.createElement('div');
- this.scrollbar_.className = 'tile-page-scrollbar';
- this.scrollbar_.hidden = true;
- this.appendChild(this.scrollbar_);
-
// This contains everything but the scrollbar.
this.content_ = this.ownerDocument.createElement('div');
this.content_.className = 'tile-page-content';
this.appendChild(this.content_);
- // Div that sets the vertical position of the tile grid.
- this.topMargin_ = this.ownerDocument.createElement('div');
- this.topMargin_.className = 'top-margin';
- this.content_.appendChild(this.topMargin_);
-
// Div that holds the tiles.
this.tileGrid_ = this.ownerDocument.createElement('div');
this.tileGrid_.className = 'tile-grid';
- this.tileGrid_.style.minWidth = this.gridValues_.narrowWidth + 'px';
+ // TODO(xci)
+ //this.tileGrid_.style.minWidth = this.gridValues_.narrowWidth + 'px';
this.content_.appendChild(this.tileGrid_);
+ // TODO(xci) new!
+ this.tileGridContent_ = this.ownerDocument.createElement('div');
+ this.tileGridContent_.className = 'tile-grid-content';
+ this.tileGrid_.appendChild(this.tileGridContent_);
+
+ // TODO(xci) new!
+ this.tileGrid_.addEventListener('webkitTransitionEnd',
+ this.onTileGridAnimationEnd_.bind(this));
+
// Ordered list of our tiles.
- this.tileElements_ = this.tileGrid_.getElementsByClassName('tile real');
+ //this.tileElements_ = this.tileGrid_.getElementsByClassName('tile real');
jeremycho_google 2012/08/02 00:19:11 Any reason to keep lines like these?
jeremycho_google 2012/08/02 03:00:49 As we discussed, these will be deleted in a future
pedrosimonetti2 2012/08/03 18:14:12 I kept that code commented out as a reminder to re
pedrosimonetti2 2012/08/03 18:14:12 I'll delete this code in a future CL. On 2012/08/
+ this.tileElements_ = [];
+
// Ordered list of the elements which want to accept keyboard focus. These
// elements will not be a part of the normal tab order; the tile grid
// initially gets focused and then these elements can be focused via the
// arrow keys.
+ // TODO(xci)
+ /*
this.focusableElements_ =
this.tileGrid_.getElementsByClassName('focusable');
-
- // These are properties used in updateTopMargin.
- this.animatedTopMarginPx_ = 0;
- this.topMarginPx_ = 0;
+ */
this.eventTracker = new EventTracker();
this.eventTracker.add(window, 'resize', this.onResize_.bind(this));
+ // TODO(xci) new
+ this.eventTracker.add(window, 'keydown', this.onKeyDown_.bind(this));
- this.addEventListener('DOMNodeInsertedIntoDocument',
- this.onNodeInsertedIntoDocument_);
-
- this.content_.addEventListener('scroll', this.onScroll_.bind(this));
+ // TODO(xci)
+ //this.addEventListener('DOMNodeInsertedIntoDocument',
+ // this.onNodeInsertedIntoDocument_);
- this.dragWrapper_ = new cr.ui.DragWrapper(this.tileGrid_, this);
+ //this.dragWrapper_ = new cr.ui.DragWrapper(this.tileGrid_, this);
this.addEventListener('cardselected', this.handleCardSelection_);
this.addEventListener('carddeselected', this.handleCardDeselection_);
- this.addEventListener('focus', this.handleFocus_);
- this.addEventListener('keydown', this.handleKeyDown_);
- this.addEventListener('mousedown', this.handleMouseDown_);
+ //this.addEventListener('focus', this.handleFocus_);
+ //this.addEventListener('keydown', this.handleKeyDown_);
+ //this.addEventListener('mousedown', this.handleMouseDown_);
- this.focusElementIndex_ = -1;
+ //this.focusElementIndex_ = -1;
},
get tiles() {
@@ -477,33 +472,6 @@ cr.define('ntp', function() {
},
/**
- * The size of the margin (unused space) on the sides of the tile grid, in
- * pixels.
- * @type {number}
- */
- get sideMargin() {
- return this.layoutValues_.leftMargin;
- },
-
- /**
- * Returns the width of the scrollbar, in pixels, if it is active, or 0
- * otherwise.
- * @type {number}
- */
- get scrollbarWidth() {
- return this.scrollbar_.hidden ? 0 : 13;
- },
-
- /**
- * Returns any extra padding to insert to the bottom of a tile page. By
- * default there is none, but subclasses can override.
- * @type {number}
- */
- get extraBottomPadding() {
- return 0;
- },
-
- /**
* The notification content of this tile (if any, otherwise null).
* @type {!HTMLElement}
*/
@@ -523,18 +491,6 @@ cr.define('ntp', function() {
},
/**
- * Fetches the size, in pixels, of the padding-top of the tile contents.
- * @type {number}
- */
- get contentPadding() {
- if (typeof this.contentPadding_ == 'undefined') {
- this.contentPadding_ =
- parseInt(getComputedStyle(this.content_).paddingTop, 10);
- }
- return this.contentPadding_;
- },
-
- /**
* Removes the tilePage from the DOM and cleans up event handlers.
*/
remove: function() {
@@ -563,9 +519,12 @@ cr.define('ntp', function() {
* @param {boolean} animate If true, the append will be animated.
* @protected
*/
+ // TODO(xci)
+ /*
appendTile: function(tileElement, animate) {
this.addTileAt(tileElement, this.tileElements_.length, animate);
},
+ */
/**
* Adds the given element to the tile grid.
@@ -575,30 +534,18 @@ cr.define('ntp', function() {
* animated (other tiles, if they must reposition, do not animate).
* @protected
*/
+ // TODO(xci)
+ /*
addTileAt: function(tileElement, index, animate) {
- this.classList.remove('animating-tile-page');
- if (animate)
- tileElement.classList.add('new-tile-contents');
-
- // Make sure the index is positive and either in the the bounds of
- // this.tileElements_ or at the end (meaning append).
- assert(index >= 0 && index <= this.tileElements_.length);
-
- var wrapperDiv = new Tile(tileElement);
- // If is out of the bounds of the tile element list, .insertBefore() will
- // act just like appendChild().
- this.tileGrid_.insertBefore(wrapperDiv, this.tileElements_[index]);
this.calculateLayoutValues_();
- this.heightChanged_();
-
- this.repositionTiles_();
this.fireAddedEvent(wrapperDiv, index, animate);
},
+ */
/**
* Notify interested subscribers that a tile has been removed from this
* page.
- * @param {Tile} tile The newly added tile.
+ * @param {TileCell} tile The newly added tile.
* @param {number} index The index of the tile that was added.
* @param {boolean} wasAnimated Whether the removal was animated.
*/
@@ -632,7 +579,7 @@ cr.define('ntp', function() {
/**
* Notify interested subscribers that a tile has been removed from this
* page.
- * @param {Tile} tile The tile that was removed.
+ * @param {TileCell} tile The tile that was removed.
* @param {number} oldIndex Where the tile was positioned before removal.
* @param {boolean} wasAnimated Whether the removal was animated.
*/
@@ -649,6 +596,7 @@ cr.define('ntp', function() {
* Removes all tiles from the page.
*/
removeAllTiles: function() {
+ // TODO(xci) dispatch individual tearDown functions
this.tileGrid_.innerHTML = '';
},
@@ -797,40 +745,11 @@ cr.define('ntp', function() {
* @private
*/
calculateLayoutValues_: function() {
- var grid = this.gridValues_;
- var availableSpace = this.tileGrid_.clientWidth - 2 * MIN_WIDE_MARGIN;
- var wide = availableSpace >= grid.minWideWidth;
- var numRowTiles = wide ? grid.maxColCount : grid.minColCount;
-
- var effectiveGridWidth = wide ?
- Math.min(Math.max(availableSpace, grid.minWideWidth),
- grid.maxWideWidth) :
- grid.narrowWidth;
- var realTileValues = tileValuesForGrid(effectiveGridWidth, numRowTiles,
- grid.tileSpacingFraction);
-
- // leftMargin centers the grid within the avaiable space.
- var minMargin = wide ? MIN_WIDE_MARGIN : 0;
- var leftMargin =
- Math.max(minMargin,
- (this.tileGrid_.clientWidth - effectiveGridWidth) / 2);
-
- var rowHeight = this.heightForWidth(realTileValues.tileWidth) +
- realTileValues.interTileSpacing;
-
- this.layoutValues_ = {
- colWidth: realTileValues.offsetX,
- gridWidth: effectiveGridWidth,
- leftMargin: leftMargin,
- numRowTiles: numRowTiles,
- rowHeight: rowHeight,
- tileWidth: realTileValues.tileWidth,
- wide: wide,
- };
// We need to update the top margin as well.
this.updateTopMargin_();
+ // TODO(pedrosimonetti): when do we really need to send this message?
this.firePageLayoutEvent_();
},
@@ -842,72 +761,6 @@ cr.define('ntp', function() {
cr.dispatchSimpleEvent(this, 'pagelayout', true, true);
},
- /**
- * @return {number} The amount of margin that should be animated (in pixels)
- * for the current grid layout.
- */
- getAnimatedLeftMargin_: function() {
- if (this.layoutValues_.wide)
- return 0;
-
- var grid = this.gridValues_;
- return (grid.minWideWidth - MIN_WIDE_MARGIN - grid.narrowWidth) / 2;
- },
-
- /**
- * Calculates the x/y coordinates for an element and moves it there.
- * @param {number} index The index of the element to be positioned.
- * @param {number} indexOffset If provided, this is added to |index| when
- * positioning the tile. The effect is that the tile will be positioned
- * in a non-default location.
- * @private
- */
- positionTile_: function(index, indexOffset) {
- var grid = this.gridValues_;
- var layout = this.layoutValues_;
-
- indexOffset = typeof indexOffset != 'undefined' ? indexOffset : 0;
- // Add the offset _after_ the modulus division. We might want to show the
- // tile off the side of the grid.
- var col = index % layout.numRowTiles + indexOffset;
- var row = Math.floor(index / layout.numRowTiles);
- // Calculate the final on-screen position for the tile.
- var realX = col * layout.colWidth + layout.leftMargin;
- var realY = row * layout.rowHeight;
-
- // Calculate the portion of the tile's position that should be animated.
- var animatedTileValues = layout.wide ?
- grid.wideTileValues : grid.narrowTileValues;
- // Animate the difference between three-wide and six-wide.
- var animatedLeftMargin = this.getAnimatedLeftMargin_();
- var animatedX = col * animatedTileValues.offsetX + animatedLeftMargin;
- var animatedY = row * (this.heightForWidth(animatedTileValues.tileWidth) +
- animatedTileValues.interTileSpacing);
-
- var tile = this.tileElements_[index];
- tile.setGridPosition(animatedX, animatedY);
- tile.firstChild.setBounds(layout.tileWidth,
- realX - animatedX,
- realY - animatedY);
-
- // This code calculates whether the tile needs to show a clone of itself
- // wrapped around the other side of the tile grid.
- var offTheRight = col == layout.numRowTiles ||
- (col == layout.numRowTiles - 1 && tile.hasDoppleganger());
- var offTheLeft = col == -1 || (col == 0 && tile.hasDoppleganger());
- if (this.isCurrentDragTarget && (offTheRight || offTheLeft)) {
- var sign = offTheRight ? 1 : -1;
- tile.showDoppleganger(-layout.numRowTiles * layout.colWidth * sign,
- layout.rowHeight * sign);
- } else {
- tile.clearDoppleganger();
- }
-
- if (index == this.tileElements_.length - 1) {
- this.tileGrid_.style.height = (realY + layout.rowHeight) + 'px';
- this.queueUpdateScrollbars_();
- }
- },
/**
* Gets the index of the tile that should occupy coordinate (x, y). Note
@@ -920,6 +773,7 @@ cr.define('ntp', function() {
* |this|.
* @private
*/
+ // TODO(xci) drag
getWouldBeIndexForPoint_: function(x, y) {
var grid = this.gridValues_;
var layout = this.layoutValues_;
@@ -938,32 +792,12 @@ cr.define('ntp', function() {
},
/**
- * Window resize event handler. Window resizes may trigger re-layouts.
- * @param {Object} e The resize event.
- */
- onResize_: function(e) {
- if (this.lastWidth_ == this.clientWidth &&
- this.lastHeight_ == this.clientHeight) {
- return;
- }
-
- this.calculateLayoutValues_();
-
- this.lastWidth_ = this.clientWidth;
- this.lastHeight_ = this.clientHeight;
- this.classList.add('animating-tile-page');
- this.heightChanged_();
-
- this.positionNotification_();
- this.repositionTiles_();
- },
-
- /**
* The tile grid has an image mask which fades at the edges. We only show
* the mask when there is an active drag; it obscures doppleganger tiles
* as they enter or exit the grid.
* @private
*/
+ // TODO(xci) drag
updateMask_: function() {
if (!this.isCurrentDragTarget) {
this.tileGrid_.style.WebkitMaskBoxImage = '';
@@ -991,71 +825,20 @@ cr.define('ntp', function() {
this.tileGrid_.style.WebkitMaskBoxImage = gradient;
},
+ // TODO(xci) delete (used by drag and drop)
updateTopMargin_: function() {
- var layout = this.layoutValues_;
-
- // The top margin is set so that the vertical midpoint of the grid will
- // be 1/3 down the page.
- var numTiles = this.tileCount +
- (this.isCurrentDragTarget && !this.withinPageDrag_ ? 1 : 0);
- var numRows = Math.max(1, Math.ceil(numTiles / layout.numRowTiles));
- var usedHeight = layout.rowHeight * numRows;
- var newMargin = document.documentElement.clientHeight / 3 -
- usedHeight / 3 - this.contentPadding;
- // The 'height' style attribute of topMargin is non-zero to work around
- // webkit's collapsing margin behavior, so we have to factor that into
- // our calculations here.
- newMargin = Math.max(newMargin, 0) - this.topMargin_.offsetHeight;
-
- // |newMargin| is the final margin we actually want to show. However,
- // part of that should be animated and part should not (for the same
- // reason as with leftMargin). The approach is to consider differences
- // when the layout changes from wide to narrow or vice versa as
- // 'animatable'. These differences accumulate in animatedTopMarginPx_,
- // while topMarginPx_ caches the real (total) margin. Either of these
- // calculations may come out to be negative, so we use margins as the
- // css property.
-
- if (typeof this.topMarginIsForWide_ == 'undefined')
- this.topMarginIsForWide_ = layout.wide;
- if (this.topMarginIsForWide_ != layout.wide) {
- this.animatedTopMarginPx_ += newMargin - this.topMarginPx_;
- this.topMargin_.style.marginBottom = toCssPx(this.animatedTopMarginPx_);
- }
-
- this.topMarginIsForWide_ = layout.wide;
- this.topMarginPx_ = newMargin;
- this.topMargin_.style.marginTop =
- toCssPx(this.topMarginPx_ - this.animatedTopMarginPx_);
+ return;
},
/**
* Position the notification if there's one showing.
*/
positionNotification_: function() {
- var notification = this.notification;
- if (!notification || notification.hidden)
- return;
-
- // Update the horizontal position.
- var animatedLeftMargin = this.getAnimatedLeftMargin_();
- notification.style.WebkitMarginStart = animatedLeftMargin + 'px';
- var leftOffset = (this.layoutValues_.leftMargin - animatedLeftMargin) *
- (isRTL() ? -1 : 1);
- notification.style.WebkitTransform = 'translateX(' + leftOffset + 'px)';
-
- // Update the allowable widths of the text.
- var buttonWidth = notification.querySelector('button').offsetWidth + 8;
- notification.querySelector('span').style.maxWidth =
- this.layoutValues_.gridWidth - buttonWidth + 'px';
-
- // This makes sure the text doesn't condense smaller than the narrow size
- // of the grid (e.g. when a user makes the window really small).
- notification.style.minWidth =
- this.gridValues_.narrowWidth - buttonWidth + 'px';
-
- // Update the top position.
- notification.style.marginTop = -notification.offsetHeight + 'px';
+ if (this.notification && !this.notification.hidden) {
+ this.notification.style.margin =
+ -this.notification.offsetHeight + 'px ' +
+ this.layoutValues_.leftMargin + 'px 0';
+ }
},
/**
@@ -1065,23 +848,6 @@ cr.define('ntp', function() {
*/
onNodeInsertedIntoDocument_: function(e) {
this.calculateLayoutValues_();
- this.heightChanged_();
- },
-
- /**
- * Called when the height of |this| has changed: update the size of
- * tileGrid.
- * @private
- */
- heightChanged_: function() {
- // The tile grid will expand to the bottom footer, or enough to hold all
- // the tiles, whichever is greater. It would be nicer if tilePage were
- // a flex box, and the tile grid could be box-flex: 1, but this exposes a
- // bug where repositioning tiles will cause the scroll position to reset.
- this.tileGrid_.style.minHeight = (this.clientHeight -
- this.tileGrid_.offsetTop - this.content_.offsetTop -
- this.extraBottomPadding -
- (this.footerNode_ ? this.footerNode_.clientHeight : 0)) + 'px';
},
/**
@@ -1112,78 +878,9 @@ cr.define('ntp', function() {
return true;
},
- /**
- * Handler for the 'scroll' event on |content_|.
- * @param {Event} e The scroll event.
- * @private
- */
- onScroll_: function(e) {
- this.queueUpdateScrollbars_();
- },
-
- /**
- * ID of scrollbar update timer. If 0, there's no scrollbar re-calc queued.
- * @private
- */
- scrollbarUpdate_: 0,
-
- /**
- * Queues an update on the custom scrollbar. Used for two reasons: first,
- * coalescing of multiple updates, and second, because action like
- * repositioning a tile can require a delay before they affect values
- * like clientHeight.
- * @private
- */
- queueUpdateScrollbars_: function() {
- if (this.scrollbarUpdate_)
- return;
-
- this.scrollbarUpdate_ = window.setTimeout(
- this.doUpdateScrollbars_.bind(this), 0);
- },
-
- /**
- * Does the work of calculating the visibility, height and position of the
- * scrollbar thumb (there is no track or buttons).
- * @private
- */
- doUpdateScrollbars_: function() {
- this.scrollbarUpdate_ = 0;
-
- var content = this.content_;
-
- // Adjust scroll-height to account for possible header-bar.
- var adjustedScrollHeight = content.scrollHeight - content.offsetTop;
-
- if (adjustedScrollHeight <= content.clientHeight) {
- this.scrollbar_.hidden = true;
- return;
- } else {
- this.scrollbar_.hidden = false;
- }
-
- var thumbTop = content.offsetTop +
- content.scrollTop / adjustedScrollHeight * content.clientHeight;
- var thumbHeight = content.clientHeight / adjustedScrollHeight *
- this.clientHeight;
-
- this.scrollbar_.style.top = thumbTop + 'px';
- this.scrollbar_.style.height = thumbHeight + 'px';
- this.firePageLayoutEvent_();
- },
-
- /**
- * Get the height for a tile of a certain width. Override this function to
- * get non-square tiles.
- * @param {number} width The pixel width of a tile.
- * @return {number} The height for |width|.
- */
- heightForWidth: function(width) {
- return width;
- },
-
/** Dragging **/
+ // TODO(xci) drag
get isCurrentDragTarget() {
return this.dragWrapper_.isCurrentDragTarget;
},
@@ -1192,6 +889,7 @@ cr.define('ntp', function() {
* Thunk for dragleave events fired on |tileGrid_|.
* @param {Event} e A MouseEvent for the drag.
*/
+ // TODO(xci) drag
doDragLeave: function(e) {
this.cleanupDrag();
},
@@ -1200,6 +898,7 @@ cr.define('ntp', function() {
* Performs all actions necessary when a drag enters the tile page.
* @param {Event} e A mouseover event for the drag enter.
*/
+ // TODO(xci) drag
doDragEnter: function(e) {
// Applies the mask so doppleganger tiles disappear into the fog.
this.updateMask_();
@@ -1213,6 +912,7 @@ cr.define('ntp', function() {
// The new tile may change the number of rows, hence the top margin
// will change.
if (!this.withinPageDrag_)
+ // TODO(xci) this function does nothing now!
this.updateTopMargin_();
this.doDragOver(e);
@@ -1223,6 +923,7 @@ cr.define('ntp', function() {
* a drag over the tile page.
* @param {Event} e A mouseover event for the drag over.
*/
+ // TODO(xci) drag
doDragOver: function(e) {
e.preventDefault();
@@ -1237,6 +938,7 @@ cr.define('ntp', function() {
* Performs all actions necessary when the user completes a drop.
* @param {Event} e A mouseover event for the drag drop.
*/
+ // TODO(xci) drag
doDrop: function(e) {
e.stopPropagation();
e.preventDefault();
@@ -1273,6 +975,7 @@ cr.define('ntp', function() {
* Appends the currently dragged tile to the end of the page. Called
* from outside the page, e.g. when dropping on a nav dot.
*/
+ // TODO(xci) drag
appendDraggingTile: function() {
var originalPage = currentlyDraggingTile.tilePage;
if (originalPage == this)
@@ -1286,6 +989,7 @@ cr.define('ntp', function() {
/**
* Makes sure all the tiles are in the right place after a drag is over.
*/
+ // TODO(xci) drag
cleanupDrag: function() {
this.repositionTiles_(currentlyDraggingTile);
// Remove the drag mask.
@@ -1297,11 +1001,14 @@ cr.define('ntp', function() {
* @param {?Node} ignoreNode An optional node to ignore.
* @private
*/
+ // TODO(xci) drag
repositionTiles_: function(ignoreNode) {
+ /*
for (var i = 0; i < this.tileElements_.length; i++) {
if (!ignoreNode || ignoreNode !== this.tileElements_[i])
- this.positionTile_(i);
+ ;//this.positionTile_(i); TODO(xci) this function was deleted!
}
+ */
},
/**
@@ -1309,6 +1016,7 @@ cr.define('ntp', function() {
* @param {Event} e A MouseEvent for the drag.
* @private
*/
+ // TODO(xci) drag
updateDropIndicator_: function(newDragIndex) {
var oldDragIndex = this.currentDropIndex_;
if (newDragIndex == oldDragIndex)
@@ -1325,7 +1033,7 @@ cr.define('ntp', function() {
else
var adjustment = i >= newDragIndex ? 1 : 0;
- this.positionTile_(i, adjustment);
+ //this.positionTile_(i, adjustment); TODO(xci) function was deleted!
}
this.currentDropIndex_ = newDragIndex;
},
@@ -1336,6 +1044,7 @@ cr.define('ntp', function() {
* likely want to check |e.dataTransfer|.
* @return {boolean} True if this page can handle the drag.
*/
+ // TODO(xci) drag
shouldAcceptDrag: function(e) {
return false;
},
@@ -1346,6 +1055,7 @@ cr.define('ntp', function() {
* data. This should only be used if currentlyDraggingTile is null.
* @param {number} index The tile index at which the drop occurred.
*/
+ // TODO(xci) drag
addDragData: function(dataTransfer, index) {
assert(false);
},
@@ -1364,14 +1074,406 @@ cr.define('ntp', function() {
* 'copy').
* @param {Object} dataTransfer The drag event dataTransfer object.
*/
+ // TODO(xci) drag
setDropEffect: function(dataTransfer) {
assert(false);
},
+
+
+ // #########################################################################
+ // XCI - Extended Chrome Instant
+ // #########################################################################
+
+
+ // properties
+ // -------------------------------------------------------------------------
+ colCount: 5,
+ rowCount: 2,
+
+ numOfVisibleRows: 0,
+ animatingColCount: 5, // TODO initialize
jeremycho_google 2012/08/02 03:00:49 Delete TODO?
pedrosimonetti2 2012/08/03 18:14:12 No, I clarified what to do. On 2012/08/02 03:00:4
+
+ // TODO move to layout?
+ pageOffset: 0,
+
+ appendTile: function(tile) {
jeremycho_google 2012/08/02 00:19:11 Can this be factored into addTileAt?
pedrosimonetti2 2012/08/03 18:14:12 The addTileAt() implementation was wrong, and I fi
+ this.tileElements_.push(tile);
+ this.renderGrid_();
+ },
+
+ addTileAt: function(tile) {
+ this.appendTile(tile);
+ },
+
+ // internal helpers
+ // -------------------------------------------------------------------------
+
+ // TODO move to layout?
+ getNumOfVisibleRows: function() {
jeremycho_google 2012/08/02 03:00:49 getNumOfVisibleRows_
pedrosimonetti2 2012/08/03 18:14:12 Done.
+ return this.numOfVisibleRows;
+ },
+
+ getTileRequiredWidth_: function() {
+ var grid = this.gridValues_;
+ return grid.tileWidth + 2 * grid.tileBorderWidth + grid.tileHorMargin;
+ },
+
+ getColCountForWidth_: function(width) {
+ var availableWidth = width + this.gridValues_.tileHorMargin;
+ var requiredWidth = this.getTileRequiredWidth_();
+ var colCount = Math.floor(availableWidth / requiredWidth);
+ return colCount;
+ },
+
+ getWidthForColCount_: function(colCount) {
+ var requiredWidth = this.getTileRequiredWidth_();
+ var width = colCount * requiredWidth - this.gridValues_.tileHorMargin;
+ return width;
+ },
+
+ getBottomPanelWidth_: function() {
+ var windowWidth = cr.doc.documentElement.clientWidth;
+ var width;
+ if (windowWidth >= 948) {
jeremycho_google 2012/08/02 00:19:11 Should these numbers be made parameters?
pedrosimonetti2 2012/08/03 18:14:12 Maybe, added a TODO. This will depend on the WebVi
+ width = 748;
+ } else if (windowWidth >= 500) {
+ width = windowWidth - 2 * this.gridValues_.bottomPanelHorMargin;
+ } else if (windowWidth >= 300) {
+ // TODO(pedrosimonetti): check math and document
+ width = Math.floor(((windowWidth - 300) / 200) * 100 + 200);
+ } else {
+ width = 200;
+ }
+ return width;
+ },
+
+ getAvailableColCount_: function() {
+ return this.getColCountForWidth_(this.getBottomPanelWidth_());
+ },
+
+ // rendering
+ // -------------------------------------------------------------------------
+
+ renderGrid_: function(colCount, tileElements) {
jeremycho_google 2012/08/02 00:19:11 Please provide brief function-level comment for no
jeremycho_google 2012/08/02 03:00:49 Never called with tileElements?
pedrosimonetti2 2012/08/03 18:14:12 Maybe I'll have to change this function soon, so I
pedrosimonetti2 2012/08/03 18:14:12 It was being called with tileElements in the old p
+ //if (window.xc > 5) debugger;
+ //window.xc = window.xc || 1, console.log('renderGrid' + window.xc++);
+ colCount = colCount || this.colCount;
+
+ var tileGridContent = this.tileGridContent_;
+
+ tileElements = tileElements || this.tileElements_;
+
+ var tileCount = tileElements.length;
+ var rowCount = Math.ceil(tileCount / colCount);
+
+ var tileRows = tileGridContent.getElementsByClassName('tile-row');
+ var tileRow;
+ var tileRowTiles;
+ var tileCell;
+ var tileElement;
+ var maxColCount;
+
+ var numOfVisibleRows = this.getNumOfVisibleRows();
+ var pageOffset = this.pageOffset;
+
+ for (var tile = 0, row = 0; row < rowCount; row++) {
+ // Get the current tile row.
jeremycho_google 2012/08/02 03:00:49 I think you can drop comments like these if it's f
pedrosimonetti2 2012/08/03 18:14:12 Done.
+ tileRow = tileRows[row];
+
+ // Create tile row if there's no one yet.
+ if (!tileRow) {
+ tileRow = cr.doc.createElement('div');
+ tileRow.className = 'tile-row tile-row-' + row;// TODO do we need id?
+ tileGridContent.appendChild(tileRow);
+ }
+
+ // Adjust row visibility.
+ var rowVisible = (row >= pageOffset &&
jeremycho_google 2012/08/02 03:00:49 Make the hide-row add/remove a helper function and
pedrosimonetti2 2012/08/03 18:14:12 Done.
+ row <= (pageOffset + numOfVisibleRows - 1));
+ tileRow.classList[rowVisible ? 'remove' : 'add']('hide-row');
+
+ // The tiles inside the current row.
+ tileRowTiles = tileRow.childNodes;
+
+ // Remove excessive columns from a particular tile row.
+ maxColCount = Math.min(colCount, tileCount - tile);
+ while (tileRowTiles.length > maxColCount) {
+ tileRow.removeChild(tileRow.lastElementChild);
+ }
+
+ // For each column in the current row.
+ for (var col = 0; col < colCount; col++, tile++) {
+
jeremycho_google 2012/08/02 03:00:49 Delete newline
pedrosimonetti2 2012/08/03 18:14:12 Done.
+ if (tileRowTiles[col]) {
+ tileCell = tileRowTiles[col];
+ } else {
+ var span = cr.doc.createElement('span');
+ tileCell = new TileCell(span, this.gridValues_);
+ }
+
+ // Reset column class.
+ this.resetTileCol_(tileCell, col);
+
+ // Render Tiles.
+ if (tile < tileCount) {
+ tileCell.classList.remove('filler');
+ tileElement = tileElements[tile];
+ if (tileCell.firstChild) {
jeremycho_google 2012/08/02 03:00:49 Factor out duplicate code here and in the else?
pedrosimonetti2 2012/08/03 18:14:12 They are slightly different so I don't think we ca
+ if (tileElement != tileCell.firstChild) {
+ tileCell.replaceChild(tileElement, tileCell.firstChild);
+ }
+ } else {
+ tileCell.appendChild(tileElement);
+ }
+ } else {
+ // TODO create filler and method to
jeremycho_google 2012/08/02 03:00:49 Please clarify comment.
pedrosimonetti2 2012/08/03 18:14:12 Done.
+ if (!tileCell.classList.contains('filler')) {
+ tileCell.classList.add('filler');
+ tileElement = cr.doc.createElement('span');
+ if (tileCell.firstChild)
+ tileCell.replaceChild(tileElement, tileCell.firstChild);
+ else
+ tileCell.appendChild(tileElement);
+ }
+ }
+
+ if (!tileRowTiles[col]) {
+ tileRow.appendChild(tileCell);
jeremycho_google 2012/08/02 03:00:49 Move to the L1209 else?
pedrosimonetti2 2012/08/03 18:14:12 No, because when we are creating new TileCells, we
+ }
+ }
+ }
+
+ // Remove excessive tile rows from the tile grid.
+ while (tileRows.length > rowCount) {
+ tileGridContent.removeChild(tileGridContent.lastElementChild);
+ }
+
+ this.colCount = colCount;
+ this.rowCount = rowCount;
+ },
+
+ layout_: function() {
+ var pageList = $('page-list');
+ var panel = this.content_;
+ var menu = $('page-list-menu');
+ var tileGrid = this.tileGrid_;
+ var tileGridContent = this.tileGridContent_;
+ var tileRows = tileGridContent.getElementsByClassName('tile-row');
+
+ tileGridContent.classList.add('animate-tile');
+
+ var bottomPanelWidth = this.getBottomPanelWidth_();
+ var colCount = this.getColCountForWidth_(bottomPanelWidth);
+ var lastColCount = this.colCount;
+ var animatingColCount = this.animatingColCount;
+
+ var windowHeight = cr.doc.documentElement.clientHeight;
+
+ // TODO better handling of height state
+ // changeVisibleRows
+ // TODO need to call paginate when height changes
+ var numOfVisibleRows = this.numOfVisibleRows;
+ if (windowHeight > 500) {
+ numOfVisibleRows = 2;
+ } else {
+ numOfVisibleRows = 1;
+ }
+
+ if (numOfVisibleRows != this.numOfVisibleRows) {
+ this.numOfVisibleRows = numOfVisibleRows;
+ this.paginate(null, true);
+ pageList.style.height = (107 * numOfVisibleRows) + 'px';
+ //tileGrid.style.height = (107 * numOfVisibleRows) + 'px';
+ }
+
+ // changeVisibleCols
+ if (colCount != animatingColCount) {
+
+ var newWidth = this.getWidthForColCount_(colCount);
+ if (colCount > animatingColCount) {
+
+ // TODO actual size check
+ if (colCount != lastColCount) {
+ this.renderGrid_(colCount);
+ //this.renderTiles_(colCount);
+ }
+
+ this.showTileCols_(animatingColCount, false);
+
+ var self = this;
+ setTimeout((function(animatingColCount) {
jeremycho_google 2012/08/02 03:00:49 Comment why this is necessary?
pedrosimonetti2 2012/08/03 18:14:12 I was having a problem with this code a while ago,
+ return function() {
+ self.showTileCols_(animatingColCount, true);
+ }
+ })(animatingColCount), 0);
+
+ } else {
+ this.showTileCols_(colCount, false);
+ }
+
+ tileGrid.style.width = newWidth + 'px';
+ menu.style.width = newWidth + 'px';
+
+ // TODO: listen animateEnd
+ var self = this;
+ this.onTileGridAnimationEndHandler_ = function() {
+ if (colCount < lastColCount) {
+ self.renderGrid_(colCount);
+ //self.renderTiles_(colCount);
+ } else {
+ self.showTileCols_(0, true);
+ }
+ };
+
+ this.paginate();
+
+ }
+
+ panel.style.width = bottomPanelWidth + 'px';
+
+ this.animatingColCount = colCount;
+ },
+
+ // animation helpers
+ // -------------------------------------------------------------------------
+
+ // TODO make it local?
+ showTileCols_: function(col, show) {
+ var prop = show ? 'remove' : 'add';
+ var max = 10; // TODO(pedrosimonetti) const?
+ var tileGridContent = this.tileGridContent_;
+ for (var i = col; i < max; i++) {
+ tileGridContent.classList[prop]('hide-col-' + i);
+ }
+ },
+
+ // TODO make it local?
+ resetTileCol_: function(tileCell, col) {
+ var max = 10;
+ for (var i = 0; i < max; i++) {
+ if (i != col) {
+ tileCell.classList.remove('tile-col-' + i);
+ }
+ }
+ tileCell.classList.add('tile-col-' + col);
+ },
+
+ // pagination
+ // -------------------------------------------------------------------------
+
+ paginate: function(pageOffset, force) {
jeremycho_google 2012/08/02 03:00:49 paginate_
pedrosimonetti2 2012/08/03 18:14:12 Done.
+ var numOfVisibleRows = this.getNumOfVisibleRows();
+ var pageOffset = typeof pageOffset == 'number' ?
+ pageOffset : this.pageOffset;
+
+ pageOffset = Math.max(0, pageOffset);
+ pageOffset = Math.min(this.rowCount - numOfVisibleRows, pageOffset);
+
+ if (pageOffset != this.pageOffset || force) {
+ var rows = this.tileGridContent_.getElementsByClassName('tile-row');
+ for (var i = 0, l = rows.length; i < l; i++) {
+ var row = rows[i];
+ if (i >= pageOffset && i <= (pageOffset + numOfVisibleRows - 1)) {
+ row.classList.remove('hide-row');
+ } else {
+ row.classList.add('hide-row');
+ }
+ }
+
+ this.pageOffset = pageOffset;
+ this.tileGridContent_.style.webkitTransform = 'translate3d(0, ' +
+ (-pageOffset * 106) + 'px, 0)';
+ }
+ },
+
+ // event handlers
+ // -------------------------------------------------------------------------
+
+ onResize_: function() {
+ this.layout_();
+ },
+
+ onTileGridAnimationEnd_: function() {
+ // TODO figure out how to cleanup each kind animation properly
+ //console.log('AnimEnd', event.target.className, event.target, event);
+ //console.log('--------------------------------------------------------');
+ if (event.target == this.tileGrid_ &&
+ this.onTileGridAnimationEndHandler_) {
+ if (this.tileGridContent_.classList.contains('animate-tile')) {
+ this.onTileGridAnimationEndHandler_();
+ //this.tileGridContent_.classList.remove('animate-tile')
jeremycho_google 2012/08/02 00:19:11 This class never gets removed, intentional?
pedrosimonetti2 2012/08/03 18:14:12 We need to refactor this piece of code later. On
+ }
+ }
+ },
+
+ onKeyDown_: function(e) {
jeremycho_google 2012/08/02 00:19:11 Should this be onKeyUp instead (if the user holds
pedrosimonetti2 2012/08/03 18:14:12 Done.
+ var pageOffset = this.pageOffset;
+
+ var keyCode = e.keyCode;
+ if (keyCode == 40 /* down */) {
+ pageOffset++;
+ } else if (keyCode == 38 /* up */) {
+ pageOffset--;
+ }
+
+ if (pageOffset != this.pageOffset) {
+ this.paginate(pageOffset);
+ }
+ }
+
};
+
+ var duration = 200;
+ var defaultDuration = 200;
+ var animatedProperties = [
+ '#card-slider-frame .tile-grid',
+ '#card-slider-frame .tile-grid-content',
+ '#card-slider-frame .tile-row',
+ '.animate-tile .tile-cell',
+ '.debug .animate-tile .tile-cell'
+ ];
+
+ function adjustAnimationTiming(slownessFactor, selectors) {
+ slownessFactor = slownessFactor || 1;
+ duration = defaultDuration * slownessFactor;
+ for (var i = 0, l = selectors.length; i < l; i++) {
+ var selector = selectors[i];
+ var rule = findCSSRule(selector);
+ if (rule) {
+ rule.style.webkitTransitionDuration = duration + 'ms';
+ } else {
+ throw 'Could not find the CSS rule "' + selector + '"';
+ }
+ }
+ }
+
+ function findCSSRule(selectorText) {
+ var rules = document.styleSheets[0].rules;
+ for (var i = 0, l = rules.length; i < l; i++) {
+ var rule = rules[i];
+ if (rule.selectorText == selectorText)
+ {
+ return rule;
+ }
+ }
+ }
+
+ function changeSlowFactor(el) {
jeremycho_google 2012/08/02 00:19:11 Unused?
pedrosimonetti2 2012/08/03 18:14:12 I'll add the debugging features later. On 2012/08
+ if (el.value)
+ adjustAnimationTiming(el.value - 0, animatedProperties);
+ }
+
+ function changeDebugMode(el) {
jeremycho_google 2012/08/02 00:19:11 Unused?
pedrosimonetti2 2012/08/03 18:14:12 I'll add the debugging features later. On 2012/08
+ var prop = el.checked ? 'add' : 'remove';
+ document.body.classList[prop]('debug');
+ }
+
return {
- getCurrentlyDraggingTile: getCurrentlyDraggingTile,
- setCurrentDropEffect: setCurrentDropEffect,
- TilePage: TilePage,
+ // TODO(xci) drag
+ //getCurrentlyDraggingTile2: getCurrentlyDraggingTile,
+ //setCurrentDropEffect2: setCurrentDropEffect,
+ Tile2: Tile,
+ TilePage2: TilePage,
};
});

Powered by Google App Engine
This is Rietveld 408576698