mirror of
https://github.com/scratchfoundation/scratch-paint.git
synced 2024-12-23 05:52:42 -05:00
Add selection tool to rect
This commit is contained in:
parent
f95bbe2ca5
commit
6732483d80
2 changed files with 51 additions and 8 deletions
|
@ -84,8 +84,8 @@ class BoundingBoxTool {
|
||||||
|
|
||||||
const hitProperties = {
|
const hitProperties = {
|
||||||
hitResult: hitResult,
|
hitResult: hitResult,
|
||||||
clone: event.modifiers.alt,
|
clone: clone,
|
||||||
multiselect: event.modifiers.shift
|
multiselect: multiselect
|
||||||
};
|
};
|
||||||
if (this.mode === BoundingBoxModes.MOVE) {
|
if (this.mode === BoundingBoxModes.MOVE) {
|
||||||
this._modeMap[this.mode].onMouseDown(hitProperties);
|
this._modeMap[this.mode].onMouseDown(hitProperties);
|
||||||
|
|
|
@ -1,12 +1,16 @@
|
||||||
import paper from '@scratch/paper';
|
import paper from '@scratch/paper';
|
||||||
import Modes from '../../modes/modes';
|
import Modes from '../../modes/modes';
|
||||||
import {styleShape} from '../style-path';
|
import {styleShape} from '../style-path';
|
||||||
|
import {clearSelection} from '../selection';
|
||||||
import BoundingBoxTool from '../selection-tools/bounding-box-tool';
|
import BoundingBoxTool from '../selection-tools/bounding-box-tool';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tool for drawing rectangles.
|
* Tool for drawing rectangles.
|
||||||
*/
|
*/
|
||||||
class RectTool extends paper.Tool {
|
class RectTool extends paper.Tool {
|
||||||
|
static get TOLERANCE () {
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* @param {function} setSelectedItems Callback to set the set of selected items in the Redux state
|
* @param {function} setSelectedItems Callback to set the set of selected items in the Redux state
|
||||||
* @param {function} clearSelectedItems Callback to clear the set of selected items in the Redux state
|
* @param {function} clearSelectedItems Callback to clear the set of selected items in the Redux state
|
||||||
|
@ -14,33 +18,66 @@ class RectTool extends paper.Tool {
|
||||||
*/
|
*/
|
||||||
constructor (setSelectedItems, clearSelectedItems, onUpdateSvg) {
|
constructor (setSelectedItems, clearSelectedItems, onUpdateSvg) {
|
||||||
super();
|
super();
|
||||||
|
this.clearSelectedItems = clearSelectedItems;
|
||||||
this.onUpdateSvg = onUpdateSvg;
|
this.onUpdateSvg = onUpdateSvg;
|
||||||
this.prevHoveredItemId = null;
|
this.prevHoveredItemId = null;
|
||||||
this.boundingBoxTool = new BoundingBoxTool(Modes.SELECT, setSelectedItems, clearSelectedItems, onUpdateSvg);
|
this.boundingBoxTool = new BoundingBoxTool(Modes.SELECT, setSelectedItems, clearSelectedItems, onUpdateSvg);
|
||||||
|
|
||||||
// We have to set these functions instead of just declaring them because
|
// We have to set these functions instead of just declaring them because
|
||||||
// paper.js tools hook up the listeners in the setter functions.
|
// paper.js tools hook up the listeners in the setter functions.
|
||||||
|
this.onMouseDown = this.handleMouseDown;
|
||||||
this.onMouseDrag = this.handleMouseDrag;
|
this.onMouseDrag = this.handleMouseDrag;
|
||||||
this.onMouseUp = this.handleMouseUp;
|
this.onMouseUp = this.handleMouseUp;
|
||||||
|
|
||||||
this.downPoint = null;
|
this.downPoint = null;
|
||||||
this.rect = null;
|
this.rect = null;
|
||||||
this.colorState = null;
|
this.colorState = null;
|
||||||
|
this.isBoundingBoxMode = null;
|
||||||
|
}
|
||||||
|
getHitOptions () {
|
||||||
|
return {
|
||||||
|
segments: true,
|
||||||
|
stroke: true,
|
||||||
|
curves: true,
|
||||||
|
fill: true,
|
||||||
|
guide: false,
|
||||||
|
match: hitResult =>
|
||||||
|
(hitResult.item.data && hitResult.item.data.isHelperItem) ||
|
||||||
|
hitResult.item.selected, // Allow hits on bounding box and selected only
|
||||||
|
tolerance: RectTool.TOLERANCE / paper.view.zoom
|
||||||
|
};
|
||||||
}
|
}
|
||||||
setColorState (colorState) {
|
setColorState (colorState) {
|
||||||
this.colorState = colorState;
|
this.colorState = colorState;
|
||||||
}
|
}
|
||||||
|
handleMouseDown (event) {
|
||||||
|
const clickedItem = paper.project.hitTest(event.point, this.getHitOptions());
|
||||||
|
if (clickedItem) {
|
||||||
|
this.isBoundingBoxMode = true;
|
||||||
|
this.boundingBoxTool.onMouseDown(event, false /* clone */, false /* multiselect */, this.getHitOptions());
|
||||||
|
} else {
|
||||||
|
this.isBoundingBoxMode = false;
|
||||||
|
this.boundingBoxTool.removeBoundsPath();
|
||||||
|
clearSelection(this.clearSelectedItems);
|
||||||
|
}
|
||||||
|
}
|
||||||
handleMouseDrag (event) {
|
handleMouseDrag (event) {
|
||||||
if (event.event.button > 0) return; // only first mouse button
|
if (event.event.button > 0) return; // only first mouse button
|
||||||
|
|
||||||
|
if (this.isBoundingBoxMode) {
|
||||||
|
this.boundingBoxTool.onMouseDrag(event);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.rect) {
|
if (this.rect) {
|
||||||
this.rect.remove();
|
this.rect.remove();
|
||||||
}
|
}
|
||||||
this.rect = new paper.Path.Rectangle(event.downPoint, event.point);
|
|
||||||
|
|
||||||
|
const rect = new paper.Rectangle(event.downPoint, event.point);
|
||||||
if (event.modifiers.shift) {
|
if (event.modifiers.shift) {
|
||||||
this.rect.height = this.rect.width;
|
rect.height = rect.width;
|
||||||
}
|
}
|
||||||
|
this.rect = new paper.Path.Rectangle(rect);
|
||||||
|
|
||||||
if (event.modifiers.alt) {
|
if (event.modifiers.alt) {
|
||||||
this.rect.position = event.downPoint;
|
this.rect.position = event.downPoint;
|
||||||
|
@ -51,15 +88,21 @@ class RectTool extends paper.Tool {
|
||||||
handleMouseUp (event) {
|
handleMouseUp (event) {
|
||||||
if (event.event.button > 0) return; // only first mouse button
|
if (event.event.button > 0) return; // only first mouse button
|
||||||
|
|
||||||
|
if (this.isBoundingBoxMode) {
|
||||||
|
this.boundingBoxTool.onMouseUp(event);
|
||||||
|
this.isBoundingBoxMode = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.rect) {
|
if (this.rect) {
|
||||||
|
this.rect.selected = true;
|
||||||
|
this.boundingBoxTool.setSelectionBounds();
|
||||||
this.onUpdateSvg();
|
this.onUpdateSvg();
|
||||||
this.rect = null;
|
this.rect = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
deactivateTool () {
|
deactivateTool () {
|
||||||
this.downPoint = null;
|
this.boundingBoxTool.removeBoundsPath();
|
||||||
this.rect = null;
|
|
||||||
this.colorState = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue