// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
cr.define('ntp4', function() {
'use strict';
var TilePage = ntp4.TilePage;
/**
* Creates a new App object.
* @param {Object} appData The data object that describes the app.
* @constructor
* @extends {HTMLDivElement}
*/
function App(appData) {
var el = cr.doc.createElement('div');
el.__proto__ = App.prototype;
el.appData = appData;
el.initialize();
return el;
}
App.prototype = {
__proto__: HTMLDivElement.prototype,
initialize: function() {
assert(this.appData.id, 'Got an app without an ID');
this.className = 'app';
this.setAttribute('app-id', this.appData.id);
var appImg = this.ownerDocument.createElement('img');
appImg.src = this.appData.icon_big;
// We use a mask of the same image so CSS rules can highlight just the
// image when it's touched.
appImg.style.WebkitMaskImage = url(this.appData.icon_big);
// We put a click handler just on the app image - so clicking on the
// margins between apps doesn't do anything.
appImg.addEventListener('click', this.onClick_.bind(this));
this.appendChild(appImg);
this.appImg_ = appImg;
var appSpan = this.ownerDocument.createElement('span');
appSpan.textContent = this.appData.name;
this.appendChild(appSpan);
/* TODO(estade): grabber */
},
/**
* Set the size and position of the app tile.
* @param {number} size The total size of |this|.
* @param {number} x The x-position.
* @param {number} y The y-position.
* animate.
*/
setBounds: function(size, x, y) {
this.appImg_.style.width = this.appImg_.style.height =
(size * APP_IMG_SIZE_FRACTION) + 'px';
this.style.width = this.style.height = size + 'px';
this.style.left = x + 'px';
this.style.top = y + 'px';
},
/**
* Invoked when an app is clicked
* @param {Event} e The click event.
* @private
*/
onClick_: function(e) {
// Tell chrome to launch the app.
var NTP_APPS_MAXIMIZED = 0;
chrome.send('launchApp', [this.appData.id, NTP_APPS_MAXIMIZED]);
// Don't allow the click to trigger a link or anything
e.preventDefault();
},
};
// The fraction of the app tile size that the icon uses.
var APP_IMG_SIZE_FRACTION = 4 / 5;
var appsPageGridValues = {
// The fewest tiles we will show in a row.
minColCount: 3,
// The most tiles we will show in a row.
maxColCount: 6,
// The smallest a tile can be.
minTileWidth: 96 / APP_IMG_SIZE_FRACTION,
// The biggest a tile can be.
maxTileWidth: 128 / APP_IMG_SIZE_FRACTION,
};
TilePage.initGridValues(appsPageGridValues);
/**
* Creates a new AppsPage object.
* @param {string} name The display name for the page.
* @constructor
* @extends {TilePage}
*/
function AppsPage(name) {
var el = new TilePage(name, appsPageGridValues);
el.__proto__ = AppsPage.prototype;
el.initialize();
return el;
}
AppsPage.prototype = {
__proto__: TilePage.prototype,
initialize: function() {
this.classList.add('apps-page');
},
/**
* Creates an app DOM element and places it at the last position on the
* page.
* @param {Object} appData The data object that describes the app.
*/
appendApp: function(appData) {
this.appendTile(new App(appData));
},
};
return {
AppsPage: AppsPage,
};
});