From 2fda0b60aeed9b3033a6c2d52bc69aaf04ab356c Mon Sep 17 00:00:00 2001 From: Matthew Amato Date: Wed, 9 Apr 2014 11:31:47 -0400 Subject: [PATCH 1/8] Add Terrain support to BaseLayerPicker Still needs cleanup. --- .../BaseLayerPicker/BaseLayerPicker.css | 15 +++ .../BaseLayerPicker/BaseLayerPicker.js | 101 ++++++++++++------ .../BaseLayerPickerViewModel.js | 91 ++++++++++------ ...viderViewModel.js => ProviderViewModel.js} | 10 +- ...createDefaultImageryProviderViewModels.js} | 65 +++-------- .../createDefaultTerrainProviderViewModels.js | 59 ++++++++++ Source/Widgets/BaseLayerPicker/lighter.css | 4 + .../Images/TerrainProviders/Ellipsoid.png | Bin 0 -> 6173 bytes .../Widgets/Images/TerrainProviders/STK.png | Bin 0 -> 4482 bytes Source/Widgets/Viewer/Viewer.js | 17 +-- .../BaseLayerPicker/BaseLayerPickerSpec.js | 20 ++-- .../BaseLayerPickerViewModelSpec.js | 76 +++++++------ ...wModelSpec.js => ProviderViewModelSpec.js} | 24 ++--- Specs/Widgets/Viewer/ViewerSpec.js | 10 +- 14 files changed, 313 insertions(+), 179 deletions(-) rename Source/Widgets/BaseLayerPicker/{ImageryProviderViewModel.js => ProviderViewModel.js} (91%) rename Source/Widgets/BaseLayerPicker/{createDefaultBaseLayers.js => createDefaultImageryProviderViewModels.js} (67%) create mode 100644 Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js create mode 100644 Source/Widgets/Images/TerrainProviders/Ellipsoid.png create mode 100644 Source/Widgets/Images/TerrainProviders/STK.png rename Specs/Widgets/BaseLayerPicker/{ImageryProviderViewModelSpec.js => ProviderViewModelSpec.js} (85%) diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css index 0787882a08f2..12f47bcfd231 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css @@ -40,6 +40,21 @@ user-select: none; } +.cesium-baseLayerPicker-sectionTitle { + display: block; + font-family: sans-serif; + font-size: 16pt; + text-align: center; + color: #edffff; +} + +.cesium-baseLayerPicker-choices { + display: block; + position: relative; + top: auto; + right: 0; +} + .cesium-baseLayerPicker-item { display: inline-block; vertical-align: top; diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js index 6e2e6d51a542..769e9e9d4daf 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js @@ -39,7 +39,7 @@ define([ * @exception {DeveloperError} Element with id "container" does not exist in the document. * * @see ImageryProvider - * @see ImageryProviderViewModel + * @see ProviderViewModel * @see ImageryLayerCollection * * @example @@ -50,7 +50,7 @@ define([ * //Create the list of available providers we would like the user to select from. * //This example uses 3, OpenStreetMap, The Black Marble, and a single, non-streaming world image. * var providerViewModels = []; - * providerViewModels.push(new Cesium.ImageryProviderViewModel({ + * providerViewModels.push(new Cesium.ProviderViewModel({ * name : 'Open\u00adStreet\u00adMap', * iconUrl : Cesium.buildModuleUrl('Widgets/Images/ImageryProviders/openStreetMap.png'), * tooltip : 'OpenStreetMap (OSM) is a collaborative project to create a free editable \ @@ -62,7 +62,7 @@ define([ * } * })); * - * providerViewModels.push(new Cesium.ImageryProviderViewModel({ + * providerViewModels.push(new Cesium.ProviderViewModel({ * name : 'Black Marble', * iconUrl : Cesium.buildModuleUrl('Widgets/Images/ImageryProviders/blackMarble.png'), * tooltip : 'The lights of cities and villages trace the outlines of civilization \ @@ -76,7 +76,7 @@ define([ * } * })); * - * providerViewModels.push(new Cesium.ImageryProviderViewModel({ + * providerViewModels.push(new Cesium.ProviderViewModel({ * name : 'Natural Earth\u00a0II', * iconUrl : Cesium.buildModuleUrl('Widgets/Images/ImageryProviders/naturalEarthII.png'), * tooltip : 'Natural Earth II, darkened for contrast.\nhttp://www.naturalearthdata.com/', @@ -97,25 +97,25 @@ define([ * //Use the first item in the list as the current selection. * baseLayerPicker.viewModel.selectedItem = providerViewModels[0]; */ - var BaseLayerPicker = function(container, imageryLayers, imageryProviderViewModels) { + var BaseLayerPicker = function(container, centralBody, imageryProviderViewModels, terrainProviderViewModels) { //>>includeStart('debug', pragmas.debug); if (!defined(container)) { throw new DeveloperError('container is required.'); } - if (!defined(imageryLayers)) { - throw new DeveloperError('imageryLayers is required.'); + if (!defined(centralBody)) { + throw new DeveloperError('centralBody is required.'); } //>>includeEnd('debug'); container = getElement(container); - var viewModel = new BaseLayerPickerViewModel(imageryLayers, imageryProviderViewModels); + var viewModel = new BaseLayerPickerViewModel(centralBody, imageryProviderViewModels, terrainProviderViewModels); var element = document.createElement('button'); element.type = 'button'; element.className = 'cesium-button cesium-toolbar-button'; element.setAttribute('data-bind', '\ -attr: { title: selectedName },\ +attr: { title: selectedImageryName },\ click: toggleDropDown'); container.appendChild(element); @@ -123,47 +123,88 @@ click: toggleDropDown'); imgElement.setAttribute('draggable', 'false'); imgElement.className = 'cesium-baseLayerPicker-selected'; imgElement.setAttribute('data-bind', '\ -attr: { src: selectedIconUrl }'); +attr: { src: selectedImageryIconUrl }'); element.appendChild(imgElement); - var choices = document.createElement('div'); - choices.className = 'cesium-baseLayerPicker-dropDown'; - choices.setAttribute('data-bind', '\ + var dropPanel = document.createElement('div'); + dropPanel.className = 'cesium-baseLayerPicker-dropDown'; + dropPanel.setAttribute('data-bind', '\ css: { "cesium-baseLayerPicker-visible" : dropDownVisible,\ - "cesium-baseLayerPicker-hidden" : !dropDownVisible },\ -foreach: imageryProviderViewModels'); - container.appendChild(choices); - - var provider = document.createElement('div'); - provider.className = 'cesium-baseLayerPicker-item'; - provider.setAttribute('data-bind', '\ -css: { "cesium-baseLayerPicker-selectedItem" : $data === $parent.selectedItem },\ + "cesium-baseLayerPicker-hidden" : !dropDownVisible }'); + container.appendChild(dropPanel); + + var imageryTitle = document.createElement('div'); + imageryTitle.className = 'cesium-baseLayerPicker-sectionTitle'; + imageryTitle.setAttribute('data-bind', 'visible: imageryProviderViewModels.length > 0'); + imageryTitle.innerHTML = 'Imagery
'; + dropPanel.appendChild(imageryTitle); + + var imageryChoices = document.createElement('div'); + imageryChoices.className = 'cesium-baseLayerPicker-choices'; + imageryChoices.setAttribute('data-bind', 'foreach: imageryProviderViewModels'); + dropPanel.appendChild(imageryChoices); + + var imageryProvider = document.createElement('div'); + imageryProvider.className = 'cesium-baseLayerPicker-item'; + imageryProvider.setAttribute('data-bind', '\ +css: { "cesium-baseLayerPicker-selectedItem" : $data === $parent.selectedImagery },\ attr: { title: tooltip },\ visible: creationCommand.canExecute,\ -click: function($data) { $parent.selectedItem = $data; }'); - choices.appendChild(provider); +click: function($data) { $parent.selectedImagery = $data; }'); + imageryChoices.appendChild(imageryProvider); var providerIcon = document.createElement('img'); providerIcon.className = 'cesium-baseLayerPicker-itemIcon'; providerIcon.setAttribute('data-bind', 'attr: { src: iconUrl }'); providerIcon.setAttribute('draggable', 'false'); - provider.appendChild(providerIcon); + imageryProvider.appendChild(providerIcon); var providerLabel = document.createElement('div'); providerLabel.className = 'cesium-baseLayerPicker-itemLabel'; providerLabel.setAttribute('data-bind', 'text: name'); - provider.appendChild(providerLabel); + imageryProvider.appendChild(providerLabel); + + var terrainTitle = document.createElement('div'); + terrainTitle.className = 'cesium-baseLayerPicker-sectionTitle'; + terrainTitle.setAttribute('data-bind', 'visible: terrainProviderViewModels.length > 0'); + terrainTitle.innerHTML = 'Terrain
'; + dropPanel.appendChild(terrainTitle); + + var terrainChoices = document.createElement('div'); + terrainChoices.className = 'cesium-baseLayerPicker-choices'; + terrainChoices.setAttribute('data-bind', 'foreach: terrainProviderViewModels'); + dropPanel.appendChild(terrainChoices); + + var terrainProvider = document.createElement('div'); + terrainProvider.className = 'cesium-baseLayerPicker-item'; + terrainProvider.setAttribute('data-bind', '\ +css: { "cesium-baseLayerPicker-selectedItem" : $data === $parent.selectedTerrain },\ +attr: { title: tooltip },\ +visible: creationCommand.canExecute,\ +click: function($data) { $parent.selectedTerrain = $data; }'); + terrainChoices.appendChild(terrainProvider); + + var terrainProviderIcon = document.createElement('img'); + terrainProviderIcon.className = 'cesium-baseLayerPicker-itemIcon'; + terrainProviderIcon.setAttribute('data-bind', 'attr: { src: iconUrl }'); + terrainProviderIcon.setAttribute('draggable', 'false'); + terrainProvider.appendChild(terrainProviderIcon); + + var terrainProviderLabel = document.createElement('div'); + terrainProviderLabel.className = 'cesium-baseLayerPicker-itemLabel'; + terrainProviderLabel.setAttribute('data-bind', 'text: name'); + terrainProvider.appendChild(terrainProviderLabel); knockout.applyBindings(viewModel, element); - knockout.applyBindings(viewModel, choices); + knockout.applyBindings(viewModel, dropPanel); this._viewModel = viewModel; this._container = container; this._element = element; - this._choices = choices; + this._dropPanel = dropPanel; this._closeDropDown = function(e) { - if (!(element.contains(e.target) || choices.contains(e.target))) { + if (!(element.contains(e.target) || dropPanel.contains(e.target))) { viewModel.dropDownVisible = false; } }; @@ -215,9 +256,9 @@ click: function($data) { $parent.selectedItem = $data; }'); document.removeEventListener('mousedown', this._closeDropDown, true); document.removeEventListener('touchstart', this._closeDropDown, true); knockout.cleanNode(this._element); - knockout.cleanNode(this._choices); + knockout.cleanNode(this._dropPanel); this._container.removeChild(this._element); - this._container.removeChild(this._choices); + this._container.removeChild(this._dropPanel); return destroyObject(this); }; diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js b/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js index 3cd862ce3985..7a8525208424 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js @@ -21,16 +21,16 @@ define([ * @constructor * * @param {ImageryLayerCollection} imageryLayers The imagery layer collection to use. - * @param {Array} [imageryProviderViewModels=[]] The array of ImageryProviderViewModel instances to use. + * @param {Array} [imageryProviderViewModels=[]] The array of ProviderViewModel instances to use. * * @exception {DeveloperError} imageryProviderViewModels must be an array. * - * @see ImageryProviderViewModel + * @see ProviderViewModel */ - var BaseLayerPickerViewModel = function(imageryLayers, imageryProviderViewModels) { + var BaseLayerPickerViewModel = function(centralBody, imageryProviderViewModels, terrainProviderViewModels) { //>>includeStart('debug', pragmas.debug); - if (!defined(imageryLayers)) { - throw new DeveloperError('imageryLayers is required'); + if (!defined(centralBody)) { + throw new DeveloperError('centralBody is required'); } //>>includeEnd('debug'); @@ -40,17 +40,23 @@ define([ throw new DeveloperError('imageryProviderViewModels must be an array'); } - var that = this; + if (!defined(terrainProviderViewModels)) { + terrainProviderViewModels = []; + } else if (!isArray(imageryProviderViewModels)) { + throw new DeveloperError('terrainProviderViewModels must be an array'); + } - this._imageryLayers = imageryLayers; + this._centralBody = centralBody; /** - * Gets or sets an array of ImageryProviderViewModel instances available for selection. + * Gets or sets an array of ProviderViewModel instances available for selection. * This property is observable. * @type {Array} */ this.imageryProviderViewModels = imageryProviderViewModels.slice(0); + this.terrainProviderViewModels = terrainProviderViewModels.slice(0); + /** * Gets or sets whether the imagery selection drop-down is currently visible. * @type {Boolean} @@ -58,15 +64,15 @@ define([ */ this.dropDownVisible = false; - knockout.track(this, ['imageryProviderViewModels', 'dropDownVisible']); + knockout.track(this, ['imageryProviderViewModels', 'terrainProviderViewModels', 'dropDownVisible']); /** * Gets the currently selected item name. This property is observable. * @type {String} */ - this.selectedName = undefined; - knockout.defineProperty(this, 'selectedName', function() { - var selected = that.selectedItem; + this.selectedImageryName = undefined; + knockout.defineProperty(this, 'selectedImageryName', function() { + var selected = this.selectedImagery; return defined(selected) ? selected.name : undefined; }); @@ -74,34 +80,35 @@ define([ * Gets the image url of the currently selected item. This property is observable. * @type {String} */ - this.selectedIconUrl = undefined; - knockout.defineProperty(this, 'selectedIconUrl', function() { - var viewModel = that.selectedItem; + this.selectedImageryIconUrl = undefined; + knockout.defineProperty(this, 'selectedImageryIconUrl', function() { + var viewModel = this.selectedImagery; return defined(viewModel) ? viewModel.iconUrl : undefined; }); /** * Gets or sets the currently selected item. This property is observable. - * @type {ImageryProviderViewModel} + * @type {ProviderViewModel} * @default undefined */ - this.selectedItem = undefined; - var selectedViewModel = knockout.observable(); + this.selectedImagery = undefined; + var selectedImageryViewModel = knockout.observable(); - this._currentProviders = []; - knockout.defineProperty(this, 'selectedItem', { + this._currentImageryProviders = []; + knockout.defineProperty(this, 'selectedImagery', { get : function() { - return selectedViewModel(); + return selectedImageryViewModel(); }, set : function(value) { var i; - var currentProviders = that._currentProviders; - var currentProvidersLength = currentProviders.length; - for (i = 0; i < currentProvidersLength; i++) { + var currentImageryProviders = this._currentImageryProviders; + var currentImageryProvidersLength = currentImageryProviders.length; + var imageryLayers = this._centralBody.imageryLayers; + for (i = 0; i < currentImageryProvidersLength; i++) { var layersLength = imageryLayers.length; for ( var x = 0; x < layersLength; x++) { var layer = imageryLayers.get(x); - if (layer.imageryProvider === currentProviders[i]) { + if (layer.imageryProvider === currentImageryProviders[i]) { imageryLayers.remove(layer); break; } @@ -115,18 +122,42 @@ define([ for (i = newProvidersLength - 1; i >= 0; i--) { imageryLayers.addImageryProvider(newProviders[i], 0); } - that._currentProviders = newProviders.slice(0); + this._currentImageryProviders = newProviders.slice(0); } else { - that._currentProviders = [newProviders]; + this._currentImageryProviders = [newProviders]; imageryLayers.addImageryProvider(newProviders, 0); } - selectedViewModel(value); + selectedImageryViewModel(value); } - that.dropDownVisible = false; + this.dropDownVisible = false; } }); + /** + * Gets or sets the currently selected item. This property is observable. + * @type {ProviderViewModel} + * @default undefined + */ + this.selectedTerrain = undefined; + var selectedTerrainViewModel = knockout.observable(); + + knockout.defineProperty(this, 'selectedTerrain', { + get : function() { + return selectedTerrainViewModel(); + }, + set : function(value) { + if (defined(value)) { + var newProvider = value.creationCommand(); + this._centralBody.terrainProvider = newProvider; + selectedTerrainViewModel(value); + } + + this.dropDownVisible = false; + } + }); + + var that = this; this._toggleDropDown = createCommand(function() { that.dropDownVisible = !that.dropDownVisible; }); @@ -153,7 +184,7 @@ define([ */ imageryLayers : { get : function() { - return this._imageryLayers; + return this._centralBody.imageryLayers; } } }); diff --git a/Source/Widgets/BaseLayerPicker/ImageryProviderViewModel.js b/Source/Widgets/BaseLayerPicker/ProviderViewModel.js similarity index 91% rename from Source/Widgets/BaseLayerPicker/ImageryProviderViewModel.js rename to Source/Widgets/BaseLayerPicker/ProviderViewModel.js index 5a362d97805d..a3f610bb3bfd 100644 --- a/Source/Widgets/BaseLayerPicker/ImageryProviderViewModel.js +++ b/Source/Widgets/BaseLayerPicker/ProviderViewModel.js @@ -16,7 +16,7 @@ define([ /** * A view model that represents each item in the BaseLayerPicker. * - * @alias ImageryProviderViewModel + * @alias ProviderViewModel * @constructor * * @param {Object} description The object containing all parameters. @@ -28,7 +28,7 @@ define([ * @see BaseLayerPicker * @see ImageryProvider */ - var ImageryProviderViewModel = function(description) { + var ProviderViewModel = function(description) { //>>includeStart('debug', pragmas.debug); if (!defined(description.name)) { throw new DeveloperError('description.name is required.'); @@ -72,11 +72,11 @@ define([ knockout.track(this, ['name', 'tooltip', 'iconUrl']); }; - defineProperties(ImageryProviderViewModel.prototype, { + defineProperties(ProviderViewModel.prototype, { /** * Gets the Command called to create the imagery provider or array of * imagery providers to be added to the bottom of the layer collection. - * @memberof ImageryProviderViewModel.prototype + * @memberof ProviderViewModel.prototype * * @type {Command} */ @@ -87,5 +87,5 @@ define([ } }); - return ImageryProviderViewModel; + return ProviderViewModel; }); diff --git a/Source/Widgets/BaseLayerPicker/createDefaultBaseLayers.js b/Source/Widgets/BaseLayerPicker/createDefaultImageryProviderViewModels.js similarity index 67% rename from Source/Widgets/BaseLayerPicker/createDefaultBaseLayers.js rename to Source/Widgets/BaseLayerPicker/createDefaultImageryProviderViewModels.js index c0c5783a6402..d10fe1157b27 100644 --- a/Source/Widgets/BaseLayerPicker/createDefaultBaseLayers.js +++ b/Source/Widgets/BaseLayerPicker/createDefaultImageryProviderViewModels.js @@ -1,6 +1,6 @@ /*global define*/ define([ - '../BaseLayerPicker/ImageryProviderViewModel', + '../BaseLayerPicker/ProviderViewModel', '../../Core/buildModuleUrl', '../../Scene/BingMapsImageryProvider', '../../Scene/BingMapsStyle', @@ -8,7 +8,7 @@ define([ '../../Scene/OpenStreetMapImageryProvider', '../../Scene/TileMapServiceImageryProvider' ], function( - ImageryProviderViewModel, + ProviderViewModel, buildModuleUrl, BingMapsImageryProvider, BingMapsStyle, @@ -20,9 +20,9 @@ define([ /** * @private */ - function createDefaultBaseLayers() { + function createDefaultImageryProviderViewModels() { var providerViewModels = []; - providerViewModels.push(new ImageryProviderViewModel({ + providerViewModels.push(new ProviderViewModel({ name : 'Bing Maps Aerial', iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/bingAerial.png'), tooltip : 'Bing Maps aerial imagery \nhttp://www.bing.com/maps', @@ -34,7 +34,7 @@ define([ } })); - providerViewModels.push(new ImageryProviderViewModel({ + providerViewModels.push(new ProviderViewModel({ name : 'Bing Maps Aerial with Labels', iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/bingAerialLabels.png'), tooltip : 'Bing Maps aerial imagery with label overlays \nhttp://www.bing.com/maps', @@ -46,7 +46,7 @@ define([ } })); - providerViewModels.push(new ImageryProviderViewModel({ + providerViewModels.push(new ProviderViewModel({ name : 'Bing Maps Roads', iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/bingRoads.png'), tooltip : 'Bing Maps standard road maps\nhttp://www.bing.com/maps', @@ -58,7 +58,7 @@ define([ } })); - providerViewModels.push(new ImageryProviderViewModel({ + providerViewModels.push(new ProviderViewModel({ name : 'ESRI World Imagery', iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/esriWorldImagery.png'), tooltip : '\ @@ -76,22 +76,7 @@ contributed by the GIS User Community.\nhttp://www.esri.com', } })); - providerViewModels.push(new ImageryProviderViewModel({ - name : 'ESRI World Street Map', - iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/esriWorldStreetMap.png'), - tooltip : '\ -This worldwide street map presents highway-level data for the world. Street-level data includes the United States; much of \ -Canada; Japan; most countries in Europe; Australia and New Zealand; India; parts of South America including Argentina, Brazil, \ -Chile, Colombia, and Venezuela; Ghana; and parts of southern Africa including Botswana, Lesotho, Namibia, South Africa, and Swaziland.\n\ -http://www.esri.com', - creationFunction : function() { - return new ArcGisMapServerImageryProvider({ - url : 'http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer' - }); - } - })); - - providerViewModels.push(new ImageryProviderViewModel({ + providerViewModels.push(new ProviderViewModel({ name : 'ESRI National Geographic', iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/esriNationalGeographic.png'), tooltip : '\ @@ -105,7 +90,7 @@ mapping applications.\nhttp://www.esri.com', } })); - providerViewModels.push(new ImageryProviderViewModel({ + providerViewModels.push(new ProviderViewModel({ name : 'Open\u00adStreet\u00adMap', iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/openStreetMap.png'), tooltip : 'OpenStreetMap (OSM) is a collaborative project to create a free editable map \ @@ -117,20 +102,7 @@ of the world.\nhttp://www.openstreetmap.org', } })); - providerViewModels.push(new ImageryProviderViewModel({ - name : 'Stamen Watercolor', - iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/stamenWatercolor.png'), - tooltip : 'Reminiscent of hand drawn maps, Stamen watercolor maps apply raster effect \ -area washes and organic edges over a paper texture to add warm pop to any map.\nhttp://maps.stamen.com', - creationFunction : function() { - return new OpenStreetMapImageryProvider({ - url : 'http://tile.stamen.com/watercolor/', - credit : 'Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under CC BY SA.' - }); - } - })); - - providerViewModels.push(new ImageryProviderViewModel({ + providerViewModels.push(new ProviderViewModel({ name : 'Stamen Toner', iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/stamenToner.png'), tooltip : 'A high contrast black and white map.\nhttp://maps.stamen.com', @@ -142,19 +114,8 @@ area washes and organic edges over a paper texture to add warm pop to any map.\n } })); - providerViewModels.push(new ImageryProviderViewModel({ - name : 'MapQuest Open\u00adStreet\u00adMap', - iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png'), - tooltip : 'OpenStreetMap (OSM) is a collaborative project to create a free editable \ -map of the world.\nhttp://www.openstreetmap.org', - creationFunction : function() { - return new OpenStreetMapImageryProvider({ - url : 'http://otile1.mqcdn.com/tiles/1.0.0/osm/' - }); - } - })); - providerViewModels.push(new ImageryProviderViewModel({ + providerViewModels.push(new ProviderViewModel({ name : 'The Black Marble', iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/blackMarble.png'), tooltip : 'The lights of cities and villages trace the outlines of civilization in this global view of the \ @@ -168,7 +129,7 @@ Earth at night as seen by NASA/NOAA\'s Suomi NPP satellite.', } })); - providerViewModels.push(new ImageryProviderViewModel({ + providerViewModels.push(new ProviderViewModel({ name : 'Natural Earth\u00a0II', iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/naturalEarthII.png'), tooltip : 'Natural Earth II, darkened for contrast.\nhttp://www.naturalearthdata.com/', @@ -182,5 +143,5 @@ Earth at night as seen by NASA/NOAA\'s Suomi NPP satellite.', return providerViewModels; } - return createDefaultBaseLayers; + return createDefaultImageryProviderViewModels; }); \ No newline at end of file diff --git a/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js b/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js new file mode 100644 index 000000000000..7055148a6c49 --- /dev/null +++ b/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js @@ -0,0 +1,59 @@ +/*global define*/ +define([ + '../BaseLayerPicker/ProviderViewModel', + '../../Core/buildModuleUrl', + '../../Scene/ArcGisImageServerTerrainProvider', + '../../Scene/CesiumTerrainProvider', + '../../Scene/EllipsoidTerrainProvider' + ], function( + ProviderViewModel, + buildModuleUrl, + ArcGisImageServerTerrainProvider, + CesiumTerrainProvider, + EllipsoidTerrainProvider) { + "use strict"; + + /** + * @private + */ + function createDefaultTerrainProviderViewModels() { + var providerViewModels = []; + providerViewModels.push(new ProviderViewModel({ + name : 'WGS84 Ellipsoid', + iconUrl : buildModuleUrl('Widgets/Images/TerrainProviders/Ellipsoid.png'), + tooltip : 'EllipsoidTerrainProvider', + creationFunction : function() { + return new EllipsoidTerrainProvider(); + } + })); + + + providerViewModels.push(new ProviderViewModel({ + name : 'STK World Terrain meshes', + iconUrl : buildModuleUrl('Widgets/Images/TerrainProviders/STK.png'), + tooltip : 'CesiumTerrainProvider', + creationFunction : function() { + return new CesiumTerrainProvider({ + url : 'http://cesiumjs.org/stk-terrain/tilesets/world/tiles', + credit : 'Terrain data courtesy Analytical Graphics, Inc.' + }); + } + })); + + providerViewModels.push(new ProviderViewModel({ + name : 'STK World Terrain heightmaps and water', + iconUrl : buildModuleUrl('Widgets/Images/TerrainProviders/STK.png'), + tooltip : 'CesiumTerrainProvider', + creationFunction : function() { + return new CesiumTerrainProvider({ + url : 'http://cesiumjs.org/smallterrain', + credit : 'Terrain data courtesy Analytical Graphics, Inc.' + }); + } + })); + + return providerViewModels; + } + + return createDefaultTerrainProviderViewModels; +}); \ No newline at end of file diff --git a/Source/Widgets/BaseLayerPicker/lighter.css b/Source/Widgets/BaseLayerPicker/lighter.css index a3e4231eab09..4b0d7094420c 100644 --- a/Source/Widgets/BaseLayerPicker/lighter.css +++ b/Source/Widgets/BaseLayerPicker/lighter.css @@ -6,6 +6,10 @@ background-color: rgba(240, 240, 240, 0.75); } +.cesium-lighter .cesium-baseLayerPicker-sectionTitle { + color: black; +} + .cesium-lighter .cesium-baseLayerPicker-itemLabel { color: black; } diff --git a/Source/Widgets/Images/TerrainProviders/Ellipsoid.png b/Source/Widgets/Images/TerrainProviders/Ellipsoid.png new file mode 100644 index 0000000000000000000000000000000000000000..a36259bbecd3db15252723fbeb9d202907306d6a GIT binary patch literal 6173 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 literal 0 HcmV?d00001 diff --git a/Source/Widgets/Viewer/Viewer.js b/Source/Widgets/Viewer/Viewer.js index 53345402d78b..a1a1f1154447 100644 --- a/Source/Widgets/Viewer/Viewer.js +++ b/Source/Widgets/Viewer/Viewer.js @@ -14,7 +14,8 @@ define([ '../Animation/Animation', '../Animation/AnimationViewModel', '../BaseLayerPicker/BaseLayerPicker', - '../BaseLayerPicker/createDefaultBaseLayers', + '../BaseLayerPicker/createDefaultImageryProviderViewModels', + '../BaseLayerPicker/createDefaultTerrainProviderViewModels', '../CesiumWidget/CesiumWidget', '../ClockViewModel', '../FullscreenButton/FullscreenButton', @@ -42,7 +43,8 @@ define([ Animation, AnimationViewModel, BaseLayerPicker, - createDefaultBaseLayers, + createDefaultImageryProviderViewModels, + createDefaultTerrainProviderViewModels, CesiumWidget, ClockViewModel, FullscreenButton, @@ -114,8 +116,8 @@ define([ * @param {Boolean} [options.sceneModePicker=true] If set to false, the SceneModePicker widget will not be created. * @param {Boolean} [options.selectionIndicator=true] If set to false, the SelectionIndicator widget will not be created. * @param {Boolean} [options.timeline=true] If set to false, the Timeline widget will not be created. - * @param {ImageryProviderViewModel} [options.selectedImageryProviderViewModel] The view model for the current base imagery layer, if not supplied the first available base layer is used. This value is only valid if options.baseLayerPicker is set to true. - * @param {Array} [options.imageryProviderViewModels=createDefaultBaseLayers()] The array of ImageryProviderViewModels to be selectable from the BaseLayerPicker. This value is only valid if options.baseLayerPicker is set to true. + * @param {ProviderViewModel} [options.selectedImageryProviderViewModel] The view model for the current base imagery layer, if not supplied the first available base layer is used. This value is only valid if options.baseLayerPicker is set to true. + * @param {Array} [options.imageryProviderViewModels=createDefaultImageryProviderViewModels()] The array of ProviderViewModels to be selectable from the BaseLayerPicker. This value is only valid if options.baseLayerPicker is set to true. * @param {ImageryProvider} [options.imageryProvider=new BingMapsImageryProvider()] The imagery provider to use. This value is only valid if options.baseLayerPicker is set to false. * @param {TerrainProvider} [options.terrainProvider=new EllipsoidTerrainProvider()] The terrain provider to use * @param {SkyBox} [options.skyBox] The skybox used to render the stars. When undefined, the default stars are used. @@ -296,9 +298,10 @@ Either specify options.imageryProvider instead or set options.baseLayerPicker to //BaseLayerPicker var baseLayerPicker; if (createBaseLayerPicker) { - var providerViewModels = defaultValue(options.imageryProviderViewModels, createDefaultBaseLayers()); - baseLayerPicker = new BaseLayerPicker(toolbar, cesiumWidget.centralBody.imageryLayers, providerViewModels); - baseLayerPicker.viewModel.selectedItem = defaultValue(options.selectedImageryProviderViewModel, providerViewModels[0]); + var imageryProviderViewModels = defaultValue(options.imageryProviderViewModels, createDefaultImageryProviderViewModels()); + var terrainProviderViewModels = defaultValue(options.terrainProviderViewModels, createDefaultTerrainProviderViewModels()); + baseLayerPicker = new BaseLayerPicker(toolbar, cesiumWidget.centralBody, imageryProviderViewModels, terrainProviderViewModels); + baseLayerPicker.viewModel.selectedImagery = defaultValue(options.selectedImageryProviderViewModel, imageryProviderViewModels[0]); //Grab the dropdown for resize code. var elements = toolbar.getElementsByClassName('cesium-baseLayerPicker-dropDown'); diff --git a/Specs/Widgets/BaseLayerPicker/BaseLayerPickerSpec.js b/Specs/Widgets/BaseLayerPicker/BaseLayerPickerSpec.js index 2cafe4a05e13..c2f23fe6ffb3 100644 --- a/Specs/Widgets/BaseLayerPicker/BaseLayerPickerSpec.js +++ b/Specs/Widgets/BaseLayerPicker/BaseLayerPickerSpec.js @@ -2,22 +2,30 @@ defineSuite([ 'Widgets/BaseLayerPicker/BaseLayerPicker', 'Scene/ImageryLayerCollection', + 'Scene/EllipsoidTerrainProvider', 'Specs/EventHelper' ], function( BaseLayerPicker, ImageryLayerCollection, + EllipsoidTerrainProvider, EventHelper) { "use strict"; /*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn,runs,waits,waitsFor*/ + var MockCentralBody = function(){ + this.imageryLayers = new ImageryLayerCollection(); + this.terrainProvider = new EllipsoidTerrainProvider(); + }; + it('can create and destroy', function() { var container = document.createElement('div'); container.id = 'testContainer'; document.body.appendChild(container); - var layers = new ImageryLayerCollection(); + var centralBody = new MockCentralBody(); + var layers = centralBody.imageryLayers; - var widget = new BaseLayerPicker('testContainer', layers); + var widget = new BaseLayerPicker('testContainer', centralBody); expect(widget.container).toBe(container); expect(widget.viewModel.imageryLayers).toBe(layers); expect(widget.isDestroyed()).toEqual(false); @@ -32,7 +40,7 @@ defineSuite([ container.id = 'testContainer'; document.body.appendChild(container); - var widget = new BaseLayerPicker('testContainer', new ImageryLayerCollection()); + var widget = new BaseLayerPicker('testContainer', new MockCentralBody()); widget.viewModel.dropDownVisible = true; EventHelper.fireMouseDown(document.body); @@ -51,7 +59,7 @@ defineSuite([ container.id = 'testContainer'; document.body.appendChild(container); - var widget = new BaseLayerPicker('testContainer', new ImageryLayerCollection()); + var widget = new BaseLayerPicker('testContainer', new MockCentralBody()); widget.viewModel.dropDownVisible = true; @@ -75,13 +83,13 @@ defineSuite([ it('constructor throws with no element', function() { expect(function() { - return new BaseLayerPicker(undefined, new ImageryLayerCollection()); + return new BaseLayerPicker(undefined, new MockCentralBody()); }).toThrowDeveloperError(); }); it('constructor throws with string element that does not exist', function() { expect(function() { - return new BaseLayerPicker('does not exist', new ImageryLayerCollection()); + return new BaseLayerPicker('does not exist', new MockCentralBody()); }).toThrowDeveloperError(); }); }); \ No newline at end of file diff --git a/Specs/Widgets/BaseLayerPicker/BaseLayerPickerViewModelSpec.js b/Specs/Widgets/BaseLayerPicker/BaseLayerPickerViewModelSpec.js index dbd1c68bdbda..c8b68b866bf9 100644 --- a/Specs/Widgets/BaseLayerPicker/BaseLayerPickerViewModelSpec.js +++ b/Specs/Widgets/BaseLayerPicker/BaseLayerPickerViewModelSpec.js @@ -1,15 +1,22 @@ /*global defineSuite*/ defineSuite([ 'Widgets/BaseLayerPicker/BaseLayerPickerViewModel', - 'Widgets/BaseLayerPicker/ImageryProviderViewModel', + 'Widgets/BaseLayerPicker/ProviderViewModel', + 'Scene/EllipsoidTerrainProvider', 'Scene/ImageryLayerCollection' ], function( BaseLayerPickerViewModel, - ImageryProviderViewModel, + ProviderViewModel, + EllipsoidTerrainProvider, ImageryLayerCollection) { "use strict"; /*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn,runs,waits,waitsFor*/ + var MockCentralBody = function(){ + this.imageryLayers = new ImageryLayerCollection(); + this.terrainProvider = new EllipsoidTerrainProvider(); + }; + var testProvider = { isReady : function() { return false; @@ -28,7 +35,7 @@ defineSuite([ } }; - var testProviderViewModel = new ImageryProviderViewModel({ + var testProviderViewModel = new ProviderViewModel({ name : 'name', tooltip : 'tooltip', iconUrl : 'url', @@ -37,7 +44,7 @@ defineSuite([ } }); - var testProviderViewModel2 = new ImageryProviderViewModel({ + var testProviderViewModel2 = new ProviderViewModel({ name : 'name', tooltip : 'tooltip', iconUrl : 'url', @@ -48,63 +55,68 @@ defineSuite([ it('constructor sets expected values', function() { var array = []; - var imageryLayers = new ImageryLayerCollection(); - var viewModel = new BaseLayerPickerViewModel(imageryLayers, array); + var centralBody = new MockCentralBody(); + var imageryLayers = centralBody.imageryLayers; + var viewModel = new BaseLayerPickerViewModel(centralBody, array); expect(viewModel.imageryLayers).toBe(imageryLayers); expect(viewModel.imageryProviderViewModels).toEqual(array); }); it('selecting an item closes the dropDown', function() { var array = [testProviderViewModel]; - var imageryLayers = new ImageryLayerCollection(); - var viewModel = new BaseLayerPickerViewModel(imageryLayers, array); + var centralBody = new MockCentralBody(); + var imageryLayers = centralBody.imageryLayers; + var viewModel = new BaseLayerPickerViewModel(centralBody, array); viewModel.dropDownVisible = true; - viewModel.selectedItem = testProviderViewModel; + viewModel.selectedImagery = testProviderViewModel; expect(viewModel.dropDownVisible).toEqual(false); }); - it('selectedName, selectedIconUrl, and selectedItem all return expected values', function() { + it('selectedImageryName, selectedImageryIconUrl, and selectedImagery all return expected values', function() { var array = [testProviderViewModel]; - var imageryLayers = new ImageryLayerCollection(); - var viewModel = new BaseLayerPickerViewModel(imageryLayers, array); + var centralBody = new MockCentralBody(); + var imageryLayers = centralBody.imageryLayers; + var viewModel = new BaseLayerPickerViewModel(centralBody, array); - expect(viewModel.selectedName).toBeUndefined(); - expect(viewModel.selectedIconUrl).toBeUndefined(); - expect(viewModel.selectedItem).toBeUndefined(); + expect(viewModel.selectedImageryName).toBeUndefined(); + expect(viewModel.selectedImageryIconUrl).toBeUndefined(); + expect(viewModel.selectedImagery).toBeUndefined(); - viewModel.selectedItem = testProviderViewModel; + viewModel.selectedImagery = testProviderViewModel; - expect(viewModel.selectedName).toEqual(testProviderViewModel.name); - expect(viewModel.selectedIconUrl).toEqual(testProviderViewModel.iconUrl); - expect(viewModel.selectedItem).toBe(testProviderViewModel); + expect(viewModel.selectedImageryName).toEqual(testProviderViewModel.name); + expect(viewModel.selectedImageryIconUrl).toEqual(testProviderViewModel.iconUrl); + expect(viewModel.selectedImagery).toBe(testProviderViewModel); }); - it('selectedItem actually sets base layer', function() { + it('selectedImagery actually sets base layer', function() { var array = [testProviderViewModel]; - var imageryLayers = new ImageryLayerCollection(); - var viewModel = new BaseLayerPickerViewModel(imageryLayers, array); + var centralBody = new MockCentralBody(); + var imageryLayers = centralBody.imageryLayers; + var viewModel = new BaseLayerPickerViewModel(centralBody, array); expect(imageryLayers.length).toEqual(0); - viewModel.selectedItem = testProviderViewModel; + viewModel.selectedImagery = testProviderViewModel; expect(imageryLayers.length).toEqual(1); expect(imageryLayers.get(0).imageryProvider).toBe(testProvider); - viewModel.selectedItem = testProviderViewModel2; + viewModel.selectedImagery = testProviderViewModel2; expect(imageryLayers.length).toEqual(2); expect(imageryLayers.get(0).imageryProvider).toBe(testProvider); expect(imageryLayers.get(1).imageryProvider).toBe(testProvider2); }); - it('settings selectedItem only removes layers added by view model', function() { + it('settings selectedImagery only removes layers added by view model', function() { var array = [testProviderViewModel]; - var imageryLayers = new ImageryLayerCollection(); - var viewModel = new BaseLayerPickerViewModel(imageryLayers, array); + var centralBody = new MockCentralBody(); + var imageryLayers = centralBody.imageryLayers; + var viewModel = new BaseLayerPickerViewModel(centralBody, array); expect(imageryLayers.length).toEqual(0); - viewModel.selectedItem = testProviderViewModel2; + viewModel.selectedImagery = testProviderViewModel2; expect(imageryLayers.length).toEqual(2); expect(imageryLayers.get(0).imageryProvider).toBe(testProvider); expect(imageryLayers.get(1).imageryProvider).toBe(testProvider2); @@ -112,7 +124,7 @@ defineSuite([ imageryLayers.addImageryProvider(testProvider3, 1); imageryLayers.remove(imageryLayers.get(0)); - viewModel.selectedItem = undefined; + viewModel.selectedImagery = undefined; expect(imageryLayers.length).toEqual(1); expect(imageryLayers.get(0).imageryProvider).toBe(testProvider3); @@ -120,7 +132,7 @@ defineSuite([ it('dropDownVisible and toggleDropDown work', function() { - var viewModel = new BaseLayerPickerViewModel(new ImageryLayerCollection()); + var viewModel = new BaseLayerPickerViewModel(new MockCentralBody()); expect(viewModel.dropDownVisible).toEqual(false); viewModel.toggleDropDown(); @@ -136,9 +148,9 @@ defineSuite([ }); it('constructor throws if viewModels argument is not an array', function() { - var imageryLayers = new ImageryLayerCollection(); + var centralBody = new MockCentralBody(); expect(function() { - return new BaseLayerPickerViewModel(imageryLayers, {}); + return new BaseLayerPickerViewModel(centralBody, {}); }).toThrowDeveloperError(); }); }); \ No newline at end of file diff --git a/Specs/Widgets/BaseLayerPicker/ImageryProviderViewModelSpec.js b/Specs/Widgets/BaseLayerPicker/ProviderViewModelSpec.js similarity index 85% rename from Specs/Widgets/BaseLayerPicker/ImageryProviderViewModelSpec.js rename to Specs/Widgets/BaseLayerPicker/ProviderViewModelSpec.js index 4ddf2cefd663..47911b14a982 100644 --- a/Specs/Widgets/BaseLayerPicker/ImageryProviderViewModelSpec.js +++ b/Specs/Widgets/BaseLayerPicker/ProviderViewModelSpec.js @@ -1,10 +1,10 @@ /*global defineSuite*/ defineSuite([ - 'Widgets/BaseLayerPicker/ImageryProviderViewModel', + 'Widgets/BaseLayerPicker/ProviderViewModel', 'Widgets/createCommand', 'ThirdParty/knockout' ], function( - ImageryProviderViewModel, + ProviderViewModel, createCommand, knockout) { "use strict"; @@ -24,7 +24,7 @@ defineSuite([ creationFunction : createCommand(spyCreationFunction) }; - var viewModel = new ImageryProviderViewModel(description); + var viewModel = new ProviderViewModel(description); expect(viewModel.name).toBe(description.name()); expect(viewModel.tooltip).toBe(description.tooltip()); expect(viewModel.iconUrl).toBe(description.iconUrl()); @@ -42,7 +42,7 @@ defineSuite([ }; expect(function() { - return new ImageryProviderViewModel(description); + return new ProviderViewModel(description); }).toThrowDeveloperError(); }); @@ -54,7 +54,7 @@ defineSuite([ }; expect(function() { - return new ImageryProviderViewModel(description); + return new ProviderViewModel(description); }).toThrowDeveloperError(); }); @@ -66,7 +66,7 @@ defineSuite([ }; expect(function() { - return new ImageryProviderViewModel(description); + return new ProviderViewModel(description); }).toThrowDeveloperError(); }); @@ -78,7 +78,7 @@ defineSuite([ }; expect(function() { - return new ImageryProviderViewModel(description); + return new ProviderViewModel(description); }).toThrowDeveloperError(); }); }); @@ -92,7 +92,7 @@ defineSuite([ creationFunction : spyCreationFunction }; - var viewModel = new ImageryProviderViewModel(description); + var viewModel = new ProviderViewModel(description); expect(viewModel.name).toEqual(description.name); expect(viewModel.tooltip).toEqual(description.tooltip); expect(viewModel.iconUrl).toEqual(description.iconUrl); @@ -110,7 +110,7 @@ defineSuite([ }; expect(function() { - return new ImageryProviderViewModel(description); + return new ProviderViewModel(description); }).toThrowDeveloperError(); }); @@ -122,7 +122,7 @@ defineSuite([ }; expect(function() { - return new ImageryProviderViewModel(description); + return new ProviderViewModel(description); }).toThrowDeveloperError(); }); @@ -134,7 +134,7 @@ defineSuite([ }; expect(function() { - return new ImageryProviderViewModel(description); + return new ProviderViewModel(description); }).toThrowDeveloperError(); }); @@ -146,7 +146,7 @@ defineSuite([ }; expect(function() { - return new ImageryProviderViewModel(description); + return new ProviderViewModel(description); }).toThrowDeveloperError(); }); }); diff --git a/Specs/Widgets/Viewer/ViewerSpec.js b/Specs/Widgets/Viewer/ViewerSpec.js index 2e5f04e82717..8ed1f39ce74d 100644 --- a/Specs/Widgets/Viewer/ViewerSpec.js +++ b/Specs/Widgets/Viewer/ViewerSpec.js @@ -3,7 +3,7 @@ defineSuite([ 'Widgets/Viewer/Viewer', 'Widgets/Animation/Animation', 'Widgets/BaseLayerPicker/BaseLayerPicker', - 'Widgets/BaseLayerPicker/ImageryProviderViewModel', + 'Widgets/BaseLayerPicker/ProviderViewModel', 'Widgets/CesiumWidget/CesiumWidget', 'Widgets/FullscreenButton/FullscreenButton', 'Widgets/HomeButton/HomeButton', @@ -24,7 +24,7 @@ defineSuite([ Viewer, Animation, BaseLayerPicker, - ImageryProviderViewModel, + ProviderViewModel, CesiumWidget, FullscreenButton, HomeButton, @@ -50,7 +50,7 @@ defineSuite([ } }; - var testProviderViewModel = new ImageryProviderViewModel({ + var testProviderViewModel = new ProviderViewModel({ name : 'name', tooltip : 'tooltip', iconUrl : 'url', @@ -323,7 +323,7 @@ defineSuite([ }); expect(viewer.centralBody.imageryLayers.length).toEqual(1); expect(viewer.centralBody.imageryLayers.get(0).imageryProvider).toBe(testProvider); - expect(viewer.baseLayerPicker.viewModel.selectedItem).toBe(testProviderViewModel); + expect(viewer.baseLayerPicker.viewModel.selectedImagery).toBe(testProviderViewModel); }); it('can set imageryProvider when BaseLayerPicker is disabled', function() { @@ -343,7 +343,7 @@ defineSuite([ }); expect(viewer.centralBody.imageryLayers.length).toEqual(1); expect(viewer.centralBody.imageryLayers.get(0).imageryProvider).toBe(testProvider); - expect(viewer.baseLayerPicker.viewModel.selectedItem).toBe(testProviderViewModel); + expect(viewer.baseLayerPicker.viewModel.selectedImagery).toBe(testProviderViewModel); expect(viewer.baseLayerPicker.viewModel.imageryProviderViewModels).toEqual(models); }); From 9115cd993b4fa8c7cff9962eaf062cc401c16a54 Mon Sep 17 00:00:00 2001 From: Matthew Amato Date: Wed, 9 Apr 2014 14:09:35 -0400 Subject: [PATCH 2/8] BaseLayerPicker cleanup 1. Turn on depth test when any terrain other than EllipsoidTerrainProvider is being used 2. All similar Viewer options for terrain that imagery already has. --- .../BaseLayerPicker/BaseLayerPicker.css | 2 +- .../BaseLayerPickerViewModel.js | 3 +++ .../createDefaultTerrainProviderViewModels.js | 2 +- Source/Widgets/Viewer/Viewer.js | 18 +++++++++++++++++- Specs/Widgets/Viewer/ViewerSpec.js | 1 + 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css index 12f47bcfd231..7fdfe08a7dd6 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css @@ -44,7 +44,7 @@ display: block; font-family: sans-serif; font-size: 16pt; - text-align: center; + text-align: left; color: #edffff; } diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js b/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js index 7a8525208424..4b057937cb5b 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js @@ -4,6 +4,7 @@ define([ '../../Core/defineProperties', '../../Core/DeveloperError', '../../Core/isArray', + '../../Scene/EllipsoidTerrainProvider', '../createCommand', '../../ThirdParty/knockout' ], function( @@ -11,6 +12,7 @@ define([ defineProperties, DeveloperError, isArray, + EllipsoidTerrainProvider, createCommand, knockout) { "use strict"; @@ -149,6 +151,7 @@ define([ set : function(value) { if (defined(value)) { var newProvider = value.creationCommand(); + this._centralBody.depthTestAgainstTerrain = !(newProvider instanceof EllipsoidTerrainProvider); this._centralBody.terrainProvider = newProvider; selectedTerrainViewModel(value); } diff --git a/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js b/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js index 7055148a6c49..65d733ec63f6 100644 --- a/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js +++ b/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js @@ -41,7 +41,7 @@ define([ })); providerViewModels.push(new ProviderViewModel({ - name : 'STK World Terrain heightmaps and water', + name : 'Small Terrain heightmaps and water mask', iconUrl : buildModuleUrl('Widgets/Images/TerrainProviders/STK.png'), tooltip : 'CesiumTerrainProvider', creationFunction : function() { diff --git a/Source/Widgets/Viewer/Viewer.js b/Source/Widgets/Viewer/Viewer.js index a1a1f1154447..4347dc7b02a7 100644 --- a/Source/Widgets/Viewer/Viewer.js +++ b/Source/Widgets/Viewer/Viewer.js @@ -118,6 +118,8 @@ define([ * @param {Boolean} [options.timeline=true] If set to false, the Timeline widget will not be created. * @param {ProviderViewModel} [options.selectedImageryProviderViewModel] The view model for the current base imagery layer, if not supplied the first available base layer is used. This value is only valid if options.baseLayerPicker is set to true. * @param {Array} [options.imageryProviderViewModels=createDefaultImageryProviderViewModels()] The array of ProviderViewModels to be selectable from the BaseLayerPicker. This value is only valid if options.baseLayerPicker is set to true. + * @param {ProviderViewModel} [options.selectedTerrainProviderViewModel] The view model for the current base terrain layer, if not supplied the first available base layer is used. This value is only valid if options.baseLayerPicker is set to true. + * @param {Array} [options.terrainProviderViewModels=createDefaultTerrainProviderViewModels()] The array of ProviderViewModels to be selectable from the BaseLayerPicker. This value is only valid if options.baseLayerPicker is set to true. * @param {ImageryProvider} [options.imageryProvider=new BingMapsImageryProvider()] The imagery provider to use. This value is only valid if options.baseLayerPicker is set to false. * @param {TerrainProvider} [options.terrainProvider=new EllipsoidTerrainProvider()] The terrain provider to use * @param {SkyBox} [options.skyBox] The skybox used to render the stars. When undefined, the default stars are used. @@ -130,7 +132,9 @@ define([ * * @exception {DeveloperError} Element with id "container" does not exist in the document. * @exception {DeveloperError} options.imageryProvider is not available when using the BaseLayerPicker widget, specify options.selectedImageryProviderViewModel instead. + * @exception {DeveloperError} options.terrainProvider is not available when using the BaseLayerPicker widget, specify options.selectedTerrainProviderViewModel instead. * @exception {DeveloperError} options.selectedImageryProviderViewModel is not available when not using the BaseLayerPicker widget, specify options.imageryProvider instead. + * @exception {DeveloperError} options.selectedTerrainProviderViewModel is not available when not using the BaseLayerPicker widget, specify options.terrainProvider instead. * * @see Animation * @see BaseLayerPicker @@ -196,7 +200,6 @@ define([ var createBaseLayerPicker = !defined(options.baseLayerPicker) || options.baseLayerPicker !== false; //>>includeStart('debug', pragmas.debug); - //If using BaseLayerPicker, imageryProvider is an invalid option if (createBaseLayerPicker && defined(options.imageryProvider)) { throw new DeveloperError('options.imageryProvider is not available when using the BaseLayerPicker widget. \ @@ -208,6 +211,18 @@ Either specify options.selectedImageryProviderViewModel instead or set options.b throw new DeveloperError('options.selectedImageryProviderViewModel is not available when not using the BaseLayerPicker widget. \ Either specify options.imageryProvider instead or set options.baseLayerPicker to true.'); } + + //If using BaseLayerPicker, terrainProvider is an invalid option + if (createBaseLayerPicker && defined(options.terrainProvider)) { + throw new DeveloperError('options.terrainProvider is not available when using the BaseLayerPicker widget. \ +Either specify options.selectedTerrainProviderViewModel instead or set options.baseLayerPicker to false.'); + } + + //If not using BaseLayerPicker, selectedTerrainProviderViewModel is an invalid option + if (!createBaseLayerPicker && defined(options.selectedTerrainProviderViewModel)) { + throw new DeveloperError('options.selectedTerrainProviderViewModel is not available when not using the BaseLayerPicker widget. \ +Either specify options.terrainProvider instead or set options.baseLayerPicker to true.'); + } //>>includeEnd('debug') var viewerContainer = document.createElement('div'); @@ -302,6 +317,7 @@ Either specify options.imageryProvider instead or set options.baseLayerPicker to var terrainProviderViewModels = defaultValue(options.terrainProviderViewModels, createDefaultTerrainProviderViewModels()); baseLayerPicker = new BaseLayerPicker(toolbar, cesiumWidget.centralBody, imageryProviderViewModels, terrainProviderViewModels); baseLayerPicker.viewModel.selectedImagery = defaultValue(options.selectedImageryProviderViewModel, imageryProviderViewModels[0]); + baseLayerPicker.viewModel.selectedTerrain = defaultValue(options.selectedTerrainProviderViewModel, terrainProviderViewModels[0]); //Grab the dropdown for resize code. var elements = toolbar.getElementsByClassName('cesium-baseLayerPicker-dropDown'); diff --git a/Specs/Widgets/Viewer/ViewerSpec.js b/Specs/Widgets/Viewer/ViewerSpec.js index 8ed1f39ce74d..84f22310d162 100644 --- a/Specs/Widgets/Viewer/ViewerSpec.js +++ b/Specs/Widgets/Viewer/ViewerSpec.js @@ -265,6 +265,7 @@ defineSuite([ var provider = new EllipsoidTerrainProvider(); viewer = new Viewer(container, { + baseLayerPicker : false, terrainProvider : provider }); expect(viewer.centralBody.terrainProvider).toBe(provider); From 1190ea6c098978980b001381caa1d055da151b2e Mon Sep 17 00:00:00 2001 From: Matthew Amato Date: Wed, 9 Apr 2014 21:40:56 -0400 Subject: [PATCH 3/8] Ongoing BaseLayerPicker work Flesh out specs and minor cleanup. --- .../BaseLayerPicker/BaseLayerPicker.js | 4 +- .../BaseLayerPickerViewModel.js | 44 ++++++----- .../createDefaultTerrainProviderViewModels.js | 4 +- .../BaseLayerPicker/BaseLayerPickerSpec.js | 4 +- .../BaseLayerPickerViewModelSpec.js | 76 ++++++++++++++----- 5 files changed, 91 insertions(+), 41 deletions(-) diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js index 769e9e9d4daf..1d2b1db2b99f 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js @@ -115,7 +115,7 @@ define([ element.type = 'button'; element.className = 'cesium-button cesium-toolbar-button'; element.setAttribute('data-bind', '\ -attr: { title: selectedImageryName },\ +attr: { title: buttonTooltip },\ click: toggleDropDown'); container.appendChild(element); @@ -123,7 +123,7 @@ click: toggleDropDown'); imgElement.setAttribute('draggable', 'false'); imgElement.className = 'cesium-baseLayerPicker-selected'; imgElement.setAttribute('data-bind', '\ -attr: { src: selectedImageryIconUrl }'); +attr: { src: buttonImageUrl }'); element.appendChild(imgElement); var dropPanel = document.createElement('div'); diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js b/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js index 4b057937cb5b..1f17e12e2516 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js @@ -69,21 +69,31 @@ define([ knockout.track(this, ['imageryProviderViewModels', 'terrainProviderViewModels', 'dropDownVisible']); /** - * Gets the currently selected item name. This property is observable. + * Gets the primary tooltip. This property is observable. * @type {String} */ - this.selectedImageryName = undefined; - knockout.defineProperty(this, 'selectedImageryName', function() { - var selected = this.selectedImagery; - return defined(selected) ? selected.name : undefined; + this.buttonTooltip = undefined; + knockout.defineProperty(this, 'buttonTooltip', function() { + var selectedImagery = this.selectedImagery; + var selectedTerrain = this.selectedTerrain; + + var imageryTip = defined(selectedImagery) ? selectedImagery.name : undefined; + var 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 image url of the currently selected item. This property is observable. * @type {String} */ - this.selectedImageryIconUrl = undefined; - knockout.defineProperty(this, 'selectedImageryIconUrl', function() { + this.buttonImageUrl = undefined; + knockout.defineProperty(this, 'buttonImageUrl', function() { var viewModel = this.selectedImagery; return defined(viewModel) ? viewModel.iconUrl : undefined; }); @@ -129,9 +139,8 @@ define([ this._currentImageryProviders = [newProviders]; imageryLayers.addImageryProvider(newProviders, 0); } - - selectedImageryViewModel(value); } + selectedImageryViewModel(value); this.dropDownVisible = false; } }); @@ -149,13 +158,14 @@ define([ return selectedTerrainViewModel(); }, set : function(value) { + var newProvider; if (defined(value)) { - var newProvider = value.creationCommand(); - this._centralBody.depthTestAgainstTerrain = !(newProvider instanceof EllipsoidTerrainProvider); - this._centralBody.terrainProvider = newProvider; - selectedTerrainViewModel(value); + newProvider = value.creationCommand(); } + this._centralBody.depthTestAgainstTerrain = !(newProvider instanceof EllipsoidTerrainProvider); + this._centralBody.terrainProvider = newProvider; + selectedTerrainViewModel(value); this.dropDownVisible = false; } }); @@ -180,14 +190,14 @@ define([ }, /** - * Gets the imagery layer collection. + * Gets the centralBody. * @memberof BaseLayerPickerViewModel.prototype * - * @type {ImageryLayerCollection} + * @type {CentralBody} */ - imageryLayers : { + centralBody : { get : function() { - return this._centralBody.imageryLayers; + return this._centralBody; } } }); diff --git a/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js b/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js index 65d733ec63f6..8f4603441a0a 100644 --- a/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js +++ b/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js @@ -34,7 +34,7 @@ define([ tooltip : 'CesiumTerrainProvider', creationFunction : function() { return new CesiumTerrainProvider({ - url : 'http://cesiumjs.org/stk-terrain/tilesets/world/tiles', + url : '//cesiumjs.org/stk-terrain/tilesets/world/tiles', credit : 'Terrain data courtesy Analytical Graphics, Inc.' }); } @@ -46,7 +46,7 @@ define([ tooltip : 'CesiumTerrainProvider', creationFunction : function() { return new CesiumTerrainProvider({ - url : 'http://cesiumjs.org/smallterrain', + url : '//cesiumjs.org/smallterrain', credit : 'Terrain data courtesy Analytical Graphics, Inc.' }); } diff --git a/Specs/Widgets/BaseLayerPicker/BaseLayerPickerSpec.js b/Specs/Widgets/BaseLayerPicker/BaseLayerPickerSpec.js index c2f23fe6ffb3..7ad49c344868 100644 --- a/Specs/Widgets/BaseLayerPicker/BaseLayerPickerSpec.js +++ b/Specs/Widgets/BaseLayerPicker/BaseLayerPickerSpec.js @@ -23,11 +23,9 @@ defineSuite([ document.body.appendChild(container); var centralBody = new MockCentralBody(); - var layers = centralBody.imageryLayers; - var widget = new BaseLayerPicker('testContainer', centralBody); expect(widget.container).toBe(container); - expect(widget.viewModel.imageryLayers).toBe(layers); + expect(widget.viewModel.centralBody).toBe(centralBody); expect(widget.isDestroyed()).toEqual(false); widget.destroy(); expect(widget.isDestroyed()).toEqual(true); diff --git a/Specs/Widgets/BaseLayerPicker/BaseLayerPickerViewModelSpec.js b/Specs/Widgets/BaseLayerPicker/BaseLayerPickerViewModelSpec.js index c8b68b866bf9..3f4a561dae2a 100644 --- a/Specs/Widgets/BaseLayerPicker/BaseLayerPickerViewModelSpec.js +++ b/Specs/Widgets/BaseLayerPicker/BaseLayerPickerViewModelSpec.js @@ -12,7 +12,7 @@ defineSuite([ "use strict"; /*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn,runs,waits,waitsFor*/ - var MockCentralBody = function(){ + var MockCentralBody = function() { this.imageryLayers = new ImageryLayerCollection(); this.terrainProvider = new EllipsoidTerrainProvider(); }; @@ -45,24 +45,36 @@ defineSuite([ }); var testProviderViewModel2 = new ProviderViewModel({ - name : 'name', - tooltip : 'tooltip', - iconUrl : 'url', + name : 'name2', + tooltip : 'tooltip2', + iconUrl : 'url2', creationFunction : function() { return [testProvider, testProvider2]; } }); + var testProviderViewModel3 = new ProviderViewModel({ + name : 'name3', + tooltip : 'tooltip3', + iconUrl : 'url3', + creationFunction : function() { + return testProvider3; + } + }); + it('constructor sets expected values', function() { - var array = []; + var imageryViewModels = []; + var terrainViewModels = []; + var centralBody = new MockCentralBody(); - var imageryLayers = centralBody.imageryLayers; - var viewModel = new BaseLayerPickerViewModel(centralBody, array); - expect(viewModel.imageryLayers).toBe(imageryLayers); - expect(viewModel.imageryProviderViewModels).toEqual(array); + + var viewModel = new BaseLayerPickerViewModel(centralBody, imageryViewModels, terrainViewModels); + expect(viewModel.centralBody).toBe(centralBody); + expect(viewModel.imageryProviderViewModels).toEqual(imageryViewModels); + expect(viewModel.terrainProviderViewModels).toEqual(terrainViewModels); }); - it('selecting an item closes the dropDown', function() { + it('selecting imagery closes the dropDown', function() { var array = [testProviderViewModel]; var centralBody = new MockCentralBody(); var imageryLayers = centralBody.imageryLayers; @@ -73,21 +85,43 @@ defineSuite([ expect(viewModel.dropDownVisible).toEqual(false); }); - it('selectedImageryName, selectedImageryIconUrl, and selectedImagery all return expected values', function() { + it('selecting terrain closes the dropDown', function() { var array = [testProviderViewModel]; var centralBody = new MockCentralBody(); var imageryLayers = centralBody.imageryLayers; var viewModel = new BaseLayerPickerViewModel(centralBody, array); - expect(viewModel.selectedImageryName).toBeUndefined(); - expect(viewModel.selectedImageryIconUrl).toBeUndefined(); + viewModel.dropDownVisible = true; + viewModel.selectedTerrain = testProviderViewModel; + expect(viewModel.dropDownVisible).toEqual(false); + }); + + it('tooltip, buttonImageUrl, and selectedImagery all return expected values', function() { + var imageryViewModels = [testProviderViewModel]; + var terrainViewModels = [testProviderViewModel3]; + var centralBody = new MockCentralBody(); + var imageryLayers = centralBody.imageryLayers; + + var viewModel = new BaseLayerPickerViewModel(centralBody, imageryViewModels, terrainViewModels); + + expect(viewModel.buttonTooltip).toBeUndefined(); + expect(viewModel.buttonImageUrl).toBeUndefined(); expect(viewModel.selectedImagery).toBeUndefined(); + expect(viewModel.selectedTerrain).toBeUndefined(); + + viewModel.selectedImagery = testProviderViewModel; + expect(viewModel.buttonTooltip).toEqual(testProviderViewModel.name); + + viewModel.selectedImagery = undefined; + viewModel.selectedTerrain = testProviderViewModel3; + expect(viewModel.buttonTooltip).toEqual(testProviderViewModel3.name); viewModel.selectedImagery = testProviderViewModel; + expect(viewModel.buttonTooltip).toEqual(testProviderViewModel.name + '\n' + testProviderViewModel3.name); - expect(viewModel.selectedImageryName).toEqual(testProviderViewModel.name); - expect(viewModel.selectedImageryIconUrl).toEqual(testProviderViewModel.iconUrl); + expect(viewModel.buttonImageUrl).toEqual(testProviderViewModel.iconUrl); expect(viewModel.selectedImagery).toBe(testProviderViewModel); + expect(viewModel.selectedTerrain).toBe(testProviderViewModel3); }); it('selectedImagery actually sets base layer', function() { @@ -108,6 +142,15 @@ defineSuite([ expect(imageryLayers.get(1).imageryProvider).toBe(testProvider2); }); + it('selectedTerrain actually sets terrainPRovider', function() { + var terrainProviderViewModels = [testProviderViewModel, testProviderViewModel3]; + var centralBody = new MockCentralBody(); + var viewModel = new BaseLayerPickerViewModel(centralBody, [], terrainProviderViewModels); + + viewModel.selectedTerrain = testProviderViewModel3; + expect(centralBody.terrainProvider).toBe(testProvider3); + }); + it('settings selectedImagery only removes layers added by view model', function() { var array = [testProviderViewModel]; var centralBody = new MockCentralBody(); @@ -130,7 +173,6 @@ defineSuite([ expect(imageryLayers.get(0).imageryProvider).toBe(testProvider3); }); - it('dropDownVisible and toggleDropDown work', function() { var viewModel = new BaseLayerPickerViewModel(new MockCentralBody()); @@ -141,7 +183,7 @@ defineSuite([ expect(viewModel.dropDownVisible).toEqual(false); }); - it('constructor throws with no layer collection', function() { + it('constructor throws with no centralBody', function() { expect(function() { return new BaseLayerPickerViewModel(undefined); }).toThrowDeveloperError(); From bbb56e9397de0fd5a10817b3ee0a8d66e63e7524 Mon Sep 17 00:00:00 2001 From: Matthew Amato Date: Wed, 9 Apr 2014 22:02:39 -0400 Subject: [PATCH 4/8] Hopefully final pre PR clean to BaseLayerPicker terrain support. --- CHANGES.md | 6 ++++ .../BaseLayerPicker/BaseLayerPicker.js | 30 ++++++++++--------- .../BaseLayerPickerViewModel.js | 25 +++++++++------- 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 4addee184254..7c94f0ecc2e2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,12 @@ Change Log Beta Releases ------------- +### b28 - 2014-05-01 + +* Breaking changes: + * `BaseLayerPicker` has many breaking changes, see [#1607](https://github.com/AnalyticalGraphicsInc/cesium/pull/1607) for details. +* Added support for terrain selection to `BaseLayerPicker`. + ### b27 - 2014-04-01 * Breaking changes: diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js index 1d2b1db2b99f..d4847f1d54c7 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js @@ -23,23 +23,25 @@ define([ *
BaseLayerPicker with its drop-panel open. * *

- * The BaseLayerPicker is a single button widget that displays a panel of available imagery - * providers. When an item is selected, the corresponding imagery layer is created and inserted - * as the base layer of the imagery collection; removing the existing base. Each item in the - * available providers list contains a name, a representative icon, and a tooltip to display more - * information when hovered. The list is initially empty, and must be configured before use, as - * illustrated in the below example. + * The BaseLayerPicker is a single button widget that displays a panel of available imagery and + * terrain providers. When imagery is selected, the corresponding imagery layer is created and inserted + * as the base layer of the imagery collection; removing the existing base. When terrain is selected, + * it replaces the current terrain provider. Each item in the available providers list contains a name, + * a representative icon, and a tooltip to display more information when hovered. The list is initially + * empty, and must be configured before use, as illustrated in the below example. * * @alias BaseLayerPicker * @constructor * * @param {Element} container The parent HTML container node for this widget. - * @param {ImageryLayerCollection} imageryLayers The imagery layer collection to use. + * @param {CentralBody} centralBody The CentralBody to use. + * @param {ProviderViewModel[]} [imageryProviderViewModels=[]] The array of ProviderViewModel instances to use for imagery. + * @param {ProviderViewModel[]} [terrainProviderViewModels=[]] The array of ProviderViewModel instances to use for terrain. * * @exception {DeveloperError} Element with id "container" does not exist in the document. * + * @see TerrainProvider * @see ImageryProvider - * @see ProviderViewModel * @see ImageryLayerCollection * * @example @@ -49,8 +51,8 @@ define([ * * //Create the list of available providers we would like the user to select from. * //This example uses 3, OpenStreetMap, The Black Marble, and a single, non-streaming world image. - * var providerViewModels = []; - * providerViewModels.push(new Cesium.ProviderViewModel({ + * var imageryViewModels = []; + * imageryViewModels.push(new Cesium.ProviderViewModel({ * name : 'Open\u00adStreet\u00adMap', * iconUrl : Cesium.buildModuleUrl('Widgets/Images/ImageryProviders/openStreetMap.png'), * tooltip : 'OpenStreetMap (OSM) is a collaborative project to create a free editable \ @@ -62,7 +64,7 @@ define([ * } * })); * - * providerViewModels.push(new Cesium.ProviderViewModel({ + * imageryViewModels.push(new Cesium.ProviderViewModel({ * name : 'Black Marble', * iconUrl : Cesium.buildModuleUrl('Widgets/Images/ImageryProviders/blackMarble.png'), * tooltip : 'The lights of cities and villages trace the outlines of civilization \ @@ -76,7 +78,7 @@ define([ * } * })); * - * providerViewModels.push(new Cesium.ProviderViewModel({ + * imageryViewModels.push(new Cesium.ProviderViewModel({ * name : 'Natural Earth\u00a0II', * iconUrl : Cesium.buildModuleUrl('Widgets/Images/ImageryProviders/naturalEarthII.png'), * tooltip : 'Natural Earth II, darkened for contrast.\nhttp://www.naturalearthdata.com/', @@ -92,10 +94,10 @@ define([ * * //Finally, create the baseLayerPicker widget using our view models. * var layers = cesiumWidget.centralBody.imageryLayers; - * var baseLayerPicker = new Cesium.BaseLayerPicker('baseLayerPickerContainer', layers, providerViewModels); + * var baseLayerPicker = new Cesium.BaseLayerPicker('baseLayerPickerContainer', layers, imageryViewModels); * * //Use the first item in the list as the current selection. - * baseLayerPicker.viewModel.selectedItem = providerViewModels[0]; + * baseLayerPicker.viewModel.selectedItem = imageryViewModels[0]; */ var BaseLayerPicker = function(container, centralBody, imageryProviderViewModels, terrainProviderViewModels) { //>>includeStart('debug', pragmas.debug); diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js b/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js index 1f17e12e2516..e111c364470d 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js @@ -22,12 +22,12 @@ define([ * @alias BaseLayerPickerViewModel * @constructor * - * @param {ImageryLayerCollection} imageryLayers The imagery layer collection to use. - * @param {Array} [imageryProviderViewModels=[]] The array of ProviderViewModel instances to use. + * @param {CentralBody} centralBody The CentralBody to use. + * @param {ProviderViewModel[]} [imageryProviderViewModels=[]] The array of ProviderViewModel instances to use for imagery. + * @param {ProviderViewModel[]} [terrainProviderViewModels=[]] The array of ProviderViewModel instances to use for terrain. * * @exception {DeveloperError} imageryProviderViewModels must be an array. - * - * @see ProviderViewModel + * @exception {DeveloperError} terrainProviderViewModels must be an array. */ var BaseLayerPickerViewModel = function(centralBody, imageryProviderViewModels, terrainProviderViewModels) { //>>includeStart('debug', pragmas.debug); @@ -44,19 +44,24 @@ define([ if (!defined(terrainProviderViewModels)) { terrainProviderViewModels = []; - } else if (!isArray(imageryProviderViewModels)) { + } else if (!isArray(terrainProviderViewModels)) { throw new DeveloperError('terrainProviderViewModels must be an array'); } this._centralBody = centralBody; /** - * Gets or sets an array of ProviderViewModel instances available for selection. + * Gets or sets an array of ProviderViewModel instances available for imagery selection. * This property is observable. * @type {Array} */ this.imageryProviderViewModels = imageryProviderViewModels.slice(0); + /** + * Gets or sets an array of ProviderViewModel instances available for terrain selection. + * This property is observable. + * @type {Array} + */ this.terrainProviderViewModels = terrainProviderViewModels.slice(0); /** @@ -69,7 +74,7 @@ define([ knockout.track(this, ['imageryProviderViewModels', 'terrainProviderViewModels', 'dropDownVisible']); /** - * Gets the primary tooltip. This property is observable. + * Gets the button tooltip. This property is observable. * @type {String} */ this.buttonTooltip = undefined; @@ -89,7 +94,7 @@ define([ }); /** - * Gets the image url of the currently selected item. This property is observable. + * Gets the button background image. This property is observable. * @type {String} */ this.buttonImageUrl = undefined; @@ -99,7 +104,7 @@ define([ }); /** - * Gets or sets the currently selected item. This property is observable. + * Gets or sets the currently selected imagery. This property is observable. * @type {ProviderViewModel} * @default undefined */ @@ -146,7 +151,7 @@ define([ }); /** - * Gets or sets the currently selected item. This property is observable. + * Gets or sets the currently selected terrain. This property is observable. * @type {ProviderViewModel} * @default undefined */ From f26c88f6cca4188921a7dbec3e7f41807db16237 Mon Sep 17 00:00:00 2001 From: Matthew Amato Date: Wed, 9 Apr 2014 23:07:42 -0400 Subject: [PATCH 5/8] Put back default imagery and widen the drop down. --- .../BaseLayerPicker/BaseLayerPicker.css | 2 +- .../createDefaultImageryProviderViewModels.js | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css index 7fdfe08a7dd6..8040d6267876 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css @@ -28,7 +28,7 @@ position: absolute; top: auto; right: 0; - width: 240px; + width: 300px; max-height: 500px; margin-top: 5px; background-color: rgba(38, 38, 38, 0.75); diff --git a/Source/Widgets/BaseLayerPicker/createDefaultImageryProviderViewModels.js b/Source/Widgets/BaseLayerPicker/createDefaultImageryProviderViewModels.js index d10fe1157b27..fbea6ab6b38a 100644 --- a/Source/Widgets/BaseLayerPicker/createDefaultImageryProviderViewModels.js +++ b/Source/Widgets/BaseLayerPicker/createDefaultImageryProviderViewModels.js @@ -76,6 +76,21 @@ contributed by the GIS User Community.\nhttp://www.esri.com', } })); + providerViewModels.push(new ProviderViewModel({ + name : 'ESRI World Street Map', + iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/esriWorldStreetMap.png'), + tooltip : '\ +This worldwide street map presents highway-level data for the world. Street-level data includes the United States; much of \ +Canada; Japan; most countries in Europe; Australia and New Zealand; India; parts of South America including Argentina, Brazil, \ +Chile, Colombia, and Venezuela; Ghana; and parts of southern Africa including Botswana, Lesotho, Namibia, South Africa, and Swaziland.\n\ +http://www.esri.com', + creationFunction : function() { + return new ArcGisMapServerImageryProvider({ + url : 'http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer' + }); + } + })); + providerViewModels.push(new ProviderViewModel({ name : 'ESRI National Geographic', iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/esriNationalGeographic.png'), @@ -102,6 +117,19 @@ of the world.\nhttp://www.openstreetmap.org', } })); + providerViewModels.push(new ProviderViewModel({ + name : 'Stamen Watercolor', + iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/stamenWatercolor.png'), + tooltip : 'Reminiscent of hand drawn maps, Stamen watercolor maps apply raster effect \ +area washes and organic edges over a paper texture to add warm pop to any map.\nhttp://maps.stamen.com', + creationFunction : function() { + return new OpenStreetMapImageryProvider({ + url : 'http://tile.stamen.com/watercolor/', + credit : 'Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under CC BY SA.' + }); + } + })); + providerViewModels.push(new ProviderViewModel({ name : 'Stamen Toner', iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/stamenToner.png'), @@ -114,6 +142,17 @@ of the world.\nhttp://www.openstreetmap.org', } })); + providerViewModels.push(new ProviderViewModel({ + name : 'MapQuest Open\u00adStreet\u00adMap', + iconUrl : buildModuleUrl('Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png'), + tooltip : 'OpenStreetMap (OSM) is a collaborative project to create a free editable \ +map of the world.\nhttp://www.openstreetmap.org', + creationFunction : function() { + return new OpenStreetMapImageryProvider({ + url : 'http://otile1.mqcdn.com/tiles/1.0.0/osm/' + }); + } + })); providerViewModels.push(new ProviderViewModel({ name : 'The Black Marble', From b94f851ea04f3cc4dfa6188a6b67ecfed8bcda35 Mon Sep 17 00:00:00 2001 From: Matthew Amato Date: Thu, 10 Apr 2014 17:35:15 -0400 Subject: [PATCH 6/8] Changes after review. 1. BaseLayerPicker now takes an options object instead of individual parameters. 2. Minor styling fix to dropdown width so that 4 items fit when vertical scroll bar is visible. 3. Add selectedImageryProviderViewModel/selectedTerrainProviderViewModel options to BaseLayerPickerViewModel 4. Fix tooltips for default terrain providers. --- .../BaseLayerPicker/BaseLayerPicker.css | 2 +- .../BaseLayerPicker/BaseLayerPicker.js | 15 ++-- .../BaseLayerPickerViewModel.js | 43 +++++++---- .../createDefaultTerrainProviderViewModels.js | 6 +- Source/Widgets/Viewer/Viewer.js | 11 ++- .../BaseLayerPicker/BaseLayerPickerSpec.js | 20 +++-- .../BaseLayerPickerViewModelSpec.js | 75 +++++++++++-------- 7 files changed, 104 insertions(+), 68 deletions(-) diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css index 8040d6267876..ac0052aac628 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.css @@ -28,7 +28,7 @@ position: absolute; top: auto; right: 0; - width: 300px; + width: 320px; max-height: 500px; margin-top: 5px; background-color: rgba(38, 38, 38, 0.75); diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js index d4847f1d54c7..5fba8f085338 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js @@ -34,9 +34,11 @@ define([ * @constructor * * @param {Element} container The parent HTML container node for this widget. - * @param {CentralBody} centralBody The CentralBody to use. - * @param {ProviderViewModel[]} [imageryProviderViewModels=[]] The array of ProviderViewModel instances to use for imagery. - * @param {ProviderViewModel[]} [terrainProviderViewModels=[]] The array of ProviderViewModel instances to use for terrain. + * @param {CentralBody} options.centralBody The CentralBody 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 base layer is used. This value is only valid if options.baseLayerPicker is set to true. + * @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 base layer is used. This value is only valid if options.baseLayerPicker is set to true. * * @exception {DeveloperError} Element with id "container" does not exist in the document. * @@ -99,19 +101,16 @@ define([ * //Use the first item in the list as the current selection. * baseLayerPicker.viewModel.selectedItem = imageryViewModels[0]; */ - var BaseLayerPicker = function(container, centralBody, imageryProviderViewModels, terrainProviderViewModels) { + var BaseLayerPicker = function(container, options) { //>>includeStart('debug', pragmas.debug); if (!defined(container)) { throw new DeveloperError('container is required.'); } - if (!defined(centralBody)) { - throw new DeveloperError('centralBody is required.'); - } //>>includeEnd('debug'); container = getElement(container); - var viewModel = new BaseLayerPickerViewModel(centralBody, imageryProviderViewModels, terrainProviderViewModels); + var viewModel = new BaseLayerPickerViewModel(options); var element = document.createElement('button'); element.type = 'button'; diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js b/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js index e111c364470d..a45bfa027967 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js @@ -1,5 +1,6 @@ /*global define*/ define([ + '../../Core/defaultValue', '../../Core/defined', '../../Core/defineProperties', '../../Core/DeveloperError', @@ -8,6 +9,7 @@ define([ '../createCommand', '../../ThirdParty/knockout' ], function( + defaultValue, defined, defineProperties, DeveloperError, @@ -22,32 +24,28 @@ define([ * @alias BaseLayerPickerViewModel * @constructor * - * @param {CentralBody} centralBody The CentralBody to use. - * @param {ProviderViewModel[]} [imageryProviderViewModels=[]] The array of ProviderViewModel instances to use for imagery. - * @param {ProviderViewModel[]} [terrainProviderViewModels=[]] The array of ProviderViewModel instances to use for terrain. + * @param {CentralBody} options.centralBody The CentralBody 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 base layer is used. This value is only valid if options.baseLayerPicker is set to true. + * @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 base layer is used. This value is only valid if options.baseLayerPicker is set to true. * * @exception {DeveloperError} imageryProviderViewModels must be an array. * @exception {DeveloperError} terrainProviderViewModels must be an array. */ - var BaseLayerPickerViewModel = function(centralBody, imageryProviderViewModels, terrainProviderViewModels) { + var BaseLayerPickerViewModel = function(options) { + options = defaultValue(options, defaultValue.EMPTY_OBJECT); + + var centralBody = options.centralBody; + var imageryProviderViewModels = defaultValue(options.imageryProviderViewModels, []); + var terrainProviderViewModels = defaultValue(options.terrainProviderViewModels, []); + //>>includeStart('debug', pragmas.debug); if (!defined(centralBody)) { throw new DeveloperError('centralBody is required'); } //>>includeEnd('debug'); - if (!defined(imageryProviderViewModels)) { - imageryProviderViewModels = []; - } else if (!isArray(imageryProviderViewModels)) { - throw new DeveloperError('imageryProviderViewModels must be an array'); - } - - if (!defined(terrainProviderViewModels)) { - terrainProviderViewModels = []; - } else if (!isArray(terrainProviderViewModels)) { - throw new DeveloperError('terrainProviderViewModels must be an array'); - } - this._centralBody = centralBody; /** @@ -117,6 +115,11 @@ define([ return selectedImageryViewModel(); }, set : function(value) { + if (selectedImageryViewModel() === value) { + this.dropDownVisible = false; + return; + } + var i; var currentImageryProviders = this._currentImageryProviders; var currentImageryProvidersLength = currentImageryProviders.length; @@ -163,6 +166,11 @@ define([ return selectedTerrainViewModel(); }, set : function(value) { + if (selectedTerrainViewModel() === value) { + this.dropDownVisible = false; + return; + } + var newProvider; if (defined(value)) { newProvider = value.creationCommand(); @@ -179,6 +187,9 @@ define([ this._toggleDropDown = createCommand(function() { that.dropDownVisible = !that.dropDownVisible; }); + + this.selectedImagery = defaultValue(options.selectedImageryProviderViewModel, imageryProviderViewModels[0]); + this.selectedTerrain = defaultValue(options.selectedTerrainProviderViewModel, terrainProviderViewModels[0]); }; defineProperties(BaseLayerPickerViewModel.prototype, { diff --git a/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js b/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js index 8f4603441a0a..5e4c3e1eae93 100644 --- a/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js +++ b/Source/Widgets/BaseLayerPicker/createDefaultTerrainProviderViewModels.js @@ -21,7 +21,7 @@ define([ providerViewModels.push(new ProviderViewModel({ name : 'WGS84 Ellipsoid', iconUrl : buildModuleUrl('Widgets/Images/TerrainProviders/Ellipsoid.png'), - tooltip : 'EllipsoidTerrainProvider', + tooltip : 'WGS84 standard ellipsoid, also known as EPSG:4326', creationFunction : function() { return new EllipsoidTerrainProvider(); } @@ -31,7 +31,7 @@ define([ providerViewModels.push(new ProviderViewModel({ name : 'STK World Terrain meshes', iconUrl : buildModuleUrl('Widgets/Images/TerrainProviders/STK.png'), - tooltip : 'CesiumTerrainProvider', + tooltip : 'High-resolution, mesh-based terrain for the entire globe. Free for use on the Internet. Closed-network options are available.\nhttp://www.agi.com', creationFunction : function() { return new CesiumTerrainProvider({ url : '//cesiumjs.org/stk-terrain/tilesets/world/tiles', @@ -43,7 +43,7 @@ define([ providerViewModels.push(new ProviderViewModel({ name : 'Small Terrain heightmaps and water mask', iconUrl : buildModuleUrl('Widgets/Images/TerrainProviders/STK.png'), - tooltip : 'CesiumTerrainProvider', + tooltip : 'Medium-resolution, heightmap-based terrain for the entire globe. This tileset also includes a water mask. Free for use on the Internet.\nhttp://www.agi.com', creationFunction : function() { return new CesiumTerrainProvider({ url : '//cesiumjs.org/smallterrain', diff --git a/Source/Widgets/Viewer/Viewer.js b/Source/Widgets/Viewer/Viewer.js index 4347dc7b02a7..34b2c55f1a54 100644 --- a/Source/Widgets/Viewer/Viewer.js +++ b/Source/Widgets/Viewer/Viewer.js @@ -315,9 +315,14 @@ Either specify options.terrainProvider instead or set options.baseLayerPicker to if (createBaseLayerPicker) { var imageryProviderViewModels = defaultValue(options.imageryProviderViewModels, createDefaultImageryProviderViewModels()); var terrainProviderViewModels = defaultValue(options.terrainProviderViewModels, createDefaultTerrainProviderViewModels()); - baseLayerPicker = new BaseLayerPicker(toolbar, cesiumWidget.centralBody, imageryProviderViewModels, terrainProviderViewModels); - baseLayerPicker.viewModel.selectedImagery = defaultValue(options.selectedImageryProviderViewModel, imageryProviderViewModels[0]); - baseLayerPicker.viewModel.selectedTerrain = defaultValue(options.selectedTerrainProviderViewModel, terrainProviderViewModels[0]); + + baseLayerPicker = new BaseLayerPicker(toolbar, { + centralBody : cesiumWidget.centralBody, + imageryProviderViewModels : imageryProviderViewModels, + selectedImageryProviderViewModel : options.selectedImageryProviderViewModel, + terrainProviderViewModels : terrainProviderViewModels, + selectedTerrainProviderViewModel : options.selectedTerrainProviderViewModel + }); //Grab the dropdown for resize code. var elements = toolbar.getElementsByClassName('cesium-baseLayerPicker-dropDown'); diff --git a/Specs/Widgets/BaseLayerPicker/BaseLayerPickerSpec.js b/Specs/Widgets/BaseLayerPicker/BaseLayerPickerSpec.js index 7ad49c344868..39862647dfa4 100644 --- a/Specs/Widgets/BaseLayerPicker/BaseLayerPickerSpec.js +++ b/Specs/Widgets/BaseLayerPicker/BaseLayerPickerSpec.js @@ -23,7 +23,9 @@ defineSuite([ document.body.appendChild(container); var centralBody = new MockCentralBody(); - var widget = new BaseLayerPicker('testContainer', centralBody); + var widget = new BaseLayerPicker('testContainer', { + centralBody : centralBody + }); expect(widget.container).toBe(container); expect(widget.viewModel.centralBody).toBe(centralBody); expect(widget.isDestroyed()).toEqual(false); @@ -38,7 +40,9 @@ defineSuite([ container.id = 'testContainer'; document.body.appendChild(container); - var widget = new BaseLayerPicker('testContainer', new MockCentralBody()); + var widget = new BaseLayerPicker('testContainer', { + centralBody : new MockCentralBody() + }); widget.viewModel.dropDownVisible = true; EventHelper.fireMouseDown(document.body); @@ -57,7 +61,9 @@ defineSuite([ container.id = 'testContainer'; document.body.appendChild(container); - var widget = new BaseLayerPicker('testContainer', new MockCentralBody()); + var widget = new BaseLayerPicker('testContainer', { + centralBody : new MockCentralBody() + }); widget.viewModel.dropDownVisible = true; @@ -81,13 +87,17 @@ defineSuite([ it('constructor throws with no element', function() { expect(function() { - return new BaseLayerPicker(undefined, new MockCentralBody()); + return new BaseLayerPicker(undefined, { + centralBody : new MockCentralBody() + }); }).toThrowDeveloperError(); }); it('constructor throws with string element that does not exist', function() { expect(function() { - return new BaseLayerPicker('does not exist', new MockCentralBody()); + return new BaseLayerPicker('does not exist', { + centralBody : new MockCentralBody() + }); }).toThrowDeveloperError(); }); }); \ No newline at end of file diff --git a/Specs/Widgets/BaseLayerPicker/BaseLayerPickerViewModelSpec.js b/Specs/Widgets/BaseLayerPicker/BaseLayerPickerViewModelSpec.js index 3f4a561dae2a..5b3fc6ab9df3 100644 --- a/Specs/Widgets/BaseLayerPicker/BaseLayerPickerViewModelSpec.js +++ b/Specs/Widgets/BaseLayerPicker/BaseLayerPickerViewModelSpec.js @@ -68,17 +68,24 @@ defineSuite([ var centralBody = new MockCentralBody(); - var viewModel = new BaseLayerPickerViewModel(centralBody, imageryViewModels, terrainViewModels); + var viewModel = new BaseLayerPickerViewModel({ + centralBody : centralBody, + imageryProviderViewModels : imageryViewModels, + terrainProviderViewModels : terrainViewModels + }); expect(viewModel.centralBody).toBe(centralBody); expect(viewModel.imageryProviderViewModels).toEqual(imageryViewModels); expect(viewModel.terrainProviderViewModels).toEqual(terrainViewModels); }); it('selecting imagery closes the dropDown', function() { - var array = [testProviderViewModel]; + var imageryViewModels = [testProviderViewModel]; var centralBody = new MockCentralBody(); var imageryLayers = centralBody.imageryLayers; - var viewModel = new BaseLayerPickerViewModel(centralBody, array); + var viewModel = new BaseLayerPickerViewModel({ + centralBody : centralBody, + imageryProviderViewModels : imageryViewModels + }); viewModel.dropDownVisible = true; viewModel.selectedImagery = testProviderViewModel; @@ -86,10 +93,13 @@ defineSuite([ }); it('selecting terrain closes the dropDown', function() { - var array = [testProviderViewModel]; + var imageryViewModels = [testProviderViewModel]; var centralBody = new MockCentralBody(); var imageryLayers = centralBody.imageryLayers; - var viewModel = new BaseLayerPickerViewModel(centralBody, array); + var viewModel = new BaseLayerPickerViewModel({ + centralBody : centralBody, + imageryProviderViewModels : imageryViewModels + }); viewModel.dropDownVisible = true; viewModel.selectedTerrain = testProviderViewModel; @@ -102,35 +112,35 @@ defineSuite([ var centralBody = new MockCentralBody(); var imageryLayers = centralBody.imageryLayers; - var viewModel = new BaseLayerPickerViewModel(centralBody, imageryViewModels, terrainViewModels); - - expect(viewModel.buttonTooltip).toBeUndefined(); - expect(viewModel.buttonImageUrl).toBeUndefined(); - expect(viewModel.selectedImagery).toBeUndefined(); - expect(viewModel.selectedTerrain).toBeUndefined(); + var viewModel = new BaseLayerPickerViewModel({ + centralBody : centralBody, + imageryProviderViewModels : imageryViewModels, + terrainProviderViewModels : terrainViewModels + }); viewModel.selectedImagery = testProviderViewModel; - expect(viewModel.buttonTooltip).toEqual(testProviderViewModel.name); + expect(viewModel.buttonTooltip).toEqual(testProviderViewModel.name + '\n' + testProviderViewModel3.name); viewModel.selectedImagery = undefined; - viewModel.selectedTerrain = testProviderViewModel3; expect(viewModel.buttonTooltip).toEqual(testProviderViewModel3.name); viewModel.selectedImagery = testProviderViewModel; - expect(viewModel.buttonTooltip).toEqual(testProviderViewModel.name + '\n' + testProviderViewModel3.name); + viewModel.selectedTerrain = undefined; + expect(viewModel.buttonTooltip).toEqual(testProviderViewModel.name); expect(viewModel.buttonImageUrl).toEqual(testProviderViewModel.iconUrl); - expect(viewModel.selectedImagery).toBe(testProviderViewModel); - expect(viewModel.selectedTerrain).toBe(testProviderViewModel3); }); it('selectedImagery actually sets base layer', function() { - var array = [testProviderViewModel]; + var imageryViewModels = [testProviderViewModel]; var centralBody = new MockCentralBody(); var imageryLayers = centralBody.imageryLayers; - var viewModel = new BaseLayerPickerViewModel(centralBody, array); + var viewModel = new BaseLayerPickerViewModel({ + centralBody : centralBody, + imageryProviderViewModels : imageryViewModels + }); - expect(imageryLayers.length).toEqual(0); + expect(imageryLayers.length).toEqual(1); viewModel.selectedImagery = testProviderViewModel; expect(imageryLayers.length).toEqual(1); @@ -145,19 +155,25 @@ defineSuite([ it('selectedTerrain actually sets terrainPRovider', function() { var terrainProviderViewModels = [testProviderViewModel, testProviderViewModel3]; var centralBody = new MockCentralBody(); - var viewModel = new BaseLayerPickerViewModel(centralBody, [], terrainProviderViewModels); + var viewModel = new BaseLayerPickerViewModel({ + centralBody : centralBody, + terrainProviderViewModels : terrainProviderViewModels + }); viewModel.selectedTerrain = testProviderViewModel3; expect(centralBody.terrainProvider).toBe(testProvider3); }); it('settings selectedImagery only removes layers added by view model', function() { - var array = [testProviderViewModel]; + var imageryViewModels = [testProviderViewModel]; var centralBody = new MockCentralBody(); var imageryLayers = centralBody.imageryLayers; - var viewModel = new BaseLayerPickerViewModel(centralBody, array); + var viewModel = new BaseLayerPickerViewModel({ + centralBody : centralBody, + imageryProviderViewModels : imageryViewModels + }); - expect(imageryLayers.length).toEqual(0); + expect(imageryLayers.length).toEqual(1); viewModel.selectedImagery = testProviderViewModel2; expect(imageryLayers.length).toEqual(2); @@ -174,7 +190,9 @@ defineSuite([ }); it('dropDownVisible and toggleDropDown work', function() { - var viewModel = new BaseLayerPickerViewModel(new MockCentralBody()); + var viewModel = new BaseLayerPickerViewModel({ + centralBody : new MockCentralBody() + }); expect(viewModel.dropDownVisible).toEqual(false); viewModel.toggleDropDown(); @@ -185,14 +203,7 @@ defineSuite([ it('constructor throws with no centralBody', function() { expect(function() { - return new BaseLayerPickerViewModel(undefined); - }).toThrowDeveloperError(); - }); - - it('constructor throws if viewModels argument is not an array', function() { - var centralBody = new MockCentralBody(); - expect(function() { - return new BaseLayerPickerViewModel(centralBody, {}); + return new BaseLayerPickerViewModel({}); }).toThrowDeveloperError(); }); }); \ No newline at end of file From c839a4b06e52e396db88973becfc9a8309bbed9c Mon Sep 17 00:00:00 2001 From: Matthew Amato Date: Thu, 10 Apr 2014 19:54:57 -0400 Subject: [PATCH 7/8] Update CHANGES.md Remove duplicate b28 entry. --- CHANGES.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index d7792b57dfa9..15a5bea175f8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -23,6 +23,7 @@ Beta Releases * `TilingScheme.extentToNativeRectangle` -> `TilingScheme.rectangleToNativeRectangle` * `TilingScheme.tileXYToNativeExtent` -> `TilingScheme.tileXYToNativeRectangle` * `TilingScheme.tileXYToExtent` -> `TilingScheme.tileXYToRectangle` + * `BaseLayerPicker` has been extended to support terrain selection. This includes many potential breaking changes, see [#1607](https://github.com/AnalyticalGraphicsInc/cesium/pull/1607) for details. * `TimeIntervalCollection.clear` renamed to `TimeIntervalColection.removeAll` * `Context` is now private * Removed `Scene.context`: replaced by adding `drawingBufferWidth`, `drawingBufferHeight`, `maximumAliasedLineWidth` properties and `createTextureAtlas` function to `Scene`. @@ -31,12 +32,6 @@ Beta Releases * Types implementing the `ImageryProvider` interface are now required to have a `hasAlphaChannel` property. * Improved texture upload performance and reduced memory usage when using `BingMapsImageryProvider` and other imagery providers that return false from `hasAlphaChannel`. -### b28 - 2014-05-01 - -* Breaking changes: - * `BaseLayerPicker` has many breaking changes, see [#1607](https://github.com/AnalyticalGraphicsInc/cesium/pull/1607) for details. -* Added support for terrain selection to `BaseLayerPicker`. - ### b27 - 2014-04-01 * Breaking changes: From 64c19bd456bcfd64e7f71876503b9287b1bca40a Mon Sep 17 00:00:00 2001 From: Matthew Amato Date: Fri, 11 Apr 2014 14:19:07 -0400 Subject: [PATCH 8/8] Changes after review 1. Fix copy/paste error. 2. Add more information to CHANGES --- CHANGES.md | 10 +++++++++- Source/Widgets/BaseLayerPicker/BaseLayerPicker.js | 4 ++-- .../BaseLayerPicker/BaseLayerPickerViewModel.js | 4 ++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 15a5bea175f8..01580d82fe94 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -23,7 +23,15 @@ Beta Releases * `TilingScheme.extentToNativeRectangle` -> `TilingScheme.rectangleToNativeRectangle` * `TilingScheme.tileXYToNativeExtent` -> `TilingScheme.tileXYToNativeRectangle` * `TilingScheme.tileXYToExtent` -> `TilingScheme.tileXYToRectangle` - * `BaseLayerPicker` has been extended to support terrain selection. This includes many potential breaking changes, see [#1607](https://github.com/AnalyticalGraphicsInc/cesium/pull/1607) for details. + * `BaseLayerPicker` has been extended to support terrain selection. + * The `BaseLayerPicker` constructor function now takes the container element and an options object instead of a CentralBody and ImageryLayerCollection. + * The `BaseLayerPickerViewModel` constructor function now takes an options object instead of a CentralBody and ImageryLayerCollection. + * `ImageryProviderViewModel` -> `ProviderViewModel` + * `BaseLayerPickerViewModel.selectedName` -> `BaseLayerPickerViewModel.buttonTooltip` + * `BaseLayerPickerViewModel.selectedIconUrl` -> `BaseLayerPickerViewModel.buttonImageUrl` + * `BaseLayerPickerViewModel.selectedItem` -> `BaseLayerPickerViewModel.selectedImagery` + * `BaseLayerPickerViewModel.imageryLayers`has been removed and replaced with `BaseLayerPickerViewModel.centralBody` + * See [#1607](https://github.com/AnalyticalGraphicsInc/cesium/pull/1607) for full details. * `TimeIntervalCollection.clear` renamed to `TimeIntervalColection.removeAll` * `Context` is now private * Removed `Scene.context`: replaced by adding `drawingBufferWidth`, `drawingBufferHeight`, `maximumAliasedLineWidth` properties and `createTextureAtlas` function to `Scene`. diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js index 5fba8f085338..3904a85f010d 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPicker.js @@ -36,9 +36,9 @@ define([ * @param {Element} container The parent HTML container node for this widget. * @param {CentralBody} options.centralBody The CentralBody 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 base layer is used. This value is only valid if options.baseLayerPicker is set to true. + * @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 base layer is used. This value is only valid if options.baseLayerPicker is set to true. + * @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} Element with id "container" does not exist in the document. * diff --git a/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js b/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js index a45bfa027967..697b508729b4 100644 --- a/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js +++ b/Source/Widgets/BaseLayerPicker/BaseLayerPickerViewModel.js @@ -26,9 +26,9 @@ define([ * * @param {CentralBody} options.centralBody The CentralBody 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 base layer is used. This value is only valid if options.baseLayerPicker is set to true. + * @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 base layer is used. This value is only valid if options.baseLayerPicker is set to true. + * @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.