Fix #980: Implement visual selection of item.position

This commit is contained in:
Jürg Lehni 2016-03-17 14:15:28 +01:00
parent 00b2102b6d
commit 3b71de9544
5 changed files with 70 additions and 15 deletions

View file

@ -782,12 +782,22 @@ var Point = Base.extend(/** @lends Point# */{
}, },
/** /**
* This property is only present if the point is an anchor or control point * This property is only valid if the point is an anchor or handle point
* of a {@link Segment} or a {@link Curve}. In this case, it returns * of a {@link Segment} or a {@link Curve}, or the position of an
* {@true if it is selected} * {@link Item}, as returned by {@link Item#position},
* {@link Segment#point}, {@link Segment#handleIn},
* {@link Segment#handleOut}, {@link Curve#point1}, {@link Curve#point2},
* {@link Curve#handle1}, {@link Curve#handle2}.
*
* In those cases, it returns {@true if it the point is selected}.
*
* Paper.js renders selected points on top of your project. This is very
* useful when debugging.
* *
* @name Point#selected * @name Point#selected
* @property * @property
* @type Boolean
* @default false
* *
* @example {@paperscript} * @example {@paperscript}
* var path = new Path.Circle({ * var path = new Path.Circle({
@ -797,6 +807,10 @@ var Point = Base.extend(/** @lends Point# */{
* *
* // Select the third segment point: * // Select the third segment point:
* path.segments[2].point.selected = true; * path.segments[2].point.selected = true;
*
* // Select the item's position, which is the pivot point
* // around which it is trasnformed:
* path.position.selected = true;
*/ */
/** /**
@ -971,7 +985,7 @@ var Point = Base.extend(/** @lends Point# */{
* through setting itself again on the setter that corresponds to the getter * through setting itself again on the setter that corresponds to the getter
* that produced this LinkedPoint. * that produced this LinkedPoint.
* *
* @ignore * @private
*/ */
var LinkedPoint = Point.extend({ var LinkedPoint = Point.extend({
// Have LinkedPoint appear as a normal Point in debugging // Have LinkedPoint appear as a normal Point in debugging
@ -1006,5 +1020,17 @@ var LinkedPoint = Point.extend({
setY: function(y) { setY: function(y) {
this._y = y; this._y = y;
this._owner[this._setter](this); this._owner[this._setter](this);
},
isSelected: function() {
return !!(this._owner._selection & this._getSelection());
},
setSelected: function(selected) {
this._owner.changeSelection(this._getSelection(), selected);
},
_getSelection: function() {
return this._setter === 'setPosition' ? /*#=*/ItemSelection.POSITION : 0;
} }
}); });

View file

@ -893,15 +893,23 @@ new function() {
/** /**
* {@grouptitle Item Bounds} * {@grouptitle Item Bounds}
* *
* Specifies whether an item's bounds are selected and will also * Specifies whether an item's bounds are to appear as selected.
* mark the item as selected.
* *
* Paper.js draws the visual bounds of selected items on top of your * Paper.js draws the bounds of items with selected bounds on top of
* project. This can be useful for debugging. * your project. This is very useful when debugging.
* *
* @bean * @bean
* @type Boolean * @type Boolean
* @default false * @default false
*
* @example {@paperscript}
* var path = new Path.Circle({
* center: [80, 50],
* radius: 40,
* selected: true
* });
*
* path.bounds.selected = true;
*/ */
isSelected: function() { isSelected: function() {
return !!(this._owner._selection & /*#=*/ItemSelection.BOUNDS); return !!(this._owner._selection & /*#=*/ItemSelection.BOUNDS);

View file

@ -4255,23 +4255,44 @@ new function() { // Injection scope for hit-test functions shared with project
var selection = this._selection, var selection = this._selection,
itemSelected = selection & /*#=*/ItemSelection.ITEM, itemSelected = selection & /*#=*/ItemSelection.ITEM,
boundsSelected = selection & /*#=*/ItemSelection.BOUNDS boundsSelected = selection & /*#=*/ItemSelection.BOUNDS
|| itemSelected && this._selectBounds; || itemSelected && this._selectBounds,
positionSelected = selection & /*#=*/ItemSelection.POSITION;
if (!this._drawSelected) if (!this._drawSelected)
itemSelected = false; itemSelected = false;
if ((itemSelected || boundsSelected) && this._isUpdated(updateVersion)) { if ((itemSelected || boundsSelected || positionSelected)
&& this._isUpdated(updateVersion)) {
// Allow definition of selected color on a per item and per // Allow definition of selected color on a per item and per
// layer level, with a fallback to #009dec // layer level, with a fallback to #009dec
var layer, var layer,
color = this.getSelectedColor(true) || (layer = this.getLayer()) color = this.getSelectedColor(true) || (layer = this.getLayer())
&& layer.getSelectedColor(true), && layer.getSelectedColor(true),
mx = matrix.appended(this.getGlobalMatrix(true)); mx = matrix.appended(this.getGlobalMatrix(true)),
half = size / 2;
ctx.strokeStyle = ctx.fillStyle = color ctx.strokeStyle = ctx.fillStyle = color
? color.toCanvasStyle(ctx) : '#009dec'; ? color.toCanvasStyle(ctx) : '#009dec';
if (itemSelected) if (itemSelected)
this._drawSelected(ctx, mx, selectionItems); this._drawSelected(ctx, mx, selectionItems);
if (positionSelected) {
var point = this.getPosition(true),
x = point.x,
y = point.y;
ctx.beginPath();
ctx.arc(x, y, half, 0, Math.PI * 2, true);
ctx.stroke();
var deltas = [[0, -1], [1, 0], [0, 1], [-1, 0]],
start = half,
end = size + 1;
for (var i = 0; i < 4; i++) {
var delta = deltas[i],
dx = delta[0],
dy = delta[1];
ctx.moveTo(x + dx * start, y + dy * start);
ctx.lineTo(x + dx * end, y + dy * end);
ctx.stroke();
}
}
if (boundsSelected) { if (boundsSelected) {
var half = size / 2, var coords = mx._transformCorners(this.getInternalBounds());
coords = mx._transformCorners(this.getInternalBounds());
// Now draw a rectangle that connects the transformed // Now draw a rectangle that connects the transformed
// bounds corners, and draw the corners. // bounds corners, and draw the corners.
ctx.beginPath(); ctx.beginPath();

View file

@ -13,5 +13,5 @@
var ItemSelection = { var ItemSelection = {
ITEM: 1, ITEM: 1,
BOUNDS: 2, BOUNDS: 2,
PIVOT: 4 POSITION: 4
}; };

View file

@ -868,7 +868,7 @@ statics: /** @lends Curve */{
*/ */
/** /**
* The rough bounding rectangle of the curve that is shure to include all of * The rough bounding rectangle of the curve that is sure to include all of
* the drawing, including stroke width. * the drawing, including stroke width.
* *
* @name Curve#roughBounds * @name Curve#roughBounds