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, |
}; |
}); |