#layout #engine #table #system #framework #padding #table-grid

sktablelayout-rs

基于表格/网格的布局引擎。基于规则且与框架无关。

4个版本

使用旧Rust 2015

0.2.1 2018年9月19日
0.2.0 2018年8月18日
0.1.1 2018年8月13日
0.1.0 2018年8月8日

#41 in #padding

BSD-3-Clause

37KB
731

表格布局

一个无框架的纯Rust编写的表格布局系统。您提供所需的布局约束,并提供一个闭包以在给定的布局元素上实现布局。一旦需要放置所有内容,就使用布局对象的尺寸调用impose。基于Esoteric Software的tablelayout包,也许有一天是MIGLayout,但完全基于公开规范构建,而不是以任何形式从源代码构建。

闭包会接收到布局项的xywidthheight。这些与表格中的该项相关,不包括可能应用于表格本身的任何平移。这意味着如果表格不是放置在(0, 0),则需要偏移xy

当前引擎未使用任何unsafe块。

布局

使用CellProperties::new创建单元格,然后使用构建器模式填充它们。如果要在布局中使用单元格、行或列的默认值,请使用CellProperties::with_defaults

扩展

单元格可以垂直或水平扩展。扩展意味着如果所有单元格接收到它们的首选大小后还有剩余空间,则额外的空间会分配给具有扩展样式的行和列。

.expand_horizontal.expand_vertical.expand设置这些策略。

填充

如果一列或一行比预期放大(由于同一列或行中其他单元格的扩展规则),这将在其他单元格内留下额外的可用空间。默认情况下,这部分空间会被浪费,布局元素将根据锚定规则放置在这片空白空间中。一个填充表示,如果以某种方式获得了额外空间,那么这部分空间将被占据。填充不是扩展,它不会导致额外空间被使用。只有意外变得可用的空间才会被填充。

.fill_horizontal.fill_vertical.fill设置了这些策略。

注意,填充会尊重布局项的最大尺寸。如果一个元素达到其最大尺寸且存在填充空间,布局项将根据锚定规则进行定位(尽管是在其更大的尺寸上。)

锚点

当一个布局项因任何原因小于其可用空间时,锚点定义了它将在该空白空间内的位置。

.anchor_top.anchor_bottom.anchor_vertical_center处理沿垂直域粘附布局项。

.anchor_left.anchor_right.anchor_horizontal_center处理沿水平域粘附布局项。

冲突的锚点指定不是错误,但布局引擎可以自由忽略冲突请求。

填充

填充有意浪费了元素边缘的空间。

.padding允许你提供一个自己的Rectangle结构体,以一次指定所有边缘。

.padding_all将所有填充边缘设置为相同的值。

.padding_top设置顶部边缘的填充。

.padding_left设置左侧边缘的填充。

.padding_right设置右侧边缘的填充。

.padding_bottom设置底部边缘的填充。

填充作为在单元格大小偏好周围添加额外空间来实现,但在最终布局阶段定位对象时并不使用这些空间。

牺牲填充

虽然尚未实现,但一些布局引擎将填充视为在尝试在小空间内适应UI时可以压缩的空间。

统一

所有设置为统一的单元格都将具有相同的大小。实际上,这项政策目前并未真正实现。

内部

你应该使用构建器模式来准备布局和单元格。直接篡改内部不被建议(并且在更稳定的版本中它们可能变得不可公开。)

用于居中放置的位标志可能被移除;可以争论说尝试同时锚定到左侧和右侧相当于居中锚定,这可以释放两个标志供其他地方使用。

性能

提供了一个基准测试(cargo bench)来测试布局计算。在我的AMD FX™-6300 六核处理器

test test::impose2x3 ... bench:       8,468 ns/iter (+/- 790)

请注意,施加布局依赖于多线程,并且只有在表格的宽度和高度被干扰时才需要执行。

变更日志

0.2

单元测试和单元格填充的实现。

0.1.1

一些小修复和PR。

0.1

初始版本。

参考

https://github.com/EsotericSoftware/tablelayout

依赖项

~105KB