mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 03:50:40 +02:00
Add undo/redo for group/ungroup
This commit is contained in:
parent
8c9026c892
commit
003c1c7bc5
1 changed files with 60 additions and 2 deletions
|
@ -83,18 +83,33 @@ Groups = function () {
|
||||||
// Groups all selections into one.
|
// Groups all selections into one.
|
||||||
var DYNAMIC_AND_COLLISIONLESS = { dynamic: true, collisionless: true },
|
var DYNAMIC_AND_COLLISIONLESS = { dynamic: true, collisionless: true },
|
||||||
rootID,
|
rootID,
|
||||||
|
undoData = [],
|
||||||
|
redoData = [],
|
||||||
i,
|
i,
|
||||||
lengthI,
|
lengthI,
|
||||||
j,
|
j,
|
||||||
lengthJ;
|
lengthJ;
|
||||||
|
|
||||||
// If the first group has physics (i.e., root entity is dynamic) make all entities in child groups dynamic and
|
// If the first group has physics (i.e., root entity is dynamic) make all entities in child groups dynamic and
|
||||||
// collisionless. (Don't need to worry about other groups physics properties because only those of the the first entity
|
// collisionless. (Don't need to worry about other groups physics properties because only those of the first entity in
|
||||||
// in the linkset are used by High Fidelity.) See Selection.applyPhysics().
|
// the linkset are used by High Fidelity.) See Selection.applyPhysics().
|
||||||
if (selections[0][0].dynamic) {
|
if (selections[0][0].dynamic) {
|
||||||
for (i = 1, lengthI = selections.length; i < lengthI; i += 1) {
|
for (i = 1, lengthI = selections.length; i < lengthI; i += 1) {
|
||||||
for (j = 0, lengthJ = selections[i].length; j < lengthJ; j += 1) {
|
for (j = 0, lengthJ = selections[i].length; j < lengthJ; j += 1) {
|
||||||
|
undoData.push({
|
||||||
|
entityID: selections[i][j].id,
|
||||||
|
properties: {
|
||||||
|
dynamic: selections[i][j].dynamic,
|
||||||
|
collisionless: selections[i][j].collisionless
|
||||||
|
}
|
||||||
|
});
|
||||||
Entities.editEntity(selections[i][j].id, DYNAMIC_AND_COLLISIONLESS);
|
Entities.editEntity(selections[i][j].id, DYNAMIC_AND_COLLISIONLESS);
|
||||||
|
selections[i][j].dynamic = true;
|
||||||
|
selections[i][j].collisionless = true;
|
||||||
|
redoData.push({
|
||||||
|
entityID: selections[i][j].id,
|
||||||
|
properties: DYNAMIC_AND_COLLISIONLESS
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -102,9 +117,17 @@ Groups = function () {
|
||||||
// Make the first entity in the first group the root and link the first entities of all other groups to it.
|
// Make the first entity in the first group the root and link the first entities of all other groups to it.
|
||||||
rootID = rootEntityIDs[0];
|
rootID = rootEntityIDs[0];
|
||||||
for (i = 1, lengthI = rootEntityIDs.length; i < lengthI; i += 1) {
|
for (i = 1, lengthI = rootEntityIDs.length; i < lengthI; i += 1) {
|
||||||
|
undoData.push({
|
||||||
|
entityID: rootEntityIDs[i],
|
||||||
|
properties: { parentID: Uuid.NULL }
|
||||||
|
});
|
||||||
Entities.editEntity(rootEntityIDs[i], {
|
Entities.editEntity(rootEntityIDs[i], {
|
||||||
parentID: rootID
|
parentID: rootID
|
||||||
});
|
});
|
||||||
|
redoData.push({
|
||||||
|
entityID: rootEntityIDs[i],
|
||||||
|
properties: { parentID: rootID }
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update selection.
|
// Update selection.
|
||||||
|
@ -114,6 +137,12 @@ Groups = function () {
|
||||||
selections[0] = selections[0].concat(selections[i]);
|
selections[0] = selections[0].concat(selections[i]);
|
||||||
}
|
}
|
||||||
selections.splice(1, selections.length - 1);
|
selections.splice(1, selections.length - 1);
|
||||||
|
|
||||||
|
// Add history entry.
|
||||||
|
History.push(
|
||||||
|
{ setProperties: undoData },
|
||||||
|
{ setProperties: redoData }
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function ungroup() {
|
function ungroup() {
|
||||||
|
@ -129,6 +158,8 @@ Groups = function () {
|
||||||
hasGroupChildren = false,
|
hasGroupChildren = false,
|
||||||
isUngroupAll,
|
isUngroupAll,
|
||||||
NONDYNAMIC_AND_NONCOLLISIONLESS = { dynamic: false, collisionless: false },
|
NONDYNAMIC_AND_NONCOLLISIONLESS = { dynamic: false, collisionless: false },
|
||||||
|
undoData = [],
|
||||||
|
redoData = [],
|
||||||
i,
|
i,
|
||||||
lengthI,
|
lengthI,
|
||||||
j,
|
j,
|
||||||
|
@ -172,9 +203,17 @@ Groups = function () {
|
||||||
isUngroupAll = hasSoloChildren !== hasGroupChildren;
|
isUngroupAll = hasSoloChildren !== hasGroupChildren;
|
||||||
for (i = childrenIDs.length - 1; i >= 0; i -= 1) {
|
for (i = childrenIDs.length - 1; i >= 0; i -= 1) {
|
||||||
if (isUngroupAll || childrenIndexIsGroup[i]) {
|
if (isUngroupAll || childrenIndexIsGroup[i]) {
|
||||||
|
undoData.push({
|
||||||
|
entityID: childrenIDs[i],
|
||||||
|
properties: { parentID: selections[0][childrenIndexes[i]].parentID }
|
||||||
|
});
|
||||||
Entities.editEntity(childrenIDs[i], {
|
Entities.editEntity(childrenIDs[i], {
|
||||||
parentID: Uuid.NULL
|
parentID: Uuid.NULL
|
||||||
});
|
});
|
||||||
|
redoData.push({
|
||||||
|
entityID: childrenIDs[i],
|
||||||
|
properties: { parentID: Uuid.NULL }
|
||||||
|
});
|
||||||
rootEntityIDs.push(childrenIDs[i]);
|
rootEntityIDs.push(childrenIDs[i]);
|
||||||
selections[0][childrenIndexes[i]].parentID = Uuid.NULL;
|
selections[0][childrenIndexes[i]].parentID = Uuid.NULL;
|
||||||
selections.push(selections[0].splice(childrenIndexes[i], childrenIndexes[i + 1] - childrenIndexes[i]));
|
selections.push(selections[0].splice(childrenIndexes[i], childrenIndexes[i + 1] - childrenIndexes[i]));
|
||||||
|
@ -186,10 +225,29 @@ Groups = function () {
|
||||||
if (selections[0][0].dynamic) {
|
if (selections[0][0].dynamic) {
|
||||||
for (i = 1, lengthI = selections.length; i < lengthI; i += 1) {
|
for (i = 1, lengthI = selections.length; i < lengthI; i += 1) {
|
||||||
for (j = 0, lengthJ = selections[i].length; j < lengthJ; j += 1) {
|
for (j = 0, lengthJ = selections[i].length; j < lengthJ; j += 1) {
|
||||||
|
undoData.push({
|
||||||
|
entityID: selections[i][j].id,
|
||||||
|
properties: {
|
||||||
|
dynamic: selections[i][j].dynamic,
|
||||||
|
collisionless: selections[i][j].collisionless
|
||||||
|
}
|
||||||
|
});
|
||||||
Entities.editEntity(selections[i][j].id, NONDYNAMIC_AND_NONCOLLISIONLESS);
|
Entities.editEntity(selections[i][j].id, NONDYNAMIC_AND_NONCOLLISIONLESS);
|
||||||
|
selections[i][j].dynamic = false;
|
||||||
|
selections[i][j].collisionless = false;
|
||||||
|
redoData.push({
|
||||||
|
entityID: selections[i][j].id,
|
||||||
|
properties: NONDYNAMIC_AND_NONCOLLISIONLESS
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add history entry.
|
||||||
|
History.push(
|
||||||
|
{ setProperties: undoData },
|
||||||
|
{ setProperties: redoData }
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function clear() {
|
function clear() {
|
||||||
|
|
Loading…
Reference in a new issue