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

基线

我们正在进入 GTK+ 尺寸分配中另一个更神秘的领域。基线将窗口小部件从简单的具有宽度和高度的盒子模型转变为可以在垂直方向以更有趣的方式对齐窗口小部件的模型。这主要在文本方面起作用。当您沿着文本行移动时,读者的眼睛对单词上下移动非常敏感。基线可以避免这种情况。

 

由于这是关于子项彼此之间的垂直对齐,因此只有当容器处于水平方向时,基线才相关。

测量上方和下方

由于子项现在可以具有“强制”对齐,因此简单地取子项高度的最大值已经不够了。对齐可能会导致子项在顶部或底部“突出”,从而需要更大的整体高度。为了处理这个问题,我们分别测量“基线上方”的部分和“基线下方”的部分,并分别最大化它们。

for (i = 0; i < 3; i++) {
  gtk_widget_measure (child[i],
                      orientation,
                      sizes[i].minimum_size,
                      &child_min, &child_nat,
                      &child_min_baseline, &child_nat_baseline);

   below_min = MAX (below_min, child_min - child_min_baseline);
   above_min = MAX (above_min, child_min_baseline);
   below_nat = MAX (below_nat, child_nat - child_nat_baseline);
   above_nat = MAX (above_nat, child_nat_baseline);
}

total_min = above_min + below_min;
total_nat = above_nat + below_nat;

此代码省略了一些细节,例如处理不返回基线的子项。

在基线上分配

在分配方面,有两种情况:要么我们被赋予一个必须将子项对齐到的基线,要么我们必须自己确定一个基线。在后一种情况下,我们需要做与我们已经为测量所做的基本相同的事情:分别确定下方和上方的大小,并使用它们来找到我们的基线。

for (i = 0; i < 3; i++) {
  if (gtk_widget_get_valign (child[i]) != GTK_ALIGN_BASELINE)
    continue;

  gtk_widget_measure (child[i],
                      GTK_ORIENTATION_VERTICAL,
                      child_size[i],
                      &child_min, &child_nat,
                      &child_min_baseline, &child_nat_baseline);

  below_min = MAX (below_min, child_min - child_min_baseline);
  below_nat = MAX (below_nat, child_nat - child_nat_baseline);
  above_min = MAX (above_min, child_min_baseline);
  above_nat = MAX (above_nat, child_nat_baseline);
}

在确定基线时,我们再次需要做出选择。当可用空间大于最小值时,我们将基线尽可能高地放置,还是尽可能低地放置,还是放置在中间的某个位置?GtkBox 有一个 ::baseline-position 属性,可以将此选择留给用户,我们在这里也这样做。

switch (baseline_position) {
  case GTK_BASELINE_POSITION_TOP:
    baseline = above_min;
    break;
  case GTK_BASELINE_POSITION_CENTER:
    baseline = above_min + (height - (above_min + below_min)) / 2;
    break;
  case GTK_BASELINE_POSITION_BOTTOM:
    baseline = height - below_min;
    break;
}
展开,基线位置:中心
压缩,基线位置:顶部
压缩,基线位置:中心
压缩,基线位置:底部

总结

这结束了我们对 GTK+ 尺寸分配机制的探索。我希望你喜欢它。

参考

  1. 容器秘密:尺寸分配
  2. 容器秘密:尺寸分配,第 2 部分
  3. 容器秘密:尺寸分配,第 3 部分
  4. 容器秘密:尺寸分配,第 4 部分
  5. 容器秘密:尺寸分配,第 5 部分
  6. 代码 包含这些更改

关于“容器秘密:尺寸分配,第 6 部分”的一则评论

评论已关闭。