/* * Copyright (c) 2015-2017, Michael A. Updike All rights reserved. * Licensed under the BSD-3-Clause * https://opensource.org/licenses/BSD-3-Clause * https://github.com/opus1269/photo-screen-saver/blob/master/LICENSE.md */ (function() { window.app = window.app || {}; 'use strict'; new ExceptionHandler(); /** * Screensaver zoom view and base class for other SSView classes * @property {Element} image - paper-image * @property {Element} author - label * @property {Element} time - label * @property {Element} location - Geo location * @property {Object} model - template item model * @extends app.SSView * @alias app.SSViewFrame */ app.SSViewFrame = class extends app.SSView { /** * Create new SSViewFrame * @param {app.SSPhoto} photo - An {@link app.SSPhoto} * @constructor */ constructor(photo) { super(photo); } /** * Set style info for a label * @param {Object} style - element.style object * @param {int} width - frame width * @param {int} height - frame height * @param {boolean} isLeft - if true align left, else right * @static * @private */ static _setLabelStyle(style, width, height, isLeft) { style.textOverflow = 'ellipsis'; style.whiteSpace = 'nowrap'; style.color = 'black'; style.opacity = 1.0; style.fontSize = '2.5vh'; style.fontWeight = 400; // percent of screen width for label padding let padPer = 0.5; // percent of screen width of image let imgWidthPer = (width / screen.width) * 100; // percent of screen width on each side of image let sidePer = (100 - imgWidthPer) / 2; if (isLeft) { style.left = sidePer + padPer + 'vw'; style.right = ''; style.textAlign = 'left'; } else { style.right = sidePer + padPer + 'vw'; style.left = ''; style.textAlign = 'right'; } style.width = imgWidthPer - 2 * padPer + 'vw'; // percent of screen height of image let imgHtPer = (height / screen.height) * 100; // percent of screen height on each side of image let topPer = (100 - imgHtPer) / 2; style.bottom = topPer + 1.1 + 'vh'; } /** * Render the page for display */ render() { super.render(); const authorStyle = this.author.style; const locationStyle = this.location.style; const timeStyle = this.time.style; const image = this.image; const imageStyle = image.style; const img = image.$.img; const imgStyle = img.style; /** @type {app.SSPhoto} */ const photo = this.photo; const ar = photo.getAspectRatio(); // scale to screen size const border = screen.height * 0.005; const borderBot = screen.height * 0.05; const padding = screen.height * 0.025; const height = Math.min((screen.width - padding * 2 - border * 2) / ar, screen.height - padding * 2 - border - borderBot); const width = height * ar; // size with the frame const frWidth = width + border * 2; const frHeight = height + borderBot + border; imgStyle.height = height + 'px'; imgStyle.width = width + 'px'; image.height = height; image.width = width; imageStyle.top = (screen.height - frHeight) / 2 + 'px'; imageStyle.left = (screen.width - frWidth) / 2 + 'px'; imageStyle.border = 0.5 + 'vh ridge WhiteSmoke'; imageStyle.borderBottom = 5 + 'vh solid WhiteSmoke'; imageStyle.borderRadius = '1.5vh'; imageStyle.boxShadow = '1.5vh 1.5vh 1.5vh rgba(0,0,0,.7)'; app.SSViewFrame._setLabelStyle(authorStyle, frWidth, frHeight, false); app.SSViewFrame._setLabelStyle(locationStyle, frWidth, frHeight, true); // percent of screen height of image let imgHtPer = (frHeight / screen.height) * 100; // percent of screen height on each side of image let topPer = (100 - imgHtPer) / 2; // percent of screen width of image let imgWidthPer = (frWidth / screen.width) * 100; // percent of screen width on each side of image let sidePer = (100 - imgWidthPer) / 2; timeStyle.right = sidePer + 1.0 + 'vw'; timeStyle.textAlign = 'right'; timeStyle.bottom = topPer + 5.0 + 'vh'; // percent of half the width of image let maxWidth = imgWidthPer / 2; if (this._hasLocationLabel()) { // limit author width if we also have a location authorStyle.maxWidth = maxWidth - 1 + 'vw'; } if (this._hasAuthorLabel()) { // limit location width if we also have an author locationStyle.maxWidth = maxWidth - 1 + 'vw'; } } }; })();