diff --git a/ui/src/components/rects/RectPad.vue b/ui/src/components/rects/RectPad.vue
index 1e04f32..27456b8 100644
--- a/ui/src/components/rects/RectPad.vue
+++ b/ui/src/components/rects/RectPad.vue
@@ -4,20 +4,23 @@
viewBox="0 0 1000 1000"
preserveAspectRatio="none"
@mousedown.left="draw_start"
- @mousemove="on_mousemove"
@mouseup.left="draw_finish"
- @contextmenu.prevent=""
+ @contextmenu.prevent
+ @mousedown.right="drag_start"
+ @mouseup.right="drag_finish"
+ @mousemove="on_mousemove"
+ @dblclick.left="remove_rect"
>
-
+
@@ -45,44 +48,116 @@ function get_event_thous(event: MouseEvent): Vector2D {
},
})
export default class RectPad extends Vue {
- private preview_state = {
- visible: false,
- corner1: new Vector2D(),
- corner2: new Vector2D(),
- };
private readonly min_rect_area = 4;
+ private drawing = false;
+ private preview_corner1 = new Vector2D();
+ private preview_corner2 = new Vector2D();
+ private dragging = false;
+ private drag_index = -1;
+ private drag_origin = new Vector2D();
private rectangles: Rectangle[] = [];
- private draw_start(event: MouseEvent) {
- if (this.preview_state.visible) {
- return;
- }
-
- this.preview_state.visible = true;
- this.preview_state.corner1 = get_event_thous(event);
- this.preview_state.corner2 = get_event_thous(event);
+ private get preview_visible(): boolean {
+ return this.drawing || this.dragging;
}
- private on_mousemove(event: MouseEvent) {
- if (!this.preview_state.visible) {
+ private get preview_rectangle(): Rectangle {
+ return new Rectangle(
+ this.preview_corner1,
+ this.preview_corner2
+ ).normalize();
+ }
+
+ private find_rectangle(point: Vector2D) {
+ return this.rectangles.findIndex(
+ (rect) =>
+ point.x >= rect.left &&
+ point.y >= rect.top &&
+ point.x <= rect.left + rect.width &&
+ point.y <= rect.top + rect.height
+ );
+ }
+
+ private draw_start(event: MouseEvent) {
+ if (this.preview_visible) {
return;
}
- this.preview_state.corner2 = get_event_thous(event);
+ this.drawing = true;
+ this.preview_corner1 = get_event_thous(event);
+ this.preview_corner2 = get_event_thous(event);
}
private draw_finish() {
- this.preview_state.visible = false;
+ if (!this.drawing) {
+ return;
+ }
+
+ this.drawing = false;
+
if (this.preview_rectangle.area >= this.min_rect_area) {
this.rectangles.push(this.preview_rectangle);
}
}
- private get preview_rectangle(): Rectangle {
- return new Rectangle(
- this.preview_state.corner1,
- this.preview_state.corner2
- ).normalize();
+ private drag_start(event: MouseEvent) {
+ if (this.preview_visible) {
+ return;
+ }
+
+ let point = get_event_thous(event);
+ this.drag_index = this.find_rectangle(point);
+
+ if (this.drag_index === -1) {
+ return;
+ }
+
+ this.dragging = true;
+ this.drag_origin = point;
+
+ this.preview_corner1 = this.rectangles[this.drag_index].origin;
+ this.preview_corner2 = this.rectangles[this.drag_index].corner;
+
+ console.log("drag_start", point);
+ }
+
+ private drag_finish(event: MouseEvent) {
+ if (!this.dragging) {
+ return;
+ }
+
+ this.dragging = false;
+ this.rectangles[this.drag_index] = this.preview_rectangle;
+
+ console.log("drag_finish", get_event_thous(event));
+ }
+
+ private on_mousemove(event: MouseEvent) {
+ let point = get_event_thous(event);
+
+ if (this.drawing) {
+ this.preview_corner2 = point;
+ } else if (this.dragging) {
+ let movement = point.minus(this.drag_origin);
+
+ this.preview_corner1 =
+ this.rectangles[this.drag_index].origin.plus(movement);
+ this.preview_corner2 =
+ this.rectangles[this.drag_index].corner.plus(movement);
+ }
+ }
+
+ private remove_rect(event: MouseEvent) {
+ let point = get_event_thous(event);
+ let rect_index = this.find_rectangle(point);
+
+ if (rect_index === -1) {
+ return;
+ }
+
+ this.rectangles.splice(rect_index, 1);
+
+ console.log("remove_rect", get_event_thous(event));
}
}
diff --git a/ui/src/components/rects/rectangles.ts b/ui/src/components/rects/rectangles.ts
index 809d07d..329183b 100644
--- a/ui/src/components/rects/rectangles.ts
+++ b/ui/src/components/rects/rectangles.ts
@@ -44,6 +44,10 @@ export class Rectangle {
return this.origin.y;
}
+ public get corner(): Vector2D {
+ return this._corner_2;
+ }
+
public get size(): Vector2D {
return this._corner_2.minus(this._corner_1);
}