FIX: Part dragging
This commit is contained in:
parent
ee6679de98
commit
ce4c8de6f8
@ -22,4 +22,8 @@ export class Point {
|
|||||||
return new Point(part.x, part.y);
|
return new Point(part.x, part.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
minus(start: Point): Point {
|
||||||
|
return new Point(this.x - start.x, this.y - start.y);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,42 +1,59 @@
|
|||||||
import {Point} from '../Point';
|
|
||||||
import {Part, RASTER} from '../parts/Part';
|
import {Part, RASTER} from '../parts/Part';
|
||||||
import {Circuit} from './Circuit';
|
import {Circuit} from './Circuit';
|
||||||
|
import {Point} from '../Point';
|
||||||
|
|
||||||
export class Parts {
|
export class Parts {
|
||||||
|
|
||||||
circuit!: Circuit;
|
private _circuit!: Circuit;
|
||||||
|
|
||||||
dragStart: Point | null = null;
|
set circuit(circuit: Circuit) {
|
||||||
|
this._circuit = circuit;
|
||||||
|
this.reset();
|
||||||
|
}
|
||||||
|
|
||||||
dragStartPart: Part | null = null;
|
get circuit(): Circuit {
|
||||||
|
return this._circuit;
|
||||||
|
}
|
||||||
|
|
||||||
dragCursor: Point | null = null;
|
private part: Part | null = null;
|
||||||
|
|
||||||
|
private partStart: Point | null = null;
|
||||||
|
|
||||||
|
private mouseStart: Point | null = null;
|
||||||
|
|
||||||
mouseDown(part: Part, $event: MouseEvent) {
|
mouseDown(part: Part, $event: MouseEvent) {
|
||||||
if ($event.button === 0) {
|
if ($event.button === 0) {
|
||||||
this.dragStartPart = part;
|
this.part = part;
|
||||||
this.dragStart = Point.fromPart(part);
|
this.partStart = Point.fromPart(part);
|
||||||
|
this.mouseStart = Point.fromEvent($event);
|
||||||
|
this.mouseMove($event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mouseMove($event: MouseEvent) {
|
mouseMove($event: MouseEvent) {
|
||||||
this.updateDragCursor($event);
|
if ($event.button === 0 && this.part !== null && this.partStart !== null && this.mouseStart !== null) {
|
||||||
if (this.dragStartPart !== null && this.dragCursor !== null) {
|
const diff = Point.fromEvent($event).minus(this.mouseStart);
|
||||||
this.dragStartPart.rasterCenterX = Math.floor(this.dragCursor.x / RASTER) + 0.5;
|
this.part.x = Math.floor((this.partStart.x + diff.x) / RASTER + 0.5) * RASTER;
|
||||||
this.dragStartPart.rasterCenterY = Math.floor(this.dragCursor.y / RASTER) + 0.5;
|
this.part.y = Math.floor((this.partStart.y + diff.y) / RASTER + 0.5) * RASTER;
|
||||||
this.dragStartPart.updateJunctionPositions();
|
this.part.updateJunctionPositions();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mouseUp($event: MouseEvent) {
|
mouseUp($event: MouseEvent) {
|
||||||
this.updateDragCursor($event);
|
this.mouseMove($event);
|
||||||
if ($event.button === 0) {
|
if ($event.button === 0) {
|
||||||
this.dragStartPart = null;
|
this.reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private updateDragCursor($event: MouseEvent) {
|
private reset() {
|
||||||
this.dragCursor = Point.fromEvent($event);
|
this.part = null;
|
||||||
|
this.partStart = null;
|
||||||
|
this.mouseStart = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
isDragged(part: Part) {
|
||||||
|
return this.part === part;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,13 +8,13 @@ export abstract class Part {
|
|||||||
|
|
||||||
readonly uuid: string = self.crypto.randomUUID();
|
readonly uuid: string = self.crypto.randomUUID();
|
||||||
|
|
||||||
private _x: number;
|
x: number;
|
||||||
|
|
||||||
private _y: number;
|
y: number;
|
||||||
|
|
||||||
private readonly _w: number;
|
readonly w: number;
|
||||||
|
|
||||||
private readonly _h: number;
|
readonly h: number;
|
||||||
|
|
||||||
protected constructor(
|
protected constructor(
|
||||||
readonly circuit: Circuit,
|
readonly circuit: Circuit,
|
||||||
@ -25,34 +25,10 @@ export abstract class Part {
|
|||||||
rasterW: number = 1,
|
rasterW: number = 1,
|
||||||
rasterH: number = 1,
|
rasterH: number = 1,
|
||||||
) {
|
) {
|
||||||
this._x = rasterX * 3 * RASTER;
|
this.x = rasterX * 3 * RASTER;
|
||||||
this._y = rasterY * 3 * RASTER;
|
this.y = rasterY * 3 * RASTER;
|
||||||
this._w = rasterW * 3 * RASTER;
|
this.w = rasterW * 3 * RASTER;
|
||||||
this._h = rasterH * 3 * RASTER;
|
this.h = rasterH * 3 * RASTER;
|
||||||
}
|
|
||||||
|
|
||||||
get x(): number {
|
|
||||||
return this._x;
|
|
||||||
}
|
|
||||||
|
|
||||||
get y(): number {
|
|
||||||
return this._y;
|
|
||||||
}
|
|
||||||
|
|
||||||
get w(): number {
|
|
||||||
return this._w;
|
|
||||||
}
|
|
||||||
|
|
||||||
get h(): number {
|
|
||||||
return this._h;
|
|
||||||
}
|
|
||||||
|
|
||||||
set rasterCenterX(rx: number) {
|
|
||||||
this._x = rx * RASTER - this._w / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
set rasterCenterY(ry: number) {
|
|
||||||
this._y = ry * RASTER - this._h / 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
toString(): string {
|
toString(): string {
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
[attr.y]="part.y + 'px'"
|
[attr.y]="part.y + 'px'"
|
||||||
[attr.width]="part.w + 'px'"
|
[attr.width]="part.w + 'px'"
|
||||||
[attr.height]="part.h + 'px'"
|
[attr.height]="part.h + 'px'"
|
||||||
[class.partDrag]="parts.dragStartPart === part"
|
[class.partDrag]="parts.isDragged(part)"
|
||||||
(mousedown)="parts.mouseDown(part, $event)"
|
(mousedown)="parts.mouseDown(part, $event)"
|
||||||
>
|
>
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 831 B After Width: | Height: | Size: 824 B |
Loading…
Reference in New Issue
Block a user