mirror of
https://github.com/scratchfoundation/scratch-blocks.git
synced 2025-06-29 13:40:24 -04:00
Block and comment events should report language agnostic coordinates so that switching locales (between LTR and RTL languages) does not affect the x position of the blocks and comments on the workspace.
This commit is contained in:
parent
0fa3ef6e78
commit
1fef923ad4
3 changed files with 49 additions and 9 deletions
|
@ -56,6 +56,7 @@ Blockly.Events.BlockBase = function(block) {
|
||||||
*/
|
*/
|
||||||
this.blockId = block.id;
|
this.blockId = block.id;
|
||||||
this.workspaceId = block.workspace.id;
|
this.workspaceId = block.workspace.id;
|
||||||
|
this.workspace = block.workspace;
|
||||||
};
|
};
|
||||||
goog.inherits(Blockly.Events.BlockBase, Blockly.Events.Abstract);
|
goog.inherits(Blockly.Events.BlockBase, Blockly.Events.Abstract);
|
||||||
|
|
||||||
|
@ -463,7 +464,11 @@ Blockly.Events.Move.prototype.currentLocation_ = function() {
|
||||||
location.inputName = input.name;
|
location.inputName = input.name;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
location.coordinate = block.getRelativeToSurfaceXY();
|
var blockXY = block.getRelativeToSurfaceXY();
|
||||||
|
// The X position in the block move event should be the language agnostic
|
||||||
|
// position of the block. I.e. it should not be different in LTR vs. RTL.
|
||||||
|
var rtlAwareX = workspace.RTL ? workspace.getWidth() - blockXY.x : blockXY.x;
|
||||||
|
location.coordinate = new goog.math.Coordinate(rtlAwareX, blockXY.y);
|
||||||
}
|
}
|
||||||
return location;
|
return location;
|
||||||
};
|
};
|
||||||
|
@ -505,7 +510,8 @@ Blockly.Events.Move.prototype.run = function(forward) {
|
||||||
}
|
}
|
||||||
if (coordinate) {
|
if (coordinate) {
|
||||||
var xy = block.getRelativeToSurfaceXY();
|
var xy = block.getRelativeToSurfaceXY();
|
||||||
block.moveBy(coordinate.x - xy.x, coordinate.y - xy.y);
|
var rtlAwareX = workspace.RTL ? workspace.getWidth() - coordinate.x : coordinate.x;
|
||||||
|
block.moveBy(rtlAwareX - xy.x, coordinate.y - xy.y);
|
||||||
} else {
|
} else {
|
||||||
var blockConnection = block.outputConnection || block.previousConnection;
|
var blockConnection = block.outputConnection || block.previousConnection;
|
||||||
var parentConnection;
|
var parentConnection;
|
||||||
|
|
|
@ -402,11 +402,12 @@ Blockly.Events.CommentMove = function(comment) {
|
||||||
*/
|
*/
|
||||||
this.comment_ = comment;
|
this.comment_ = comment;
|
||||||
|
|
||||||
|
this.workspaceWidth_ = comment.workspace.getWidth();
|
||||||
/**
|
/**
|
||||||
* The location before the move, in workspace coordinates.
|
* The location before the move, in workspace coordinates.
|
||||||
* @type {!goog.math.Coordinate}
|
* @type {!goog.math.Coordinate}
|
||||||
*/
|
*/
|
||||||
this.oldCoordinate_ = comment.getXY();
|
this.oldCoordinate_ = this.currentLocation_();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The location after the move, in workspace coordinates.
|
* The location after the move, in workspace coordinates.
|
||||||
|
@ -416,6 +417,28 @@ Blockly.Events.CommentMove = function(comment) {
|
||||||
};
|
};
|
||||||
goog.inherits(Blockly.Events.CommentMove, Blockly.Events.CommentBase);
|
goog.inherits(Blockly.Events.CommentMove, Blockly.Events.CommentBase);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the current, language agnostic location of the comment.
|
||||||
|
* This value should not report different numbers in LTR vs. RTL.
|
||||||
|
* @return {goog.math.Coordinate} The location of the comment.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
Blockly.Events.CommentMove.prototype.currentLocation_ = function() {
|
||||||
|
var xy = this.comment_.getXY();
|
||||||
|
if (!this.comment_.workspace.RTL) {
|
||||||
|
return xy;
|
||||||
|
}
|
||||||
|
|
||||||
|
var rtlAwareX;
|
||||||
|
if (this.comment_ instanceof Blockly.ScratchBlockComment) {
|
||||||
|
var commentWidth = this.comment_.getBubbleSize().width;
|
||||||
|
rtlAwareX = this.workspaceWidth_ - xy.x - commentWidth;
|
||||||
|
} else {
|
||||||
|
rtlAwareX = this.workspaceWidth_ - xy.x;
|
||||||
|
}
|
||||||
|
return new goog.math.Coordinate(rtlAwareX, xy.y);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Record the comment's new location. Called after the move. Can only be
|
* Record the comment's new location. Called after the move. Can only be
|
||||||
* called once.
|
* called once.
|
||||||
|
@ -425,7 +448,7 @@ Blockly.Events.CommentMove.prototype.recordNew = function() {
|
||||||
throw new Error('Tried to record the new position of a comment on the ' +
|
throw new Error('Tried to record the new position of a comment on the ' +
|
||||||
'same event twice.');
|
'same event twice.');
|
||||||
}
|
}
|
||||||
this.newCoordinate_ = this.comment_.getXY();
|
this.newCoordinate_ = this.currentLocation_();
|
||||||
this.comment_ = null;
|
this.comment_ = null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -442,7 +465,8 @@ Blockly.Events.CommentMove.prototype.type = Blockly.Events.COMMENT_MOVE;
|
||||||
* coordinates.
|
* coordinates.
|
||||||
*/
|
*/
|
||||||
Blockly.Events.CommentMove.prototype.setOldCoordinate = function(xy) {
|
Blockly.Events.CommentMove.prototype.setOldCoordinate = function(xy) {
|
||||||
this.oldCoordinate_ = xy;
|
this.oldCoordinate_ = new goog.math.Coordinate(this.comment_.workspace.RTL ?
|
||||||
|
this.workspaceWidth_ - xy.x : xy.x, xy.y);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -496,10 +520,20 @@ Blockly.Events.CommentMove.prototype.run = function(forward) {
|
||||||
var target = forward ? this.newCoordinate_ : this.oldCoordinate_;
|
var target = forward ? this.newCoordinate_ : this.oldCoordinate_;
|
||||||
|
|
||||||
if (comment instanceof Blockly.ScratchBlockComment) {
|
if (comment instanceof Blockly.ScratchBlockComment) {
|
||||||
comment.moveTo(target.x, target.y);
|
if (comment.workspace.RTL) {
|
||||||
|
comment.moveTo(this.workspaceWidth_ - target.x, target.y);
|
||||||
|
} else {
|
||||||
|
comment.moveTo(target.x, target.y);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// TODO: Check if the comment is being dragged, and give up if so.
|
// TODO: Check if the comment is being dragged, and give up if so.
|
||||||
var current = comment.getXY();
|
var current = comment.getXY();
|
||||||
comment.moveBy(target.x - current.x, target.y - current.y);
|
if (comment.workspace.RTL) {
|
||||||
|
var deltaX = target.x - (this.workspaceWidth_ - current.x);
|
||||||
|
comment.moveBy(-deltaX, target.y - current.y);
|
||||||
|
} else {
|
||||||
|
comment.moveBy(target.x - current.x, target.y - current.y);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -419,8 +419,8 @@ Blockly.WorkspaceCommentSvg.prototype.clearTransformAttributes_ = function() {
|
||||||
Blockly.WorkspaceCommentSvg.prototype.getBubbleSize = function() {
|
Blockly.WorkspaceCommentSvg.prototype.getBubbleSize = function() {
|
||||||
if (this.rendered_) {
|
if (this.rendered_) {
|
||||||
return {
|
return {
|
||||||
width: this.svgRect_.getAttribute('width'),
|
width: parseInt(this.svgRect_.getAttribute('width')),
|
||||||
height: this.svgRect_.getAttribute('height')
|
height: parseInt(this.svgRect_.getAttribute('height'))
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
this.getHeightWidth();
|
this.getHeightWidth();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue