#logi-sheets #controller #action #user #display #undo-redo

logisheets_controller

LogiSheets 的核心

7 个版本 (破坏性更新)

0.6.0 2024年1月3日
0.5.0 2023年12月29日
0.4.0 2023年9月30日
0.3.0 2022年6月2日
0.1.0 2022年4月18日

#2 in #logi-sheets


2 crates 中使用

MIT 许可证

715KB
20K SLoC

LogiSheets Controller

Controller 是 LogiSheets 的核心 crate。 Controller 处理用户操作并返回显示信息。

这里我们将介绍一些实现。

重要组件

  • Cell Id Manager 为每个单元格分配 Cell Id。Cell Id 识别单元格,即使该单元格被删除。Cell Id 与单元格位置不同,单元格位置在插入或删除某些行或列后可能会改变。你可能发现我们还使用 Sheetid 来识别工作表,并使用 NameId 来识别名称。这是因为在一个电子表格应用程序中,几乎一切都可以重命名或移动。Id 管理器是基础。

  • Container 存储了 CellIdCell 映射。单元格的内容应通过其 CellId 访问。

  • Navigator 负责在单元格 id 和单元格位置之间进行转换。目前,LogiSheets 只支持插入或删除行和列,我们使用一个简单的算法来实现这一点。 Navigator 存储一个 RowId 向量和列 ColId 向量,我们使用一个元组 (RowId, ColId) 作为 CellId。初始化工作表的 navigator 后,每一行和每一列都有一个 Id,因此每个单元格都可以通过 (RowId, ColId) 来识别。例如,当按位置索引单元格,如 B4 或 r4c2 时,Navigator 取第 4 个 RowId 和第 2 个 ColId,然后你可以得到 CellId。用户插入或删除行/列将对 RowId 向量或 ColId 向量产生影响。

  • VertexManager 负责记录计算依赖关系,更新公式 ast,并为 CalcEngine 提供脏顶点和 ast。

  • Connectors 实现了帮助组件之间通信的 traits。我们定义了一些 traits 来在组件之间建立抽象屏障,这有助于解耦它们并使编写单元测试更容易。

撤销/重做

我们使用 持久数据结构 来存储工作簿的状态,这有助于我们轻松实现撤销/重做系统。

我们使用 im crate 来实现这一点。如果你有类似的背景来维护这个 crate,那就更好了。

依赖项

~19MB
~354K SLoC