diff --git a/ui/src/components/door_map/RectangleCanvas.vue b/ui/src/components/door_map/RectangleCanvas.vue
index f76d395..aaeeae7 100644
--- a/ui/src/components/door_map/RectangleCanvas.vue
+++ b/ui/src/components/door_map/RectangleCanvas.vue
@@ -13,11 +13,7 @@
:key="`rect-${index}`"
:rectangle="rect"
/>
-
+
@@ -27,6 +23,12 @@ import { Vector2D, Rectangle } from "../rects/rectangles";
import ThouCanvas from "../rects/ThouCanvas.vue";
import SVGRect from "../rects/SVGRect.vue";
+enum CanvasState {
+ Idle,
+ Drawing,
+ Dragging,
+}
+
@Options({
components: {
ThouCanvas,
@@ -35,20 +37,14 @@ import SVGRect from "../rects/SVGRect.vue";
})
export default class extends Vue {
private readonly min_rect_area = 300;
- private drawing = false;
- private preview_corner1 = new Vector2D();
- private preview_corner2 = new Vector2D();
- private dragging = false;
+ private state = CanvasState.Idle;
+ private preview_rect = new Rectangle();
private drag_rect?: Rectangle;
private drag_origin = new Vector2D();
public rectangles: Rectangle[] = [];
private get preview_visible(): boolean {
- return this.drawing || this.dragging;
- }
-
- private get preview_rectangle(): Rectangle {
- return new Rectangle(this.preview_corner1, this.preview_corner2);
+ return this.state !== CanvasState.Idle;
}
private pop_rectangle(point: Vector2D): Rectangle | undefined {
@@ -66,23 +62,22 @@ export default class extends Vue {
return;
}
- this.drawing = true;
- this.preview_corner1 = point;
- this.preview_corner2 = point;
+ this.state = CanvasState.Drawing;
+ this.preview_rect = new Rectangle(point, point);
}
private draw_finish() {
- if (!this.drawing) {
+ if (this.state !== CanvasState.Drawing || this.preview_rect === undefined) {
return;
}
- this.drawing = false;
+ this.state = CanvasState.Idle;
- if (this.preview_rectangle.area < this.min_rect_area) {
+ if (this.preview_rect.area < this.min_rect_area) {
return;
}
- this.rectangles.push(this.preview_rectangle);
+ this.rectangles.push(this.preview_rect);
}
private drag_start(event: MouseEvent, point: Vector2D) {
@@ -96,30 +91,34 @@ export default class extends Vue {
return;
}
- this.dragging = true;
+ this.state = CanvasState.Dragging;
this.drag_origin = point;
- this.preview_corner1 = this.drag_rect.origin;
- this.preview_corner2 = this.drag_rect.corner;
+ this.preview_rect = this.drag_rect;
}
private drag_finish() {
- if (!this.dragging) {
+ if (
+ this.state !== CanvasState.Dragging ||
+ this.preview_rect === undefined
+ ) {
return;
}
- this.dragging = false;
- this.rectangles.push(this.preview_rectangle);
+ this.state = CanvasState.Idle;
+ this.rectangles.push(this.preview_rect);
}
private on_mousemove(event: MouseEvent, point: Vector2D) {
- if (this.drawing) {
- this.preview_corner2 = point;
- } else if (this.dragging && this.drag_rect) {
- const movement = point.minus(this.drag_origin);
+ if (this.preview_rect === undefined) {
+ return;
+ }
- this.preview_corner1 = this.drag_rect.origin.plus(movement);
- this.preview_corner2 = this.drag_rect.corner.plus(movement);
+ if (this.state === CanvasState.Drawing) {
+ this.preview_rect = this.preview_rect.update(undefined, point);
+ } else if (this.state === CanvasState.Dragging && this.drag_rect) {
+ const movement = point.minus(this.drag_origin);
+ this.preview_rect = this.drag_rect.move(movement);
}
}
diff --git a/ui/src/components/rects/rectangles.ts b/ui/src/components/rects/rectangles.ts
index 7b15b61..1bcc0dc 100644
--- a/ui/src/components/rects/rectangles.ts
+++ b/ui/src/components/rects/rectangles.ts
@@ -24,9 +24,9 @@ export class Rectangle {
private readonly corner_1: Vector2D;
private readonly corner_2: Vector2D;
- constructor(corner_1: Vector2D, corner_2: Vector2D) {
- this.corner_1 = corner_1;
- this.corner_2 = corner_2;
+ constructor(corner_1?: Vector2D, corner_2?: Vector2D) {
+ this.corner_1 = corner_1 || new Vector2D();
+ this.corner_2 = corner_2 || new Vector2D();
}
public get origin(): Vector2D {
@@ -71,6 +71,20 @@ export class Rectangle {
return point.x >= this.origin.x &&
point.y >= this.origin.y &&
point.x <= this.corner.x &&
- point.y <= this.corner.y
+ point.y <= this.corner.y;
+ }
+
+ public update(corner_1?: Vector2D, corner_2?: Vector2D): Rectangle {
+ return new Rectangle(
+ corner_1 || this.corner_1,
+ corner_2 || this.corner_2,
+ );
+ }
+
+ public move(vector: Vector2D): Rectangle {
+ return new Rectangle(
+ this.corner_1.plus(vector),
+ this.corner_2.plus(vector),
+ );
}
}