@plait/mind 0.19.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/base/base.drawer.d.ts +3 -3
- package/base/image-base.component.d.ts +5 -3
- package/constants/index.d.ts +0 -1
- package/drawer/node-image.drawer.d.ts +3 -5
- package/esm2020/base/base.drawer.mjs +1 -1
- package/esm2020/base/image-base.component.mjs +9 -5
- package/esm2020/constants/index.mjs +1 -2
- package/esm2020/drawer/node-image.drawer.mjs +34 -39
- package/esm2020/interfaces/element.mjs +1 -1
- package/esm2020/node.component.mjs +8 -9
- package/esm2020/plugins/with-abstract-resize.mjs +1 -2
- package/esm2020/plugins/with-mind-hotkey.mjs +3 -2
- package/esm2020/plugins/with-mind.mjs +9 -14
- package/esm2020/plugins/with-node-dnd.mjs +5 -5
- package/esm2020/plugins/with-node-hover.mjs +3 -10
- package/esm2020/plugins/with-node-image.mjs +46 -0
- package/esm2020/plugins/with-node-resize.mjs +119 -0
- package/esm2020/transforms/index.mjs +3 -2
- package/esm2020/transforms/node.mjs +19 -7
- package/esm2020/utils/clipboard.mjs +4 -4
- package/esm2020/utils/dnd/detector.mjs +3 -10
- package/esm2020/utils/mind.mjs +3 -3
- package/esm2020/utils/node/adjust-node.mjs +3 -3
- package/esm2020/utils/node/common.mjs +11 -2
- package/esm2020/utils/node/image.mjs +23 -0
- package/esm2020/utils/position/image.mjs +9 -4
- package/esm2020/utils/position/topic.mjs +3 -3
- package/esm2020/utils/space/node-space.mjs +59 -24
- package/fesm2015/plait-mind.mjs +312 -148
- package/fesm2015/plait-mind.mjs.map +1 -1
- package/fesm2020/plait-mind.mjs +312 -147
- package/fesm2020/plait-mind.mjs.map +1 -1
- package/interfaces/element.d.ts +1 -0
- package/node.component.d.ts +0 -1
- package/package.json +1 -1
- package/plugins/with-mind-hotkey.d.ts +2 -1
- package/plugins/with-mind.d.ts +1 -1
- package/plugins/with-node-image.d.ts +2 -0
- package/plugins/with-node-resize.d.ts +10 -0
- package/styles/styles.scss +9 -2
- package/transforms/index.d.ts +3 -2
- package/transforms/node.d.ts +4 -2
- package/utils/clipboard.d.ts +3 -2
- package/utils/mind.d.ts +3 -2
- package/utils/node/adjust-node.d.ts +2 -1
- package/utils/node/common.d.ts +2 -0
- package/utils/node/image.d.ts +6 -0
- package/utils/space/node-space.d.ts +9 -3
- package/constants/node-rule.d.ts +0 -1
- package/esm2020/constants/node-rule.mjs +0 -2
- package/esm2020/plugins/with-mind-image.mjs +0 -49
- package/plugins/with-mind-image.d.ts +0 -2
package/fesm2015/plait-mind.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Directive, Input, Component, ChangeDetectionStrategy, NgModule, NgZone, HostListener } from '@angular/core';
|
|
3
3
|
import * as i2 from '@plait/core';
|
|
4
|
-
import { DefaultThemeColor, ColorfulThemeColor, SoftThemeColor, RetroThemeColor, DarkThemeColor, StarryThemeColor, RectangleClient, PlaitElement, idCreator, isNullOrUndefined, Transforms, clearSelectedElement, addSelectedElement, PlaitNode, Path, PlaitBoard, depthFirstRecursion, drawLinearPath, drawBezierPath, createG, updateForeignObject, drawRoundRectangle, getRectangleByElements, getSelectedElements, NODE_TO_PARENT, distanceBetweenPointAndRectangle, createForeignObject, createText, PlaitPointerType, PlaitPluginElementComponent, NODE_TO_INDEX, PlaitModule, transformPoint, toPoint, getHitElements, distanceBetweenPointAndPoint, CLIP_BOARD_FORMAT_KEY,
|
|
4
|
+
import { DefaultThemeColor, ColorfulThemeColor, SoftThemeColor, RetroThemeColor, DarkThemeColor, StarryThemeColor, RectangleClient, PlaitElement, PlaitPluginKey, idCreator, isNullOrUndefined, Transforms, clearSelectedElement, addSelectedElement, PlaitNode, Path, PlaitBoard, depthFirstRecursion, getIsRecursionFunc, drawLinearPath, drawBezierPath, createG, updateForeignObject, drawRoundRectangle, getRectangleByElements, getSelectedElements, NODE_TO_PARENT, distanceBetweenPointAndRectangle, createForeignObject, createText, PlaitPointerType, PlaitPluginElementComponent, NODE_TO_INDEX, PlaitModule, isMainPointer, transformPoint, toPoint, getHitElements, distanceBetweenPointAndPoint, CLIP_BOARD_FORMAT_KEY, BOARD_TO_HOST, throttleRAF, BoardTransforms, removeSelectedElement, PlaitHistoryBoard, hotkeys, PRESS_AND_MOVE_BUFFER, MERGING, ResizeCursorClass } from '@plait/core';
|
|
5
5
|
import { MindLayoutType, isIndentedLayout, AbstractNode, getNonAbstractChildren, isStandardLayout, isLeftLayout, isRightLayout, isVerticalLogicLayout, isHorizontalLogicLayout, isTopLayout, isBottomLayout, isHorizontalLayout, getCorrectStartEnd, getAbstractLayout, ConnectingPosition, GlobalLayout } from '@plait/layouts';
|
|
6
|
-
import { TEXT_DEFAULT_HEIGHT, buildText, getTextSize, TextManage, ExitOrigin, TextModule, getTextFromClipboard } from '@plait/text';
|
|
6
|
+
import { PlaitMarkEditor, MarkTypes, DEFAULT_FONT_SIZE, TEXT_DEFAULT_HEIGHT, buildText, getTextSize, TextManage, ExitOrigin, TextModule, getTextFromClipboard } from '@plait/text';
|
|
7
7
|
import { fromEvent, Subject } from 'rxjs';
|
|
8
8
|
import { Node, Path as Path$1 } from 'slate';
|
|
9
9
|
import { isKeyHotkey } from 'is-hotkey';
|
|
@@ -180,13 +180,21 @@ function getEmojiFontSize(element) {
|
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
+
const TOPIC_COLOR = '#333';
|
|
184
|
+
const TOPIC_FONT_SIZE = 14;
|
|
185
|
+
const ROOT_TOPIC_FONT_SIZE = 18;
|
|
186
|
+
const ROOT_TOPIC_HEIGHT = 25;
|
|
187
|
+
const TOPIC_DEFAULT_MAX_WORD_COUNT = 34;
|
|
188
|
+
const DEFAULT_FONT_FAMILY = 'PingFangSC-Regular, "PingFang SC"';
|
|
189
|
+
const BRANCH_FONT_FAMILY = 'PingFangSC-Medium, "PingFang SC"';
|
|
190
|
+
|
|
183
191
|
const NodeDefaultSpace = {
|
|
184
192
|
horizontal: {
|
|
185
|
-
nodeAndText: BASE *
|
|
193
|
+
nodeAndText: BASE * 2.5,
|
|
186
194
|
emojiAndText: BASE * 1.5
|
|
187
195
|
},
|
|
188
196
|
vertical: {
|
|
189
|
-
nodeAndText: BASE
|
|
197
|
+
nodeAndText: BASE,
|
|
190
198
|
nodeAndImage: BASE,
|
|
191
199
|
imageAndText: BASE * 1.5
|
|
192
200
|
}
|
|
@@ -203,12 +211,14 @@ const RootDefaultSpace = {
|
|
|
203
211
|
const getHorizontalSpaceBetweenNodeAndText = (board, element) => {
|
|
204
212
|
const isMind = PlaitMind.isMind(element);
|
|
205
213
|
const nodeAndText = isMind ? RootDefaultSpace.horizontal.nodeAndText : NodeDefaultSpace.horizontal.nodeAndText;
|
|
206
|
-
|
|
214
|
+
const strokeWidth = getStrokeWidthByElement(board, element);
|
|
215
|
+
return nodeAndText + strokeWidth / 2;
|
|
207
216
|
};
|
|
208
|
-
const getVerticalSpaceBetweenNodeAndText = (element) => {
|
|
217
|
+
const getVerticalSpaceBetweenNodeAndText = (board, element) => {
|
|
209
218
|
const isMind = PlaitMind.isMind(element);
|
|
219
|
+
const strokeWidth = getStrokeWidthByElement(board, element);
|
|
210
220
|
const nodeAndText = isMind ? RootDefaultSpace.vertical.nodeAndText : NodeDefaultSpace.vertical.nodeAndText;
|
|
211
|
-
return nodeAndText;
|
|
221
|
+
return nodeAndText + strokeWidth / 2;
|
|
212
222
|
};
|
|
213
223
|
const getSpaceEmojiAndText = (element) => {
|
|
214
224
|
const isMind = PlaitMind.isMind(element);
|
|
@@ -217,29 +227,45 @@ const getSpaceEmojiAndText = (element) => {
|
|
|
217
227
|
};
|
|
218
228
|
const NodeSpace = {
|
|
219
229
|
getNodeWidth(board, element) {
|
|
220
|
-
var _a;
|
|
221
230
|
const nodeAndText = getHorizontalSpaceBetweenNodeAndText(board, element);
|
|
222
|
-
const imageWidth = MindElement.hasImage(element) ? (_a = element.data.image) === null || _a === void 0 ? void 0 : _a.width : 0;
|
|
223
231
|
if (MindElement.hasEmojis(element)) {
|
|
224
232
|
return (NodeSpace.getEmojiLeftSpace(board, element) +
|
|
225
233
|
getEmojisWidthHeight(board, element).width +
|
|
226
234
|
getSpaceEmojiAndText(element) +
|
|
227
|
-
|
|
235
|
+
NodeSpace.getNodeResizableWidth(board, element) +
|
|
228
236
|
nodeAndText);
|
|
229
237
|
}
|
|
230
|
-
return nodeAndText +
|
|
238
|
+
return nodeAndText + NodeSpace.getNodeResizableWidth(board, element) + nodeAndText;
|
|
231
239
|
},
|
|
232
240
|
getNodeHeight(board, element) {
|
|
233
|
-
const nodeAndText = getVerticalSpaceBetweenNodeAndText(element);
|
|
241
|
+
const nodeAndText = getVerticalSpaceBetweenNodeAndText(board, element);
|
|
234
242
|
if (MindElement.hasImage(element)) {
|
|
235
|
-
return (
|
|
236
|
-
element.data.image.height +
|
|
237
|
-
NodeDefaultSpace.vertical.imageAndText +
|
|
238
|
-
element.height +
|
|
239
|
-
nodeAndText);
|
|
243
|
+
return NodeSpace.getTextTopSpace(board, element) + element.height + nodeAndText;
|
|
240
244
|
}
|
|
241
245
|
return nodeAndText + element.height + nodeAndText;
|
|
242
246
|
},
|
|
247
|
+
getNodeResizableWidth(board, element) {
|
|
248
|
+
var _a;
|
|
249
|
+
const width = element.manualWidth || element.width;
|
|
250
|
+
const imageWidth = MindElement.hasImage(element) ? (_a = element.data.image) === null || _a === void 0 ? void 0 : _a.width : 0;
|
|
251
|
+
return Math.max(width, imageWidth);
|
|
252
|
+
},
|
|
253
|
+
getNodeResizableMinWidth(board, element) {
|
|
254
|
+
const minTopicWidth = NodeSpace.getNodeTopicMinWidth(board, element);
|
|
255
|
+
if (MindElement.hasImage(element) && element.data.image.width > minTopicWidth) {
|
|
256
|
+
return element.data.image.width;
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
return minTopicWidth;
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
getNodeTopicMinWidth(board, element, isRoot = false) {
|
|
263
|
+
const defaultFontSize = getNodeDefaultFontSize(isRoot);
|
|
264
|
+
const editor = MindElement.getTextEditor(element);
|
|
265
|
+
const marks = PlaitMarkEditor.getMarks(editor);
|
|
266
|
+
const fontSize = marks[MarkTypes.fontSize] || defaultFontSize;
|
|
267
|
+
return fontSize;
|
|
268
|
+
},
|
|
243
269
|
getTextLeftSpace(board, element) {
|
|
244
270
|
const nodeAndText = getHorizontalSpaceBetweenNodeAndText(board, element);
|
|
245
271
|
if (MindElement.hasEmojis(element)) {
|
|
@@ -249,28 +275,43 @@ const NodeSpace = {
|
|
|
249
275
|
return nodeAndText;
|
|
250
276
|
}
|
|
251
277
|
},
|
|
252
|
-
getTextTopSpace(element) {
|
|
253
|
-
const nodeAndText = getVerticalSpaceBetweenNodeAndText(element);
|
|
278
|
+
getTextTopSpace(board, element) {
|
|
279
|
+
const nodeAndText = getVerticalSpaceBetweenNodeAndText(board, element);
|
|
254
280
|
if (MindElement.hasImage(element)) {
|
|
255
|
-
return element.data.image.height + NodeDefaultSpace.vertical.
|
|
281
|
+
return NodeSpace.getImageTopSpace(board, element) + element.data.image.height + NodeDefaultSpace.vertical.imageAndText;
|
|
256
282
|
}
|
|
257
283
|
else {
|
|
258
284
|
return nodeAndText;
|
|
259
285
|
}
|
|
260
286
|
},
|
|
261
|
-
getImageTopSpace(element) {
|
|
262
|
-
|
|
287
|
+
getImageTopSpace(board, element) {
|
|
288
|
+
const strokeWidth = getStrokeWidthByElement(board, element);
|
|
289
|
+
return strokeWidth / 2 + NodeDefaultSpace.vertical.nodeAndImage;
|
|
263
290
|
},
|
|
264
291
|
getEmojiLeftSpace(board, element) {
|
|
265
292
|
const options = board.getPluginOptions(WithMindPluginKey);
|
|
266
293
|
const nodeAndText = getHorizontalSpaceBetweenNodeAndText(board, element);
|
|
267
|
-
|
|
294
|
+
const strokeWidth = getStrokeWidthByElement(board, element);
|
|
295
|
+
return strokeWidth / 2 + nodeAndText - options.emojiPadding;
|
|
268
296
|
},
|
|
269
|
-
getEmojiTopSpace(element) {
|
|
270
|
-
const nodeAndText = getVerticalSpaceBetweenNodeAndText(element);
|
|
297
|
+
getEmojiTopSpace(board, element) {
|
|
298
|
+
const nodeAndText = getVerticalSpaceBetweenNodeAndText(board, element);
|
|
271
299
|
return nodeAndText;
|
|
272
300
|
}
|
|
273
301
|
};
|
|
302
|
+
const getFontSizeBySlateElement = (text) => {
|
|
303
|
+
const defaultFontSize = DEFAULT_FONT_SIZE;
|
|
304
|
+
if (typeof text === 'string') {
|
|
305
|
+
return defaultFontSize;
|
|
306
|
+
}
|
|
307
|
+
const marks = PlaitMarkEditor.getMarksByElement(text);
|
|
308
|
+
const fontSize = marks[MarkTypes.fontSize] || defaultFontSize;
|
|
309
|
+
return fontSize;
|
|
310
|
+
};
|
|
311
|
+
const getNodeDefaultFontSize = (isRoot = false) => {
|
|
312
|
+
const defaultFontSize = isRoot ? ROOT_TOPIC_FONT_SIZE : DEFAULT_FONT_SIZE;
|
|
313
|
+
return defaultFontSize;
|
|
314
|
+
};
|
|
274
315
|
|
|
275
316
|
function getEmojiRectangle(board, element) {
|
|
276
317
|
let { x, y } = getRectangleByNode(MindElement.getNode(element));
|
|
@@ -307,43 +348,47 @@ function getTopicRectangleByNode(board, node) {
|
|
|
307
348
|
}
|
|
308
349
|
function getTopicRectangleByElement(board, nodeRectangle, element) {
|
|
309
350
|
const x = nodeRectangle.x + NodeSpace.getTextLeftSpace(board, element);
|
|
310
|
-
const y = nodeRectangle.y + NodeSpace.getTextTopSpace(element);
|
|
311
|
-
const width =
|
|
351
|
+
const y = nodeRectangle.y + NodeSpace.getTextTopSpace(board, element);
|
|
352
|
+
const width = NodeSpace.getNodeResizableWidth(board, element);
|
|
312
353
|
const height = Math.ceil(element.height);
|
|
313
354
|
return { height, width, x, y };
|
|
314
355
|
}
|
|
315
356
|
|
|
316
357
|
function getImageForeignRectangle(board, element) {
|
|
317
358
|
let { x, y } = getRectangleByNode(MindElement.getNode(element));
|
|
318
|
-
|
|
319
|
-
|
|
359
|
+
const elementWidth = element.manualWidth || element.width;
|
|
360
|
+
x =
|
|
361
|
+
elementWidth > element.data.image.width
|
|
362
|
+
? x + NodeSpace.getTextLeftSpace(board, element) + (elementWidth - element.data.image.width) / 2
|
|
363
|
+
: x + NodeSpace.getTextLeftSpace(board, element);
|
|
364
|
+
y = NodeSpace.getImageTopSpace(board, element) + y;
|
|
320
365
|
const { width, height } = element.data.image;
|
|
321
|
-
|
|
366
|
+
const rectangle = {
|
|
322
367
|
x,
|
|
323
368
|
y,
|
|
324
369
|
width,
|
|
325
370
|
height
|
|
326
371
|
};
|
|
372
|
+
return RectangleClient.getOutlineRectangle(rectangle, -6);
|
|
327
373
|
}
|
|
328
374
|
const isHitImage = (board, element, range) => {
|
|
329
375
|
const client = getImageForeignRectangle(board, element);
|
|
330
376
|
return RectangleClient.isHit(RectangleClient.toRectangleClient([range.anchor, range.focus]), client);
|
|
331
377
|
};
|
|
332
378
|
|
|
333
|
-
const NODE_MIN_WIDTH = 18;
|
|
334
|
-
|
|
335
379
|
function editTopic(element) {
|
|
336
380
|
const component = PlaitElement.getComponent(element);
|
|
337
381
|
component === null || component === void 0 ? void 0 : component.editTopic();
|
|
338
382
|
}
|
|
339
|
-
|
|
340
|
-
const
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
383
|
+
const temporaryDisableSelection = (board) => {
|
|
384
|
+
const currentOptions = board.getPluginOptions(PlaitPluginKey.withSelection);
|
|
385
|
+
board.setPluginOptions(PlaitPluginKey.withSelection, {
|
|
386
|
+
isDisabledSelect: true
|
|
387
|
+
});
|
|
388
|
+
setTimeout(() => {
|
|
389
|
+
board.setPluginOptions(PlaitPluginKey.withSelection, Object.assign({}, currentOptions));
|
|
390
|
+
}, 0);
|
|
391
|
+
};
|
|
347
392
|
|
|
348
393
|
const createEmptyMind = (point) => {
|
|
349
394
|
const element = createMindElement('思维导图', 72, ROOT_TOPIC_HEIGHT, { layout: MindLayoutType.right });
|
|
@@ -454,7 +499,7 @@ const insertMindElement = (board, inheritNode, path) => {
|
|
|
454
499
|
});
|
|
455
500
|
delete newNode.layout;
|
|
456
501
|
}
|
|
457
|
-
const newElement = createMindElement('',
|
|
502
|
+
const newElement = createMindElement('', getNodeDefaultFontSize(), TEXT_DEFAULT_HEIGHT, newNode);
|
|
458
503
|
Transforms.insertNode(board, newElement, path);
|
|
459
504
|
clearSelectedElement(board);
|
|
460
505
|
addSelectedElement(board, newElement);
|
|
@@ -620,7 +665,7 @@ const adjustNodeToRoot = (board, node) => {
|
|
|
620
665
|
fontSize: ROOT_TOPIC_FONT_SIZE,
|
|
621
666
|
fontFamily: BRANCH_FONT_FAMILY
|
|
622
667
|
});
|
|
623
|
-
newElement.width = Math.max(width,
|
|
668
|
+
newElement.width = Math.max(width, getNodeDefaultFontSize(true));
|
|
624
669
|
newElement.height = height;
|
|
625
670
|
return Object.assign(Object.assign({}, newElement), { layout: (_a = newElement.layout) !== null && _a !== void 0 ? _a : MindLayoutType.right, isRoot: true, type: 'mindmap' });
|
|
626
671
|
};
|
|
@@ -1036,14 +1081,7 @@ const detectDropTarget = (board, detectPoint, dropTarget, activeElements) => {
|
|
|
1036
1081
|
if (detectResult && isValid) {
|
|
1037
1082
|
dropTarget = { target: node.origin, detectResult: detectResult[0] };
|
|
1038
1083
|
}
|
|
1039
|
-
},
|
|
1040
|
-
if (PlaitBoard.isBoard(node) || board.isRecursion(node)) {
|
|
1041
|
-
return true;
|
|
1042
|
-
}
|
|
1043
|
-
else {
|
|
1044
|
-
return false;
|
|
1045
|
-
}
|
|
1046
|
-
});
|
|
1084
|
+
}, getIsRecursionFunc(board));
|
|
1047
1085
|
return dropTarget;
|
|
1048
1086
|
};
|
|
1049
1087
|
const directionDetector = (targetNode, centerPoint) => {
|
|
@@ -2212,19 +2250,31 @@ const correctLogicLayoutNode = (board, layout, path) => {
|
|
|
2212
2250
|
}
|
|
2213
2251
|
};
|
|
2214
2252
|
|
|
2215
|
-
const normalizeWidthAndHeight = (board, width, height) => {
|
|
2216
|
-
const
|
|
2253
|
+
const normalizeWidthAndHeight = (board, element, width, height) => {
|
|
2254
|
+
const minWidth = NodeSpace.getNodeTopicMinWidth(board, element, element.isRoot);
|
|
2255
|
+
const newWidth = width < minWidth * board.viewport.zoom ? minWidth : width / board.viewport.zoom;
|
|
2217
2256
|
const newHeight = height / board.viewport.zoom;
|
|
2218
2257
|
return { width: newWidth, height: newHeight };
|
|
2219
2258
|
};
|
|
2220
2259
|
const setTopic = (board, element, topic, width, height) => {
|
|
2221
|
-
const newElement = Object.assign({ data: Object.assign(Object.assign({}, element.data), { topic }) }, normalizeWidthAndHeight(board, width, height));
|
|
2260
|
+
const newElement = Object.assign({ data: Object.assign(Object.assign({}, element.data), { topic }) }, normalizeWidthAndHeight(board, element, width, height));
|
|
2261
|
+
const path = PlaitBoard.findPath(board, element);
|
|
2262
|
+
Transforms.setNode(board, newElement, path);
|
|
2263
|
+
};
|
|
2264
|
+
const setNodeManualWidth = (board, element, width, height) => {
|
|
2222
2265
|
const path = PlaitBoard.findPath(board, element);
|
|
2266
|
+
const { width: normalizedWidth, height: normalizedHeight } = normalizeWidthAndHeight(board, element, width, height);
|
|
2267
|
+
const newElement = { manualWidth: normalizedWidth, height: normalizedHeight };
|
|
2223
2268
|
Transforms.setNode(board, newElement, path);
|
|
2224
2269
|
};
|
|
2225
2270
|
const setTopicSize = (board, element, width, height) => {
|
|
2226
|
-
const newElement = Object.assign({}, normalizeWidthAndHeight(board, width, height));
|
|
2227
|
-
|
|
2271
|
+
const newElement = Object.assign({}, normalizeWidthAndHeight(board, element, width, height));
|
|
2272
|
+
let isEqualWidth = Math.ceil(element.width) === Math.ceil(newElement.width);
|
|
2273
|
+
let isEqualHeight = Math.ceil(element.height) === Math.ceil(newElement.height);
|
|
2274
|
+
if (element.manualWidth) {
|
|
2275
|
+
isEqualWidth = true;
|
|
2276
|
+
}
|
|
2277
|
+
if (!isEqualWidth || !isEqualHeight) {
|
|
2228
2278
|
const path = PlaitBoard.findPath(board, element);
|
|
2229
2279
|
Transforms.setNode(board, newElement, path);
|
|
2230
2280
|
}
|
|
@@ -2318,6 +2368,7 @@ const MindTransforms = {
|
|
|
2318
2368
|
setLayout,
|
|
2319
2369
|
setTopic,
|
|
2320
2370
|
setTopicSize,
|
|
2371
|
+
setNodeManualWidth,
|
|
2321
2372
|
addEmoji,
|
|
2322
2373
|
removeEmoji,
|
|
2323
2374
|
replaceEmoji,
|
|
@@ -2692,13 +2743,15 @@ class MindImageBaseComponent {
|
|
|
2692
2743
|
get nativeElement() {
|
|
2693
2744
|
return this.elementRef.nativeElement;
|
|
2694
2745
|
}
|
|
2695
|
-
constructor(elementRef) {
|
|
2746
|
+
constructor(elementRef, cdr) {
|
|
2696
2747
|
this.elementRef = elementRef;
|
|
2748
|
+
this.cdr = cdr;
|
|
2749
|
+
this.isFocus = false;
|
|
2697
2750
|
}
|
|
2698
2751
|
ngOnInit() { }
|
|
2699
2752
|
}
|
|
2700
|
-
MindImageBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: MindImageBaseComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
2701
|
-
MindImageBaseComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.5", type: MindImageBaseComponent, inputs: { imageItem: "imageItem", board: "board", element: "element" }, host: { classAttribute: "mind-node-image" }, ngImport: i0 });
|
|
2753
|
+
MindImageBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: MindImageBaseComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
2754
|
+
MindImageBaseComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.5", type: MindImageBaseComponent, inputs: { imageItem: "imageItem", board: "board", element: "element", isFocus: "isFocus" }, host: { classAttribute: "mind-node-image" }, ngImport: i0 });
|
|
2702
2755
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: MindImageBaseComponent, decorators: [{
|
|
2703
2756
|
type: Directive,
|
|
2704
2757
|
args: [{
|
|
@@ -2706,12 +2759,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImpor
|
|
|
2706
2759
|
class: 'mind-node-image'
|
|
2707
2760
|
}
|
|
2708
2761
|
}]
|
|
2709
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { imageItem: [{
|
|
2762
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { imageItem: [{
|
|
2710
2763
|
type: Input
|
|
2711
2764
|
}], board: [{
|
|
2712
2765
|
type: Input
|
|
2713
2766
|
}], element: [{
|
|
2714
2767
|
type: Input
|
|
2768
|
+
}], isFocus: [{
|
|
2769
|
+
type: Input
|
|
2715
2770
|
}] } });
|
|
2716
2771
|
|
|
2717
2772
|
class NodeImageDrawer {
|
|
@@ -2720,46 +2775,40 @@ class NodeImageDrawer {
|
|
|
2720
2775
|
this.viewContainerRef = viewContainerRef;
|
|
2721
2776
|
this.componentRef = null;
|
|
2722
2777
|
}
|
|
2723
|
-
drawImage(element) {
|
|
2724
|
-
|
|
2725
|
-
|
|
2726
|
-
|
|
2727
|
-
const foreignRectangle = getImageForeignRectangle(this.board, element);
|
|
2728
|
-
const foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);
|
|
2729
|
-
this.g.append(foreignObject);
|
|
2730
|
-
if (this.componentRef) {
|
|
2731
|
-
this.componentRef.destroy();
|
|
2732
|
-
this.componentRef = null;
|
|
2733
|
-
}
|
|
2734
|
-
const componentType = this.board.getPluginOptions(WithMindPluginKey).imageComponentType || MindImageBaseComponent;
|
|
2735
|
-
if (!componentType) {
|
|
2736
|
-
throw new Error('Not implement drawEmoji method error.');
|
|
2737
|
-
}
|
|
2738
|
-
this.componentRef = this.viewContainerRef.createComponent(componentType);
|
|
2739
|
-
this.componentRef.instance.board = this.board;
|
|
2740
|
-
this.componentRef.instance.element = element;
|
|
2741
|
-
this.componentRef.instance.imageItem = element.data.image;
|
|
2742
|
-
foreignObject.append(this.componentRef.instance.nativeElement);
|
|
2743
|
-
return this.g;
|
|
2778
|
+
drawImage(nodeG, element) {
|
|
2779
|
+
if (!MindElement.hasImage(element)) {
|
|
2780
|
+
this.destroy();
|
|
2781
|
+
return;
|
|
2744
2782
|
}
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2749
|
-
this.
|
|
2750
|
-
|
|
2751
|
-
|
|
2752
|
-
|
|
2753
|
-
this.
|
|
2754
|
-
|
|
2755
|
-
|
|
2756
|
-
|
|
2757
|
-
|
|
2758
|
-
|
|
2783
|
+
this.g = createG();
|
|
2784
|
+
const foreignRectangle = getImageForeignRectangle(this.board, element);
|
|
2785
|
+
const foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);
|
|
2786
|
+
this.g.append(foreignObject);
|
|
2787
|
+
const componentType = this.board.getPluginOptions(WithMindPluginKey).imageComponentType || MindImageBaseComponent;
|
|
2788
|
+
if (!componentType) {
|
|
2789
|
+
throw new Error('Not implement drawEmoji method error.');
|
|
2790
|
+
}
|
|
2791
|
+
this.componentRef = this.viewContainerRef.createComponent(componentType);
|
|
2792
|
+
this.componentRef.instance.board = this.board;
|
|
2793
|
+
this.componentRef.instance.element = element;
|
|
2794
|
+
this.componentRef.instance.imageItem = element.data.image;
|
|
2795
|
+
this.componentRef.instance.cdr.markForCheck();
|
|
2796
|
+
foreignObject.append(this.componentRef.instance.nativeElement);
|
|
2797
|
+
nodeG.appendChild(this.g);
|
|
2759
2798
|
}
|
|
2760
|
-
|
|
2799
|
+
updateImage(nodeG, previous, current) {
|
|
2761
2800
|
var _a;
|
|
2762
|
-
(
|
|
2801
|
+
if (!MindElement.hasImage(previous) || !MindElement.hasImage(current)) {
|
|
2802
|
+
this.drawImage(nodeG, current);
|
|
2803
|
+
return;
|
|
2804
|
+
}
|
|
2805
|
+
if (previous !== current && this.componentRef) {
|
|
2806
|
+
this.componentRef.instance.element = current;
|
|
2807
|
+
this.componentRef.instance.imageItem = current.data.image;
|
|
2808
|
+
}
|
|
2809
|
+
const currentForeignObject = getImageForeignRectangle(this.board, current);
|
|
2810
|
+
updateForeignObject(this.g, currentForeignObject.width, currentForeignObject.height, currentForeignObject.x, currentForeignObject.y);
|
|
2811
|
+
(_a = this.componentRef) === null || _a === void 0 ? void 0 : _a.instance.cdr.markForCheck();
|
|
2763
2812
|
}
|
|
2764
2813
|
destroy() {
|
|
2765
2814
|
if (this.g) {
|
|
@@ -2822,13 +2871,17 @@ class MindNodeComponent extends PlaitPluginElementComponent {
|
|
|
2822
2871
|
this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: this.textManage.isEditing });
|
|
2823
2872
|
this.drawEmojis();
|
|
2824
2873
|
this.drawExtend();
|
|
2825
|
-
this.drawImage();
|
|
2874
|
+
this.imageDrawer.drawImage(this.g, this.element);
|
|
2826
2875
|
if (PlaitMind.isMind(this.context.parent)) {
|
|
2827
2876
|
this.g.classList.add('branch');
|
|
2828
2877
|
}
|
|
2829
2878
|
}
|
|
2830
2879
|
editTopic() {
|
|
2831
2880
|
this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: true });
|
|
2881
|
+
if (this.element.manualWidth) {
|
|
2882
|
+
const width = NodeSpace.getNodeResizableWidth(this.board, this.element);
|
|
2883
|
+
this.textManage.updateWidth(width);
|
|
2884
|
+
}
|
|
2832
2885
|
this.textManage.edit((origin) => {
|
|
2833
2886
|
if (origin === ExitOrigin.default) {
|
|
2834
2887
|
this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: false });
|
|
@@ -2845,8 +2898,8 @@ class MindNodeComponent extends PlaitPluginElementComponent {
|
|
|
2845
2898
|
this.drawShape();
|
|
2846
2899
|
this.drawLink();
|
|
2847
2900
|
this.drawEmojis();
|
|
2848
|
-
this.drawImage();
|
|
2849
2901
|
this.drawExtend();
|
|
2902
|
+
this.imageDrawer.updateImage(this.g, previous.element, value.element);
|
|
2850
2903
|
this.textManage.updateText(this.element.data.topic);
|
|
2851
2904
|
this.textManage.updateRectangle();
|
|
2852
2905
|
}
|
|
@@ -2867,12 +2920,6 @@ class MindNodeComponent extends PlaitPluginElementComponent {
|
|
|
2867
2920
|
this.g.append(g);
|
|
2868
2921
|
}
|
|
2869
2922
|
}
|
|
2870
|
-
drawImage() {
|
|
2871
|
-
const image = this.imageDrawer.drawImage(this.element);
|
|
2872
|
-
if (image) {
|
|
2873
|
-
this.g.append(image);
|
|
2874
|
-
}
|
|
2875
|
-
}
|
|
2876
2923
|
drawShape() {
|
|
2877
2924
|
this.destroyShape();
|
|
2878
2925
|
const shape = getShapeByElement(this.board, this.node.origin);
|
|
@@ -3113,7 +3160,7 @@ const withNodeDnd = (board) => {
|
|
|
3113
3160
|
if (PlaitBoard.isReadonly(board) ||
|
|
3114
3161
|
PlaitBoard.hasBeenTextEditing(board) ||
|
|
3115
3162
|
!PlaitBoard.isPointer(board, PlaitPointerType.selection) ||
|
|
3116
|
-
event
|
|
3163
|
+
!isMainPointer(event)) {
|
|
3117
3164
|
mousedown(event);
|
|
3118
3165
|
return;
|
|
3119
3166
|
}
|
|
@@ -3137,11 +3184,11 @@ const withNodeDnd = (board) => {
|
|
|
3137
3184
|
activeElements = [targetElement];
|
|
3138
3185
|
startPoint = point;
|
|
3139
3186
|
}
|
|
3140
|
-
event.preventDefault();
|
|
3141
3187
|
}
|
|
3142
3188
|
if (activeElements.length) {
|
|
3143
|
-
|
|
3189
|
+
// prevent text from being selected
|
|
3144
3190
|
event.preventDefault();
|
|
3191
|
+
correspondingElements = getOverallAbstracts(board, activeElements);
|
|
3145
3192
|
}
|
|
3146
3193
|
mousedown(event);
|
|
3147
3194
|
};
|
|
@@ -3340,7 +3387,7 @@ const insertClipboardData = (board, elements, targetPoint) => {
|
|
|
3340
3387
|
newElement = adjustRootToNode(board, newElement);
|
|
3341
3388
|
const styles = PlaitMind.isMind(targetParent) ? { fontFamily: BRANCH_FONT_FAMILY } : { fontFamily: DEFAULT_FONT_FAMILY };
|
|
3342
3389
|
const { width, height } = getTextSize(board, newElement.data.topic, TOPIC_DEFAULT_MAX_WORD_COUNT, styles);
|
|
3343
|
-
newElement.width = Math.max(width,
|
|
3390
|
+
newElement.width = Math.max(width, getNodeDefaultFontSize());
|
|
3344
3391
|
newElement.height = height;
|
|
3345
3392
|
}
|
|
3346
3393
|
// handle abstract start and end
|
|
@@ -3370,7 +3417,7 @@ const insertClipboardData = (board, elements, targetPoint) => {
|
|
|
3370
3417
|
const insertClipboardText = (board, targetParent, text) => {
|
|
3371
3418
|
const styles = PlaitMind.isMind(targetParent) ? { fontFamily: BRANCH_FONT_FAMILY } : { fontFamily: DEFAULT_FONT_FAMILY };
|
|
3372
3419
|
const { width, height } = getTextSize(board, text, TOPIC_DEFAULT_MAX_WORD_COUNT, styles);
|
|
3373
|
-
const newElement = createMindElement(text, width, height, {});
|
|
3420
|
+
const newElement = createMindElement(text, Math.max(width, getFontSizeBySlateElement(text)), height, {});
|
|
3374
3421
|
Transforms.insertNode(board, newElement, findNewChildNodePath(board, targetParent));
|
|
3375
3422
|
return;
|
|
3376
3423
|
};
|
|
@@ -3410,7 +3457,6 @@ const withAbstract = (board) => {
|
|
|
3410
3457
|
const endPoint = transformPoint(board, toPoint(event.x, event.y, host));
|
|
3411
3458
|
touchedAbstract = handleTouchedAbstract(board, touchedAbstract, endPoint);
|
|
3412
3459
|
if (abstractHandlePosition && activeAbstractElement) {
|
|
3413
|
-
event.preventDefault();
|
|
3414
3460
|
const abstractComponent = PlaitElement.getComponent(activeAbstractElement);
|
|
3415
3461
|
const element = abstractComponent.element;
|
|
3416
3462
|
const nodeLayout = MindQueries.getCorrectLayoutByElement(board, activeAbstractElement);
|
|
@@ -3588,7 +3634,8 @@ const withCreateMind = (board) => {
|
|
|
3588
3634
|
return newBoard;
|
|
3589
3635
|
};
|
|
3590
3636
|
|
|
3591
|
-
const withMindHotkey = (
|
|
3637
|
+
const withMindHotkey = (baseBoard) => {
|
|
3638
|
+
const board = baseBoard;
|
|
3592
3639
|
const { keydown } = board;
|
|
3593
3640
|
board.keydown = (event) => {
|
|
3594
3641
|
const selectedElements = getSelectedElements(board);
|
|
@@ -3718,14 +3765,7 @@ const withNodeHover = (board) => {
|
|
|
3718
3765
|
if (isHitElement) {
|
|
3719
3766
|
target = element;
|
|
3720
3767
|
}
|
|
3721
|
-
},
|
|
3722
|
-
if (PlaitBoard.isBoard(node) || board.isRecursion(node)) {
|
|
3723
|
-
return true;
|
|
3724
|
-
}
|
|
3725
|
-
else {
|
|
3726
|
-
return false;
|
|
3727
|
-
}
|
|
3728
|
-
}, true);
|
|
3768
|
+
}, getIsRecursionFunc(board), true);
|
|
3729
3769
|
if (hoveredMindElement && target && hoveredMindElement === target) {
|
|
3730
3770
|
return;
|
|
3731
3771
|
}
|
|
@@ -3762,7 +3802,29 @@ const removeHovered = (element) => {
|
|
|
3762
3802
|
}
|
|
3763
3803
|
};
|
|
3764
3804
|
|
|
3765
|
-
const
|
|
3805
|
+
const BOARD_TO_SELECTED_IMAGE_ELEMENT = new WeakMap();
|
|
3806
|
+
const getSelectedImageElement = (board) => {
|
|
3807
|
+
return BOARD_TO_SELECTED_IMAGE_ELEMENT.get(board);
|
|
3808
|
+
};
|
|
3809
|
+
const addSelectedImageElement = (board, element) => {
|
|
3810
|
+
BOARD_TO_SELECTED_IMAGE_ELEMENT.set(board, element);
|
|
3811
|
+
};
|
|
3812
|
+
const removeSelectedImageElement = (board) => {
|
|
3813
|
+
BOARD_TO_SELECTED_IMAGE_ELEMENT.delete(board);
|
|
3814
|
+
};
|
|
3815
|
+
const setImageFocus = (board, element, isFocus) => {
|
|
3816
|
+
if (isFocus) {
|
|
3817
|
+
addSelectedImageElement(board, element);
|
|
3818
|
+
}
|
|
3819
|
+
else {
|
|
3820
|
+
removeSelectedImageElement(board);
|
|
3821
|
+
}
|
|
3822
|
+
const elementComponent = PlaitElement.getComponent(element);
|
|
3823
|
+
elementComponent.imageDrawer.componentRef.instance.isFocus = isFocus;
|
|
3824
|
+
elementComponent.imageDrawer.componentRef.instance.cdr.markForCheck();
|
|
3825
|
+
};
|
|
3826
|
+
|
|
3827
|
+
const withNodeImage = (board) => {
|
|
3766
3828
|
let selectedImageElement = null;
|
|
3767
3829
|
const { keydown, mousedown } = board;
|
|
3768
3830
|
board.mousedown = (event) => {
|
|
@@ -3775,26 +3837,21 @@ const withMindImage = (board) => {
|
|
|
3775
3837
|
const hitElements = getHitElements(board, { ranges: [range] });
|
|
3776
3838
|
const hasImage = hitElements.length && MindElement.hasImage(hitElements[0]);
|
|
3777
3839
|
const hitImage = hasImage && isHitImage(board, hitElements[0], range);
|
|
3840
|
+
if (selectedImageElement && hitImage && hitElements[0] === selectedImageElement) {
|
|
3841
|
+
temporaryDisableSelection(board);
|
|
3842
|
+
mousedown(event);
|
|
3843
|
+
return;
|
|
3844
|
+
}
|
|
3845
|
+
if (selectedImageElement) {
|
|
3846
|
+
setImageFocus(board, selectedImageElement, false);
|
|
3847
|
+
selectedImageElement = null;
|
|
3848
|
+
}
|
|
3778
3849
|
if (hitImage) {
|
|
3779
|
-
|
|
3780
|
-
board.setPluginOptions(PlaitPluginKey.withSelection, {
|
|
3781
|
-
isDisabledSelect: true
|
|
3782
|
-
});
|
|
3783
|
-
setTimeout(() => {
|
|
3784
|
-
board.setPluginOptions(PlaitPluginKey.withSelection, Object.assign({}, currentOptions));
|
|
3785
|
-
}, 0);
|
|
3850
|
+
temporaryDisableSelection(board);
|
|
3786
3851
|
selectedImageElement = hitElements[0];
|
|
3787
|
-
|
|
3788
|
-
component.imageDrawer.drawActive(selectedImageElement);
|
|
3852
|
+
setImageFocus(board, selectedImageElement, true);
|
|
3789
3853
|
clearSelectedElement(board);
|
|
3790
3854
|
}
|
|
3791
|
-
else {
|
|
3792
|
-
if (selectedImageElement) {
|
|
3793
|
-
const component = PlaitElement.getComponent(selectedImageElement);
|
|
3794
|
-
component && component.imageDrawer.destroyActive();
|
|
3795
|
-
}
|
|
3796
|
-
selectedImageElement = null;
|
|
3797
|
-
}
|
|
3798
3855
|
mousedown(event);
|
|
3799
3856
|
};
|
|
3800
3857
|
board.keydown = (event) => {
|
|
@@ -3808,8 +3865,122 @@ const withMindImage = (board) => {
|
|
|
3808
3865
|
return board;
|
|
3809
3866
|
};
|
|
3810
3867
|
|
|
3811
|
-
const
|
|
3812
|
-
const {
|
|
3868
|
+
const withNodeResize = (board) => {
|
|
3869
|
+
const { mousedown, mousemove, globalMouseup } = board;
|
|
3870
|
+
let targetElement = null;
|
|
3871
|
+
let targetElementRef = null;
|
|
3872
|
+
let startPoint = null;
|
|
3873
|
+
board.mousedown = (event) => {
|
|
3874
|
+
if (targetElement) {
|
|
3875
|
+
startPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
|
|
3876
|
+
// prevent text from being selected
|
|
3877
|
+
event.preventDefault();
|
|
3878
|
+
return;
|
|
3879
|
+
}
|
|
3880
|
+
mousedown(event);
|
|
3881
|
+
};
|
|
3882
|
+
board.mousemove = (event) => {
|
|
3883
|
+
if (PlaitBoard.isReadonly(board) || PlaitBoard.hasBeenTextEditing(board)) {
|
|
3884
|
+
mousemove(event);
|
|
3885
|
+
return;
|
|
3886
|
+
}
|
|
3887
|
+
if (startPoint && targetElement && !isMindNodeResizing(board)) {
|
|
3888
|
+
const endPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
|
|
3889
|
+
const distance = distanceBetweenPointAndPoint(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);
|
|
3890
|
+
if (distance > PRESS_AND_MOVE_BUFFER) {
|
|
3891
|
+
startPoint = endPoint;
|
|
3892
|
+
addResizing(board, targetElement);
|
|
3893
|
+
targetElementRef = {
|
|
3894
|
+
minWidth: NodeSpace.getNodeResizableMinWidth(board, targetElement),
|
|
3895
|
+
currentWidth: NodeSpace.getNodeResizableWidth(board, targetElement),
|
|
3896
|
+
path: PlaitBoard.findPath(board, targetElement),
|
|
3897
|
+
textManage: PlaitElement.getComponent(targetElement).textManage
|
|
3898
|
+
};
|
|
3899
|
+
MERGING.set(board, true);
|
|
3900
|
+
}
|
|
3901
|
+
}
|
|
3902
|
+
if (isMindNodeResizing(board) && startPoint && targetElementRef) {
|
|
3903
|
+
const endPoint = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
|
|
3904
|
+
const offsetX = endPoint[0] - startPoint[0];
|
|
3905
|
+
let resizedWidth = targetElementRef.currentWidth + offsetX;
|
|
3906
|
+
if (resizedWidth < targetElementRef.minWidth) {
|
|
3907
|
+
resizedWidth = targetElementRef.minWidth;
|
|
3908
|
+
}
|
|
3909
|
+
const newTarget = PlaitNode.get(board, targetElementRef.path);
|
|
3910
|
+
if (newTarget && NodeSpace.getNodeTopicMinWidth(board, newTarget) !== resizedWidth) {
|
|
3911
|
+
targetElementRef.textManage.updateWidth(resizedWidth);
|
|
3912
|
+
const { width, height } = targetElementRef.textManage.getSize();
|
|
3913
|
+
MindTransforms.setNodeManualWidth(board, newTarget, resizedWidth, height);
|
|
3914
|
+
}
|
|
3915
|
+
}
|
|
3916
|
+
else {
|
|
3917
|
+
// press and start drag when node is non selected
|
|
3918
|
+
if (!isDragging(board)) {
|
|
3919
|
+
const point = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
|
|
3920
|
+
const newTargetElement = getTargetElement(board, point);
|
|
3921
|
+
if (newTargetElement) {
|
|
3922
|
+
PlaitBoard.getBoardContainer(board).classList.add(ResizeCursorClass['ew-resize']);
|
|
3923
|
+
}
|
|
3924
|
+
else {
|
|
3925
|
+
PlaitBoard.getBoardContainer(board).classList.remove(ResizeCursorClass['ew-resize']);
|
|
3926
|
+
}
|
|
3927
|
+
targetElement = newTargetElement;
|
|
3928
|
+
}
|
|
3929
|
+
}
|
|
3930
|
+
mousemove(event);
|
|
3931
|
+
};
|
|
3932
|
+
board.globalMouseup = (event) => {
|
|
3933
|
+
globalMouseup(event);
|
|
3934
|
+
if (isMindNodeResizing(board) && targetElement) {
|
|
3935
|
+
removeResizing(board, targetElement);
|
|
3936
|
+
targetElementRef = null;
|
|
3937
|
+
targetElement = null;
|
|
3938
|
+
startPoint = null;
|
|
3939
|
+
MERGING.set(board, false);
|
|
3940
|
+
}
|
|
3941
|
+
};
|
|
3942
|
+
return board;
|
|
3943
|
+
};
|
|
3944
|
+
const IS_MIND_NODE_RESIZING = new WeakMap();
|
|
3945
|
+
const isMindNodeResizing = (board) => {
|
|
3946
|
+
return !!IS_MIND_NODE_RESIZING.get(board);
|
|
3947
|
+
};
|
|
3948
|
+
const addResizing = (board, element) => {
|
|
3949
|
+
PlaitBoard.getBoardContainer(board).classList.add('mind-node-resizing');
|
|
3950
|
+
const component = PlaitElement.getComponent(element);
|
|
3951
|
+
component.g.classList.add('resizing');
|
|
3952
|
+
IS_MIND_NODE_RESIZING.set(board, true);
|
|
3953
|
+
};
|
|
3954
|
+
const removeResizing = (board, element) => {
|
|
3955
|
+
PlaitBoard.getBoardContainer(board).classList.remove('mind-node-resizing');
|
|
3956
|
+
PlaitBoard.getBoardContainer(board).classList.remove(ResizeCursorClass['ew-resize']);
|
|
3957
|
+
const component = PlaitElement.getComponent(element);
|
|
3958
|
+
if (component && component.g) {
|
|
3959
|
+
component.g.classList.remove('resizing');
|
|
3960
|
+
}
|
|
3961
|
+
IS_MIND_NODE_RESIZING.set(board, false);
|
|
3962
|
+
};
|
|
3963
|
+
const getTargetElement = (board, point) => {
|
|
3964
|
+
const selectedElements = getSelectedElements(board).filter(value => MindElement.isMindElement(board, value));
|
|
3965
|
+
if (selectedElements.length > 0) {
|
|
3966
|
+
const target = selectedElements.find(value => {
|
|
3967
|
+
const rectangle = getResizeActiveRectangle(board, value);
|
|
3968
|
+
return distanceBetweenPointAndRectangle(point[0], point[1], rectangle) <= 0;
|
|
3969
|
+
});
|
|
3970
|
+
return target ? target : null;
|
|
3971
|
+
}
|
|
3972
|
+
return null;
|
|
3973
|
+
};
|
|
3974
|
+
const getResizeActiveRectangle = (board, element) => {
|
|
3975
|
+
const activeWidth = 20;
|
|
3976
|
+
const node = MindElement.getNode(element);
|
|
3977
|
+
const rectangle = getRectangleByNode(node);
|
|
3978
|
+
return { x: rectangle.x + rectangle.width - activeWidth / 2, y: rectangle.y, width: activeWidth, height: rectangle.height };
|
|
3979
|
+
};
|
|
3980
|
+
|
|
3981
|
+
const withMind = (baseBoard) => {
|
|
3982
|
+
const board = baseBoard;
|
|
3983
|
+
const { drawElement, dblclick, insertFragment, setFragment, deleteFragment, isHitSelection, getRectangle, isMovable, isRecursion } = board;
|
|
3813
3984
|
board.drawElement = (context) => {
|
|
3814
3985
|
if (PlaitMind.isMind(context.element)) {
|
|
3815
3986
|
return PlaitMindComponent;
|
|
@@ -3866,14 +4037,7 @@ const withMind = (board) => {
|
|
|
3866
4037
|
if (!PlaitBoard.hasBeenTextEditing(board) && isHitMindElement(board, point, node)) {
|
|
3867
4038
|
editTopic(node);
|
|
3868
4039
|
}
|
|
3869
|
-
},
|
|
3870
|
-
if (PlaitBoard.isBoard(node) || board.isRecursion(node)) {
|
|
3871
|
-
return true;
|
|
3872
|
-
}
|
|
3873
|
-
else {
|
|
3874
|
-
return false;
|
|
3875
|
-
}
|
|
3876
|
-
});
|
|
4040
|
+
}, getIsRecursionFunc(board));
|
|
3877
4041
|
});
|
|
3878
4042
|
if (PlaitBoard.hasBeenTextEditing(board)) {
|
|
3879
4043
|
return;
|
|
@@ -3919,7 +4083,7 @@ const withMind = (board) => {
|
|
|
3919
4083
|
MindTransforms.removeElements(board, selectedElements);
|
|
3920
4084
|
deleteFragment(data);
|
|
3921
4085
|
};
|
|
3922
|
-
return
|
|
4086
|
+
return withNodeResize(withNodeImage(withNodeHover(withMindHotkey(withMindExtend(withCreateMind(withAbstract(withNodeDnd(board))))))));
|
|
3923
4087
|
};
|
|
3924
4088
|
|
|
3925
4089
|
class MindEmojiBaseComponent {
|
|
@@ -3973,5 +4137,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImpor
|
|
|
3973
4137
|
* Generated bundle index. Do not edit.
|
|
3974
4138
|
*/
|
|
3975
4139
|
|
|
3976
|
-
export { ABSTRACT_HANDLE_COLOR, ABSTRACT_HANDLE_LENGTH, ABSTRACT_HANDLE_MASK_WIDTH, ABSTRACT_INCLUDED_OUTLINE_OFFSET, AbstractHandlePosition, AbstractResizeState, BASE, BRANCH_FONT_FAMILY, BRANCH_WIDTH, BaseDrawer, BranchShape, DEFAULT_FONT_FAMILY, DefaultAbstractNodeStyle, DefaultNodeStyle, ELEMENT_TO_NODE, EXTEND_DIAMETER, EXTEND_OFFSET, GRAY_COLOR, INHERIT_ATTRIBUTE_KEYS, IS_DRAGGING, LayoutDirection, LayoutDirectionsMap, MindColorfulThemeColor, MindDarkThemeColor, MindDefaultThemeColor, MindElement, MindElementShape, MindEmojiBaseComponent, MindImageBaseComponent, MindModule, MindNode, MindNodeComponent, MindPointerType, MindQueries, MindRetroThemeColor, MindSoftThemeColor, MindStarryThemeColor, MindThemeColor, MindThemeColors, MindTransforms,
|
|
4140
|
+
export { ABSTRACT_HANDLE_COLOR, ABSTRACT_HANDLE_LENGTH, ABSTRACT_HANDLE_MASK_WIDTH, ABSTRACT_INCLUDED_OUTLINE_OFFSET, AbstractHandlePosition, AbstractResizeState, BASE, BRANCH_FONT_FAMILY, BRANCH_WIDTH, BaseDrawer, BranchShape, DEFAULT_FONT_FAMILY, DefaultAbstractNodeStyle, DefaultNodeStyle, ELEMENT_TO_NODE, EXTEND_DIAMETER, EXTEND_OFFSET, GRAY_COLOR, INHERIT_ATTRIBUTE_KEYS, IS_DRAGGING, LayoutDirection, LayoutDirectionsMap, MindColorfulThemeColor, MindDarkThemeColor, MindDefaultThemeColor, MindElement, MindElementShape, MindEmojiBaseComponent, MindImageBaseComponent, MindModule, MindNode, MindNodeComponent, MindPointerType, MindQueries, MindRetroThemeColor, MindSoftThemeColor, MindStarryThemeColor, MindThemeColor, MindThemeColors, MindTransforms, PRIMARY_COLOR, PlaitMind, PlaitMindComponent, QUICK_INSERT_CIRCLE_COLOR, QUICK_INSERT_CIRCLE_OFFSET, QUICK_INSERT_INNER_CROSS_COLOR, ROOT_TOPIC_FONT_SIZE, ROOT_TOPIC_HEIGHT, STROKE_WIDTH, TOPIC_COLOR, TOPIC_DEFAULT_MAX_WORD_COUNT, TOPIC_FONT_SIZE, TRANSPARENT, WithMindPluginKey, addActiveOnDragOrigin, adjustAbstractToNode, adjustNodeToRoot, adjustRootToNode, canSetAbstract, copyNewNode, correctLayoutByDirection, createDefaultMind, createEmptyMind, createMindElement, deleteElementHandleAbstract, deleteElementsHandleRightNodeCount, detectDropTarget, directionCorrector, directionDetector, divideElementByParent, drawFakeDragNode, drawFakeDropNode, editTopic, extractNodesText, findLastChild, findLocationLeftIndex, getAbstractBranchColor, getAbstractBranchWidth, getAbstractHandleRectangle, getAllowedDirection, getAvailableSubLayoutsByLayoutDirections, getBehindAbstracts, getBranchColorByMindElement, getBranchDirectionsByLayouts, getBranchShapeByMindElement, getBranchWidthByMindElement, getChildrenCount, getCorrespondingAbstract, getDefaultBranchColor, getDefaultBranchColorByIndex, getDefaultLayout, getEmojiForeignRectangle, getEmojiRectangle, getFillByElement, getFirstLevelElement, getHitAbstractHandle, getImageForeignRectangle, getInCorrectLayoutDirection, getLayoutDirection$1 as getLayoutDirection, getLayoutReverseDirection, getLocationScope, getMindThemeColor, getNextBranchColor, getOverallAbstracts, getPathByDropTarget, getRectangleByElement, getRectangleByNode, getRectangleByResizingLocation, getRelativeStartEndByAbstractRef, getRootLayout, getShapeByElement, getStrokeByMindElement, getStrokeWidthByElement, getTopicRectangleByElement, getTopicRectangleByNode, getValidAbstractRefs, handleTouchedAbstract, hasAfterDraw, hasPreviousOrNextOfDropPath, insertElementHandleAbstract, insertElementHandleRightNodeCount, insertMindElement, isChildElement, isChildOfAbstract, isChildRight, isChildUp, isCorrectLayout, isDragging, isDropStandardRight, isHitEmojis, isHitImage, isHitMindElement, isInRightBranchOfStandardLayout, isMixedLayout, isSetAbstract, isValidTarget, isVirtualKey, removeActiveOnDragOrigin, separateChildren, setIsDragging, temporaryDisableSelection, withMind, withMindExtend };
|
|
3977
4141
|
//# sourceMappingURL=plait-mind.mjs.map
|