mirror of
https://github.com/nasa/openmct.git
synced 2025-02-07 19:40:28 +00:00
Merge branch 'open-master' into open940b
Merge in latest from open-master into topic branch for WTD-940, merge of fixed position look-and-feel updates. Conflicts: platform/features/layout/src/FixedController.js platform/features/layout/src/elements/ElementFactory.js
This commit is contained in:
commit
93debb4abe
@ -5,8 +5,7 @@ define(
|
|||||||
function (LayoutSelection, FixedProxy, ElementProxies, FixedDragHandle) {
|
function (LayoutSelection, FixedProxy, ElementProxies, FixedDragHandle) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var DEFAULT_DIMENSIONS = [ 2, 1 ],
|
var DEFAULT_GRID_SIZE = [64, 16],
|
||||||
DEFAULT_GRID_SIZE = [64, 16],
|
|
||||||
DEFAULT_GRID_EXTENT = [4, 4];
|
DEFAULT_GRID_EXTENT = [4, 4];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -29,6 +28,7 @@ define(
|
|||||||
elementProxiesById = {},
|
elementProxiesById = {},
|
||||||
handles = [],
|
handles = [],
|
||||||
moveHandle,
|
moveHandle,
|
||||||
|
viewProxy,
|
||||||
selection;
|
selection;
|
||||||
|
|
||||||
// Refresh cell styles (e.g. because grid extent changed)
|
// Refresh cell styles (e.g. because grid extent changed)
|
||||||
@ -198,14 +198,6 @@ define(
|
|||||||
telemetrySubscriber.subscribe(domainObject, updateValues);
|
telemetrySubscriber.subscribe(domainObject, updateValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle changes in the object's composition
|
|
||||||
function updateComposition(ids) {
|
|
||||||
// Populate panel positions
|
|
||||||
// TODO: Ensure defaults here
|
|
||||||
// Resubscribe - objects in view have changed
|
|
||||||
subscribe($scope.domainObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add an element to this view
|
// Add an element to this view
|
||||||
function addElement(element) {
|
function addElement(element) {
|
||||||
// Ensure that configuration field is populated
|
// Ensure that configuration field is populated
|
||||||
@ -226,29 +218,93 @@ define(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add a telemetry element to this view
|
||||||
|
function addTelemetryElement(id, x, y) {
|
||||||
|
viewProxy.add("fixed.telemetry", { id: id, x: x, y: y });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure that all telemetry elements have elements in view
|
||||||
|
function ensureElements(ids) {
|
||||||
|
var contained = {},
|
||||||
|
found = {};
|
||||||
|
|
||||||
|
// Track that a telemetry element is in the view
|
||||||
|
function track(element) {
|
||||||
|
if (element.type === 'fixed.telemetry') {
|
||||||
|
found[element.id] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used to filter down to elements not yet present
|
||||||
|
function notFound(id) {
|
||||||
|
return !found[id];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a telemetry element
|
||||||
|
function add(id, index) {
|
||||||
|
addTelemetryElement(id, 0, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build list of all found elements
|
||||||
|
(($scope.configuration || {}).elements || []).forEach(track);
|
||||||
|
|
||||||
|
// Add in telemetry elements where needed
|
||||||
|
(ids || []).filter(notFound).forEach(add);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove telemetry elements which don't match set of contained ids
|
||||||
|
function removeOtherElements(ids) {
|
||||||
|
// Set of ids, to simplify lookup
|
||||||
|
var contained = {},
|
||||||
|
elements = ($scope.configuration || {}).elements;
|
||||||
|
|
||||||
|
// Track that an id is present; used to build set
|
||||||
|
function track(id) {
|
||||||
|
contained[id] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if an element is still valid
|
||||||
|
function valid(element) {
|
||||||
|
return (element.type !== "fixed.telemetry") ||
|
||||||
|
contained[element.id];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only need to remove elements if any have been defined
|
||||||
|
if (Array.isArray(elements)) {
|
||||||
|
// Build set of contained ids
|
||||||
|
ids.forEach(track);
|
||||||
|
// Filter out removed telemetry elements
|
||||||
|
$scope.configuration.elements = elements.filter(valid);
|
||||||
|
// Refresh elements exposed to template
|
||||||
|
refreshElements();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle changes in the object's composition
|
||||||
|
function updateComposition(ids) {
|
||||||
|
// Remove any obsolete telemetry elements
|
||||||
|
removeOtherElements(ids);
|
||||||
|
// Populate panel positions
|
||||||
|
ensureElements(ids);
|
||||||
|
// Resubscribe - objects in view have changed
|
||||||
|
subscribe($scope.domainObject);
|
||||||
|
}
|
||||||
|
|
||||||
// Position a panel after a drop event
|
// Position a panel after a drop event
|
||||||
function handleDrop(e, id, position) {
|
function handleDrop(e, id, position) {
|
||||||
// Store the position of this element.
|
// Store the position of this element.
|
||||||
addElement({
|
addTelemetryElement(
|
||||||
type: "fixed.telemetry",
|
id,
|
||||||
x: Math.floor(position.x / gridSize[0]),
|
Math.floor(position.x / gridSize[0]),
|
||||||
y: Math.floor(position.y / gridSize[1]),
|
Math.floor(position.y / gridSize[1])
|
||||||
id: id,
|
);
|
||||||
stroke: "transparent",
|
|
||||||
color: "#cccccc",
|
|
||||||
titled: true,
|
|
||||||
width: DEFAULT_DIMENSIONS[0],
|
|
||||||
height: DEFAULT_DIMENSIONS[1]
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Track current selection state
|
// Track current selection state
|
||||||
|
viewProxy = new FixedProxy(addElement, $q, dialogService);
|
||||||
if (Array.isArray($scope.selection)) {
|
if (Array.isArray($scope.selection)) {
|
||||||
selection = new LayoutSelection(
|
selection = new LayoutSelection($scope.selection, viewProxy);
|
||||||
$scope.selection,
|
|
||||||
new FixedProxy(addElement, $q, dialogService)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Refresh list of elements whenever model changes
|
// Refresh list of elements whenever model changes
|
||||||
|
@ -21,9 +21,14 @@ define(
|
|||||||
/**
|
/**
|
||||||
* Add a new visual element to this view.
|
* Add a new visual element to this view.
|
||||||
*/
|
*/
|
||||||
add: function (type) {
|
add: function (type, state) {
|
||||||
// Place a configured element into the view configuration
|
// Place a configured element into the view configuration
|
||||||
function addElement(element) {
|
function addElement(element) {
|
||||||
|
// Populate element with additional state
|
||||||
|
Object.keys(state || {}).forEach(function (k) {
|
||||||
|
element[k] = state[k];
|
||||||
|
});
|
||||||
|
|
||||||
// Configure common properties of the element
|
// Configure common properties of the element
|
||||||
element.x = element.x || 0;
|
element.x = element.x || 0;
|
||||||
element.y = element.y || 0;
|
element.y = element.y || 0;
|
||||||
|
@ -25,6 +25,13 @@ define(
|
|||||||
fill: "transparent",
|
fill: "transparent",
|
||||||
stroke: "transparent",
|
stroke: "transparent",
|
||||||
color: "#cccccc"
|
color: "#cccccc"
|
||||||
|
},
|
||||||
|
"fixed.telemetry": {
|
||||||
|
stroke: "transparent",
|
||||||
|
color: "#cccccc",
|
||||||
|
titled: true,
|
||||||
|
width: 2,
|
||||||
|
height: 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
DIALOGS = {
|
DIALOGS = {
|
||||||
|
@ -13,6 +13,7 @@ define(
|
|||||||
mockFormatter,
|
mockFormatter,
|
||||||
mockDomainObject,
|
mockDomainObject,
|
||||||
mockSubscription,
|
mockSubscription,
|
||||||
|
mockPromise,
|
||||||
testGrid,
|
testGrid,
|
||||||
testModel,
|
testModel,
|
||||||
testValues,
|
testValues,
|
||||||
@ -77,6 +78,10 @@ define(
|
|||||||
'subscription',
|
'subscription',
|
||||||
[ 'unsubscribe', 'getTelemetryObjects', 'getRangeValue' ]
|
[ 'unsubscribe', 'getTelemetryObjects', 'getRangeValue' ]
|
||||||
);
|
);
|
||||||
|
mockPromise = jasmine.createSpyObj(
|
||||||
|
'promise',
|
||||||
|
[ 'then' ]
|
||||||
|
);
|
||||||
|
|
||||||
testGrid = [ 123, 456 ];
|
testGrid = [ 123, 456 ];
|
||||||
testModel = {
|
testModel = {
|
||||||
@ -103,6 +108,8 @@ define(
|
|||||||
mockScope.model = testModel;
|
mockScope.model = testModel;
|
||||||
mockScope.configuration = testConfiguration;
|
mockScope.configuration = testConfiguration;
|
||||||
mockScope.selection = []; // Act like edit mode
|
mockScope.selection = []; // Act like edit mode
|
||||||
|
mockQ.when.andReturn(mockPromise);
|
||||||
|
mockPromise.then.andCallFake(function (cb) { cb({}); });
|
||||||
|
|
||||||
controller = new FixedController(
|
controller = new FixedController(
|
||||||
mockScope,
|
mockScope,
|
||||||
@ -363,6 +370,19 @@ define(
|
|||||||
// Style should have been updated
|
// Style should have been updated
|
||||||
expect(controller.selected().style).not.toEqual(oldStyle);
|
expect(controller.selected().style).not.toEqual(oldStyle);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("ensures elements in view match elements in composition", function () {
|
||||||
|
// View should ensure that at least one element is present
|
||||||
|
// for each id, and then unused ids do not have elements.
|
||||||
|
mockScope.model = testModel;
|
||||||
|
testModel.composition = [ 'b', 'd' ];
|
||||||
|
findWatch("model.composition")(mockScope.model.composition);
|
||||||
|
|
||||||
|
// Should have a new element for d; should not have elements for a, c
|
||||||
|
expect(testConfiguration.elements.length).toEqual(2);
|
||||||
|
expect(testConfiguration.elements[0].id).toEqual('b');
|
||||||
|
expect(testConfiguration.elements[1].id).toEqual('d');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
Loading…
x
Reference in New Issue
Block a user