【PPTist】批注、选择窗格

news/2025/1/8 7:21:26/

前言:本篇文章研究批注和选择窗格两个小功能

一、批注

批注功能就是介个小图标
在这里插入图片描述
点击可以为当前页的幻灯片添加批注,还能删除之前的批注
在这里插入图片描述
如果我们增加了登录功能,还可以在批注上显示当前的用户名和头像,不过现在是写死的。
左侧幻灯片缩略图的左上角会显示当前幻灯片的批注的数量
在这里插入图片描述
首先我们来换一个个性的头像吧!
看下头像现在是一个icon
在这里插入图片描述

这段HTML在 src/views/Editor/NotesPanel.vue 文件中
首先创建一个文件目录 src/assets/images/avatars,然后把中意的头像放进去,然后把模版中的icon改成我们的头像就好啦
不过我们也可以写的更智能一点,通过用户名动态渲染

<img :src="getImageUrl(note.user)">
const getImageUrl = (user: string) => {return new URL(`../../assets/images/avatars/${user}.png`, import.meta.url).href
}

图片的名字和用户名保持一致就可以了

在这里插入图片描述

最爱的小乔~~~
在这里插入图片描述

这里的批注就是一个列表,添加批注就向批注列表中增加一个数据,然后还需要通过 slidesStore.updateSlide() 方法,更新当前幻灯片的批注

const createNote = () => {if (!content.value) {if (textAreaRef.value) textAreaRef.value.focus()return}const newNote: Note = {id: nanoid(),content: content.value,time: new Date().getTime(),user: '小乔',}if (handleElementId.value) newNote.elId = handleElementId.valueconst newNotes = [...notes.value,newNote,]slidesStore.updateSlide({ notes: newNotes })content.value = ''
}

还有一个可以给别人的批注回复的功能
在这里插入图片描述
回复是 note.replie 属性,添加回复也跟上面的添加批注的逻辑差不多,没啥复杂的
有一点,这里没有调用 addHistorySnapshot() ,说明批注相关的操作是不能回退的
在这里插入图片描述

二、选择窗格

在这里插入图片描述
可以控制幻灯片的几个部分的显示和隐藏。
我们在全局搜索 “选择窗格” 就可以发现,点击这个按钮的时候,会触发的方法是
src/views/Editor/CanvasTool/index.vue

// 打开选择面板
const toggleSelectPanel = () => {mainStore.setSelectPanelState(!showSelectPanel.value)
}

修改公共的数据中的属性 showSelectPanel
src/store/main.ts

setSelectPanelState(show: boolean) {this.showSelectPanel = show
},

然后全局搜索这个属性,会在下面这个模版中发现它的踪迹
src/views/Editor/index.vue

<SelectPanel v-if="showSelectPanel" />

组件是 src/views/Editor/SelectPanel.vue
组件的根元素是 MoveablePanel 组件,通过它的名字我们也可以看出,这个组件是可移动的。而且既然这个自定义组件的标签中能放东西,肯定是使用插槽实现的。src/components/MoveablePanel.vue
然后我们还是看选择窗格组件,里面的功能

1、全部显示全部隐藏

是在 src/hooks/useHideElement.ts 中的 showAllElementshideAllElements

const showAllElements = () => {const currentSlideElIdList = currentSlide.value.elements.map(item => item.id)const needHiddenElementIdList = hiddenElementIdList.value.filter(item => !currentSlideElIdList.includes(item))mainStore.setHiddenElementIdList(needHiddenElementIdList)
}
const hideAllElements = () => {const currentSlideElIdList = currentSlide.value.elements.map(item => item.id)mainStore.setHiddenElementIdList([...hiddenElementIdList.value, ...currentSlideElIdList])if (activeElementIdList.value.length) mainStore.setActiveElementIdList([])
}

隐藏元素主要是通过修改 hiddenElementIdList
src/views/Editor/Canvas/index.vue 中,元素会通过 hiddenElementIdList 判断是否展示

v-show="!hiddenElementIdList.includes(element.id)"
2、点击菜单项

点击下面的列表中的菜单项的时候,幻灯片中的对应的元素会被选中
在这里插入图片描述
执行的是这个方法,好像之前见过来着,这是个公共的方法
src/hooks/useSelectElement.ts

// 将指定元素设置为被选择状态
const selectElement = (id: string) => {if (handleElementId.value === id) returnif (hiddenElementIdList.value.includes(id)) returnconst lockedElements = currentSlide.value.elements.filter(el => el.lock)if (lockedElements.some(el => el.id === id)) returnmainStore.setActiveElementIdList([id])
}

