Детали раскладки GtkBox

На упаковку действует три параметра, одинаковые для упаковки в конец и в начало; смысл этих параметров немного сложен, потому что они взаимодействуют с установкой блока homogeneous и друг с другом.

Вот как GtkBox вычисляет свои требования размеров в интересующем нас направлении (ширина для GtkHBox, высота для GtkVBox):

  1. Считается, что общий запрашиваемый размер ребенка равен запросу ребенка, плюс двойной размер значения padding, используемое для упаковки ребенка. padding ребенка -- это величина пустого места с любой из его сторон. Размер ребенка = (Размер, запрошенный ребенком) + 2 6#6 (Интервал ребенка).
  2. Если блок равномерный, то базовый запрос размера блока равен размеру (запрос + интервал) наибольшего ребенка, умноженный на число детей. В равномерном блоке все дети такие же большие, как и наибольший ребенок.
  3. Если блок неравномерный, то базовый запрос размера блока есть сумма размеров (запрос + интервал) каждого ребенка.
  4. Применимая для блока установка spacing определяет, сколько пустого места оставить между детьми; поэтому это значение умножается на число детей минус один, и добавляется к базовому запросу размера. Учтите, что пробел не принадлежит ребенку; это пустое место между детьми, и на него не влияют параметры expand и fill. С другой стороны, набивка (padding) -- это место вокруг каждого ребенка, и на него влияют параметры упаковки ребенка.
  5. Все контейнеры имеют установку ширина границы; двойной размер ширины границы добавляется к запросу, представляя границу вокруг каждой из сторон. Поэтому, общий размер, запрашиваемый GtkBox равен: (Сумма размеров детей) + Пробел 6#6 (Число детей - 1) + 2 6#6 (Ширина границы).

После вычисления запроса размера и донесения его до родительского контейнера, GtkBox получит свой выделенный размер и распределит его между своими детьми следующим образом:

  1. Достаточное количество места для границы и пробелов между детьми вычитается из выделенного размера; остаток -- это доступное место для самих детей. Это место разделяется на два части: количество действительно запрошенного детьми места (запросы детей и набивка), и излишки. Излишки = (Выделенный размер) - (Сумма размеров детей).
  2. Если блок неравномерный, то излишки разделяются между всеми детьми, у которых параметр expand установлен в TRUE. Эти дети могут быть расширены, чтобы заполнить доступное место. Если ни один из детей не может расширяться, излишки места добавляются в центр блока, между виджетами, упакованными в начале и в конце.
  3. Если блок равномерный, излишки распределяются в соответствии с нуждами; те дети, которые затребовали больше места, получают меньше излишков, таким образом все заканчивается тем, что у каждого оказывается одинаковое количество места. Параметр expand игнорируется для равномерных блоков -- излишки распределяются между всеми детьми, а не только между расширяемыми.
  4. Когда ребенок получает некоторое количество лишнего места, есть две возможности. Вокруг ребенка можно добавить больше набивки, или дочерний виджет сам может быть расширен. Параметр fill определяет, что именно произойдет. Если он равен TRUE, дочерний виджет расширяется для заполнения места, таким образом все дополнительное место входит в выделенный ребенку размер; если fill равен FALSE, то увеличивается набивка ребенка для заполнения места, и для ребенка выделяется столько места, сколько он запросил. Заметьте, что fill не имеет никакого эффекта, если expand установлен в FALSE и блок неравномерный, потому что ребенок никогда не получит никакого дополнительного места.

Ух ты! Кто хочет все это обдумать? К счастью, имеется несколько общих образцов использования, поэтому вам не надо решать многовариантное уравнение, чтобы узнать, как использовать виджет. Авторы Учебника по Gtk+ красиво свели пять случаев, которые случаются на практике; в этом мы последуем за ними.


Linux Land
2000-09-15