Index: third_party/polymer/v0_8/components/iron-iconset/iron-iconset.html |
diff --git a/third_party/polymer/v0_8/components/iron-iconset/iron-iconset.html b/third_party/polymer/v0_8/components/iron-iconset/iron-iconset.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e77f3aefa8ef7cf57d0a709e386b22bb517cb5b9 |
--- /dev/null |
+++ b/third_party/polymer/v0_8/components/iron-iconset/iron-iconset.html |
@@ -0,0 +1,338 @@ |
+<!-- |
+Copyright (c) 2015 The Polymer Project Authors. All rights reserved. |
+This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt |
+The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
+The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt |
+Code distributed by Google as part of the polymer project is also |
+subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt |
+--> |
+ |
+<!-- |
+/** |
+ * @group Iron Elements |
+ * |
+ * The `iron-iconset` element allows users to define their own icon sets. |
+ * The `src` property specifies the url of the icon image. Multiple icons may |
+ * be included in this image and they may be organized into rows. |
+ * The `icons` property is a space separated list of names corresponding to the |
+ * icons. The names must be ordered as the icons are ordered in the icon image. |
+ * Icons are expected to be square and are the size specified by the `size` |
+ * property. The `width` property corresponds to the width of the icon image |
+ * and must be specified if icons are arranged into multiple rows in the image. |
+ * |
+ * All `iron-iconset` elements are available for use by other `iron-iconset` |
+ * elements via a database keyed by id. Typically, an element author that wants |
+ * to support a set of custom icons uses a `iron-iconset` to retrieve |
+ * and use another, user-defined iconset. |
+ * |
+ * Example: |
+ * |
+ * <iron-iconset id="my-icons" src="my-icons.png" width="96" size="24" |
+ * icons="location place starta stopb bus car train walk"> |
+ * </iron-iconset> |
+ * |
+ * This will automatically register the icon set "my-icons" to the iconset |
+ * database. To use these icons from within another element, make a |
+ * `iron-iconset` element and call the `byId` method to retrieve a |
+ * given iconset. To apply a particular icon to an element, use the |
+ * `applyIcon` method. For example: |
+ * |
+ * iconset.applyIcon(iconNode, 'car'); |
+ * |
+ * Themed icon sets are also supported. The `iron-iconset` can contain child |
+ * `property` elements that specify a theme with an offsetX and offsetY of the |
+ * theme within the icon resource. For example. |
+ * |
+ * <iron-iconset id="my-icons" src="my-icons.png" width="96" size="24" |
+ * icons="location place starta stopb bus car train walk"> |
+ * <property theme="special" offsetX="256" offsetY="24"></property> |
+ * </iron-iconset> |
+ * |
+ * Then a themed icon can be applied like this: |
+ * |
+ * iconset.applyIcon(iconNode, 'car', 'special'); |
+ * |
+ * @element iron-iconset |
+ */ |
+--> |
+<link rel="import" href="../polymer/polymer.html"> |
+<link rel="import" href="../iron-meta/iron-meta.html"> |
+ |
+<script> |
+ |
+ Polymer({ |
+ |
+ is: 'iron-iconset', |
+ |
+ properties: { |
+ |
+ /** |
+ * The URL of the iconset image. |
+ * |
+ * @attribute src |
+ * @type string |
+ * @default '' |
+ */ |
+ src: { |
+ type: String, |
+ observer: '_srcChanged' |
+ }, |
+ |
+ /** |
+ * The name of the iconset. |
+ * |
+ * @attribute name |
+ * @type string |
+ * @default 'no-name' |
+ */ |
+ name: { |
+ type: String, |
+ observer: '_nameChanged' |
+ }, |
+ |
+ /** |
+ * The width of the iconset image. This must only be specified if the |
+ * icons are arranged into separate rows inside the image. |
+ * |
+ * @attribute width |
+ * @type number |
+ * @default 0 |
+ */ |
+ width: { |
+ type: Number, |
+ value: 0 |
+ }, |
+ |
+ /** |
+ * A space separated list of names corresponding to icons in the iconset |
+ * image file. This list must be ordered the same as the icon images |
+ * in the image file. |
+ * |
+ * @attribute icons |
+ * @type string |
+ * @default '' |
+ */ |
+ icons: { |
+ type: String |
+ }, |
+ |
+ /** |
+ * The size of an individual icon. Note that icons must be square. |
+ * |
+ * @attribute size |
+ * @type number |
+ * @default 24 |
+ */ |
+ size: { |
+ type: Number, |
+ value: 24 |
+ }, |
+ |
+ /** |
+ * The horizontal offset of the icon images in the inconset src image. |
+ * This is typically used if the image resource contains additional images |
+ * beside those intended for the iconset. |
+ * |
+ * @attribute offset-x |
+ * @type number |
+ * @default 0 |
+ */ |
+ _offsetX: { |
+ type: Number, |
+ value: 0 |
+ }, |
+ |
+ /** |
+ * The vertical offset of the icon images in the inconset src image. |
+ * This is typically used if the image resource contains additional images |
+ * beside those intended for the iconset. |
+ * |
+ * @attribute offset-y |
+ * @type number |
+ * @default 0 |
+ */ |
+ _offsetY: { |
+ type: Number, |
+ value: 0 |
+ }, |
+ |
+ /** |
+ * Array of fully-qualified names of icons in this set. |
+ */ |
+ iconNames: { |
+ type: Array, |
+ notify: true |
+ } |
+ |
+ }, |
+ |
+ hostAttributes: { |
+ // non-visual |
+ style: 'display: none;' |
+ }, |
+ |
+ ready: function() { |
+ // theme data must exist at ready-time |
+ this._themes = this._mapThemes(); |
+ }, |
+ |
+ /** |
+ * Applies an icon to the given element as a css background image. This |
+ * method does not size the element, and it's usually necessary to set |
+ * the element's height and width so that the background image is visible. |
+ * |
+ * @method applyIcon |
+ * @param {Element} element The element to which the icon is applied. |
+ * @param {String|Number} icon The name or index of the icon to apply. |
+ * @param {String} theme (optional) The name or index of the icon to apply. |
+ * @param {Number} scale (optional, defaults to 1) Icon scaling factor. |
+ * @return {Element} The applied icon element. |
+ */ |
+ applyIcon: function(element, icon, theme, scale) { |
+ this._validateIconMap(); |
+ var offset = this._getThemedOffset(icon, theme); |
+ if (element && offset) { |
+ this._addIconStyles(element, this._srcUrl, offset, scale || 1, |
+ this.size, this.width); |
+ } |
+ }, |
+ |
+ /** |
+ * Remove an icon from the given element by undoing the changes effected |
+ * by `applyIcon`. |
+ * |
+ * @param {Element} element The element from which the icon is removed. |
+ */ |
+ removeIcon: function(element) { |
+ this._removeIconStyles(element.style); |
+ }, |
+ |
+ _mapThemes: function() { |
+ var themes = Object.create(null); |
+ Polymer.dom(this).querySelectorAll('property[theme]') |
+ .forEach(function(property) { |
+ var offsetX = window.parseInt( |
+ property.getAttribute('offset-x'), 10 |
+ ) || 0; |
+ var offsetY = window.parseInt( |
+ property.getAttribute('offset-y'), 10 |
+ ) || 0; |
+ themes[property.getAttribute('theme')] = { |
+ offsetX: offsetX, |
+ offsetY: offsetY |
+ }; |
+ }); |
+ return themes; |
+ }, |
+ |
+ _srcChanged: function(src) { |
+ // ensure `srcUrl` is always relative to the main document |
+ this._srcUrl = this.ownerDocument !== document |
+ ? this.resolveUrl(src) : src; |
+ this._prepareIconset(); |
+ }, |
+ |
+ _nameChanged: function(name) { |
+ this._prepareIconset(); |
+ }, |
+ |
+ _prepareIconset: function() { |
+ new Polymer.IronMeta({type: 'iconset', key: this.name, value: this}); |
+ }, |
+ |
+ _invalidateIconMap: function() { |
+ this._iconMapValid = false; |
+ }, |
+ |
+ _validateIconMap: function() { |
+ if (!this._iconMapValid) { |
+ this._recomputeIconMap(); |
+ this._iconMapValid = true; |
+ } |
+ }, |
+ |
+ _recomputeIconMap: function() { |
+ this.iconNames = this._computeIconNames(this.icons); |
+ this.iconMap = this._computeIconMap(this._offsetX, this._offsetY, |
+ this.size, this.width, this.iconNames); |
+ }, |
+ |
+ _computeIconNames: function(icons) { |
+ return icons.split(/\s+/g); |
+ }, |
+ |
+ _computeIconMap: function(offsetX, offsetY, size, width, iconNames) { |
+ var iconMap = {}; |
+ if (offsetX !== undefined && offsetY !== undefined) { |
+ var x0 = offsetX; |
+ iconNames.forEach(function(iconName) { |
+ iconMap[iconName] = { |
+ offsetX: offsetX, |
+ offsetY: offsetY |
+ }; |
+ if ((offsetX + size) < width) { |
+ offsetX += size; |
+ } else { |
+ offsetX = x0; |
+ offsetY += size; |
+ } |
+ }, this); |
+ } |
+ return iconMap; |
+ }, |
+ |
+ /** |
+ * Returns an object containing `offsetX` and `offsetY` properties which |
+ * specify the pixel location in the iconset's src file for the given |
+ * `icon` and `theme`. It's uncommon to call this method. It is useful, |
+ * for example, to manually position a css backgroundImage to the proper |
+ * offset. It's more common to use the `applyIcon` method. |
+ * |
+ * @method getThemedOffset |
+ * @param {String|Number} identifier The name of the icon or the index of |
+ * the icon within in the icon image. |
+ * @param {String} theme The name of the theme. |
+ * @returns {Object} An object specifying the offset of the given icon |
+ * within the icon resource file; `offsetX` is the horizontal offset and |
+ * `offsetY` is the vertical offset. Both values are in pixel units. |
+ */ |
+ _getThemedOffset: function(identifier, theme) { |
+ var iconOffset = this._getIconOffset(identifier); |
+ var themeOffset = this._themes[theme]; |
+ if (iconOffset && themeOffset) { |
+ return { |
+ offsetX: iconOffset.offsetX + themeOffset.offsetX, |
+ offsetY: iconOffset.offsetY + themeOffset.offsetY |
+ }; |
+ } |
+ return iconOffset; |
+ }, |
+ |
+ _getIconOffset: function(identifier) { |
+ // TODO(sjmiles): consider creating offsetArray (indexed by Number) |
+ // and having iconMap map names to indices, then and index is just |
+ // iconMap[identifier] || identifier (be careful of zero, store indices |
+ // as 1-based) |
+ return this.iconMap[identifier] || |
+ this.iconMap[this.iconNames[Number(identifier)]]; |
+ }, |
+ |
+ _addIconStyles: function(element, url, offset, scale, size, width) { |
+ var style = element.style; |
+ style.backgroundImage = 'url(' + url + ')'; |
+ style.backgroundPosition = |
+ (-offset.offsetX * scale + 'px') + ' ' + |
+ (-offset.offsetY * scale + 'px'); |
+ style.backgroundSize = (scale === 1) ? 'auto' : width * scale + 'px'; |
+ style.width = size + 'px'; |
+ style.height = size + 'px'; |
+ element.setAttribute('role', 'img'); |
+ }, |
+ |
+ _removeIconStyles: function(style) { |
+ style.background = ''; |
+ } |
+ |
+ }); |
+ |
+</script> |