BaseLayerPickerViewModel.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /*global define*/
  2. define([
  3. '../../Core/defaultValue',
  4. '../../Core/defined',
  5. '../../Core/defineProperties',
  6. '../../Core/DeveloperError',
  7. '../../Core/EllipsoidTerrainProvider',
  8. '../../Core/isArray',
  9. '../../ThirdParty/knockout',
  10. '../createCommand'
  11. ], function(
  12. defaultValue,
  13. defined,
  14. defineProperties,
  15. DeveloperError,
  16. EllipsoidTerrainProvider,
  17. isArray,
  18. knockout,
  19. createCommand) {
  20. "use strict";
  21. /**
  22. * The view model for {@link BaseLayerPicker}.
  23. * @alias BaseLayerPickerViewModel
  24. * @constructor
  25. *
  26. * @param {Object} options Object with the following properties:
  27. * @param {Globe} options.globe The Globe to use.
  28. * @param {ProviderViewModel[]} [options.imageryProviderViewModels=[]] The array of ProviderViewModel instances to use for imagery.
  29. * @param {ProviderViewModel} [options.selectedImageryProviderViewModel] The view model for the current base imagery layer, if not supplied the first available imagery layer is used.
  30. * @param {ProviderViewModel[]} [options.terrainProviderViewModels=[]] The array of ProviderViewModel instances to use for terrain.
  31. * @param {ProviderViewModel} [options.selectedTerrainProviderViewModel] The view model for the current base terrain layer, if not supplied the first available terrain layer is used.
  32. *
  33. * @exception {DeveloperError} imageryProviderViewModels must be an array.
  34. * @exception {DeveloperError} terrainProviderViewModels must be an array.
  35. */
  36. var BaseLayerPickerViewModel = function(options) {
  37. options = defaultValue(options, defaultValue.EMPTY_OBJECT);
  38. var globe = options.globe;
  39. var imageryProviderViewModels = defaultValue(options.imageryProviderViewModels, []);
  40. var terrainProviderViewModels = defaultValue(options.terrainProviderViewModels, []);
  41. //>>includeStart('debug', pragmas.debug);
  42. if (!defined(globe)) {
  43. throw new DeveloperError('globe is required');
  44. }
  45. //>>includeEnd('debug');
  46. this._globe = globe;
  47. /**
  48. * Gets or sets an array of ProviderViewModel instances available for imagery selection.
  49. * This property is observable.
  50. * @type {ProviderViewModel[]}
  51. */
  52. this.imageryProviderViewModels = imageryProviderViewModels.slice(0);
  53. /**
  54. * Gets or sets an array of ProviderViewModel instances available for terrain selection.
  55. * This property is observable.
  56. * @type {ProviderViewModel[]}
  57. */
  58. this.terrainProviderViewModels = terrainProviderViewModels.slice(0);
  59. /**
  60. * Gets or sets whether the imagery selection drop-down is currently visible.
  61. * @type {Boolean}
  62. * @default false
  63. */
  64. this.dropDownVisible = false;
  65. knockout.track(this, ['imageryProviderViewModels', 'terrainProviderViewModels', 'dropDownVisible']);
  66. /**
  67. * Gets the button tooltip. This property is observable.
  68. * @type {String}
  69. */
  70. this.buttonTooltip = undefined;
  71. knockout.defineProperty(this, 'buttonTooltip', function() {
  72. var selectedImagery = this.selectedImagery;
  73. var selectedTerrain = this.selectedTerrain;
  74. var imageryTip = defined(selectedImagery) ? selectedImagery.name : undefined;
  75. var terrainTip = defined(selectedTerrain) ? selectedTerrain.name : undefined;
  76. if (defined(imageryTip) && defined(terrainTip)) {
  77. return imageryTip + '\n' + terrainTip;
  78. } else if (defined(imageryTip)) {
  79. return imageryTip;
  80. }
  81. return terrainTip;
  82. });
  83. /**
  84. * Gets the button background image. This property is observable.
  85. * @type {String}
  86. */
  87. this.buttonImageUrl = undefined;
  88. knockout.defineProperty(this, 'buttonImageUrl', function() {
  89. var viewModel = this.selectedImagery;
  90. return defined(viewModel) ? viewModel.iconUrl : undefined;
  91. });
  92. /**
  93. * Gets or sets the currently selected imagery. This property is observable.
  94. * @type {ProviderViewModel}
  95. * @default undefined
  96. */
  97. this.selectedImagery = undefined;
  98. var selectedImageryViewModel = knockout.observable();
  99. this._currentImageryProviders = [];
  100. knockout.defineProperty(this, 'selectedImagery', {
  101. get : function() {
  102. return selectedImageryViewModel();
  103. },
  104. set : function(value) {
  105. if (selectedImageryViewModel() === value) {
  106. this.dropDownVisible = false;
  107. return;
  108. }
  109. var i;
  110. var currentImageryProviders = this._currentImageryProviders;
  111. var currentImageryProvidersLength = currentImageryProviders.length;
  112. var imageryLayers = this._globe.imageryLayers;
  113. for (i = 0; i < currentImageryProvidersLength; i++) {
  114. var layersLength = imageryLayers.length;
  115. for ( var x = 0; x < layersLength; x++) {
  116. var layer = imageryLayers.get(x);
  117. if (layer.imageryProvider === currentImageryProviders[i]) {
  118. imageryLayers.remove(layer);
  119. break;
  120. }
  121. }
  122. }
  123. if (defined(value)) {
  124. var newProviders = value.creationCommand();
  125. if (isArray(newProviders)) {
  126. var newProvidersLength = newProviders.length;
  127. for (i = newProvidersLength - 1; i >= 0; i--) {
  128. imageryLayers.addImageryProvider(newProviders[i], 0);
  129. }
  130. this._currentImageryProviders = newProviders.slice(0);
  131. } else {
  132. this._currentImageryProviders = [newProviders];
  133. imageryLayers.addImageryProvider(newProviders, 0);
  134. }
  135. }
  136. selectedImageryViewModel(value);
  137. this.dropDownVisible = false;
  138. }
  139. });
  140. /**
  141. * Gets or sets the currently selected terrain. This property is observable.
  142. * @type {ProviderViewModel}
  143. * @default undefined
  144. */
  145. this.selectedTerrain = undefined;
  146. var selectedTerrainViewModel = knockout.observable();
  147. knockout.defineProperty(this, 'selectedTerrain', {
  148. get : function() {
  149. return selectedTerrainViewModel();
  150. },
  151. set : function(value) {
  152. if (selectedTerrainViewModel() === value) {
  153. this.dropDownVisible = false;
  154. return;
  155. }
  156. var newProvider;
  157. if (defined(value)) {
  158. newProvider = value.creationCommand();
  159. }
  160. this._globe.depthTestAgainstTerrain = !(newProvider instanceof EllipsoidTerrainProvider);
  161. this._globe.terrainProvider = newProvider;
  162. selectedTerrainViewModel(value);
  163. this.dropDownVisible = false;
  164. }
  165. });
  166. var that = this;
  167. this._toggleDropDown = createCommand(function() {
  168. that.dropDownVisible = !that.dropDownVisible;
  169. });
  170. this.selectedImagery = defaultValue(options.selectedImageryProviderViewModel, imageryProviderViewModels[0]);
  171. this.selectedTerrain = defaultValue(options.selectedTerrainProviderViewModel, terrainProviderViewModels[0]);
  172. };
  173. defineProperties(BaseLayerPickerViewModel.prototype, {
  174. /**
  175. * Gets the command to toggle the visibility of the drop down.
  176. * @memberof BaseLayerPickerViewModel.prototype
  177. *
  178. * @type {Command}
  179. */
  180. toggleDropDown : {
  181. get : function() {
  182. return this._toggleDropDown;
  183. }
  184. },
  185. /**
  186. * Gets the globe.
  187. * @memberof BaseLayerPickerViewModel.prototype
  188. *
  189. * @type {Globe}
  190. */
  191. globe : {
  192. get : function() {
  193. return this._globe;
  194. }
  195. }
  196. });
  197. return BaseLayerPickerViewModel;
  198. });