Skip to content

Commit

Permalink
Merge pull request CesiumGS#1404 from AnalyticalGraphicsInc/viewer-tr…
Browse files Browse the repository at this point in the history
…ackedObject

Make Viewer.trackedObject an observable.
  • Loading branch information
emackey committed Jan 24, 2014
2 parents 8890411 + 79dd857 commit 3668fac
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 74 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ Beta Releases
* Breaking changes:
* The `Viewer` constructor argument `options.fullscreenElement` now matches the `FullscreenButton` default of `document.body`, it was previously the `Viewer` container itself.
* `Asphalt`, `Blob`, `Brick`, `Cement`, `Erosion`, `Facet`, `Grass`, `TieDye`, and `Wood` materials were moved to the [Materials Pack Plugin](https://github.com/AnalyticalGraphicsInc/cesium-materials-pack).
* Removed `Viewer.objectTracked` event; `Viewer.trackedObject` is now an ES5 Knockout observable that can be subscribed to directly.
* Fixed globe rendering in the current Canary version of Google Chrome.
* `Viewer` now monitors the clock settings of the first added `DataSource` for changes, and also now has a constructor option `automaticallyTrackFirstDataSourceClock` which will turn off this behavior.
* The `DynamicObjectCollection` created by `CzmlDataSource` now sends a single `collectionChanged` event after CZML is loaded; previously it was sending an event every time an object was created or removed during the load process.
Expand Down
73 changes: 28 additions & 45 deletions Source/Widgets/Viewer/viewerDynamicObjectMixin.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ define([
'../../Core/ScreenSpaceEventType',
'../../Core/wrapFunction',
'../../Scene/SceneMode',
'../../DynamicScene/DynamicObjectView'
'../../DynamicScene/DynamicObjectView',
'../../ThirdParty/knockout'
], function(
defined,
DeveloperError,
Expand All @@ -18,7 +19,8 @@ define([
ScreenSpaceEventType,
wrapFunction,
SceneMode,
DynamicObjectView) {
DynamicObjectView,
knockout) {
"use strict";

/**
Expand Down Expand Up @@ -49,14 +51,10 @@ define([
if (viewer.hasOwnProperty('trackedObject')) {
throw new DeveloperError('trackedObject is already defined by another mixin.');
}
if (viewer.hasOwnProperty('objectTracked')) {
throw new DeveloperError('objectTracked is already defined by another mixin.');
}
//>>includeEnd('debug');

var eventHelper = new EventHelper();
var objectTracked = new Event();
var trackedObject;
var trackedObjectObservable = knockout.observable();
var dynamicObjectView;

//Subscribe to onTick so that we can update the view each update.
Expand Down Expand Up @@ -110,7 +108,7 @@ define([
function dataSourceRemoved(dataSourceCollection, dataSource) {
dataSource.getDynamicObjectCollection().collectionChanged.removeEventListener(onDynamicCollectionChanged);

if (defined(trackedObject)) {
if (defined(viewer.trackedObject)) {
if (dataSource.getDynamicObjectCollection().getById(viewer.trackedObject.id) === viewer.trackedObject) {
viewer.homeButton.viewModel.command();
}
Expand All @@ -131,45 +129,30 @@ define([
//Subscribe to left clicks and zoom to the picked object.
viewer.screenSpaceEventHandler.setInputAction(pickAndTrackObject, ScreenSpaceEventType.LEFT_CLICK);

defineProperties(viewer, {
/**
* Gets or sets the DynamicObject instance currently being tracked by the camera.
* @memberof viewerDynamicObjectMixin.prototype
* @type {DynamicObject}
*/
trackedObject : {
get : function() {
return trackedObject;
},
set : function(value) {
var sceneMode = viewer.scene.getFrameState().mode;

if (sceneMode === SceneMode.COLUMBUS_VIEW || sceneMode === SceneMode.SCENE2D) {
viewer.scene.getScreenSpaceCameraController().enableTranslate = !defined(value);
}

if (sceneMode === SceneMode.COLUMBUS_VIEW || sceneMode === SceneMode.SCENE3D) {
viewer.scene.getScreenSpaceCameraController().enableTilt = !defined(value);
}

if (trackedObject !== value) {
trackedObject = value;
dynamicObjectView = defined(value) ? new DynamicObjectView(value, viewer.scene, viewer.centralBody.getEllipsoid()) : undefined;
objectTracked.raiseEvent(viewer, value);
}
}
/**
* Gets or sets the DynamicObject instance currently being tracked by the camera.
* @memberof viewerDynamicObjectMixin.prototype
* @type {DynamicObject}
*/
viewer.trackedObject = undefined;
knockout.defineProperty(viewer, 'trackedObject', {
get : function() {
return trackedObjectObservable();
},
set : function(value) {
var sceneMode = viewer.scene.getFrameState().mode;

if (sceneMode === SceneMode.COLUMBUS_VIEW || sceneMode === SceneMode.SCENE2D) {
viewer.scene.getScreenSpaceCameraController().enableTranslate = !defined(value);
}

if (sceneMode === SceneMode.COLUMBUS_VIEW || sceneMode === SceneMode.SCENE3D) {
viewer.scene.getScreenSpaceCameraController().enableTilt = !defined(value);
}

/**
* Gets an event that will be raised when an object is tracked by the camera. The event
* has two parameters: a reference to the viewer instance, and the newly tracked object.
*
* @memberof viewerDynamicObjectMixin.prototype
* @type {Event}
*/
objectTracked : {
get : function() {
return objectTracked;
if (trackedObjectObservable() !== value) {
dynamicObjectView = defined(value) ? new DynamicObjectView(value, viewer.scene, viewer.centralBody.getEllipsoid()) : undefined;
trackedObjectObservable(value);
}
}
});
Expand Down
29 changes: 0 additions & 29 deletions Specs/Widgets/Viewer/viewerDynamicObjectMixinSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,35 +88,6 @@ defineSuite([
}).toThrowDeveloperError();
});

it('adds objectTracked event', function() {
viewer = new Viewer(container);
viewer.extend(viewerDynamicObjectMixin);
expect(viewer.hasOwnProperty('objectTracked')).toEqual(true);
});

it('objectTracked is raised by trackObject', function() {
viewer = new Viewer(container);
viewer.extend(viewerDynamicObjectMixin);

var dynamicObject = new DynamicObject();
dynamicObject.position = new ConstantProperty(new Cartesian3(123456, 123456, 123456));

var spyListener = jasmine.createSpy('listener');
viewer.objectTracked.addEventListener(spyListener);

viewer.trackedObject = dynamicObject;

waitsFor(function() {
return spyListener.wasCalled;
});

runs(function() {
expect(spyListener).toHaveBeenCalledWith(viewer, dynamicObject);

viewer.objectTracked.removeEventListener(spyListener);
});
});

it('returns to home when a tracked object is removed', function() {
viewer = new Viewer(container);

Expand Down

0 comments on commit 3668fac

Please sign in to comment.