transformation notUndoable => undoable

The `undoable` transformation property is not preserved when the element is "stringified". So transformations cannot be undone, once the element is loaded from JSON.
This commit is contained in:
abakkk 2020-10-04 22:17:13 +02:00
parent ccf928c048
commit 236e4db236
2 changed files with 25 additions and 29 deletions

27
area.js
View File

@ -537,20 +537,17 @@ var DrawingArea = new Lang.Class({
this.grabbedElement = copy;
}
let undoable = !duplicate;
if (this.currentTool == Manipulations.MOVE)
this.grabbedElement.startTransformation(startX, startY, controlPressed ? Transformations.ROTATION : Transformations.TRANSLATION);
this.grabbedElement.startTransformation(startX, startY, controlPressed ? Transformations.ROTATION : Transformations.TRANSLATION, undoable);
else if (this.currentTool == Manipulations.RESIZE)
this.grabbedElement.startTransformation(startX, startY, controlPressed ? Transformations.STRETCH : Transformations.SCALE_PRESERVE);
this.grabbedElement.startTransformation(startX, startY, controlPressed ? Transformations.STRETCH : Transformations.SCALE_PRESERVE, undoable);
else if (this.currentTool == Manipulations.MIRROR) {
this.grabbedElement.startTransformation(startX, startY, controlPressed ? Transformations.INVERSION : Transformations.REFLECTION);
this.grabbedElement.startTransformation(startX, startY, controlPressed ? Transformations.INVERSION : Transformations.REFLECTION, undoable);
this._redisplay();
}
if (duplicate)
// For undo, ignore both the transformations inherited from the duplicated element
// and the current transformation.
this.grabbedElement.makeAllTransformationsNotUndoable();
this.motionHandler = this.connect('motion-event', (actor, event) => {
if (this.spaceKeyPressed)
return;
@ -565,28 +562,30 @@ var DrawingArea = new Lang.Class({
},
_updateTransforming: function(x, y, controlPressed) {
let undoable = this.grabbedElement.lastTransformation.undoable || false;
if (controlPressed && this.grabbedElement.lastTransformation.type == Transformations.TRANSLATION) {
this.grabbedElement.stopTransformation();
this.grabbedElement.startTransformation(x, y, Transformations.ROTATION);
this.grabbedElement.startTransformation(x, y, Transformations.ROTATION, undoable);
} else if (!controlPressed && this.grabbedElement.lastTransformation.type == Transformations.ROTATION) {
this.grabbedElement.stopTransformation();
this.grabbedElement.startTransformation(x, y, Transformations.TRANSLATION);
this.grabbedElement.startTransformation(x, y, Transformations.TRANSLATION, undoable);
}
if (controlPressed && this.grabbedElement.lastTransformation.type == Transformations.SCALE_PRESERVE) {
this.grabbedElement.stopTransformation();
this.grabbedElement.startTransformation(x, y, Transformations.STRETCH);
this.grabbedElement.startTransformation(x, y, Transformations.STRETCH, undoable);
} else if (!controlPressed && this.grabbedElement.lastTransformation.type == Transformations.STRETCH) {
this.grabbedElement.stopTransformation();
this.grabbedElement.startTransformation(x, y, Transformations.SCALE_PRESERVE);
this.grabbedElement.startTransformation(x, y, Transformations.SCALE_PRESERVE, undoable);
}
if (controlPressed && this.grabbedElement.lastTransformation.type == Transformations.REFLECTION) {
this.grabbedElement.transformations.pop();
this.grabbedElement.startTransformation(x, y, Transformations.INVERSION);
this.grabbedElement.startTransformation(x, y, Transformations.INVERSION, undoable);
} else if (!controlPressed && this.grabbedElement.lastTransformation.type == Transformations.INVERSION) {
this.grabbedElement.transformations.pop();
this.grabbedElement.startTransformation(x, y, Transformations.REFLECTION);
this.grabbedElement.startTransformation(x, y, Transformations.REFLECTION, undoable);
}
this.grabbedElement.updateTransformation(x, y);

View File

@ -123,7 +123,8 @@ const _DrawingElement = new Lang.Class({
fill: this.fill,
fillRule: this.fillRule,
eraser: this.eraser,
transformations: this.transformations.filter(transformation => transformation.type != Transformations.SMOOTH),
transformations: this.transformations.filter(transformation => transformation.type != Transformations.SMOOTH)
.map(transformation => Object.assign({}, transformation, { undoable: undefined })),
points: this.points.map((point) => [Math.round(point[0]*100)/100, Math.round(point[1]*100)/100])
};
},
@ -409,7 +410,7 @@ const _DrawingElement = new Lang.Class({
let newPoints = this.points.slice();
this.transformations.push({ type: Transformations.SMOOTH,
this.transformations.push({ type: Transformations.SMOOTH, undoable: true,
undo: () => this.points = oldPoints,
redo: () => this.points = newPoints });
},
@ -465,7 +466,7 @@ const _DrawingElement = new Lang.Class({
return;
let center = this._getOriginalCenter();
this.transformations[0] = { type: Transformations.ROTATION, notUndoable: true,
this.transformations[0] = { type: Transformations.ROTATION,
angle: getAngle(center[0], center[1], points[points.length - 1][0], points[points.length - 1][1], x, y) };
} else if (this.shape == Shapes.ELLIPSE && transform) {
@ -474,7 +475,7 @@ const _DrawingElement = new Lang.Class({
points[2] = [x, y];
let center = this._getOriginalCenter();
this.transformations[0] = { type: Transformations.ROTATION, notUndoable: true,
this.transformations[0] = { type: Transformations.ROTATION,
angle: getAngle(center[0], center[1], center[0] + 1, center[1], x, y) };
} else if (this.shape == Shapes.POLYGON || this.shape == Shapes.POLYLINE) {
@ -500,18 +501,18 @@ const _DrawingElement = new Lang.Class({
this.transformations.shift();
},
startTransformation: function(startX, startY, type) {
startTransformation: function(startX, startY, type, undoable) {
if (type == Transformations.TRANSLATION)
this.transformations.push({ startX: startX, startY: startY, type: type, slideX: 0, slideY: 0 });
this.transformations.push({ startX, startY, type, undoable, slideX: 0, slideY: 0 });
else if (type == Transformations.ROTATION)
this.transformations.push({ startX: startX, startY: startY, type: type, angle: 0 });
this.transformations.push({ startX, startY, type, undoable, angle: 0 });
else if (type == Transformations.SCALE_PRESERVE || type == Transformations.STRETCH)
this.transformations.push({ startX: startX, startY: startY, type: type, scaleX: 1, scaleY: 1, angle: 0 });
this.transformations.push({ startX, startY, type, undoable, scaleX: 1, scaleY: 1, angle: 0 });
else if (type == Transformations.REFLECTION)
this.transformations.push({ startX: startX, startY: startY, endX: startX, endY: startY, type: type,
this.transformations.push({ startX, startY, endX: startX, endY: startY, type, undoable,
scaleX: 1, scaleY: 1, slideX: 0, slideY: 0, angle: 0 });
else if (type == Transformations.INVERSION)
this.transformations.push({ startX: startX, startY: startY, endX: startX, endY: startY, type: type,
this.transformations.push({ startX, startY, endX: startX, endY: startY, type, undoable,
scaleX: -1, scaleY: -1, slideX: startX, slideY: startY,
angle: Math.PI + Math.atan(startY / (startX || 1)) });
@ -596,7 +597,7 @@ const _DrawingElement = new Lang.Class({
undoTransformation: function() {
if (this.transformations && this.transformations.length) {
// Do not undo initial transformations (transformations made during the drawing step).
if (this.lastTransformation.notUndoable)
if (!this.lastTransformation.undoable)
return false;
if (!this._undoneTransformations)
@ -635,10 +636,6 @@ const _DrawingElement = new Lang.Class({
delete this._undoneTransformations;
},
makeAllTransformationsNotUndoable: function() {
this.transformations.forEach(transformation => transformation.notUndoable = true);
},
// The figure rotation center before transformations (original).
// this.textWidth is computed during Cairo building.
_getOriginalCenter: function() {