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 Clock.tick 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;