容器秘密:尺寸分配,第 3 部分

扩展子项

我们探索功能丰富的尺寸分配的下一站是 ::expand 属性。实际上有两个属性,::hexpand 和 ::vexpand,它们有一个有趣的向上传播到小部件层次结构的行为。但这并不是我们今天要讨论的内容,我们只想在中心框小部件的子项设置了 ::hexpand 标志时,为其提供所有可用空间。

再一次,measure() 的实现可以保持原样。再一次,我们需要决定如果多个子项设置了 expand 标志,谁应该先扩展。GtkBox 尝试公平对待其所有子项,并在所有正在扩展的子项之间均匀分配可用的额外空间。另一方面,我们更喜欢中心子项,因为它最重要。

但是我们该如何实现呢?经过一些实验,我认为,如果我们已经因为中心子项不适合而必须将其推到左侧或右侧,那么再使其更大就没有意义了。因此,只有在不是这种情况时,我们才会考虑 expand 标志。

center_expand = gtk_widget_get_hexpand (center);

if (left_size > center_x)
  center_x = left_size;
else if (width - right_size < center_pos + center_size)
  center_x = width - center_width - right_size;
else if (center_expand) {
  center_width = width - 2 * MAX (left_size, right_size);
  center_x = (width / 2) - (center_width / 2);
}

完成此操作后,如果外部子项正在扩展,则可能还有一些空间可以提供给它们。

if (left_expand)
  left_size = center_pos - left_pos;
if (right_expand)
  right_size = pos + width - (center_pos + center_width);
没有扩展的子项
中心子项正在扩展
末尾子项正在扩展
中心和末尾子项正在扩展

参考

  1. 容器秘密:尺寸分配
  2. 容器秘密:尺寸分配,第 2 部分
  3. 带有这些更改的代码