mirror of
https://github.com/Tencent/tmagic-editor.git
synced 2025-12-15 05:36:31 +00:00
93 lines
2.9 KiB
TypeScript
93 lines
2.9 KiB
TypeScript
import { computed, markRaw, Ref, ref } from 'vue';
|
|
import { CopyDocument, Delete, DocumentCopy } from '@element-plus/icons-vue';
|
|
|
|
import { Id, MContainer, NodeType } from '@tmagic/schema';
|
|
import { isPage } from '@tmagic/utils';
|
|
|
|
import ContentMenu from '@editor/components/ContentMenu.vue';
|
|
import type { MenuButton, Services } from '@editor/type';
|
|
|
|
export const useDeleteMenu = (): MenuButton => ({
|
|
type: 'button',
|
|
text: '删除',
|
|
icon: Delete,
|
|
display: (services) => {
|
|
const node = services?.editorService?.get('node');
|
|
return node?.type !== NodeType.ROOT && !isPage(node);
|
|
},
|
|
handler: (services) => {
|
|
const nodes = services?.editorService?.get('nodes');
|
|
nodes && services?.editorService?.remove(nodes);
|
|
},
|
|
});
|
|
|
|
const canPaste = ref(false);
|
|
|
|
export const useCopyMenu = (): MenuButton => ({
|
|
type: 'button',
|
|
text: '复制',
|
|
icon: markRaw(CopyDocument),
|
|
handler: (services) => {
|
|
const nodes = services?.editorService?.get('nodes');
|
|
nodes && services?.editorService?.copy(nodes);
|
|
canPaste.value = true;
|
|
},
|
|
});
|
|
|
|
export const usePasteMenu = (menu?: Ref<InstanceType<typeof ContentMenu> | undefined>): MenuButton => ({
|
|
type: 'button',
|
|
text: '粘贴',
|
|
icon: markRaw(DocumentCopy),
|
|
display: () => canPaste.value,
|
|
handler: (services) => {
|
|
const nodes = services?.editorService?.get('nodes');
|
|
if (!nodes || nodes.length === 0) return;
|
|
|
|
if (menu?.value?.$el) {
|
|
const stage = services?.editorService?.get('stage');
|
|
const rect = menu.value.$el.getBoundingClientRect();
|
|
const parentRect = stage?.container?.getBoundingClientRect();
|
|
const initialLeft = (rect.left || 0) - (parentRect?.left || 0);
|
|
const initialTop = (rect.top || 0) - (parentRect?.top || 0);
|
|
services?.editorService?.paste({ left: initialLeft, top: initialTop });
|
|
} else {
|
|
services?.editorService?.paste();
|
|
}
|
|
},
|
|
});
|
|
|
|
const moveTo = (id: Id, services?: Services) => {
|
|
if (!services?.editorService) return;
|
|
|
|
const nodes = services.editorService.get('nodes') || [];
|
|
const parent = services.editorService.getNodeById(id) as MContainer;
|
|
|
|
if (!parent) return;
|
|
|
|
services?.editorService.add(nodes, parent);
|
|
services?.editorService.remove(nodes);
|
|
};
|
|
|
|
export const useMoveToMenu = (services?: Services): MenuButton => {
|
|
const root = computed(() => services?.editorService?.get('root'));
|
|
|
|
return {
|
|
type: 'button',
|
|
text: '移动至',
|
|
display: (services) => {
|
|
const node = services?.editorService?.get('node');
|
|
const pageLength = services?.editorService?.get('pageLength') || 0;
|
|
return !isPage(node) && pageLength > 1;
|
|
},
|
|
items: (root.value?.items || [])
|
|
.filter((page) => page.id !== services?.editorService?.get('page')?.id)
|
|
.map((page) => ({
|
|
text: `${page.name}(${page.id})`,
|
|
type: 'button',
|
|
handler: (services?: Services) => {
|
|
moveTo(page.id, services);
|
|
},
|
|
})),
|
|
};
|
|
};
|