Skip to content

Commit 5c8a5cd

Browse files
committed
refactor(添加元素): 统计添加元素方法
1 parent 7d2e6d9 commit 5c8a5cd

File tree

9 files changed

+165
-281
lines changed

9 files changed

+165
-281
lines changed

packages/core/ServersPlugin.ts

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* @Author: 秦少卫
33
* @Date: 2023-06-20 12:52:09
44
* @LastEditors: 秦少卫
5-
* @LastEditTime: 2024-06-07 22:25:44
5+
* @LastEditTime: 2024-07-06 17:24:55
66
* @Description: 内部插件
77
*/
88
import { v4 as uuid } from 'uuid';
@@ -40,8 +40,6 @@ class ServersPlugin {
4040
'saveImg',
4141
'clear',
4242
'preview',
43-
'addImgByElement',
44-
'getImageExtension',
4543
'getSelectMode',
4644
'getExtensionKey',
4745
];
@@ -295,41 +293,6 @@ class ServersPlugin {
295293
return option;
296294
}
297295

298-
addImgByElement(target: HTMLImageElement) {
299-
// const target = e.target as HTMLImageElement;
300-
const imgType = this.getImageExtension(target.src);
301-
if (imgType === 'svg') {
302-
fabric.loadSVGFromURL(target.src, (objects) => {
303-
const item = fabric.util.groupSVGElements(objects, {
304-
shadow: '',
305-
fontFamily: 'arial',
306-
id: uuid(),
307-
name: 'svg元素',
308-
});
309-
this.dragAddItem(item);
310-
});
311-
} else {
312-
fabric.Image.fromURL(
313-
target.src,
314-
(imgEl) => {
315-
imgEl.set({
316-
left: 100,
317-
top: 100,
318-
});
319-
this.dragAddItem(imgEl);
320-
},
321-
{ crossOrigin: 'anonymous' }
322-
);
323-
}
324-
}
325-
326-
getImageExtension(imageUrl: string) {
327-
const pathParts = imageUrl.split('/');
328-
const filename = pathParts[pathParts.length - 1];
329-
const fileParts = filename.split('.');
330-
return fileParts[fileParts.length - 1];
331-
}
332-
333296
clear() {
334297
this.canvas.getObjects().forEach((obj) => {
335298
if (obj.id !== 'workspace') {

packages/core/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* @Author: 秦少卫
33
* @Date: 2023-02-03 23:29:34
44
* @LastEditors: 秦少卫
5-
* @LastEditTime: 2024-07-06 12:10:52
5+
* @LastEditTime: 2024-07-06 12:36:22
66
* @Description: 核心入口文件
77
*/
88
import Editor from './Editor';
@@ -37,6 +37,7 @@ export { default as QrCodePlugin } from './plugin/QrCodePlugin';
3737
export { default as ImageStroke } from './plugin/ImageStroke';
3838
export { default as ResizePlugin } from './plugin/ResizePlugin';
3939
export { default as LockPlugin } from './plugin/LockPlugin';
40+
export { default as AddBaseTypePlugin } from './plugin/AddBaseTypePlugin';
4041
import EventType from './eventType';
4142
import Utils from './utils/utils';
4243

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
/*
2+
* @Author: 秦少卫
3+
* @Date: 2024-07-06 12:34:00
4+
* @LastEditors: 秦少卫
5+
* @LastEditTime: 2024-07-06 17:11:03
6+
* @Description: 基础元素类型添加
7+
*/
8+
9+
import { fabric } from 'fabric';
10+
import type Editor from '../Editor';
11+
import { v4 as uuid } from 'uuid';
12+
13+
export default class AddBaseTypePlugin implements IPluginTempl {
14+
static pluginName = 'AddBaseTypePlugin';
15+
static apis = ['addBaseType', 'createImgByElement'];
16+
constructor(public canvas: fabric.Canvas, public editor: Editor) {
17+
this.editor = editor;
18+
this.canvas = canvas;
19+
}
20+
21+
addBaseType(
22+
item: fabric.Object,
23+
optons?: {
24+
event: DragEvent;
25+
scale: boolean;
26+
center: boolean;
27+
}
28+
) {
29+
const { event = false, scale = false, center = true } = optons || {};
30+
item.set({
31+
id: uuid(),
32+
});
33+
scale && this._toScale(item);
34+
event && this._toEvent(item, event);
35+
this.canvas.add(item);
36+
if (!event && center) {
37+
this._toCenter(item);
38+
}
39+
this.canvas.setActiveObject(item);
40+
this.canvas.renderAll();
41+
}
42+
43+
_toEvent(item: fabric.Object, event: DragEvent) {
44+
const { left, top } = this.canvas.getSelectionElement().getBoundingClientRect();
45+
if (event.x < left || event.y < top || item.width === undefined) return;
46+
const point = {
47+
x: event.x - left,
48+
y: event.y - top,
49+
};
50+
const pointerVpt = this.canvas.restorePointerVpt(point);
51+
item.set({
52+
left: pointerVpt.x,
53+
top: pointerVpt.y,
54+
});
55+
}
56+
57+
_toCenter(item: fabric.Object) {
58+
this.canvas.setActiveObject(item);
59+
this.editor.position('center');
60+
}
61+
62+
_toScale(item: fabric.Object) {
63+
const { width } = this.editor.getWorkspase();
64+
item.scaleToWidth(width / 2);
65+
}
66+
67+
createImgByElement(target: HTMLImageElement) {
68+
return new Promise((resolve) => {
69+
const imgType = this.getImageExtension(target.src);
70+
if (imgType === 'svg') {
71+
fabric.loadSVGFromURL(target.src, (objects) => {
72+
const item = fabric.util.groupSVGElements(objects, {
73+
shadow: '',
74+
fontFamily: 'arial',
75+
name: 'svg元素',
76+
});
77+
resolve(item);
78+
});
79+
} else {
80+
fabric.Image.fromURL(
81+
target.src,
82+
(imgEl) => {
83+
resolve(imgEl);
84+
},
85+
{ crossOrigin: 'anonymous' }
86+
);
87+
}
88+
});
89+
}
90+
91+
getImageExtension(imageUrl: string) {
92+
const pathParts = imageUrl.split('/');
93+
const filename = pathParts[pathParts.length - 1];
94+
const fileParts = filename.split('.');
95+
return fileParts[fileParts.length - 1];
96+
}
97+
98+
destroy() {
99+
console.log('pluginDestroy');
100+
}
101+
}

src/components/fontStyle.vue

Lines changed: 3 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* @Author: 秦少卫
33
* @Date: 2023-08-05 17:47:35
44
* @LastEditors: 秦少卫
5-
* @LastEditTime: 2024-06-12 15:35:30
5+
* @LastEditTime: 2024-07-06 16:55:25
66
* @Description: 字体样式
77
-->
88

@@ -37,52 +37,6 @@
3737
@click="addItem"
3838
@dragend="dragItem"
3939
></pageList>
40-
41-
<!-- <div class="search-box">
42-
<Select class="select" v-model="typeValue" @on-change="startGetList" :disabled="pageLoading">
43-
<Option v-for="item in typeList" :value="item.value" :key="item.value">
44-
{{ item.label }}
45-
</Option>
46-
</Select>
47-
<Input
48-
class="input"
49-
:placeholder="`在${typeText}中搜索`"
50-
v-model="searchKeyWord"
51-
search
52-
:disabled="pageLoading"
53-
@on-search="startGetList"
54-
/>
55-
</div> -->
56-
<!-- 列表 -->
57-
<!-- <div style="height: calc(100vh - 108px)" id="myTemplBox3">
58-
<Scroll
59-
key="mysscroll2"
60-
v-if="showScroll"
61-
:on-reach-bottom="nextPage"
62-
:height="scrollHeight"
63-
:distance-to-edge="[-1, -1]"
64-
> -->
65-
<!-- 列表 -->
66-
<!-- <div class="img-group">
67-
<Tooltip :content="info.name" v-for="info in pageData" :key="info.src" placement="top">
68-
<div class="tmpl-img-box">
69-
<Image
70-
lazy
71-
:src="info.src"
72-
fit="contain"
73-
height="100%"
74-
:alt="info.name"
75-
@click="addItem(info)"
76-
@dragend="(e) => dragItem(e, info)"
77-
/>
78-
</div>
79-
</Tooltip>
80-
</div>
81-
<Spin size="large" fix :show="pageLoading"></Spin> -->
82-
83-
<!-- <Divider plain v-if="isDownBottm">已经到底了</Divider> -->
84-
<!-- </Scroll>
85-
</div> -->
8640
</div>
8741
</template>
8842

@@ -112,10 +66,9 @@ const dragItem = async ({ e, info: item }) => {
11266
});
11367
await canvasEditor.downFontByJSON(JSON.stringify(item.json));
11468
const el = JSON.parse(JSON.stringify(item.json));
115-
el.id = uuid();
11669
const elType = capitalizeFirstLetter(el.type);
11770
new fabric[elType].fromObject(el, (fabricEl) => {
118-
canvasEditor.dragAddItem(fabricEl, e);
71+
canvasEditor.addBaseType(fabricEl, { event: e });
11972
Spin.hide();
12073
});
12174
};
@@ -129,7 +82,7 @@ const addItem = async ({ info: item }) => {
12982
el.id = uuid();
13083
const elType = capitalizeFirstLetter(el.type);
13184
new fabric[elType].fromObject(el, (fabricEl) => {
132-
canvasEditor.dragAddItem(fabricEl);
85+
canvasEditor.addBaseType(fabricEl);
13386
Spin.hide();
13487
});
13588
};

src/components/importFile.vue

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* @Author: 秦少卫
33
* @Date: 2022-09-03 19:16:55
44
* @LastEditors: 秦少卫
5-
* @LastEditTime: 2024-04-10 22:43:52
5+
* @LastEditTime: 2024-07-06 17:23:50
66
* @Description: 插入SVG元素
77
-->
88

@@ -85,9 +85,10 @@ const HANDLEMAP = {
8585
const item = fabric.util.groupSVGElements(objects, {
8686
...options,
8787
name: 'defaultSVG',
88-
id: uuid(),
8988
});
90-
canvasEditor.canvas.add(item).centerObject(item).renderAll();
89+
canvasEditor.addBaseType(item, {
90+
scale: true,
91+
});
9192
});
9293
},
9394
};
@@ -103,19 +104,11 @@ function insertImgFile(file) {
103104
imgEl.src = file;
104105
// 插入页面
105106
document.body.appendChild(imgEl);
106-
imgEl.onload = () => {
107-
// 创建图片对象
108-
const imgInstance = new fabric.Image(imgEl, {
109-
id: uuid(),
110-
name: '图片1',
111-
left: 100,
112-
top: 100,
107+
imgEl.onload = async () => {
108+
const imgItem = await canvasEditor.createImgByElement(imgEl);
109+
canvasEditor.addBaseType(imgItem, {
110+
scale: true,
113111
});
114-
// 设置缩放
115-
canvasEditor.canvas.add(imgInstance);
116-
canvasEditor.canvas.setActiveObject(imgInstance);
117-
canvasEditor.canvas.renderAll();
118-
// 删除页面中的图片元素
119112
imgEl.remove();
120113
};
121114
}
@@ -129,7 +122,9 @@ function insertSvgFile(svgFile) {
129122
name: 'defaultSVG',
130123
id: uuid(),
131124
});
132-
canvasEditor.canvas.add(item).centerObject(item).renderAll();
125+
canvasEditor.addBaseType(item, {
126+
scale: true,
127+
});
133128
});
134129
}
135130
</script>

0 commit comments

Comments
 (0)