Skip to content

Commit 983b415

Browse files
committed
feat(core): getOneHitElement support hitPoint
1 parent e8b65b6 commit 983b415

10 files changed

Lines changed: 26 additions & 17 deletions

File tree

.changeset/good-rules-brake.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@plait/core': minor
3+
'@plait/draw': minor
4+
'@plait/mind': minor
5+
---
6+
7+
getOneHitElement support hitPoint

packages/core/src/interfaces/board.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export interface PlaitBoard {
7575
isHit: (element: PlaitElement, point: Point, isStrict?: boolean) => boolean;
7676
isInsidePoint: (element: PlaitElement, point: Point) => boolean;
7777
// the hit element is determined by the plugin
78-
getOneHitElement: (hitElements: PlaitElement[]) => PlaitElement;
78+
getOneHitElement: (hitElements: PlaitElement[], hitPoint: Point) => PlaitElement;
7979
isRecursion: (element: PlaitElement) => boolean;
8080
isMovable: (element: PlaitElement) => boolean;
8181
getRectangle: (element: PlaitElement) => RectangleClient | null;

packages/core/src/plugins/create-board.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ export function createBoard(children: PlaitElement[], options?: PlaitBoardOption
116116
isRectangleHit: (element) => false,
117117
isHit: (element) => false,
118118
isInsidePoint: (element) => false,
119-
getOneHitElement: (data: PlaitElement[]) => data[0],
119+
getOneHitElement: (data: PlaitElement[], hitPoint: Point) => data[0],
120120
isRecursion: (element) => true,
121121
isMovable: (element) => false,
122122
getRectangle: (element) => null,

packages/core/src/plugins/with-selection.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ export function withSelection(board: PlaitBoard) {
204204
setSelectedElementsWithGroup(board, elements, isShift);
205205
} else {
206206
if (board.selection && Selection.isCollapsed(board.selection)) {
207-
const element = board.getOneHitElement(elements);
207+
const element = board.getOneHitElement(elements, board.selection.anchor);
208208
if (element) {
209209
elements = [element];
210210
}

packages/core/src/utils/selected-element.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ export const getHitElementByPoint = (
9393
isStrict = true
9494
): undefined | PlaitElement => {
9595
const pointHitElements = getHitElementsByPoint(board, point, match, isStrict);
96-
const hitElement = board.getOneHitElement(pointHitElements);
96+
const hitElement = board.getOneHitElement(pointHitElements, point);
9797
return hitElement;
9898
};
9999

packages/core/src/utils/selection.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
PlaitOperation,
77
PlaitPluginKey,
88
PlaitPointerType,
9+
Point,
910
RectangleClient,
1011
SELECTION_BORDER_COLOR,
1112
WithSelectionPluginOptions
@@ -112,7 +113,7 @@ export function setSelectedElementsWithGroup(board: PlaitBoard, elements: PlaitE
112113
if (isShift) {
113114
cacheSelectedElementsWithGroupOnShift(board, elements, isSelectGroupElement, elementsInHighestGroup);
114115
} else {
115-
cacheSelectedElementsWithGroup(board, elements, isSelectGroupElement, hitElementGroups);
116+
cacheSelectedElementsWithGroup(board, elements, isSelectGroupElement, hitElementGroups, board.selection.anchor);
116117
}
117118
}
118119
}
@@ -154,15 +155,16 @@ export function cacheSelectedElementsWithGroup(
154155
board: PlaitBoard,
155156
elements: PlaitElement[],
156157
isSelectGroupElement: boolean,
157-
hitElementGroups: PlaitGroup[]
158+
hitElementGroups: PlaitGroup[],
159+
hitPoint: Point
158160
) {
159161
let newElements = [...elements];
160162
const selectedGroups = filterSelectedGroups(board, hitElementGroups);
161163
if (selectedGroups.length > 0) {
162164
if (selectedGroups.length > 1) {
163165
newElements = getAllElementsInGroup(board, selectedGroups[selectedGroups.length - 2], true);
164166
} else {
165-
const element = board.getOneHitElement(elements);
167+
const element = board.getOneHitElement(elements, hitPoint);
166168
if (element) {
167169
newElements = [element];
168170
}
@@ -172,7 +174,7 @@ export function cacheSelectedElementsWithGroup(
172174
if (!isSelectGroupElement) {
173175
newElements = elementsInGroup;
174176
} else {
175-
const element = board.getOneHitElement(elements);
177+
const element = board.getOneHitElement(elements, hitPoint);
176178
if (element) {
177179
newElements = [element];
178180
}

packages/draw/src/plugins/with-draw.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,12 @@ export const withDraw = (board: PlaitBoard) => {
8484
return isHit(element, point, isStrict);
8585
};
8686

87-
board.getOneHitElement = (elements) => {
87+
board.getOneHitElement = (elements, hitPoint: Point) => {
8888
const isAllDrawElements = elements.every((item) => PlaitDrawElement.isDrawElement(item));
8989
if (isAllDrawElements) {
90-
return getHitDrawElement(board, elements as PlaitDrawElement[]);
90+
return getHitDrawElement(board, elements as PlaitDrawElement[], hitPoint);
9191
}
92-
return getOneHitElement(elements);
92+
return getOneHitElement(elements, hitPoint);
9393
};
9494

9595
board.isInsidePoint = (element: PlaitElement, point: Point) => {

packages/draw/src/utils/hit.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ export const isRectangleHitRotatedPoints = (rectangle: RectangleClient, points:
140140
return isLineHitRectangle(rotatedPoints, rectangle);
141141
};
142142

143-
export const getHitDrawElement = (board: PlaitBoard, elements: (PlaitDrawElement | PlaitCustomGeometry)[]) => {
143+
export const getHitDrawElement = (board: PlaitBoard, elements: (PlaitDrawElement | PlaitCustomGeometry)[], hitPoint: Point) => {
144144
let firstFilledElement = getFirstFilledDrawElement(board, elements);
145145
let endIndex = elements.length;
146146
if (firstFilledElement) {

packages/mind/src/plugins/with-mind.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,12 @@ export const withMind = (baseBoard: PlaitBoard) => {
128128
return isHit(element, point, isStrict);
129129
};
130130

131-
board.getOneHitElement = (elements) => {
131+
board.getOneHitElement = (elements, hitPoint: Point) => {
132132
const isAllMindElements = elements.every((item) => MindElement.isMindElement(board, item));
133133
if (isAllMindElements) {
134134
return elements[0];
135135
}
136-
return getOneHitElement(elements);
136+
return getOneHitElement(elements, hitPoint);
137137
};
138138

139139
board.isMovable = (element) => {

src/app/plugins/with-common.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { PlaitBoard, PlaitElement, PlaitI18nBoard } from '@plait/core';
1+
import { P, PlaitBoard, PlaitElement, PlaitI18nBoard, Point } from '@plait/core';
22
import { ImageProps, isFilled, PlaitImageBoard, sortElementsByArea } from '@plait/common';
33
import { AngularBoard } from '@plait/angular-board';
44
import { PlaitImageComponent } from '../editor/image/image.component';
@@ -17,13 +17,13 @@ export const withCommonPlugin = (board: PlaitBoard) => {
1717
return ref;
1818
};
1919

20-
newBoard.getOneHitElement = (elements: PlaitElement[]) => {
20+
newBoard.getOneHitElement = (elements: PlaitElement[], hitPoint: Point) => {
2121
const hasMindElements = elements.some((item) => MindElement.isMindElement(board, item));
2222
const hasDrawElements = elements.some((item) => PlaitDrawElement.isDrawElement(item));
2323
if (hasMindElements && hasDrawElements) {
2424
return getCommonHitElement(board, elements);
2525
}
26-
return getOneHitElement(elements);
26+
return getOneHitElement(elements, hitPoint);
2727
};
2828

2929
newBoard.getI18nValue = (key) => {

0 commit comments

Comments
 (0)