1. /**
  2. * @module meteoJS/synview
  3. */
  4. import $ from 'jquery';
  5. import SynviewMap from './synview/SynviewMap.js';
  6. import Timeline from './Timeline.js';
  7. import TypeCollection from './synview/TypeCollection.js';
  8. import Tooltip from './synview/Tooltip.js';
  9. /**
  10. * Options for constructor.
  11. *
  12. * @typedef {Object} module:meteoJS/synview~options
  13. * @param {module:meteoJS/synview/map.SynviewMap|undefined} [map]
  14. * Synview map object.
  15. * @param {module:meteoJS/timeline.Timeline|undefined} [timeline]
  16. * Timeline object.
  17. * @param {module:meteoJS/tooltip.Tooltip} [tooltip] - Tooltip object.
  18. */
  19. /**
  20. * Mapping object to show map data for different timestamps. Create one object
  21. * per map.
  22. */
  23. export default class Synview {
  24. /**
  25. * @param {module:meteoJS/synview~options} options - Options.
  26. */
  27. constructor(options) {
  28. /**
  29. * @type {module:meteoJS/synview~options}
  30. * @private
  31. */
  32. this.options = $.extend(true, {
  33. map: undefined,
  34. timeline: undefined,
  35. tooltip: undefined
  36. }, options);
  37. // Normalize options
  38. if (this.options.map === undefined)
  39. this.options.map = new SynviewMap();
  40. if (this.options.timeline === undefined)
  41. this.options.timeline = new Timeline();
  42. /**
  43. * Collection of synview types.
  44. * @member {module:meteoJS/synview/typecollection.TypeCollection}
  45. */
  46. this.typeCollection = new TypeCollection();
  47. /** @type meteoJS/synview/tooltip~Tooltip|undefined */
  48. this.tooltip = undefined;
  49. // Timeline initialisieren
  50. this.options.timeline.on('change:time', function () {
  51. this.getTypeCollection().getItems().map(function (type) {
  52. type.setDisplayTime(this.options.timeline.getSelectedTime());
  53. }, this);
  54. }, this);
  55. // typeCollection initialisieren
  56. var timeline = this.options.timeline;
  57. var updateTimes = function () {
  58. var isLastTime = timeline.isLastEnabledTime();
  59. // Zeitpunkte einlesen
  60. if (this.getVisible())
  61. timeline.setTimesBySetID(this.getId(), this.getResourceCollection().getTimes());
  62. else
  63. timeline.setTimesBySetID(this.getId(), []);
  64. // Switch to last timestamp, if it was the last one already before.
  65. if (isLastTime)
  66. timeline.last();
  67. else if (isNaN(timeline.getSelectedTime()))
  68. timeline.first();
  69. };
  70. var appendType = function (type) {
  71. type.setLayerGroup(this.options.map.makeLayerGroup());
  72. updateTimes.call(type);
  73. type.setDisplayTime(this.getTimeline().getSelectedTime());
  74. type.on('change:resources', updateTimes);
  75. // Zeitpunkte bei visible-Änderungen löschen oder hinzufügen
  76. type.on('change:visible', updateTimes);
  77. if (type.getTooltip() !== undefined &&
  78. this.tooltip === undefined) {
  79. this.tooltip = new Tooltip({
  80. map: this.options.map,
  81. typeCollection: this.typeCollection,
  82. tooltip: this.options.tooltip
  83. });
  84. }
  85. };
  86. var removeType = function (type) {
  87. this.getTimeline().deleteSetID(type.getId());
  88. // Layer-Group löschen (bzw. aus OL entfernen)
  89. // Events aus dem Type löschen
  90. };
  91. this.typeCollection.on('add:item', appendType, this);
  92. this.typeCollection.on('remove:item', removeType, this);
  93. this.typeCollection.on('replace:item', function (type, removedType) {
  94. appendType.call(this, type);
  95. removeType.call(this, removedType);
  96. }, this);
  97. }
  98. /**
  99. * Returns timeline object.
  100. *
  101. * @return {meteoJS.timeline} Timeline.
  102. */
  103. getTimeline() {
  104. return this.options.timeline;
  105. }
  106. /**
  107. * Returns map object.
  108. *
  109. * @return {meteoJS.synview.map} Map object.
  110. */
  111. getMap() {
  112. return this.options.map;
  113. }
  114. /**
  115. * Returns collection object of appended types.
  116. *
  117. * @return {meteoJS.synview.typeCollection} Type collection.
  118. */
  119. getTypeCollection() {
  120. return this.typeCollection;
  121. }
  122. /**
  123. * Append a type to this synview. Wrapper for getTypeCollection().append(type),
  124. * but ensures, that the new type has an id different than undefined.
  125. *
  126. * @param {meteoJS.synview.type} type Type to append.
  127. * @return {meteoJS.synview} This.
  128. */
  129. appendType(type) {
  130. if (type.getId() === undefined) {
  131. var prefixId = 'synview-type-';
  132. var i = 0;
  133. var newId;
  134. do {
  135. newId = prefixId + (i++);
  136. } while (this.getTypeCollection().containsId(newId));
  137. type.setId(newId);
  138. }
  139. this.getTypeCollection().append(type);
  140. return this;
  141. }
  142. /**
  143. * Returns the tooltip object.
  144. *
  145. * @returns {module:meteoJS/tooltip~Tooltip} - Tooltip object.
  146. */
  147. getTooltip() {
  148. return this.options.tooltip;
  149. }
  150. }