123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- import defaultValue from "../../Core/defaultValue.js";
- import defined from "../../Core/defined.js";
- import DeveloperError from "../../Core/DeveloperError.js";
- import EllipsoidTerrainProvider from "../../Core/EllipsoidTerrainProvider.js";
- import knockout from "../../ThirdParty/knockout.js";
- import createCommand from "../createCommand.js";
- /**
- * The view model for {@link BaseLayerPicker}.
- * @alias BaseLayerPickerViewModel
- * @constructor
- *
- * @param {Object} options Object with the following properties:
- * @param {Globe} options.globe The Globe to use.
- * @param {ProviderViewModel[]} [options.imageryProviderViewModels=[]] The array of ProviderViewModel instances to use for imagery.
- * @param {ProviderViewModel} [options.selectedImageryProviderViewModel] The view model for the current base imagery layer, if not supplied the first available imagery layer is used.
- * @param {ProviderViewModel[]} [options.terrainProviderViewModels=[]] The array of ProviderViewModel instances to use for terrain.
- * @param {ProviderViewModel} [options.selectedTerrainProviderViewModel] The view model for the current base terrain layer, if not supplied the first available terrain layer is used.
- *
- * @exception {DeveloperError} imageryProviderViewModels must be an array.
- * @exception {DeveloperError} terrainProviderViewModels must be an array.
- */
- function BaseLayerPickerViewModel(options) {
- options = defaultValue(options, defaultValue.EMPTY_OBJECT);
- const globe = options.globe;
- const imageryProviderViewModels = defaultValue(
- options.imageryProviderViewModels,
- []
- );
- const terrainProviderViewModels = defaultValue(
- options.terrainProviderViewModels,
- []
- );
- //>>includeStart('debug', pragmas.debug);
- if (!defined(globe)) {
- throw new DeveloperError("globe is required");
- }
- //>>includeEnd('debug');
- this._globe = globe;
- /**
- * Gets or sets an array of ProviderViewModel instances available for imagery selection.
- * This property is observable.
- * @type {ProviderViewModel[]}
- */
- this.imageryProviderViewModels = imageryProviderViewModels.slice(0);
- /**
- * Gets or sets an array of ProviderViewModel instances available for terrain selection.
- * This property is observable.
- * @type {ProviderViewModel[]}
- */
- this.terrainProviderViewModels = terrainProviderViewModels.slice(0);
- /**
- * Gets or sets whether the imagery selection drop-down is currently visible.
- * @type {Boolean}
- * @default false
- */
- this.dropDownVisible = false;
- knockout.track(this, [
- "imageryProviderViewModels",
- "terrainProviderViewModels",
- "dropDownVisible",
- ]);
- const imageryObservable = knockout.getObservable(
- this,
- "imageryProviderViewModels"
- );
- const imageryProviders = knockout.pureComputed(function () {
- const providers = imageryObservable();
- const categories = {};
- let i;
- for (i = 0; i < providers.length; i++) {
- const provider = providers[i];
- const category = provider.category;
- if (defined(categories[category])) {
- categories[category].push(provider);
- } else {
- categories[category] = [provider];
- }
- }
- const allCategoryNames = Object.keys(categories);
- const result = [];
- for (i = 0; i < allCategoryNames.length; i++) {
- const name = allCategoryNames[i];
- result.push({
- name: name,
- providers: categories[name],
- });
- }
- return result;
- });
- this._imageryProviders = imageryProviders;
- const terrainObservable = knockout.getObservable(
- this,
- "terrainProviderViewModels"
- );
- const terrainProviders = knockout.pureComputed(function () {
- const providers = terrainObservable();
- const categories = {};
- let i;
- for (i = 0; i < providers.length; i++) {
- const provider = providers[i];
- const category = provider.category;
- if (defined(categories[category])) {
- categories[category].push(provider);
- } else {
- categories[category] = [provider];
- }
- }
- const allCategoryNames = Object.keys(categories);
- const result = [];
- for (i = 0; i < allCategoryNames.length; i++) {
- const name = allCategoryNames[i];
- result.push({
- name: name,
- providers: categories[name],
- });
- }
- return result;
- });
- this._terrainProviders = terrainProviders;
- /**
- * Gets the button tooltip. This property is observable.
- * @type {String}
- */
- this.buttonTooltip = undefined;
- knockout.defineProperty(this, "buttonTooltip", function () {
- const selectedImagery = this.selectedImagery;
- const selectedTerrain = this.selectedTerrain;
- const imageryTip = defined(selectedImagery)
- ? selectedImagery.name
- : undefined;
- const terrainTip = defined(selectedTerrain)
- ? selectedTerrain.name
- : undefined;
- if (defined(imageryTip) && defined(terrainTip)) {
- return `${imageryTip}\n${terrainTip}`;
- } else if (defined(imageryTip)) {
- return imageryTip;
- }
- return terrainTip;
- });
- /**
- * Gets the button background image. This property is observable.
- * @type {String}
- */
- this.buttonImageUrl = undefined;
- knockout.defineProperty(this, "buttonImageUrl", function () {
- const selectedImagery = this.selectedImagery;
- if (defined(selectedImagery)) {
- return selectedImagery.iconUrl;
- }
- });
- /**
- * Gets or sets the currently selected imagery. This property is observable.
- * @type {ProviderViewModel}
- * @default undefined
- */
- this.selectedImagery = undefined;
- const selectedImageryViewModel = knockout.observable();
- this._currentImageryProviders = [];
- knockout.defineProperty(this, "selectedImagery", {
- get: function () {
- return selectedImageryViewModel();
- },
- set: function (value) {
- if (selectedImageryViewModel() === value) {
- this.dropDownVisible = false;
- return;
- }
- let i;
- const currentImageryProviders = this._currentImageryProviders;
- const currentImageryProvidersLength = currentImageryProviders.length;
- const imageryLayers = this._globe.imageryLayers;
- let hadExistingBaseLayer = false;
- for (i = 0; i < currentImageryProvidersLength; i++) {
- const layersLength = imageryLayers.length;
- for (let x = 0; x < layersLength; x++) {
- const layer = imageryLayers.get(x);
- if (layer.imageryProvider === currentImageryProviders[i]) {
- imageryLayers.remove(layer);
- hadExistingBaseLayer = true;
- break;
- }
- }
- }
- if (defined(value)) {
- const newProviders = value.creationCommand();
- if (Array.isArray(newProviders)) {
- const newProvidersLength = newProviders.length;
- for (i = newProvidersLength - 1; i >= 0; i--) {
- imageryLayers.addImageryProvider(newProviders[i], 0);
- }
- this._currentImageryProviders = newProviders.slice(0);
- } else {
- this._currentImageryProviders = [newProviders];
- if (hadExistingBaseLayer) {
- imageryLayers.addImageryProvider(newProviders, 0);
- } else {
- const baseLayer = imageryLayers.get(0);
- if (defined(baseLayer)) {
- imageryLayers.remove(baseLayer);
- }
- imageryLayers.addImageryProvider(newProviders, 0);
- }
- }
- }
- selectedImageryViewModel(value);
- this.dropDownVisible = false;
- },
- });
- /**
- * Gets or sets the currently selected terrain. This property is observable.
- * @type {ProviderViewModel}
- * @default undefined
- */
- this.selectedTerrain = undefined;
- const selectedTerrainViewModel = knockout.observable();
- knockout.defineProperty(this, "selectedTerrain", {
- get: function () {
- return selectedTerrainViewModel();
- },
- set: function (value) {
- if (selectedTerrainViewModel() === value) {
- this.dropDownVisible = false;
- return;
- }
- let newProvider;
- if (defined(value)) {
- newProvider = value.creationCommand();
- }
- this._globe.depthTestAgainstTerrain = !(
- newProvider instanceof EllipsoidTerrainProvider
- );
- this._globe.terrainProvider = newProvider;
- selectedTerrainViewModel(value);
- this.dropDownVisible = false;
- },
- });
- const that = this;
- this._toggleDropDown = createCommand(function () {
- that.dropDownVisible = !that.dropDownVisible;
- });
- this.selectedImagery = defaultValue(
- options.selectedImageryProviderViewModel,
- imageryProviderViewModels[0]
- );
- this.selectedTerrain = defaultValue(
- options.selectedTerrainProviderViewModel,
- terrainProviderViewModels[0]
- );
- }
- Object.defineProperties(BaseLayerPickerViewModel.prototype, {
- /**
- * Gets the command to toggle the visibility of the drop down.
- * @memberof BaseLayerPickerViewModel.prototype
- *
- * @type {Command}
- */
- toggleDropDown: {
- get: function () {
- return this._toggleDropDown;
- },
- },
- /**
- * Gets the globe.
- * @memberof BaseLayerPickerViewModel.prototype
- *
- * @type {Globe}
- */
- globe: {
- get: function () {
- return this._globe;
- },
- },
- });
- export default BaseLayerPickerViewModel;
|