[Plot] Follow universal time controller

Follow displayable area of universal time controller,
WTD-1515
This commit is contained in:
Victor Woeltjen 2015-09-04 13:57:26 -07:00
parent 3ce40ab870
commit c2985d61b7
3 changed files with 51 additions and 8 deletions

View File

@ -138,6 +138,16 @@ define(
} }
} }
// Change the displayable bounds
function setBasePanZoom(event, bounds) {
var start = bounds.start,
end = bounds.end;
if (updater) {
updater.setDomainBounds(start, end);
self.update();
}
}
// Create a new subscription; telemetrySubscriber gets // Create a new subscription; telemetrySubscriber gets
// to do the meaningful work here. // to do the meaningful work here.
function subscribe(domainObject) { function subscribe(domainObject) {
@ -172,11 +182,14 @@ define(
this.scheduleUpdate = throttle(function () { this.scheduleUpdate = throttle(function () {
self.modeOptions.getModeHandler().getSubPlots() self.modeOptions.getModeHandler().getSubPlots()
.forEach(updateSubplot); .forEach(updateSubplot);
}); }, 50);
// Subscribe to telemetry when a domain object becomes available // Subscribe to telemetry when a domain object becomes available
$scope.$watch('domainObject', subscribe); $scope.$watch('domainObject', subscribe);
// Respond to external bounds changes
$scope.$on("telemetry:display:bounds", setBasePanZoom);
// Unsubscribe when the plot is destroyed // Unsubscribe when the plot is destroyed
$scope.$on("$destroy", releaseSubscription); $scope.$on("$destroy", releaseSubscription);

View File

@ -143,8 +143,7 @@ define(
PlotPanZoomStackGroup.prototype.getDepth = function () { PlotPanZoomStackGroup.prototype.getDepth = function () {
// All stacks are kept in sync, so look up depth // All stacks are kept in sync, so look up depth
// from the first one. // from the first one.
return this.stacks.length > 0 ? return this.stacks.length > 0 ? this.stacks[0].getDepth() : 0;
this.stacks[0].getDepth() : 0;
}; };
/** /**

View File

@ -141,10 +141,10 @@ define(
PlotUpdater.prototype.initializeDomainOffset = function (values) { PlotUpdater.prototype.initializeDomainOffset = function (values) {
this.domainOffset = this.domainOffset =
((this.domainOffset === undefined) && (values.length > 0)) ? ((this.domainOffset === undefined) && (values.length > 0)) ?
(values.reduce(function (a, b) { (values.reduce(function (a, b) {
return (a || 0) + (b || 0); return (a || 0) + (b || 0);
}, 0) / values.length) : }, 0) / values.length) :
this.domainOffset; this.domainOffset;
}; };
// Expand range slightly so points near edges are visible // Expand range slightly so points near edges are visible
@ -159,7 +159,10 @@ define(
// Update dimensions and origin based on extrema of plots // Update dimensions and origin based on extrema of plots
PlotUpdater.prototype.updateBounds = function () { PlotUpdater.prototype.updateBounds = function () {
var bufferArray = this.bufferArray; var bufferArray = this.bufferArray,
priorDomainOrigin = this.origin[0],
priorDomainDimensions = this.dimensions[0];
if (bufferArray.length > 0) { if (bufferArray.length > 0) {
this.domainExtrema = bufferArray.map(function (lineBuffer) { this.domainExtrema = bufferArray.map(function (lineBuffer) {
return lineBuffer.getDomainExtrema(); return lineBuffer.getDomainExtrema();
@ -178,6 +181,18 @@ define(
// Enforce some minimum visible area // Enforce some minimum visible area
this.expandRange(); this.expandRange();
// Suppress domain changes when pinned
if (this.hasSpecificDomainBounds) {
this.origin[0] = priorDomainOrigin;
this.dimensions[0] = priorDomainDimensions;
if (this.following) {
this.origin[0] = Math.max(
this.domainExtrema[1] - this.dimensions[0],
this.origin[0]
);
}
}
// ...then enforce a fixed duration if needed // ...then enforce a fixed duration if needed
if (this.fixedDuration !== undefined) { if (this.fixedDuration !== undefined) {
this.origin[0] = this.origin[0] + this.dimensions[0] - this.origin[0] = this.origin[0] + this.dimensions[0] -
@ -281,6 +296,22 @@ define(
return this.bufferArray; return this.bufferArray;
}; };
/**
* Set the start and end boundaries (usually time) for the
* domain axis of this updater.
*/
PlotUpdater.prototype.setDomainBounds = function (start, end) {
this.fixedDuration = end - start;
this.origin[0] = start;
this.dimensions[0] = this.fixedDuration;
// Suppress follow behavior if we have windowed in on the past
this.hasSpecificDomainBounds = true;
this.following = end >= this.domainExtrema[1];
this.updateBounds();
};
/** /**
* Fill in historical data. * Fill in historical data.
*/ */