// Copyright (c) 2012 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('options', function() { var OptionsPage = options.OptionsPage; var UserImagesGrid = options.UserImagesGrid; /** @const */ var CUSTOM_WALLPAPER_PREFIX = 'chrome://wallpaper-thumb/custom_'; ///////////////////////////////////////////////////////////////////////////// // SetWallpaperOptions class: /** * Encapsulated handling of ChromeOS set wallpaper options page. * @constructor */ function SetWallpaperOptions() { OptionsPage.call( this, 'setWallpaper', loadTimeData.getString('setWallpaper'), 'set-wallpaper-page'); } cr.addSingletonGetter(SetWallpaperOptions); SetWallpaperOptions.prototype = { // Inherit SetWallpaperOptions from OptionsPage. __proto__: options.OptionsPage.prototype, /** * Initializes SetWallpaperOptions page. */ initializePage: function() { // Call base class implementation to start preferences initialization. OptionsPage.prototype.initializePage.call(this); var wallpaperGrid = $('wallpaper-grid'); UserImagesGrid.decorate(wallpaperGrid); wallpaperGrid.addEventListener('change', this.handleImageSelected_.bind(this)); wallpaperGrid.addEventListener('dblclick', this.handleImageDblClick_.bind(this)); wallpaperGrid.addEventListener('activate', function() { OptionsPage.closeOverlay() }); $('set-wallpaper-layout').addEventListener('change', this.handleLayoutChange_); $('set-custom-wallpaper').onclick = this.handleChooseFile_; $('use-daily-wallpaper').onclick = this.handleCheckboxClick_.bind(this); $('set-wallpaper-overlay-confirm').onclick = function() { OptionsPage.closeOverlay(); }; // @type {Array.} this.wallpapers_ = []; // @type {Object} Old user custom wallpaper thumbnail. this.oldImage_ = null; chrome.send('onSetWallpaperPageInitialized'); }, /** * Called right after the page has been shown to user. */ didShowPage: function() { $('wallpaper-grid').updateAndFocus(); // A quick hack to fix issue 118472. This is a general problem of list // control and options overlay. // TODO(bshe): Remove this hack when we fixed the general problem which // tracked in issue 118829. $('wallpaper-grid').redraw(); chrome.send('onSetWallpaperPageShown'); }, /** * Called right before the page is hidden. */ willHidePage: function() { var wallpaperGrid = $('wallpaper-grid'); wallpaperGrid.blur(); if (this.oldImage_) { wallpaperGrid.removeItem(this.oldImage_); this.oldImage_ = null; } $('set-wallpaper-layout').innerText = ''; }, /** * Set attributions of wallpaper with given URL. * @param {string} url URL of the selected wallpaper. * @private */ setWallpaperAttribution_: function(url) { for (var i = 0; i < this.wallpapers_.length; i++) { if (this.wallpapers_[i].url == url) { $('wallpaper-author-name').textContent = this.wallpapers_[i].author; $('wallpaper-author-website').textContent = this.wallpapers_[i].website; return; } } $('wallpaper-author-name').textContent = ''; $('wallpaper-author-website').textContent = ''; }, /** * Populates the drop down box for custom wallpaper layouts. * param {string} layouts Available wallpaper layouts. * param {number} selectedLayout The value of selected/default layout. * @private */ populateWallpaperLayouts_: function(layouts, selectedLayout) { var wallpaperLayout = $('set-wallpaper-layout'); var selectedIndex = -1; for (var i = 0; i < layouts.length; i++) { var option = new Option(layouts[i]['name'], layouts[i]['index']); if (selectedLayout == option.value) selectedIndex = i; wallpaperLayout.appendChild(option); } if (selectedIndex >= 0) wallpaperLayout.selectedIndex = selectedIndex; }, /** * Handles "Custom..." button activation. * @private */ handleChooseFile_: function() { chrome.send('chooseWallpaper'); }, /** * Handle the wallpaper layout setting change. * @private */ handleLayoutChange_: function() { var setWallpaperLayout = $('set-wallpaper-layout'); var layout = setWallpaperLayout.options[ setWallpaperLayout.selectedIndex].value; chrome.send('changeWallpaperLayout', [layout]); }, /** * Handles image selection change. * @private */ handleImageSelected_: function() { var wallpaperGrid = $('wallpaper-grid'); var url = wallpaperGrid.selectedItemUrl; if (url && !wallpaperGrid.inProgramSelection) { if (url.indexOf(CUSTOM_WALLPAPER_PREFIX) == 0) { // User custom wallpaper is selected this.isCustom = true; // When users select the custom wallpaper thumbnail from picker UI, // use the saved layout value and redraw the wallpaper. this.handleLayoutChange_(); } else { this.isCustom = false; chrome.send('selectDefaultWallpaper', [url]); } this.setWallpaperAttribution_(url); } }, /** * Handles double click on the image grid. * @param {Event} e Double click Event. */ handleImageDblClick_: function(e) { var wallpaperGrid = $('wallpaper-grid'); if (wallpaperGrid.disabled) return; // Close page unless the click target is the grid itself. if (e.target instanceof HTMLImageElement) OptionsPage.closeOverlay(); }, /** * Handles click on the "I'm feeling lucky" checkbox. * @private */ handleCheckboxClick_: function() { var wallpaperGrid = $('wallpaper-grid'); if ($('use-daily-wallpaper').checked) { wallpaperGrid.disabled = true; $('wallpaper-attribution-label').hidden = false; chrome.send('selectDailyWallpaper'); wallpaperGrid.classList.add('grayout'); $('set-wallpaper-layout').hidden = true; } else { wallpaperGrid.disabled = false; wallpaperGrid.classList.remove('grayout'); // Set the wallpaper type to User::DEFAULT. this.handleImageSelected_(); } }, /** * Selects corresponding wallpaper thumbnail with the given URL and toggle * the "Change wallpaper daily..." checkbox. * @param {string} url URL of the wallpaper thumbnail to select. * @param {boolean} isDaily True if user checked "Change wallpaper daily..." * checkbox. * @private */ setSelectedImage_: function(url, isDaily) { var wallpaperGrid = $('wallpaper-grid'); wallpaperGrid.selectedItemUrl = url; this.setWallpaperAttribution_(url); if (isDaily) { // Do not call chrome.send('selectDailyWallpaper'). $('use-daily-wallpaper').checked = true; wallpaperGrid.disabled = true; wallpaperGrid.classList.add('grayout'); } }, /** * Appends default images to the image grid. Should only be called once. * @param {Array.<{author: string, url: string, website: string}>} * wallpapers An array of wallpaper objects. * @private */ setDefaultImages_: function(wallpapers) { var wallpaperGrid = $('wallpaper-grid'); // TODO(bshe): Ideally we should save author and website with the actual // image (URL) and not use index related storage. This way this data is // stored in one place rather than depending on the index to be // consistent. for (var i = 0, wallpaper; wallpaper = wallpapers[i]; i++) { this.wallpapers_.push(wallpaper); wallpaperGrid.addItem(wallpaper.url); } }, /** * Display layout drop down box and disable daily mode if enabled. Called * when user select a valid file from file system. */ didSelectFile_: function() { $('set-wallpaper-layout').hidden = false; var wallpaperGrid = $('wallpaper-grid'); if ($('use-daily-wallpaper').checked) { $('use-daily-wallpaper').checked = false; wallpaperGrid.disabled = false; wallpaperGrid.classList.remove('grayout'); } }, /** * Returns url of current user's custom wallpaper thumbnail. * @private */ currentWallpaperImageUrl_: function() { return CUSTOM_WALLPAPER_PREFIX + BrowserOptions.getLoggedInUsername() + '?id=' + (new Date()).getTime(); }, /** * Updates the visibility of attribution-label and set-wallpaper-layout. * @param {boolean} isCustom True if users select custom wallpaper. */ set isCustom(isCustom) { if (isCustom) { // Clear attributions for custom wallpaper. $('wallpaper-attribution-label').hidden = true; // Enable the layout drop down box when custom wallpaper is selected. $('set-wallpaper-layout').hidden = false; } else { $('wallpaper-attribution-label').hidden = false; $('set-wallpaper-layout').hidden = true; } }, /** * Adds or updates custom user wallpaper thumbnail from file. * @private */ setCustomImage_: function() { var wallpaperGrid = $('wallpaper-grid'); var url = this.currentWallpaperImageUrl_(); if (this.oldImage_) { this.oldImage_ = wallpaperGrid.updateItem(this.oldImage_, url); } else { // Insert to the end of wallpaper list. var pos = wallpaperGrid.length; this.oldImage_ = wallpaperGrid.addItem(url, undefined, undefined, pos); } this.isCustom = true; this.setWallpaperAttribution_(''); wallpaperGrid.selectedItem = this.oldImage_; }, }; // Forward public APIs to private implementations. [ 'setDefaultImages', 'setSelectedImage', 'populateWallpaperLayouts', 'didSelectFile', 'setCustomImage' ].forEach(function(name) { SetWallpaperOptions[name] = function() { var instance = SetWallpaperOptions.getInstance(); return instance[name + '_'].apply(instance, arguments); }; }); // Export return { SetWallpaperOptions: SetWallpaperOptions }; });