从零开始, 开发一个 Web Office 套件 (3): 鼠标事件

这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等.
对应的Github repo 地址: https://github.com/zhaokang555/canvas-text-editor
书接前文: 从零开始, 开发一个 Web Office 套件 (2): 富文本编辑器

2. 富文本编辑器(MVP)

2.11 鼠标事件

这篇文章, 我们来实现迄今为止我们需要的鼠标事件相关的feature. 我初步整理了一下, 有如下几个:

  • WHEN 鼠标hover到编辑器边缘的六个控制点(SizeControlPoint)上时, THEN 鼠标形状需要变化
  • WHEN 鼠标hover到编辑器边缘的虚线边框上时, THEN 鼠标形状需要变化
  • WHEN 鼠标hover到文字上时, THEN 鼠标形状需要变化(第1篇博文中提到的)
  • WHEN 鼠标点击某一个文字(字符)的半部分时, THEN 需要在它的面插入光标 AND 光标应该匹配其左侧文字样式
    从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第1张图片
  • WHEN 鼠标点击某一个文字(字符)的半部分时, THEN 需要在它的面插入光标 AND 光标应该匹配其左侧文字样式
    从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第2张图片
  • GIVEN 鼠标hover到文字上, WHEN 鼠标进行拖选时, THEN 需要高亮拖选中的文字
    从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第3张图片

2.12 Mouse hover on SizeControlPoint

之前, 我们渲染控制点的代码是写在src/core/CanvasTextEditor.ts中的:

从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第4张图片

如果继续这个类中处理鼠标相关逻辑, 这个类就会变得很臃肿. 所以, 我们需要重构一下代码, 把控制点相关的代码抽离出来.

2.12.1 重构代码

新建文件src/core/SizeControlPoint.ts:

从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第5张图片

然后, 我们还需要实现SizeControlPoint中依赖的两个接口: IBoundingBox, IRenderable.

新建src/core/IBoundingBox.ts:

从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第6张图片

新建src/core/IRenderable.ts:

从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第7张图片

然后, 将CanvasTextEditor中的renderBorderCircle方法稍加修改, 迁移到SizeControlPoint类中:

从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第8张图片

最后, 修改CanvasTextEditor类, 删除老代码, 引入SizeControlPoint:

从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第9张图片

2.12.2 架构设计

从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第10张图片

2.12.3 自顶向下实现

首先, 修改src/core/CanvasTextEditor.ts:

  • 添加一个sizeControlPoints属性, 用来存放所有的控制点
  • renderBorder中渲染控制点相关的代码, 转移到构造函数中
  • 添加一个析构函数, 用来清理事件监听函数
  • clearCanvas中重置鼠标形状
  • render中渲染所有控制点

从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第11张图片

同时, 定义了一个枚举src/core/CursorType.ts, 用来存放目前所使用到的鼠标样式:

从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第12张图片

其中每个值的含义可以参考MDN的这个文档: https://developer.mozilla.org/en-US/docs/Web/CSS/cursor

从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第13张图片

然后, 修改src/core/SizeControlPoint.ts:

从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第14张图片

然后, 新建src/core/ResponsiveToMouseHover:

  • 实时监听鼠标位置, 存入mouseX, mouseX
  • 同时, 计算鼠标是否处于自身包围盒中, 将结果存入isMouseHovering
  • 在析构函数中移除监听函数

从零开始, 开发一个 Web Office 套件 (3): 鼠标事件_第15张图片

2.12.4 效果

(未完待续)

你可能感兴趣的:(从零开始, 开发一个 Web Office 套件 (3): 鼠标事件)