mirror of
https://github.com/scratchfoundation/scratch-paint.git
synced 2024-12-22 21:42:30 -05:00
get rotate working
This commit is contained in:
parent
0e91439edd
commit
9216098a3f
3 changed files with 24 additions and 8 deletions
|
@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PaintEditorComponent from '../components/paint-editor.jsx';
|
import PaintEditorComponent from '../components/paint-editor.jsx';
|
||||||
import {changeMode} from '../reducers/modes';
|
import {changeMode} from '../reducers/modes';
|
||||||
|
import {getGuideLayer} from '../helper/layer';
|
||||||
import Modes from '../modes/modes';
|
import Modes from '../modes/modes';
|
||||||
import {connect} from 'react-redux';
|
import {connect} from 'react-redux';
|
||||||
import bindAll from 'lodash.bindall';
|
import bindAll from 'lodash.bindall';
|
||||||
|
@ -21,6 +22,8 @@ class PaintEditor extends React.Component {
|
||||||
document.removeEventListener('keydown', this.props.onKeyPress);
|
document.removeEventListener('keydown', this.props.onKeyPress);
|
||||||
}
|
}
|
||||||
handleUpdateSvg () {
|
handleUpdateSvg () {
|
||||||
|
// Hide bounding box
|
||||||
|
getGuideLayer().visible = false;
|
||||||
const bounds = paper.project.activeLayer.bounds;
|
const bounds = paper.project.activeLayer.bounds;
|
||||||
this.props.onUpdateSvg(
|
this.props.onUpdateSvg(
|
||||||
paper.project.exportSVG({
|
paper.project.exportSVG({
|
||||||
|
@ -29,6 +32,7 @@ class PaintEditor extends React.Component {
|
||||||
}),
|
}),
|
||||||
paper.project.view.center.x - bounds.x,
|
paper.project.view.center.x - bounds.x,
|
||||||
paper.project.view.center.y - bounds.y);
|
paper.project.view.center.y - bounds.y);
|
||||||
|
getGuideLayer().visible = true;
|
||||||
}
|
}
|
||||||
render () {
|
render () {
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -119,7 +119,7 @@ class BoundingBoxTool {
|
||||||
this.boundsPath.fullySelected = true;
|
this.boundsPath.fullySelected = true;
|
||||||
this.boundsPath.parent = getGuideLayer();
|
this.boundsPath.parent = getGuideLayer();
|
||||||
|
|
||||||
for (let index = 0; index < this.boundsPath.segments; index++) {
|
for (let index = 0; index < this.boundsPath.segments.length; index++) {
|
||||||
const segment = this.boundsPath.segments[index];
|
const segment = this.boundsPath.segments[index];
|
||||||
let size = 4;
|
let size = 4;
|
||||||
|
|
||||||
|
@ -131,11 +131,11 @@ class BoundingBoxTool {
|
||||||
const offset = new paper.Point(0, 20);
|
const offset = new paper.Point(0, 20);
|
||||||
|
|
||||||
const arrows = new paper.Path(ARROW_PATH);
|
const arrows = new paper.Path(ARROW_PATH);
|
||||||
arrows.translate(segment.point + offset + [-10.5, -5]);
|
arrows.translate(segment.point.add(offset).add(-10.5, -5));
|
||||||
|
|
||||||
const line = new paper.Path.Rectangle(
|
const line = new paper.Path.Rectangle(
|
||||||
segment.point + offset - [1, 0],
|
segment.point.add(offset).subtract(1, 0),
|
||||||
segment.point + [1, 0]);
|
segment.point);
|
||||||
|
|
||||||
const rotHandle = arrows.unite(line);
|
const rotHandle = arrows.unite(line);
|
||||||
line.remove();
|
line.remove();
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import paper from 'paper';
|
||||||
|
|
||||||
class RotateTool {
|
class RotateTool {
|
||||||
constructor () {
|
constructor () {
|
||||||
this.rotItems = [];
|
this.rotItems = [];
|
||||||
|
@ -10,16 +12,21 @@ class RotateTool {
|
||||||
* @param {!object} boundsPath Where the boundaries of the hit item are
|
* @param {!object} boundsPath Where the boundaries of the hit item are
|
||||||
* @param {!Array.<paper.Item>} selectedItems Set of selected paper.Items
|
* @param {!Array.<paper.Item>} selectedItems Set of selected paper.Items
|
||||||
*/
|
*/
|
||||||
onMouseDown (boundsPath, selectedItems) {
|
onMouseDown (hitResult, boundsPath, selectedItems) {
|
||||||
this.rotGroupPivot = boundsPath.bounds.center;
|
this.rotGroupPivot = boundsPath.bounds.center;
|
||||||
this.rotItems = selectedItems;
|
for (const item of selectedItems) {
|
||||||
|
// Rotate only root items; all nested items shouldn't get rotated again.
|
||||||
|
if (item.parent instanceof paper.Layer) {
|
||||||
|
this.rotItems.push(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (let i = 0; i < this.rotItems.length; i++) {
|
for (let i = 0; i < this.rotItems.length; i++) {
|
||||||
this.prevRot[i] = (event.point - this.rotGroupPivot).angle;
|
this.prevRot[i] = 90;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onMouseDrag (event) {
|
onMouseDrag (event) {
|
||||||
let rotAngle = (event.point - this.rotGroupPivot).angle;
|
let rotAngle = (event.point.subtract(this.rotGroupPivot)).angle;
|
||||||
|
|
||||||
for (let i = 0; i < this.rotItems.length; i++) {
|
for (let i = 0; i < this.rotItems.length; i++) {
|
||||||
const item = this.rotItems[i];
|
const item = this.rotItems[i];
|
||||||
|
@ -44,6 +51,11 @@ class RotateTool {
|
||||||
for (const item of this.rotItems) {
|
for (const item of this.rotItems) {
|
||||||
item.applyMatrix = true;
|
item.applyMatrix = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.rotItems.length = 0;
|
||||||
|
this.rotGroupPivot = null;
|
||||||
|
this.prevRot = [];
|
||||||
|
|
||||||
// @todo add back undo
|
// @todo add back undo
|
||||||
// pg.undo.snapshot('rotateSelection');
|
// pg.undo.snapshot('rotateSelection');
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue