diff --git a/platform/commonUI/edit/src/representers/EditToolbar.js b/platform/commonUI/edit/src/representers/EditToolbar.js index 23bc7e8ed7..60d6990bb6 100644 --- a/platform/commonUI/edit/src/representers/EditToolbar.js +++ b/platform/commonUI/edit/src/representers/EditToolbar.js @@ -17,9 +17,10 @@ define( * * @param structure toolbar structure, as provided by view definition * @param {Array} selection the current selection state + * @param {Function} commit callback to invoke after changes * @constructor */ - function EditToolbar(structure, selection) { + function EditToolbar(structure, selection, commit) { var toolbarStructure = Object.create(structure || {}), toolbarState, properties = []; @@ -124,11 +125,14 @@ define( // Invoke all functions in selections with the given name function invoke(method, value) { if (method) { + // Make the change in the selection selection.forEach(function (selected) { if (typeof selected[method] === 'function') { selected[method](value); } }); + // ...and commit! + commit(); } } @@ -139,7 +143,9 @@ define( converted.key = addKey(item.property); } if (item.method) { - converted.click = function (v) { invoke(item.method, v); }; + converted.click = function (v) { + invoke(item.method, v); + }; } return converted; } diff --git a/platform/commonUI/edit/src/representers/EditToolbarRepresenter.js b/platform/commonUI/edit/src/representers/EditToolbarRepresenter.js index feeb5bcd53..4c983bcd41 100644 --- a/platform/commonUI/edit/src/representers/EditToolbarRepresenter.js +++ b/platform/commonUI/edit/src/representers/EditToolbarRepresenter.js @@ -20,6 +20,13 @@ define( toolbar, toolbarObject = {}; + // Mark changes as ready to persist + function commit(message) { + if (scope.commit) { + scope.commit(message); + } + } + // Handle changes to the current selection function updateSelection(selection) { // Make sure selection is array-like @@ -28,7 +35,7 @@ define( (selection ? [selection] : []); // Instantiate a new toolbar... - toolbar = new EditToolbar(definition, selection); + toolbar = new EditToolbar(definition, selection, commit); // ...and expose its structure/state toolbarObject.structure = toolbar.getStructure(); @@ -37,6 +44,7 @@ define( // Update selection models to match changed toolbar state function updateState(state) { + // Update underlying state based on toolbar changes state.forEach(function (value, index) { toolbar.updateState(index, value); }); diff --git a/platform/features/layout/src/FixedController.js b/platform/features/layout/src/FixedController.js index 1ccc2a5f55..9df91e9762 100644 --- a/platform/features/layout/src/FixedController.js +++ b/platform/features/layout/src/FixedController.js @@ -93,8 +93,28 @@ define( // Decorate elements in the current configuration function refreshElements() { - elementProxies = (($scope.configuration || {}).elements || []) - .map(makeProxyElement); + // Cache selection; we are instantiating new proxies + // so we may want to restore this. + var selected = selection && selection.get(), + elements = (($scope.configuration || {}).elements || []), + index = -1; // Start with a 'not-found' value + + // Find the selection in the new array + if (selected !== undefined) { + index = elements.indexOf(selected.element); + } + + // Create the new proxies... + elementProxies = elements.map(makeProxyElement); + + // Clear old selection, and restore if appropriate + if (selection) { + selection.deselect(); + if (index > -1) { + selection.select(elementProxies[index]); + } + } + // TODO: Ensure elements for all domain objects? } diff --git a/platform/features/layout/src/LayoutSelection.js b/platform/features/layout/src/LayoutSelection.js index 747694d50b..0398d3d308 100644 --- a/platform/features/layout/src/LayoutSelection.js +++ b/platform/features/layout/src/LayoutSelection.js @@ -75,6 +75,11 @@ define( return (obj === selected) || (obj === proxy); } + // Getter for current selection + function get() { + return selected; + } + // Start with the proxy selected selection.push(proxy); @@ -95,6 +100,11 @@ define( * @returns {boolean} true if selection changed */ deselect: deselect, + /** + * Get the currently-selected object. + * @returns the currently selected object + */ + get: get, /** * Clear the selection, including the proxy, and dispose * of this selection scope. No other calls to methods on diff --git a/platform/features/layout/src/elements/ElementProxy.js b/platform/features/layout/src/elements/ElementProxy.js index 963ff31706..a628c90ad8 100644 --- a/platform/features/layout/src/elements/ElementProxy.js +++ b/platform/features/layout/src/elements/ElementProxy.js @@ -17,6 +17,7 @@ define( */ function ElementProxy(element, index, elements) { return { + element: element, x: new Accessor(element, 'x'), y: new Accessor(element, 'y'), z: new Accessor(element, 'z'),