Index: third_party/polymer/components/core-iconset-svg/core-iconset.html |
diff --git a/third_party/polymer/components/core-iconset-svg/core-iconset.html b/third_party/polymer/components/core-iconset-svg/core-iconset.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7ab2d34011c1f0fa8481f5d8df1bb08f10a38089 |
--- /dev/null |
+++ b/third_party/polymer/components/core-iconset-svg/core-iconset.html |
@@ -0,0 +1,241 @@ |
+<!-- |
+Copyright (c) 2014 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 Polymer Core Elements |
+ * |
+ * The `core-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 `iconSize` |
+ * 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 `core-iconset` elements are available for use by other `core-iconset` |
+ * elements via a database keyed by id. Typically, an element author that wants |
+ * to support a set of custom icons uses a `core-iconset` to retrieve |
+ * and use another, user-defined iconset. |
+ * |
+ * Example: |
+ * |
+ * <core-iconset id="my-icons" src="my-icons.png" width="96" iconSize="24" |
+ * icons="location place starta stopb bus car train walk"> |
+ * </core-iconset> |
+ * |
+ * This will automatically register the icon set "my-icons" to the iconset |
+ * database. To use these icons from within another element, make a |
+ * `core-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 `core-iconset` can contain child |
+ * `property` elements that specify a theme with an offsetX and offsetY of the |
+ * theme within the icon resource. For example. |
+ * |
+ * <core-iconset id="my-icons" src="my-icons.png" width="96" iconSize="24" |
+ * icons="location place starta stopb bus car train walk"> |
+ * <property theme="special" offsetX="256" offsetY="24"></property> |
+ * </core-iconset> |
+ * |
+ * Then a themed icon can be applied like this: |
+ * |
+ * iconset.applyIcon(iconNode, 'car', 'special'); |
+ * |
+ * @element core-iconset |
+ * @extends core-meta |
+ * @homepage github.io |
+ */ |
+--> |
+ |
+<link rel="import" href="../core-meta/core-meta.html"> |
+ |
+<polymer-element name="core-iconset" extends="core-meta" attributes="src width icons iconSize"> |
+ |
+ <script> |
+ |
+ Polymer('core-iconset', { |
+ |
+ /** |
+ * The URL of the iconset image. |
+ * |
+ * @attribute src |
+ * @type string |
+ * @default '' |
+ */ |
+ src: '', |
+ |
+ /** |
+ * 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: 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: '', |
+ |
+ /** |
+ * The size of an individual icon. Note that icons must be square. |
+ * |
+ * @attribute iconSize |
+ * @type number |
+ * @default 24 |
+ */ |
+ iconSize: 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 offsetX |
+ * @type number |
+ * @default 0 |
+ */ |
+ offsetX: 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 offsetY |
+ * @type number |
+ * @default 0 |
+ */ |
+ offsetY: 0, |
+ type: 'iconset', |
+ |
+ created: function() { |
+ this.iconMap = {}; |
+ this.iconNames = []; |
+ this.themes = {}; |
+ }, |
+ |
+ ready: function() { |
+ // TODO(sorvell): ensure iconset's src is always relative to the main |
+ // document |
+ if (this.src && (this.ownerDocument !== document)) { |
+ this.src = this.resolvePath(this.src, this.ownerDocument.baseURI); |
+ } |
+ this.super(); |
+ this.updateThemes(); |
+ }, |
+ |
+ iconsChanged: function() { |
+ var ox = this.offsetX; |
+ var oy = this.offsetY; |
+ this.icons && this.icons.split(/\s+/g).forEach(function(name, i) { |
+ this.iconNames.push(name); |
+ this.iconMap[name] = { |
+ offsetX: ox, |
+ offsetY: oy |
+ } |
+ if (ox + this.iconSize < this.width) { |
+ ox += this.iconSize; |
+ } else { |
+ ox = this.offsetX; |
+ oy += this.iconSize; |
+ } |
+ }, this); |
+ }, |
+ |
+ updateThemes: function() { |
+ var ts = this.querySelectorAll('property[theme]'); |
+ ts && ts.array().forEach(function(t) { |
+ this.themes[t.getAttribute('theme')] = { |
+ offsetX: parseInt(t.getAttribute('offsetX')) || 0, |
+ offsetY: parseInt(t.getAttribute('offsetY')) || 0 |
+ }; |
+ }, this); |
+ }, |
+ |
+ // TODO(ffu): support retrived by index e.g. getOffset(10); |
+ /** |
+ * Returns an object containing `offsetX` and `offsetY` properties which |
+ * specify the pixel locaion 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 getOffset |
+ * @param {String|Number} icon 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. |
+ */ |
+ getOffset: function(icon, theme) { |
+ var i = this.iconMap[icon]; |
+ if (!i) { |
+ var n = this.iconNames[Number(icon)]; |
+ i = this.iconMap[n]; |
+ } |
+ var t = this.themes[theme]; |
+ if (i && t) { |
+ return { |
+ offsetX: i.offsetX + t.offsetX, |
+ offsetY: i.offsetY + t.offsetY |
+ } |
+ } |
+ return i; |
+ }, |
+ |
+ /** |
+ * Applies an icon to the given element as a css background image. This |
+ * method does not size the element, and it's often 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 background is |
+ * applied. |
+ * @param {String|Number} icon The name or index of the icon to apply. |
+ * @param {Number} scale (optional, defaults to 1) A scaling factor |
+ * with which the icon can be magnified. |
+ * @return {Element} The icon element. |
+ */ |
+ applyIcon: function(element, icon, scale) { |
+ var offset = this.getOffset(icon); |
+ scale = scale || 1; |
+ if (element && offset) { |
+ var icon = element._icon || document.createElement('div'); |
+ var style = icon.style; |
+ style.backgroundImage = 'url(' + this.src + ')'; |
+ style.backgroundPosition = (-offset.offsetX * scale + 'px') + |
+ ' ' + (-offset.offsetY * scale + 'px'); |
+ style.backgroundSize = scale === 1 ? 'auto' : |
+ this.width * scale + 'px'; |
+ if (icon.parentNode !== element) { |
+ element.appendChild(icon); |
+ } |
+ return icon; |
+ } |
+ } |
+ |
+ }); |
+ |
+ </script> |
+ |
+</polymer-element> |