【PPTist】组件结构设计、主题切换

ops/2024/12/28 15:01:16/

一、组件结构

以下是代码中所有组件的定义:

  • Editor (编辑器主界面)
    • index.vue (编辑器入口 - 整合所有子组件)
    • EditorHeader (顶部操作区域)
      • index.vue (顶部区域入口)
      • FileInput.vue (文件导入 - 支持导入PPT文件)
      • ExportButton.vue (导出功能 - 支持多种格式导出)
      • Toolbar.vue (主工具栏 - 包含常用编辑工具)
      • ToolbarButton.vue (工具栏按钮 - 可复用的工具按钮组件)
      • SaveButton.vue (保存按钮 - 保存当前编辑内容)
      • UndoRedo.vue (撤销重做 - 操作历史管理)
      • TitleBar.vue (标题栏 - 显示和编辑文档标题)
      • FullscreenButton.vue (全屏按钮 - 切换全屏模式)
      • TemplateSelect.vue (模板选择 - 预设模板管理)
    • EditorContent (主要内容区域)
      • index.vue (内容区入口)
      • Canvas (画布区域 - 核心编辑区)
        • index.vue (画布入口)
        • GridLines.vue (网格线 - 辅助对齐网格)
        • Rulers.vue (标尺 - 显示位置刻度)
        • AlignmentLines.vue (对齐参考线 - 智能对齐辅助)
        • EditableElement (可编辑元素集合)
          • index.vue (元素容器)
          • TextElement (文本元素)
            • index.vue
            • TextEditor.vue (富文本编辑器)
            • TextAttrs.vue (文本属性配置)
          • ImageElement (图片元素)
            • index.vue
            • ImageClip.vue (图片裁剪工具)
          • ShapeElement (形状元素 - 各类几何图形)
          • LineElement (线条元素 - 各类线条)
          • ChartElement (图表元素)
            • index.vue
            • ChartData.vue (图表数据编辑)
            • ChartOptions.vue (图表配置选项)
          • TableElement (表格元素)
            • index.vue
            • TableCells.vue (表格单元格编辑)
        • MultiSelectLayer.vue (多选操作层 - 框选功能)
        • ContextMenu.vue (右键菜单 - 快捷操作菜单)
      • Thumbnails (左侧缩略图区域)
        • index.vue (缩略图容器)
        • ThumbnailSlide.vue (单个幻灯片缩略图)
        • ThumbnailSlideList.vue (缩略图列表)
        • SlideSortable.vue (幻灯片拖拽排序)
      • Toolbar (右侧工具栏)
        • index.vue (工具栏容器)
        • ElementStylePanel (元素样式面板)
          • index.vue (样式面板容器)
          • TextStylePanel (文字样式配置)
            • index.vue
            • FontSelect.vue (字体选择器)
            • TextAlign.vue (文本对齐设置)
          • ImageStylePanel (图片样式配置)
            • index.vue
            • ImageFilter.vue (图片滤镜设置)
          • ShapeStylePanel.vue (形状样式配置)
          • LineStylePanel.vue (线条样式配置)
          • ChartStylePanel.vue (图表样式配置)
          • TableStylePanel.vue (表格样式配置)
        • SlideDesign (幻灯片设计面板)
          • index.vue (设计面板容器)
          • Background (背景设置)
            • index.vue
            • GradientSetting.vue (渐变背景配置)
          • Theme.vue (主题设置)
        • Animation (动画面板)
          • index.vue (动画面板容器)
          • AnimationList.vue (动画列表)
          • AnimationEditor.vue (动画参数编辑器)
    • EditorFooter (底部状态栏)
      • index.vue (底部栏容器)
      • ScaleSelect.vue (缩放比例选择)
      • SlideInfo.vue (幻灯片信息显示)
      • PlayButton.vue (放映控制按钮)
  • Screen (放映页面)
    • index.vue (放映页面入口)
    • ScreenSlide.vue (幻灯片放映组件)
    • ScreenControls.vue (放映控制器 - 切换/暂停等)
  • components (通用基础组件)
    • Modal (模态框 - 弹窗容器)
    • ColorPicker (颜色选择器)
    • InputNumber (数字输入框)
    • Dropdown (下拉菜单)
    • Button (按钮组件)
    • Divider (分割线)
    • Icon (图标组件)
    • Tooltip (文字提示)
    • Form (表单组件集)
    • Menu (菜单组件)
    • Select (选择器)
    • Slider (滑块组件)
    • Switch (开关组件)
    • Upload (文件上传)
    • Dialog (对话框组件)

主要的工作区域大致分为三个部分:

  • 顶部操作区(EditorHeader):提供全局操作功能
  • 内容编辑区(EditorContent):核心的编辑功能区域
  • 底部状态栏(EditorFooter):显示状态信息和快捷操作

二、主题切换

就是这个地方,预置的主题
在这里插入图片描述
预置主题的定义在 src/configs/theme.ts,以其中一个为例

  {background: '#ffffff',fontColor: '#333333',fontname: 'Microsoft Yahei',colors: ['#5b9bd5', '#ed7d31', '#a5a5a5', '#ffc000', '#4472c4', '#70ad47'],},

里面的 fontname 都是微软雅黑。那么我们给第一个元素的字体换一个花哨的字体试一试
字体的定义:src/configs/font.ts,就换一个 “仓耳小丸子” 吧

