Requires

Provides

Layers.js

Make widget use layers for all the SVG

License:
Public domain (http://unlicense.org).
Authors:
Yaroslaff Fedin
  1. 25
  2. 26
  3. 27
  4. 28
  5. 29
  6. 30
  7. 31
  8. 32
  9. 33
  10. 34
  11. 35
  12. 36
  13. 37
  14. 38
  15. 39
  16. 40
  17. 41
  18. 42
  19. 43
  20. 44
  21. 45
  22. 46
  23. 47
  24. 48
  25. 49
  26. 50
  27. 51
  28. 52
  29. 53
  30. 54
  31. 55
  32. 56
  33. 57
  34. 58
  35. 59
  36. 60
  37. 61
  38. 62
  39. 63
  40. 64
  41. 65
  42. 66
  43. 67
  44. 68
  45. 69
  46. 70
  47. 71
  48. 72
  49. 73
  50. 74
  51. 75
  52. 76
  53. 77
  54. 78
  55. 79
  56. 80
  57. 81
  58. 82
  59. 83
  60. 84
  61. 85
  62. 86
  63. 87
  64. 88
  65. 89
  66. 90
  67. 91
  68. 92
  69. 93
  70. 94
  71. 95
  72. 96
  73. 97
  74. 98
  75. 99
  76. 100
  77. 101
  78. 102
  79. 103
  80. 104
  81. 105
  82. 106
  83. 107
  84. 108
  85. 109
  86. 110
  87. 111
  88. 112
  89. 113
  90. 114
  91. 115
  92. 116
  93. 117
  94. 118
  95. 119
  96. 120
  97. 121
  98. 122
  99. 123
  100. 124
  101. 125
  102. 126
  103. 127
  104. 128
  105. 129
  106. 130
  107. 131
  108. 132
  109. 133
  110. 134
  111. 135
  112. 136
  113. 137
  114. 138
  115. 139
  116. 140
  117. 141
  118. 142
  119. 143
  120. 144
!function() { LSD.Trait.Layers = new Class({ options: { layers: {}, events: { self: { attach: function() { this.style.layers = {}; for (var name in this.options.layers) this.addLayer(name, this.options.layers[name]); } } } }, initialize: function() { this.offset = { inside: {}, outside: {}, padding: {} }; this.layers = {}; this.shapes = {}; this.parent.apply(this, arguments); }, addLayer: function(name, value) { var slots = this.style.layers; var layer = this.layers[name] = LSD.Layer.get(name, Array.concat(value)); for (var i = 0, painter; painter = layer.painters[i++];) { for (var group = painter.keys, j = 0, property; property = group[j++];) { if (!slots[property]) slots[property] = []; slots[property].push(name); } } }, renderLayers: function(dirty) { var updated = new FastArray, style = this.style, layers = style.layers, offset = this.offset; for (var property in dirty) if (layers[property]) updated.push.apply(updated, layers[property]); var result = {}; for (var name in this.layers) { if (!updated[name]) continue; var layer = this.layers[name]; var sizes = Object.append({box: this.size}, {size: Object.append({}, this.size)}); result = layer.draw(this, Object.append(result.inside ? {inside: result.inside, outside: result.outside} : {}, sizes)) } var inside = offset.inside = Object.append({left: 0, right: 0, top: 0, bottom: 0}, result.inside); var outside = offset.outside = Object.append({left: 0, right: 0, top: 0, bottom: 0}, result.outside); offset.shape = /*this.shape.getOffset ? this.shape.getOffset(style.current) : */{left: 0, right: 0, top: 0, bottom: 0}; for (var name in this.shapes) { var layer = this.shapes[name]; if (!layer) continue; if (!layer.injected) { for (var layers = Object.keys(this.layers), i = layers.indexOf(layer.name), key, next; key = layers[++i];) { if ((next = this.layers[key]) && next.injected && next.shape) { layer.inject(next.shape, 'before'); break; } } if (!layer.injected) layer.inject(this.getCanvas()); layer.injected = true; } } }, render: function() { var style = this.style, last = style.last, old = style.size, paint = style.paint, changed = style.changed; this.parent.apply(this, arguments); this.setSize(this.getStyles('height', 'width')); var size = this.size; if (size && (!old || (old.width != size.width || old.height != size.height))) { this.fireEvent('resize', [size, old]); changed = paint; } if (Object.getLength(changed) > 0) this.renderLayers(changed); style.changed = {}; style.last = Object.append({}, paint); style.size = Object.append({}, size); this.renderOffsets(); }, renderStyles: function() { this.parent.apply(this, arguments); var style = this.style, current = style.current; Object.append(this.offset, { padding: {left: current.paddingLeft || 0, right: current.paddingRight || 0, top: current.paddingTop || 0, bottom: current.paddingBottom || 0}, margin: {left: current.marginLeft || 0, right: current.marginRight || 0, top: current.marginTop || 0, bottom: current.marginBottom || 0} }); }, renderOffsets: function() { var element = this.element, current = this.style.current, offset = this.offset, // Offset that is provided by: inside = offset.inside, // layers, inside the widget outside = offset.outside, // layers, outside of the widget shape = offset.shape, // shape padding = offset.padding, // padding style declarations margin = offset.margin, // margin style declarations inner = {}, // all inside offsets above, converted to padding outer = {}; // all outside offsets above, converted to margin for (var property in inside) { var cc = property.capitalize(); if (offset.inner) var last = offset.inner[property]; inner[property] = padding[property] + inside[property] + shape[property] + outside[property]; if (last != null ? last != inner[property] : inner[property]) element.style['padding' + cc] = inner[property] + 'px'; if (offset.outer) last = offset.outer[property]; outer[property] = margin[property] - outside[property]; if (last != null ? last != outer[property] : outer[property]) element.style['margin' + cc] = outer[property] + 'px'; } if (inside) Object.append(offset, {inner: inner, outer: outer}); } }); }();