| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 | import Clock from "../Core/Clock.js";import defined from "../Core/defined.js";import destroyObject from "../Core/destroyObject.js";import EventHelper from "../Core/EventHelper.js";import JulianDate from "../Core/JulianDate.js";import knockout from "../ThirdParty/knockout.js";/** * A view model which exposes a {@link Clock} for user interfaces. * @alias ClockViewModel * @constructor * * @param {Clock} [clock] The clock object wrapped by this view model, if undefined a new instance will be created. * * @see Clock */function ClockViewModel(clock) {  if (!defined(clock)) {    clock = new Clock();  }  this._clock = clock;  this._eventHelper = new EventHelper();  this._eventHelper.add(clock.onTick, this.synchronize, this);  /**   * Gets the current system time.   * This property is observable.   * @type {JulianDate}   */  this.systemTime = knockout.observable(JulianDate.now());  this.systemTime.equalityComparer = JulianDate.equals;  /**   * Gets or sets the start time of the clock.   * See {@link Clock#startTime}.   * This property is observable.   * @type {JulianDate}   */  this.startTime = knockout.observable(clock.startTime);  this.startTime.equalityComparer = JulianDate.equals;  this.startTime.subscribe(function (value) {    clock.startTime = value;    this.synchronize();  }, this);  /**   * Gets or sets the stop time of the clock.   * See {@link Clock#stopTime}.   * This property is observable.   * @type {JulianDate}   */  this.stopTime = knockout.observable(clock.stopTime);  this.stopTime.equalityComparer = JulianDate.equals;  this.stopTime.subscribe(function (value) {    clock.stopTime = value;    this.synchronize();  }, this);  /**   * Gets or sets the current time.   * See {@link Clock#currentTime}.   * This property is observable.   * @type {JulianDate}   */  this.currentTime = knockout.observable(clock.currentTime);  this.currentTime.equalityComparer = JulianDate.equals;  this.currentTime.subscribe(function (value) {    clock.currentTime = value;    this.synchronize();  }, this);  /**   * Gets or sets the clock multiplier.   * See {@link Clock#multiplier}.   * This property is observable.   * @type {Number}   */  this.multiplier = knockout.observable(clock.multiplier);  this.multiplier.subscribe(function (value) {    clock.multiplier = value;    this.synchronize();  }, this);  /**   * Gets or sets the clock step setting.   * See {@link Clock#clockStep}.   * This property is observable.   * @type {ClockStep}   */  this.clockStep = knockout.observable(clock.clockStep);  this.clockStep.subscribe(function (value) {    clock.clockStep = value;    this.synchronize();  }, this);  /**   * Gets or sets the clock range setting.   * See {@link Clock#clockRange}.   * This property is observable.   * @type {ClockRange}   */  this.clockRange = knockout.observable(clock.clockRange);  this.clockRange.subscribe(function (value) {    clock.clockRange = value;    this.synchronize();  }, this);  /**   * Gets or sets whether the clock can animate.   * See {@link Clock#canAnimate}.   * This property is observable.   * @type {Boolean}   */  this.canAnimate = knockout.observable(clock.canAnimate);  this.canAnimate.subscribe(function (value) {    clock.canAnimate = value;    this.synchronize();  }, this);  /**   * Gets or sets whether the clock should animate.   * See {@link Clock#shouldAnimate}.   * This property is observable.   * @type {Boolean}   */  this.shouldAnimate = knockout.observable(clock.shouldAnimate);  this.shouldAnimate.subscribe(function (value) {    clock.shouldAnimate = value;    this.synchronize();  }, this);  knockout.track(this, [    "systemTime",    "startTime",    "stopTime",    "currentTime",    "multiplier",    "clockStep",    "clockRange",    "canAnimate",    "shouldAnimate",  ]);}Object.defineProperties(ClockViewModel.prototype, {  /**   * Gets the underlying Clock.   * @memberof ClockViewModel.prototype   * @type {Clock}   */  clock: {    get: function () {      return this._clock;    },  },});/** * Updates the view model with the contents of the underlying clock. * Can be called to force an update of the viewModel if the underlying * clock has changed and <code>Clock.tick</code> has not yet been called. */ClockViewModel.prototype.synchronize = function () {  const clock = this._clock;  this.systemTime = JulianDate.now();  this.startTime = clock.startTime;  this.stopTime = clock.stopTime;  this.currentTime = clock.currentTime;  this.multiplier = clock.multiplier;  this.clockStep = clock.clockStep;  this.clockRange = clock.clockRange;  this.canAnimate = clock.canAnimate;  this.shouldAnimate = clock.shouldAnimate;};/** * @returns {Boolean} true if the object has been destroyed, false otherwise. */ClockViewModel.prototype.isDestroyed = function () {  return false;};/** * Destroys the view model.  Should be called to * properly clean up the view model when it is no longer needed. */ClockViewModel.prototype.destroy = function () {  this._eventHelper.removeAll();  destroyObject(this);};export default ClockViewModel;
 |