可以看到,第一个主题的字体已经改变了,卡哇伊~
在这里插入图片描述
应用全局的话,就成功修改所有的字体啦
在这里插入图片描述

不过我有一个疑问,显然,默认的主题的配色方案使用的是第一个,但是为什么默认的字体不是第一个主题也就是我设置的这个字体呢?那要找一下默认的主题是在哪里呢?
是在这里 src/mocks/slides.ts 定义的一个默认展示的幻灯片数据,只是配色和第一个主题颜色一样

然后设置主题的时候,看一下是怎么执行的,将主题应用到当前幻灯片和应用全部的方法在src/hooks/useSlideTheme.ts
applyPresetThemeToSingleSlideapplyPresetThemeToAllSlides。这俩处理逻辑差不多,其中主要执行了三个步骤

  • setSlideTheme 设置幻灯片主题
    这个方法也在当前文件中,接收两个参数:SlidePresetTheme。里面的处理逻辑也非常的朴实无华,就是挨个改一下元素的可能被修改的属性
    例如如果是文字的话
if (el.type === 'text') {if (el.fill) el.fill = colorMap[tinycolor(el.fill).toRgbString()] || el.fillel.defaultColor = theme.fontColorel.defaultFontName = theme.fontname
}

会修改 filldefaultColordefaultFontName 这三个属性。
在文字的组件中 src/views/components/element/TextElement/BaseTextElement.vue,在模版中使用这几个属性

<div class="element-content":style="{width: elementInfo.vertical ? 'auto' : elementInfo.width + 'px',height: elementInfo.vertical ? elementInfo.height + 'px' : 'auto',backgroundColor: elementInfo.fill,opacity: elementInfo.opacity,textShadow: shadowStyle,lineHeight: elementInfo.lineHeight,letterSpacing: (elementInfo.wordSpace || 0) + 'px',color: elementInfo.defaultColor,fontFamily: elementInfo.defaultFontName,writingMode: elementInfo.vertical ? 'vertical-rl' : 'horizontal-tb',}"
>

fill 就是背景颜色

  • slidesStore.updateSlide 更新当前幻灯片
updateSlide(props: Partial<Slide>, slideId?: string) {const slideIndex = slideId ? this.slides.findIndex(item => item.id === slideId) : this.slideIndexthis.slides[slideIndex] = { ...this.slides[slideIndex], ...props }
},
  • addHistorySnapshot 添加到历史快照中
    这个方法在上一篇文章中介绍过,【PPTist】历史记录功能,凡是可以回退或者重做的操作都需要执行这个方法。

http://www.ppmy.cn/ops/145681.html

相关文章

Linux复习2——管理文件系统1

超级用户->普通用户&#xff1a;exit 普通用户->超级用户&#xff1a;su Linux一般将文件可存取的身份分为三个类别&#xff0c;分别是 owner/group/others&#xff0c;且三种身份各有 read/write/execute 等权限 系统目录结构 /——根目录 /home、/root——用户的宿…

Selenium实践总结

1.使用显示等待而不是隐式等待 隐式等待可能会导致不可预测的测试行为&#xff0c;尤其是在动态 Web 应用程序中。显式等待&#xff0c;它允许您 等待特定条件发生后再继续测试&#xff0c;这种方法提供了更多的控制和可靠性。 WebDriverWait wait new WebDriverWait(drive…

Adversarial Machine Learning(对抗机器学习)

之前把机器学习&#xff08;Machine Learning&#xff09;的安全问题简单记录了一下&#xff0c;这里有深入研究了一些具体的概念&#xff0c;这里记录一下方便以后查阅。 Adversarial Machine Learning&#xff08;对抗机器学习&#xff09; Adversarial Examples 相关内容Eva…

全局webSocket 单个页面进行监听并移除单页面监听

之前全局封装的 webSocket 在某些特定的页面中使用会直接去调用 webSocket 的 onMessage 方法 已进入页面就会调&#xff0c;如果退出页面移除整个监听的话全局监听就会被移除 这是修改后的 全局封装 let token uni.getStorageSync(token) const HEARTBEAT_INTERVAL 1 *…

低代码配置式组态软件-BY组态

随着物联网、大数据等技术高速发展&#xff0c;我们逐步向数字化、可视化的人工智能&#xff08;AI&#xff09;时代的方向不断迈进。智能时代是工业 4.0 时代&#xff0c;我国工业领域正努力从“制造”迈向“智造”的新跨越。 什么是组态软件&#xff1f; 组态软件&#xff…

前端真实面试题自用

一、写在前面 笔者&#xff0c;经过计算机学硕考研的失败后&#xff0c;想谋求一份前端工作实在是太难了。一方面&#xff0c;确实曾经学习过的东西很久没有拾起&#xff0c;另一方面&#xff0c;对于前端面经还是记忆不深刻&#xff0c;特地写此贴记录笔者在真实前端面试中遇…

OpenHarmony开发板环境搭建

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java相关开发、鸿蒙开发、人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 0.OpenHarmony 0.1 OpenHarmony OpenHarmony是一款面向全场景、全连接、全智能的…

Xdebug

1、开启xdebug扩展 2、修改一下php.ini文件 xdebug.remote_enable 1 xdebug.remote_autostart 13、vscode安装插件php debug 4、生成launch.json文件&#xff0c;好像啥都不用改 5、vscode没有配置php路径的&#xff0c;需要去配置&#xff1a; 6、发起请求 8、代码断…