基线
我们正在进入 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+ 尺寸分配机制中的旅程。我希望你喜欢它。