From eae4873724c7cedb9239c47d1ef5a23e3dd697ae Mon Sep 17 00:00:00 2001 From: Matthew Amato Date: Thu, 16 Apr 2015 21:51:43 -0400 Subject: [PATCH] Update InfoBox title when entity name changes Also clean up the WMS/ArcGIS Server feature picking entity code, which was using deprecated API. --- Source/Widgets/Viewer/Viewer.js | 52 +++++++++++------------------- Specs/Widgets/Viewer/ViewerSpec.js | 33 +++++++++++++++++++ 2 files changed, 51 insertions(+), 34 deletions(-) diff --git a/Source/Widgets/Viewer/Viewer.js b/Source/Widgets/Viewer/Viewer.js index e183da5c0c6f..e5858c40be1e 100644 --- a/Source/Widgets/Viewer/Viewer.js +++ b/Source/Widgets/Viewer/Viewer.js @@ -18,6 +18,7 @@ define([ '../../DataSources/DataSourceDisplay', '../../DataSources/Entity', '../../DataSources/EntityView', + '../../DataSources/Property', '../../Scene/SceneMode', '../../ThirdParty/knockout', '../../ThirdParty/when', @@ -57,6 +58,7 @@ define([ DataSourceDisplay, Entity, EntityView, + Property, SceneMode, knockout, when, @@ -126,12 +128,10 @@ define([ } // Imagery layer feature picking is asynchronous, so put up a message while loading. - var loadingMessage = new Entity('Loading...'); - loadingMessage.description = { - getValue : function() { - return 'Loading feature information...'; - } - }; + var loadingMessage = new Entity({ + id : 'Loading...', + description : 'Loading feature information...' + }); when(imageryLayerFeaturePromise, function(features) { // Has this async pick been superseded by a later one? @@ -147,12 +147,10 @@ define([ // Select the first feature. var feature = features[0]; - var entity = new Entity(feature.name); - entity.description = { - getValue : function() { - return feature.description; - } - }; + var entity = new Entity({ + id : feature.name, + description : feature.description + }); if (defined(feature.position)) { var ecfPosition = viewer.scene.globe.ellipsoid.cartographicToCartesian(feature.position, cartesian3Scratch); @@ -165,14 +163,6 @@ define([ if (viewer.selectedEntity !== loadingMessage) { return; } - - var entity = new Entity('None'); - entity.description = { - getValue : function() { - return 'No features found.'; - } - }; - viewer.selectedEntity = createNoFeaturesEntity(); }); @@ -180,13 +170,10 @@ define([ } function createNoFeaturesEntity() { - var entity = new Entity('None'); - entity.description = { - getValue : function() { - return 'No features found.'; - } - }; - return entity; + return new Entity({ + id : 'None', + description : 'No features found.' + }); } /** @@ -1024,11 +1011,6 @@ Either specify options.terrainProvider instead or set options.baseLayerPicker to this._selectedEntity = value; var selectionIndicatorViewModel = defined(this._selectionIndicator) ? this._selectionIndicator.viewModel : undefined; if (defined(value)) { - var infoBoxViewModel = defined(this._infoBox) ? this._infoBox.viewModel : undefined; - if (defined(infoBoxViewModel)) { - infoBoxViewModel.titleText = defined(value.name) ? value.name : value.id; - } - if (defined(selectionIndicatorViewModel)) { selectionIndicatorViewModel.animateAppear(); } @@ -1336,9 +1318,11 @@ Either specify options.terrainProvider instead or set options.baseLayerPicker to infoBoxViewModel.enableCamera = enableCamera; infoBoxViewModel.isCameraTracking = (this.trackedEntity === this.selectedEntity); - if (showSelection && defined(selectedEntity.description)) { - infoBoxViewModel.description = defaultValue(selectedEntity.description.getValue(time), ''); + if (showSelection) { + infoBoxViewModel.titleText = defaultValue(selectedEntity.name, selectedEntity.id); + infoBoxViewModel.description = Property.getValueOrDefault(selectedEntity.description, time, ''); } else { + infoBoxViewModel.titleText = ''; infoBoxViewModel.description = ''; } } diff --git a/Specs/Widgets/Viewer/ViewerSpec.js b/Specs/Widgets/Viewer/ViewerSpec.js index a89c1fb8642d..3d57ce53e095 100644 --- a/Specs/Widgets/Viewer/ViewerSpec.js +++ b/Specs/Widgets/Viewer/ViewerSpec.js @@ -772,6 +772,39 @@ defineSuite([ viewer.destroy(); }); + it('selectedEntity sets InfoBox properties', function() { + var viewer = new Viewer(container); + + var entity = new Entity(); + + var viewModel = viewer.infoBox.viewModel; + expect(viewModel.showInfo).toBe(false); + + viewer.selectedEntity = entity; + + viewer.clock.tick(); + expect(viewModel.showInfo).toBe(true); + expect(viewModel.titleText).toEqual(entity.id); + expect(viewModel.description).toEqual(''); + + entity.name = 'Yes, this is name.'; + entity.description = 'tubelcane'; + + viewer.clock.tick(); + expect(viewModel.showInfo).toBe(true); + expect(viewModel.titleText).toEqual(entity.name); + expect(viewModel.description).toEqual(entity.description.getValue()); + + viewer.selectedEntity = undefined; + + viewer.clock.tick(); + expect(viewModel.showInfo).toBe(false); + expect(viewModel.titleText).toEqual(''); + expect(viewModel.description).toEqual(''); + + viewer.destroy(); + }); + it('home button resets tracked object', function() { viewer = new Viewer(container);