Skip to content

Commit e010795

Browse files
committed
feat: 完成右边栏素材选中逻辑
1 parent cf990da commit e010795

File tree

4 files changed

+22
-7
lines changed

4 files changed

+22
-7
lines changed

src/components/player/CanvasPlayer.vue

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ emitter.on(BusEvent.ElementDelete, onDelete)
4747
emitter.on(BusEvent.ElementAdd, onAdd)
4848
emitter.on(BusEvent.ElementAlign, setElementAlign)
4949
emitter.on(BusEvent.ElementLayer, setElementLayer)
50+
emitter.on(BusEvent.ElementSelect, selectElement)
5051
emitter.on(BusEvent.ElementSelectAll, selectAll)
5152
emitter.on(BusEvent.CanvasFullScreen, toggleCanvasFullScreen)
5253
emitter.on(BusEvent.CanvasExportCurrentFrame, onExportCurrentFrame)
@@ -572,6 +573,16 @@ function canvasOnMouseDown(e: fabric.IEvent<MouseEvent>) {
572573
}
573574
}
574575
576+
// 选中元素
577+
function selectElement(obj: ElementItem) {
578+
const targetElement: ElementItem = canvas
579+
.getObjects()
580+
.find((item: ElementItem) => item.elementId === obj.elementId)!
581+
if (!targetElement) return
582+
canvas.setActiveObject(targetElement)
583+
canvas.requestRenderAll()
584+
}
585+
575586
// 全选
576587
function selectAll() {
577588
canvas.discardActiveObject()
@@ -584,7 +595,7 @@ function selectAll() {
584595
585596
// 元素选中时
586597
function onElementSelected(e: fabric.IEvent<MouseEvent>) {
587-
setFocusElements(e.selected, undefined)
598+
setFocusElements(e.selected, e.deselected)
588599
}
589600
590601
// 元素取消选中时

src/components/right-panel/RightPanel.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,11 @@ function setLayer(align: 'up' | 'down' | 'top' | 'bottom') {
8383
v-if="elementList.length > 0"
8484
>
8585
<div
86-
class="flex items-center justify-between rounded-md border border-[#3b3b4f] p-2"
86+
class="flex cursor-pointer items-center justify-between rounded-md border border-[#3b3b4f] p-2"
8787
:class="focusElementIds.includes(item.elementId) ? 'bg-black' : ''"
8888
v-for="(item, index) in elementList"
8989
:key="index"
90+
@click="emitter.emit(BusEvent.ElementSelect, item)"
9091
>
9192
<p class="m-0 h-[16px] p-0 leading-[16px]">{{ item.elementType }} - {{ index + 1 }}</p>
9293
<button class="btn btn-error btn-sm" @click="deleteElement(item)">

src/stores/player.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,11 @@ export const usePlayerStore = defineStore('playerStore', () => {
4545
selected: ElementList | undefined,
4646
deselected: ElementList | undefined,
4747
) {
48-
if (selected) {
49-
focusElements.value = [...focusElements.value, ...selected]
50-
} else if (deselected) {
51-
const elementId = deselected.map((item) => item.elementId || '')
48+
if (selected) focusElements.value.push(...selected)
49+
if (deselected) {
50+
const deselectedElementId = deselected.map((item) => item.elementId || '')
5251
focusElements.value = focusElements.value.filter(
53-
(item) => !elementId.includes(item.elementId || ''),
52+
(item) => !deselectedElementId.includes(item.elementId || ''),
5453
)
5554
}
5655
}

src/utils/eventBus.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { fabric } from 'fabric'
12
import mitt from 'mitt'
23
import type { Emitter } from 'mitt'
34
import type { ElementItem } from '~/stores/player'
@@ -7,6 +8,7 @@ export enum BusEvent {
78
ElementPaste = 'element:paste',
89
ElementDelete = 'element:delete',
910
ElementAdd = 'element:add',
11+
ElementSelect = 'element:select',
1012
ElementSelectAll = 'element:select-all',
1113
ElementAlign = 'element:align',
1214
ElementFlip = 'element:flip',
@@ -37,6 +39,8 @@ type BusEvents = {
3739
[BusEvent.ElementFlip]: 'x' | 'y'
3840
// 元素层级
3941
[BusEvent.ElementLayer]: 'up' | 'down' | 'top' | 'bottom'
42+
// 选中元素
43+
[BusEvent.ElementSelect]: fabric.Object
4044
// 全选
4145
[BusEvent.ElementSelectAll]: void
4246
// ============================= video =============================

0 commit comments

Comments
 (0)