Enable fast open for files which support it

This commit is contained in:
Skyler Lehmkuhl 2025-01-14 19:57:10 -05:00
parent f0a3930ed7
commit 17fe5299dc
1 changed files with 91 additions and 82 deletions

View File

@ -4449,97 +4449,106 @@ async function _open(path, returnJson = false) {
const objectOffsets = {}; const objectOffsets = {};
const frameIDs = [] const frameIDs = []
for (let action of file.actions) { if (file.version < "1.7.5") {
if (!(action.name in actions)) { for (let action of file.actions) {
await messageDialog( if (!(action.name in actions)) {
`Invalid action ${action.name}. File may be corrupt.`, await messageDialog(
{ title: "Error", kind: "error" }, `Invalid action ${action.name}. File may be corrupt.`,
); { title: "Error", kind: "error" },
return; );
} return;
}
console.log(action.name); console.log(action.name);
// Data fixes // Data fixes
if (file.version <= "1.5") { if (file.version <= "1.5") {
// Fix coordinates of objects // Fix coordinates of objects
if (action.name == "group") { if (action.name == "group") {
let bbox; let bbox;
for (let i of action.action.shapes) { for (let i of action.action.shapes) {
const shape = pointerList[i]; const shape = pointerList[i];
if (bbox == undefined) { if (bbox == undefined) {
bbox = shape.bbox(); bbox = shape.bbox();
} else { } else {
growBoundingBox(bbox, shape.bbox()); growBoundingBox(bbox, shape.bbox());
}
}
for (let i of action.action.objects) {
const object = pointerList[i]; // TODO: rotated bbox
if (bbox == undefined) {
bbox = object.bbox();
} else {
growBoundingBox(bbox, object.bbox());
}
}
const position = {
x: (bbox.x.min + bbox.x.max) / 2,
y: (bbox.y.min + bbox.y.max) / 2,
};
action.action.position = position;
objectOffsets[action.action.groupUuid] = position;
for (let shape of action.action.shapes) {
objectOffsets[shape] = position
}
} else if (action.name == "editFrame") {
for (let key in action.action.newState) {
if (key in objectOffsets) {
action.action.newState[key].x += objectOffsets[key].x;
action.action.newState[key].y += objectOffsets[key].y;
}
}
for (let key in action.action.oldState) {
if (key in objectOffsets) {
action.action.oldState[key].x += objectOffsets[key].x;
action.action.oldState[key].y += objectOffsets[key].y;
}
}
} else if (action.name == "addKeyframe") {
for (let id in objectOffsets) {
objectOffsets[action.action.uuid.slice(0,8) + id.slice(8)] = objectOffsets[id]
}
} else if (action.name == "editShape") {
if (action.action.shape in objectOffsets) {
console.log("editing shape")
for (let curve of action.action.newCurves) {
for (let point of curve.points) {
point.x -= objectOffsets[action.action.shape].x
point.y -= objectOffsets[action.action.shape].y
} }
} }
for (let curve of action.action.oldCurves) { for (let i of action.action.objects) {
for (let point of curve.points) { const object = pointerList[i]; // TODO: rotated bbox
point.x -= objectOffsets[action.action.shape].x if (bbox == undefined) {
point.y -= objectOffsets[action.action.shape].y bbox = object.bbox();
} else {
growBoundingBox(bbox, object.bbox());
}
}
const position = {
x: (bbox.x.min + bbox.x.max) / 2,
y: (bbox.y.min + bbox.y.max) / 2,
};
action.action.position = position;
objectOffsets[action.action.groupUuid] = position;
for (let shape of action.action.shapes) {
objectOffsets[shape] = position
}
} else if (action.name == "editFrame") {
for (let key in action.action.newState) {
if (key in objectOffsets) {
action.action.newState[key].x += objectOffsets[key].x;
action.action.newState[key].y += objectOffsets[key].y;
}
}
for (let key in action.action.oldState) {
if (key in objectOffsets) {
action.action.oldState[key].x += objectOffsets[key].x;
action.action.oldState[key].y += objectOffsets[key].y;
}
}
} else if (action.name == "addKeyframe") {
for (let id in objectOffsets) {
objectOffsets[action.action.uuid.slice(0,8) + id.slice(8)] = objectOffsets[id]
}
} else if (action.name == "editShape") {
if (action.action.shape in objectOffsets) {
console.log("editing shape")
for (let curve of action.action.newCurves) {
for (let point of curve.points) {
point.x -= objectOffsets[action.action.shape].x
point.y -= objectOffsets[action.action.shape].y
}
}
for (let curve of action.action.oldCurves) {
for (let point of curve.points) {
point.x -= objectOffsets[action.action.shape].x
point.y -= objectOffsets[action.action.shape].y
}
} }
} }
} }
} }
} if (file.version <= "1.6") {
if (file.version <= "1.6") { // Fix copy-paste
// Fix copy-paste if (action.name == "duplicateObject") {
if (action.name == "duplicateObject") { const obj = pointerList[action.action.object];
const obj = pointerList[action.action.object]; const objJson = obj.toJSON(true);
const objJson = obj.toJSON(true); objJson.idx =
objJson.idx = action.action.uuid.slice(0, 8) +
action.action.uuid.slice(0, 8) + action.action.object.slice(8);
action.action.object.slice(8); action.action.items = [objJson];
action.action.items = [objJson]; action.action.object = "root";
action.action.object = "root"; action.action.frame = root.currentFrame.idx;
action.action.frame = root.currentFrame.idx; }
} }
}
await actions[action.name].execute(action.action); await actions[action.name].execute(action.action);
undoStack.push(action); undoStack.push(action);
}
} else {
// disabled for now
// for (let action of file.actions) {
// undoStack.push(action)
// }
root = GraphicsObject.fromJSON(file.json)
context.objectStack = [root]
} }
lastSaveIndex = undoStack.length; lastSaveIndex = undoStack.length;