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 中使用
715KB
20K SLoC
LogiSheets Controller
Controller
是 LogiSheets 的核心 crate。 Controller
处理用户操作并返回显示信息。
这里我们将介绍一些实现。
重要组件
-
Cell Id Manager
为每个单元格分配 Cell Id。Cell Id 识别单元格,即使该单元格被删除。Cell Id 与单元格位置不同,单元格位置在插入或删除某些行或列后可能会改变。你可能发现我们还使用 Sheetid 来识别工作表,并使用 NameId 来识别名称。这是因为在一个电子表格应用程序中,几乎一切都可以重命名或移动。Id 管理器是基础。 -
Container
存储了 CellId 和 Cell 映射。单元格的内容应通过其 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