OLD | NEW |
(Empty) | |
| 1 <!-- |
| 2 Copyright (c) 2014 The Polymer Project Authors. All rights reserved. |
| 3 This code may only be used under the BSD style license found at http://polymer.g
ithub.io/LICENSE.txt |
| 4 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
| 5 The complete set of contributors may be found at http://polymer.github.io/CONTRI
BUTORS.txt |
| 6 Code distributed by Google as part of the polymer project is also |
| 7 subject to an additional IP rights grant found at http://polymer.github.io/PATEN
TS.txt |
| 8 --> |
| 9 |
| 10 <!-- |
| 11 /** |
| 12 * @group Polymer Core Elements |
| 13 * |
| 14 * The `core-iconset` element allows users to define their own icon sets. |
| 15 * The `src` property specifies the url of the icon image. Multiple icons may |
| 16 * be included in this image and they may be organized into rows. |
| 17 * The `icons` property is a space separated list of names corresponding to the |
| 18 * icons. The names must be ordered as the icons are ordered in the icon image. |
| 19 * Icons are expected to be square and are the size specified by the `iconSize` |
| 20 * property. The `width` property corresponds to the width of the icon image |
| 21 * and must be specified if icons are arranged into multiple rows in the image. |
| 22 * |
| 23 * All `core-iconset` elements are available for use by other `core-iconset` |
| 24 * elements via a database keyed by id. Typically, an element author that wants |
| 25 * to support a set of custom icons uses a `core-iconset` to retrieve |
| 26 * and use another, user-defined iconset. |
| 27 * |
| 28 * Example: |
| 29 * |
| 30 * <core-iconset id="my-icons" src="my-icons.png" width="96" iconSize="24" |
| 31 * icons="location place starta stopb bus car train walk"> |
| 32 * </core-iconset> |
| 33 * |
| 34 * This will automatically register the icon set "my-icons" to the iconset |
| 35 * database. To use these icons from within another element, make a |
| 36 * `core-iconset` element and call the `byId` method to retrieve a |
| 37 * given iconset. To apply a particular icon to an element, use the |
| 38 * `applyIcon` method. For example: |
| 39 * |
| 40 * iconset.applyIcon(iconNode, 'car'); |
| 41 * |
| 42 * Themed icon sets are also supported. The `core-iconset` can contain child |
| 43 * `property` elements that specify a theme with an offsetX and offsetY of the |
| 44 * theme within the icon resource. For example. |
| 45 * |
| 46 * <core-iconset id="my-icons" src="my-icons.png" width="96" iconSize="24" |
| 47 * icons="location place starta stopb bus car train walk"> |
| 48 * <property theme="special" offsetX="256" offsetY="24"></property> |
| 49 * </core-iconset> |
| 50 * |
| 51 * Then a themed icon can be applied like this: |
| 52 * |
| 53 * iconset.applyIcon(iconNode, 'car', 'special'); |
| 54 * |
| 55 * @element core-iconset |
| 56 * @extends core-meta |
| 57 * @homepage github.io |
| 58 */ |
| 59 --> |
| 60 |
| 61 <link rel="import" href="../core-meta/core-meta.html"> |
| 62 |
| 63 <polymer-element name="core-iconset" extends="core-meta" attributes="src width i
cons iconSize"> |
| 64 |
| 65 <script> |
| 66 |
| 67 Polymer('core-iconset', { |
| 68 |
| 69 /** |
| 70 * The URL of the iconset image. |
| 71 * |
| 72 * @attribute src |
| 73 * @type string |
| 74 * @default '' |
| 75 */ |
| 76 src: '', |
| 77 |
| 78 /** |
| 79 * The width of the iconset image. This must only be specified if the |
| 80 * icons are arranged into separate rows inside the image. |
| 81 * |
| 82 * @attribute width |
| 83 * @type number |
| 84 * @default 0 |
| 85 */ |
| 86 width: 0, |
| 87 |
| 88 /** |
| 89 * A space separated list of names corresponding to icons in the iconset |
| 90 * image file. This list must be ordered the same as the icon images |
| 91 * in the image file. |
| 92 * |
| 93 * @attribute icons |
| 94 * @type string |
| 95 * @default '' |
| 96 */ |
| 97 icons: '', |
| 98 |
| 99 /** |
| 100 * The size of an individual icon. Note that icons must be square. |
| 101 * |
| 102 * @attribute iconSize |
| 103 * @type number |
| 104 * @default 24 |
| 105 */ |
| 106 iconSize: 24, |
| 107 |
| 108 /** |
| 109 * The horizontal offset of the icon images in the inconset src image. |
| 110 * This is typically used if the image resource contains additional images |
| 111 * beside those intended for the iconset. |
| 112 * |
| 113 * @attribute offsetX |
| 114 * @type number |
| 115 * @default 0 |
| 116 */ |
| 117 offsetX: 0, |
| 118 /** |
| 119 * The vertical offset of the icon images in the inconset src image. |
| 120 * This is typically used if the image resource contains additional images |
| 121 * beside those intended for the iconset. |
| 122 * |
| 123 * @attribute offsetY |
| 124 * @type number |
| 125 * @default 0 |
| 126 */ |
| 127 offsetY: 0, |
| 128 type: 'iconset', |
| 129 |
| 130 created: function() { |
| 131 this.iconMap = {}; |
| 132 this.iconNames = []; |
| 133 this.themes = {}; |
| 134 }, |
| 135 |
| 136 ready: function() { |
| 137 // TODO(sorvell): ensure iconset's src is always relative to the main |
| 138 // document |
| 139 if (this.src && (this.ownerDocument !== document)) { |
| 140 this.src = this.resolvePath(this.src, this.ownerDocument.baseURI); |
| 141 } |
| 142 this.super(); |
| 143 this.updateThemes(); |
| 144 }, |
| 145 |
| 146 iconsChanged: function() { |
| 147 var ox = this.offsetX; |
| 148 var oy = this.offsetY; |
| 149 this.icons && this.icons.split(/\s+/g).forEach(function(name, i) { |
| 150 this.iconNames.push(name); |
| 151 this.iconMap[name] = { |
| 152 offsetX: ox, |
| 153 offsetY: oy |
| 154 } |
| 155 if (ox + this.iconSize < this.width) { |
| 156 ox += this.iconSize; |
| 157 } else { |
| 158 ox = this.offsetX; |
| 159 oy += this.iconSize; |
| 160 } |
| 161 }, this); |
| 162 }, |
| 163 |
| 164 updateThemes: function() { |
| 165 var ts = this.querySelectorAll('property[theme]'); |
| 166 ts && ts.array().forEach(function(t) { |
| 167 this.themes[t.getAttribute('theme')] = { |
| 168 offsetX: parseInt(t.getAttribute('offsetX')) || 0, |
| 169 offsetY: parseInt(t.getAttribute('offsetY')) || 0 |
| 170 }; |
| 171 }, this); |
| 172 }, |
| 173 |
| 174 // TODO(ffu): support retrived by index e.g. getOffset(10); |
| 175 /** |
| 176 * Returns an object containing `offsetX` and `offsetY` properties which |
| 177 * specify the pixel locaion in the iconset's src file for the given |
| 178 * `icon` and `theme`. It's uncommon to call this method. It is useful, |
| 179 * for example, to manually position a css backgroundImage to the proper |
| 180 * offset. It's more common to use the `applyIcon` method. |
| 181 * |
| 182 * @method getOffset |
| 183 * @param {String|Number} icon The name of the icon or the index of the |
| 184 * icon within in the icon image. |
| 185 * @param {String} theme The name of the theme. |
| 186 * @returns {Object} An object specifying the offset of the given icon |
| 187 * within the icon resource file; `offsetX` is the horizontal offset and |
| 188 * `offsetY` is the vertical offset. Both values are in pixel units. |
| 189 */ |
| 190 getOffset: function(icon, theme) { |
| 191 var i = this.iconMap[icon]; |
| 192 if (!i) { |
| 193 var n = this.iconNames[Number(icon)]; |
| 194 i = this.iconMap[n]; |
| 195 } |
| 196 var t = this.themes[theme]; |
| 197 if (i && t) { |
| 198 return { |
| 199 offsetX: i.offsetX + t.offsetX, |
| 200 offsetY: i.offsetY + t.offsetY |
| 201 } |
| 202 } |
| 203 return i; |
| 204 }, |
| 205 |
| 206 /** |
| 207 * Applies an icon to the given element as a css background image. This |
| 208 * method does not size the element, and it's often necessary to set |
| 209 * the element's height and width so that the background image is visible. |
| 210 * |
| 211 * @method applyIcon |
| 212 * @param {Element} element The element to which the background is |
| 213 * applied. |
| 214 * @param {String|Number} icon The name or index of the icon to apply. |
| 215 * @param {Number} scale (optional, defaults to 1) A scaling factor |
| 216 * with which the icon can be magnified. |
| 217 * @return {Element} The icon element. |
| 218 */ |
| 219 applyIcon: function(element, icon, scale) { |
| 220 var offset = this.getOffset(icon); |
| 221 scale = scale || 1; |
| 222 if (element && offset) { |
| 223 var icon = element._icon || document.createElement('div'); |
| 224 var style = icon.style; |
| 225 style.backgroundImage = 'url(' + this.src + ')'; |
| 226 style.backgroundPosition = (-offset.offsetX * scale + 'px') + |
| 227 ' ' + (-offset.offsetY * scale + 'px'); |
| 228 style.backgroundSize = scale === 1 ? 'auto' : |
| 229 this.width * scale + 'px'; |
| 230 if (icon.parentNode !== element) { |
| 231 element.appendChild(icon); |
| 232 } |
| 233 return icon; |
| 234 } |
| 235 } |
| 236 |
| 237 }); |
| 238 |
| 239 </script> |
| 240 |
| 241 </polymer-element> |
OLD | NEW |