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:
Victor Woeltjen 2015-03-04 14:52:01 -08:00
commit 93debb4abe
4 changed files with 114 additions and 26 deletions

View File

@ -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

View File

@ -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;

View File

@ -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 = {

View File

@ -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');
});
}); });
} }
); );