点击菜单项后面的小眼睛切换元素的显示的时候,还是修改 hiddenElementIdList
src/hooks/useHideElement.ts

const toggleHideElement = (id: string) => {if (hiddenElementIdList.value.includes(id)) {mainStore.setHiddenElementIdList(hiddenElementIdList.value.filter(item => item !== id))}else mainStore.setHiddenElementIdList([...hiddenElementIdList.value, id])if (activeElementIdList.value.includes(id)) mainStore.setActiveElementIdList([])
}

所以元素的显示隐藏相关的功能都是通过修改 hiddenElementIdList 数组实现的。
如果是组合的话,会显示成二级菜单
在这里插入图片描述
另外选中某个元素的时候,右侧的样式也会改变成选中元素的样式
在这里插入图片描述
右侧 Tab 栏组件是 src/views/Editor/Toolbar/index.vue

const { activeElementIdList, handleElement, toolbarState } = storeToRefs(mainStore)

我们看一下 handleElement,会显示填充色、宽高、位置、类型等属性
在这里插入图片描述

修改的时候就修改这个目标元素的属性即可。
handleElementsrc/store/main.ts 中的一个计算属性,实时计算

// 获取当前操作的元素
handleElement(state) {const slidesStore = useSlidesStore()const currentSlide = slidesStore.currentSlideif (!currentSlide || !currentSlide.elements) return nullreturn currentSlide.elements.find(element => state.handleElementId === element.id) || null
},

http://www.ppmy.cn/news/1561497.html

相关文章

Django 模型

Django 模型 Django 模型是 Django 框架的核心组件之一,它用于定义应用程序的数据结构。在 Django 中,模型是 Python 类,通常继承自 django.db.models.Model。每个模型类代表数据库中的一个表,模型类的属性对应表中的字段。 1. 创建模型 创建 Django 模型非常简单。首先…

mysql20250107

MVCC 史上最详尽&#xff0c;一文讲透 MVCC 实现原理_一文讲透mvcc实现原理-CSDN博客 怎么理解 事务启动时&#xff0c;InnoDB 会为它分配一个唯一的事务 ID&#xff0c;什么时候启动的&#xff0c;是Transactional注解吗&#xff0c;执行注解方法代表&#xff0c;事物开始&a…

【AI数学基础】线性代数:向量空间

&#xff08;观前提醒&#xff0c;这是工科AI相关的数学基础的学习笔记&#xff0c;不是数学专业的文章&#xff0c;所以没有严谨的证明和定义&#xff0c;数院大神请勿批评&#xff09; 1. 向量空间 1.1 定义和例子 在数学中&#xff0c;空间这个概念本质上是满足一定条件的…

简单的spring boot tomcat版本升级

简单的spring boot tomcat版本升级 1. 需求 我们使用的springboot版本为2.3.8.RELEASE&#xff0c;对应的tomcat版本为9.0.41&#xff0c;公司tomcat对应版本发现攻击者可发送不完整的POST请求触发错误响应&#xff0c;从而可能导致获取其他用户先前请求的数据&#xff0c;造…

Ruby语言的语法

Ruby语言的语法之美 Ruby是一种动态、开放源代码的编程语言&#xff0c;由日本的松本行弘&#xff08;Yukihiro Matsumoto&#xff09;于1995年首次发布。Ruby语言以其简洁、优雅和易于阅读的语法而闻名。它不仅适合初学者&#xff0c;还被广泛应用于Web开发、数据分析和其他领…

VSCode 使用鼠标滚轮控制字体

一、 文件 | 首选项 | 设置 二、单击在 settings.json中编辑 "editor.mouseWheelZoom": true 注注注意&#xff1a;保存哦&#xff01;ctrlS 三、测试 按住ctrl鼠标滚轮&#xff0c;控制字体大小

LabVIEW大数据有什么应用场景?

LabVIEW在处理大数据时主要依赖于其强大的数据采集、信号处理、控制、以及实时系统的功能。以下是一些典型的应用场景&#xff1a; ​ 1. 工业自动化与制造 数据采集与监控&#xff1a;在生产线上&#xff0c;LabVIEW可以用来收集大量的传感器数据&#xff08;如温度、压力、湿…

HTML——72. 下拉列表分组(下拉列表中多选)

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>下拉列表分组</title></head><body><!--select:1.表示创建下拉列表2.size属性设置列表中显示多少个列表项3.multiple属性可以定义下拉分组多选4.多选时…