Skip to content

Commit 6d9a1c2

Browse files
committed
horizontal scale (WIP)
1 parent 9d06b7b commit 6d9a1c2

File tree

4 files changed

+86
-31
lines changed

4 files changed

+86
-31
lines changed

src/editor-view/selectors/gizmos/scale-gizmo.ts

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,41 @@
11
import { Gizmo, GIZMO_SCALE } from './gizmo';
22
import './scale-gizmo.scss';
33

4-
export enum Corner {
5-
TopLeft,
6-
TopRight,
7-
BottomLeft,
8-
BottomRight,
4+
export enum HSide {
5+
Left = 0,
6+
Center = 0.5,
7+
Right = 1,
8+
}
9+
10+
export enum VSide {
11+
Top = 0,
12+
Middle = 0.5,
13+
Bottom = 1,
914
}
1015

1116
export class ScaleGizmo extends HTMLElement implements Gizmo {
1217
public static readonly tagName = 'phred-scale-gizmo';
1318
public readonly type = GIZMO_SCALE;
14-
public corner: Corner;
19+
public hside: HSide;
20+
public vside: VSide;
1521

16-
public init(corner: Corner) {
17-
this.corner = corner ?? 0;
22+
public init(vside: VSide, hside: HSide) {
23+
this.hside = hside ?? 0;
24+
this.vside = vside ?? 0;
1825
let clazz = '';
19-
switch (corner) {
20-
case Corner.TopRight: clazz = 'top-right'; break;
21-
case Corner.BottomLeft: clazz = 'bottom-left'; break;
22-
case Corner.BottomRight: clazz = 'bottom-right'; break;
23-
default: clazz = 'top-left';
26+
27+
switch (vside) {
28+
case VSide.Top: clazz = 'top'; break;
29+
case VSide.Bottom: clazz += 'bottom'; break;
30+
default: clazz = 'middle'; break;
2431
}
32+
33+
switch (hside) {
34+
case HSide.Right: clazz += '-right'; break;
35+
case HSide.Left: clazz += '-left'; break;
36+
default: clazz = '-center'; break;
37+
}
38+
2539
this.classList.add(clazz);
2640
this.appendChild(document.createElement('div')).classList.add('handle');
2741
}

src/editor-view/selectors/gizmos/selection-gizmo.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import { HSide, VSide } from 'index';
12
import { Rect } from 'plugin.model';
23
import { Selection, SelectionChangedEvent } from '../selection';
34
import { SelectionUtil } from '../selection.util';
45
import { Gizmo, GIZMO_MOVE } from './gizmo';
5-
import { Corner, ScaleGizmo } from './scale-gizmo';
6+
import { ScaleGizmo } from './scale-gizmo';
67
import './selection-gizmo.scss';
78

89
// interface PropertiesCache {
@@ -40,19 +41,19 @@ export class SelectionGizmo extends HTMLElement implements Gizmo {
4041

4142
private createResizeHandlers(handlers: HTMLElement[]) {
4243
const tl = this.appendChild(document.createElement(ScaleGizmo.tagName)) as ScaleGizmo;
43-
tl.init(Corner.TopLeft);
44+
tl.init(VSide.Top, HSide.Left);
4445
handlers.push(tl);
4546

4647
const tr = this.appendChild(document.createElement(ScaleGizmo.tagName)) as ScaleGizmo;
47-
tr.init(Corner.TopRight);
48+
tr.init(VSide.Top, HSide.Right);
4849
handlers.push(tr);
4950

5051
const bl = this.appendChild(document.createElement(ScaleGizmo.tagName)) as ScaleGizmo;
51-
bl.init(Corner.BottomLeft);
52+
bl.init(VSide.Bottom, HSide.Left);
5253
handlers.push(bl);
5354

5455
const br = this.appendChild(document.createElement(ScaleGizmo.tagName)) as ScaleGizmo;
55-
br.init(Corner.BottomRight);
56+
br.init(VSide.Bottom, HSide.Right);
5657
handlers.push(br);
5758
}
5859

@@ -84,7 +85,7 @@ export class SelectionGizmo extends HTMLElement implements Gizmo {
8485
this.style.pointerEvents = 'none';
8586
this.handlers.forEach(h => h.style.pointerEvents = 'none');
8687
}
87-
88+
8889
public stopMoving() {
8990
this.style.pointerEvents = 'all';
9091
this.handlers.forEach(h => h.style.pointerEvents = 'all');

src/editor-view/selectors/handlers/scale.handler.ts

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,60 @@
11
import { Point } from 'plugin.model';
2-
import { ScaleGizmo } from '../gizmos/scale-gizmo';
2+
import { HSide, ScaleGizmo, VSide } from '../gizmos/scale-gizmo';
33
import { SelectionUtil } from '../selection.util';
44
import { DraggingHandler } from './dragging-handler';
55

66
export class ScaleHandler implements DraggingHandler {
77
private _point: Point;
88
private _object: PIXI.DisplayObject;
9+
private _vside: VSide;
10+
private _hside: HSide;
11+
912
private _isGroup: boolean;
1013
private _top: number;
1114
private _left: number;
1215

1316
public startHandling(e: MouseEvent, object: PIXI.DisplayObject): void {
14-
const corner = (e.target as ScaleGizmo).corner;
17+
const gizmo = e.target as ScaleGizmo;
18+
let hside = gizmo.hside;
19+
let vside = gizmo.vside;
1520
this._object = object;
1621

17-
object.position.set(object.x - object.pivot.x, object.y - object.pivot.y);
18-
object.pivot.set(0, 0);
22+
// inverting axis
23+
if (object.scale.x < 0) {
24+
if (hside == HSide.Left) hside = HSide.Right;
25+
else if (hside == HSide.Right) hside = HSide.Left;
26+
}
1927

20-
this._isGroup = !object.anchor;
21-
if (this._isGroup) {
22-
this._top = object.top;
23-
this._left = object.left;
28+
this._vside = vside;
29+
this._hside = hside;
30+
31+
object.updateTransform();
32+
33+
if (hside === HSide.Right) {
34+
object.position.set(
35+
object.x - object.pivot.x * object.scale.x,
36+
object.y - object.pivot.y);
37+
object.pivot.set(0, 0);
38+
39+
40+
} else if (hside === HSide.Left) {
41+
const originalWidth = object.width / object.scale.x;
42+
object.position.set(
43+
object.x + object.width - object.pivot.x * object.scale.x,
44+
object.y - object.pivot.y);
45+
46+
object.pivot.set(Math.abs(originalWidth), 0);
47+
console.log(originalWidth)
2448
}
49+
50+
51+
// this._isGroup = !object.anchor;
52+
// if (this._isGroup) {
53+
// this._top = object.top;
54+
// this._left = object.left;
55+
// }
56+
57+
object.updateTransform();
2558
}
2659

2760
public handle(e: MouseEvent): void {
@@ -32,8 +65,14 @@ export class ScaleHandler implements DraggingHandler {
3265
const lastPoint = this._point;
3366
const newPoint = SelectionUtil.mouseEventToGamePoint(e, { x: 0, y: 0 });
3467

35-
const dx = newPoint.x - lastPoint.x
36-
const dy = newPoint.y - lastPoint.y
68+
let dx = 0;
69+
if (this._hside === HSide.Left) dx = lastPoint.x - newPoint.x;
70+
else if (this._hside === HSide.Right) dx = newPoint.x - lastPoint.x;
71+
// if (this._corner == Corner.BottomRight) dx = newPoint.x - lastPoint.x;
72+
// else if (this._corner === Corner.BottomLeft) dx = lastPoint.x - newPoint.x;
73+
// const dx = newPoint.x - lastPoint.x; // bottom right
74+
// const dx = lastPoint.x - newPoint.x; // bottom left
75+
const dy = newPoint.y - lastPoint.y;
3776
this._point = newPoint;
3877

3978
this._object.updateTransform();

src/global.d.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@ declare namespace PIXI {
99
name?: string;
1010
anchor?: Point;
1111
inputEnabled?: boolean;
12-
getBounds?(): Rectangle;
13-
children?: DisplayObject[];
1412
top: number;
1513
left: number;
1614
bottom: number;
1715
right: number;
1816
width: number;
1917
height: number;
18+
children?: DisplayObject[];
19+
getBounds?(): Rectangle;
20+
getLocalBounds(): Rectangle;
2021
}
2122
}
2223

0 commit comments

Comments
 (0)