Переглянути джерело

Support negative resize for multiple points line/arrow (#1237)

* Support negative resize for multiple points line

* prettier

* Fix an issue with width or height becoming zero
vanilla_orig
fujimoto kyosuke 5 роки тому
джерело
коміт
b1ed5b4cdc
Аккаунт користувача з таким Email не знайдено

+ 8
- 29
src/element/resizeElements.ts Переглянути файл

144
             width,
144
             width,
145
             height,
145
             height,
146
             ...adjustXYWithRotation("nw", element, deltaX, dY, angle),
146
             ...adjustXYWithRotation("nw", element, deltaX, dY, angle),
147
-            ...(isLinearElement(element) && width >= 0 && height >= 0
147
+            ...(isLinearElement(element) && width !== 0 && height !== 0
148
               ? {
148
               ? {
149
                   points: rescalePoints(
149
                   points: rescalePoints(
150
                     0,
150
                     0,
176
             width,
176
             width,
177
             height,
177
             height,
178
             ...adjustXYWithRotation("ne", element, deltaX, dY, angle),
178
             ...adjustXYWithRotation("ne", element, deltaX, dY, angle),
179
-            ...(isLinearElement(element) && width >= 0 && height >= 0
179
+            ...(isLinearElement(element) && width !== 0 && height !== 0
180
               ? {
180
               ? {
181
                   points: rescalePoints(
181
                   points: rescalePoints(
182
                     0,
182
                     0,
208
             width,
208
             width,
209
             height,
209
             height,
210
             ...adjustXYWithRotation("sw", element, deltaX, dY, angle),
210
             ...adjustXYWithRotation("sw", element, deltaX, dY, angle),
211
-            ...(isLinearElement(element) && width >= 0 && height >= 0
211
+            ...(isLinearElement(element) && width !== 0 && height !== 0
212
               ? {
212
               ? {
213
                   points: rescalePoints(
213
                   points: rescalePoints(
214
                     0,
214
                     0,
240
             width,
240
             width,
241
             height,
241
             height,
242
             ...adjustXYWithRotation("se", element, deltaX, dY, angle),
242
             ...adjustXYWithRotation("se", element, deltaX, dY, angle),
243
-            ...(isLinearElement(element) && width >= 0 && height >= 0
243
+            ...(isLinearElement(element) && width !== 0 && height !== 0
244
               ? {
244
               ? {
245
                   points: rescalePoints(
245
                   points: rescalePoints(
246
                     0,
246
                     0,
255
       case "n": {
255
       case "n": {
256
         const height = element.height - deltaY;
256
         const height = element.height - deltaY;
257
 
257
 
258
-        if (isLinearElement(element)) {
259
-          if (element.points.length > 2 && height <= 0) {
260
-            // Someday we should implement logic to flip the shape.
261
-            // But for now, just stop.
262
-            break;
263
-          }
258
+        if (isLinearElement(element) && height !== 0) {
264
           mutateElement(element, {
259
           mutateElement(element, {
265
             height,
260
             height,
266
             ...adjustXYWithRotation("n", element, 0, deltaY, angle),
261
             ...adjustXYWithRotation("n", element, 0, deltaY, angle),
278
       case "w": {
273
       case "w": {
279
         const width = element.width - deltaX;
274
         const width = element.width - deltaX;
280
 
275
 
281
-        if (isLinearElement(element)) {
282
-          if (element.points.length > 2 && width <= 0) {
283
-            // Someday we should implement logic to flip the shape.
284
-            // But for now, just stop.
285
-            break;
286
-          }
287
-
276
+        if (isLinearElement(element) && width !== 0) {
288
           mutateElement(element, {
277
           mutateElement(element, {
289
             width,
278
             width,
290
             ...adjustXYWithRotation("w", element, deltaX, 0, angle),
279
             ...adjustXYWithRotation("w", element, deltaX, 0, angle),
301
       case "s": {
290
       case "s": {
302
         const height = element.height + deltaY;
291
         const height = element.height + deltaY;
303
 
292
 
304
-        if (isLinearElement(element)) {
305
-          if (element.points.length > 2 && height <= 0) {
306
-            // Someday we should implement logic to flip the shape.
307
-            // But for now, just stop.
308
-            break;
309
-          }
293
+        if (isLinearElement(element) && height !== 0) {
310
           mutateElement(element, {
294
           mutateElement(element, {
311
             height,
295
             height,
312
             ...adjustXYWithRotation("s", element, 0, deltaY, angle),
296
             ...adjustXYWithRotation("s", element, 0, deltaY, angle),
323
       case "e": {
307
       case "e": {
324
         const width = element.width + deltaX;
308
         const width = element.width + deltaX;
325
 
309
 
326
-        if (isLinearElement(element)) {
327
-          if (element.points.length > 2 && width <= 0) {
328
-            // Someday we should implement logic to flip the shape.
329
-            // But for now, just stop.
330
-            break;
331
-          }
310
+        if (isLinearElement(element) && width !== 0) {
332
           mutateElement(element, {
311
           mutateElement(element, {
333
             width,
312
             width,
334
             ...adjustXYWithRotation("e", element, deltaX, 0, angle),
313
             ...adjustXYWithRotation("e", element, deltaX, 0, angle),

+ 1
- 2
src/element/resizeTest.ts Переглянути файл

10
   handlerRectangles,
10
   handlerRectangles,
11
 } from "./handlerRectangles";
11
 } from "./handlerRectangles";
12
 import { AppState } from "../types";
12
 import { AppState } from "../types";
13
-import { isLinearElement } from "./typeChecks";
14
 
13
 
15
 type HandlerRectanglesRet = keyof ReturnType<typeof handlerRectangles>;
14
 type HandlerRectanglesRet = keyof ReturnType<typeof handlerRectangles>;
16
 
15
 
155
   element: ExcalidrawElement,
154
   element: ExcalidrawElement,
156
   resizeHandle: HandlerRectanglesRet,
155
   resizeHandle: HandlerRectanglesRet,
157
 ): HandlerRectanglesRet {
156
 ): HandlerRectanglesRet {
158
-  if ((element.width >= 0 && element.height >= 0) || isLinearElement(element)) {
157
+  if (element.width >= 0 && element.height >= 0) {
159
     return resizeHandle;
158
     return resizeHandle;
160
   }
159
   }
161
 
160
 

+ 1
- 5
src/element/sizeHelpers.ts Переглянути файл

81
 export function normalizeDimensions(
81
 export function normalizeDimensions(
82
   element: ExcalidrawElement | null,
82
   element: ExcalidrawElement | null,
83
 ): element is ExcalidrawElement {
83
 ): element is ExcalidrawElement {
84
-  if (
85
-    !element ||
86
-    (element.width >= 0 && element.height >= 0) ||
87
-    isLinearElement(element)
88
-  ) {
84
+  if (!element || (element.width >= 0 && element.height >= 0)) {
89
     return false;
85
     return false;
90
   }
86
   }
91
 
87
 

Завантаження…
Відмінити
Зберегти