Widget Layouts/ru

Widget Layouts в Awesome 3.4
Одним из самых крупных изменений в Awesome 3.4 стало введение widget layouts(схемы виджетов). Схемы позволяют контролировать размещение виджетов с использованием Lua, намного удобнее чем в ранних редакциях, когда использовались свойства виджетов align.

Как они работают?
Каждая таблица/массив виджетов содержит поле layout. Это поле указывает на функцию которая принимает таблицу содержащую виджеты и место, где эти виджеты должны быть размещены в качестве параметров и возвращает таблицу содержащую геометрическое расположение (т.е. width, height, x и y позиции) для всех виджетов. Эта функция просто вызывается с таблицей виджетов в качестве аргументов. Невероятно просто, не правда ли?

Как я могу использовать их?
Разместите виджеты, которые должны иметь одинаковое свойство align в таблицу и вызовите в поле таблицы layout нужную функцию выравнивания (которые описаны ниже). Разместите эти таблицы в таблицу виджетов вашего wibox и соответственно установите его поле layout.

Удостоверьтесь, что ваш виджет tasklist является последним в таблице виджетов, поскольку он использует flex layout по умолчанию.

Какие доступны layouts?
На данный момент доступны следующие схемы для виджетов:
 * awful.widget.layout.horizontal.leftright:
 * все виджеты содержащиеся в таблице будут размещены слева направо.


 * awful.widget.layout.horizontal.rightleft:
 * виджеты размещаются справа налево. Т.е. виджет расположенный последним в таблице, будет крайним левым, а первый соответственно крайним правым.


 * awful.widget.layout.horizontal.flex:
 * Должен располагаться последим в таблице виджетов, так как используется все доступное пространство по горизонтали.


 * awful.widget.layout.vertical.flex:
 * Эта layout позволяет разместить виджеты из таблицы, друг над другом, что например позволяет стыковать imagebox и textbox поверх друг друга, чтобы получить иконку с подписью.

Примеры использования
Взято из rc.lua mywibox[s].widgets = { {           mylauncher, mytaglist[s], mypromptbox[s], layout = awful.widget.layout.horizontal.leftright -- <<-- схема размещения для виджетов прописанных выше, слева на право },       mylayoutbox[s],spacewidget,                       -- <<-- виджет переключателя режимов окон, он будет крайним правым mytextclock,                                     -- <<-- виджет часов separator,                                       -- <<-- разделитель kbdwidget,                                       -- <<-- виджет переключатель клавиатуры ...       s == 1 and mysystray or nil, mytasklist[s],                                   -- <<-- виджет списка задач, он будет крайним левым layout = awful.widget.layout.horizontal.rightleft     -- <<-- схема размещения для виджетов прописанных выше, слева на право слева на право } Я думаю разобраться здесь не сложно. Сначала создается таблица mywibox, в которой прописаны все виджеты которые мы будем отображать. В нем мы создаем подтаблицу в которой прописываем виджеты (mylauncher, mytaglist,mypromptbox) которые у нас будут располагаться с левой стороны и имеющие выравнивание слева направо. А затем идут все остальные виджеты, но для них используется метод выравнивания справа налево. Если для вас сложно это воспринять попробуйте создать свой собственный виджет, например: mywidget = widget ({"textbox"}) mywidget.text = "test" и попробуйте его вставить поочередно в разные места приведенного выше кода mywibox. И для вас сразу все встанет на свои места.

Помимо этого, есть не задокументированная(унаследованная) функция margins, которая позволяет оставить свободное место с какой либо стороны от вашего виджета, или таблицы виджетов. awful.widget.layout.margins[mywidget] = { left = 10 } Данный код позволяет оставить место в 10 пикселей слева от вашего виджета.

Widget Layouts в Awesome 3.5
https://awesome.naquadah.org/wiki/Widget_Layouts - оригинал статьи

Комплекс layout для виджетов может стать интересным и добавляющим мощности и гибкости в Awesome. Эта функциональность реализуется через layout widget, которые в основном предназначены для содержания и изменения расположения одного или нескольких виджетов. Эти виджеты могут быть созданы как с использованием самого awesome, awful, так и внешних библиотек, например Vicious.

Основы
Для использования схем виджетов, вам необходимо вызывать конструктор, добавить один или несколько виджетов в него, и установить свойства, которые вы хотите изменить. В основном, большая часть layout widget будет размещаться в секции wibox.

Итак, для создания layout widget, вызываем его конструктор: local mymargin = wibox.layout.margin

Затем добавляем виджет: mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon,                                    menu = mymainmenu }) mymargin:set_widget(mylauncher)

Как вы можете видеть, функция  добавляет виджет к этому layout. Это характерно для layouts, что принимается только один виджет. Для того, чтобы layouts принимал произвольное количество виджетов, используется функция, а для layout в которых принимаются заданное количество виджетов используется функция  , где item в общих чертах описывает где будут располагаться виджеты.

В завершение, установите те свойства, которые хотите изменить. mymargin:set_margins(1)

Порядок вызова этих функций не важен, главное сначала создать layout widget.

Доступные типы layout
Все layout widgets и их функции полностью описаны в Awesome Lua API documentation в секции wibox.layout.*

Align
Используется для размещения виджетов слева, справа, сверху, снизу или в середине выделенного пространства. Кстати виджетов в этой схеме должно быть не более 3х.

Схема align не должна вызываться напрямую, для этого используются другие подфункции, указывающие направление (горизонтальное или вертикальное расположение): myalign = wibox.layout.align.horizontal или myalign = wibox.layout.align.vertical

Горизонтальная схема виджетов располагает виджеты по направлениям Left, Middle, Right: myalign:set_left(widget_left) myalign:set_middle(widget_middle) myalign:set_right(widget_right) А вертикальная располагает виджеты по направлениям Top, Middle, Bottom: myalign:set_top(widget_top) myalign:set_middle(widget_middle) myalign:set_bottom(widget_bottom) Обратите внимание, что все используемые виджеты должны быть уже определены и описаны, иначе схема align может неправильно выделить место под них.

Режим Expand
По умолчанию, средний виджет будет сжиматься или наоборот растягиваться (даже до превращения в точку), чтобы выделить место виджетам находящимся по краям. Это не всегда желательно. Функция  используется, чтобы изменить это поведение.

Inside
Используйте  чтобы заставить средний виджет расширившись, заполнить все пространство между левым и правым виджетами. Обратите внимание, что если нет свободного места, то средний виджет не будет отображен. В этом режиме верхний или левый виджет получает главный приоритет на доступное место, затем правый или нижний, и только затем выделяется место для среднего виджета. Это поведение по умолчанию.

Outside
Используйте  для размещения среднего виджета по центру доступного пространства и заставляет внешние виджеты (левый,правый, верхний или нижний) расширившись заполнить все пространство, оставшимся на  соответствующей стороне виджетом. В этом режиме средний виджет имеет главный приоритет на размещение, а другие два виджета оставшееся на их стороне место. Виджеты описанные в handle не получают столько места, сколько они запрашивают, поэтому это не должно сломать их. Если средний виджет займет все доступное место, то остальные виджеты не будут отображены.

None
Использование  не оставляет пустого пространства. Средний виджет располагается по центру, и отдает главный приоритет доступному пространству. Оставшиеся два виджета используют все что им осталось, но не расширяется для заполнения всего свободного места. Если средний виджет занимает все свободное пространство, то оставшиеся виджеты не будут показаны.

Constraint
Этот виджет ограничивает размер его дочерних виджетов. Уставовка дочернего виджета делается так. Настройка высоты и/или ширины constraint осущесвляется вызовом функций  и   соответсвенно, где целое   это размер в пикселях. Если вы используете  вместо числа, то ограничение по данному направлению будет игнорироваться. Использование  установит strategy на "max" и очистит оба значения высоты и ширины в constraint.

Constraint Strategies
constraint strategy определяет как используется constraint. Помните, что эти описания constraint not the widget it is constraining. Если вы хотите применить разные стратегии по каждому направлению, будьте осторожны, используйте вложенные виджеты constraint.

Exact
Это значение заставляет использовать точно те значения высоты и/или ширины, которые установлены в constraint. myconstraint:set_strategy("exact")

Min
Это значение позволит использовать высоту и/или ширину больше чем установленные в constraint значения. myconstraint:set_strategy("min")

Max
Это значение установит высоту и/или ширину меньше чем значения установленные в constraint. myconstraint:set_strategy("max")

Margin
Эта схема добавляет оболочку вокруг виджета который содержит эту схему. Используйте  для установки под виджета. Если n целое число,  будет установлена полоса в n пикселей вокруг виджета и ,  ,  , и   установит полосу в n пикселей на указанной стороне.

Как облегчить себе жизнь?
Схемы виджетов могут довольно быстро усложняться, при добавлении новых виджетов. Стандартная схема включает 6 виджетов в начале и после добавления еще нескольких можно довольно легко запутаться где именно вы находитесь в вашем layout. Чтобы помочь в этом, организуйте ваши виджеты в коде последовательно с добавлением обширных комментариев. Вот несколько советов:
 * Используйте комментарии, чтобы обозначить к какому именно виджету он относится и что делает.
 * Название layout виджета основывайте на их родителе и/или положении.
 * Используйте отступы, для обозначения уровня на котором работаете.
 * Стройте layout как это сделано в HTML:
 * Объявите все ваши внешние layout.
 * Установите его опции.
 * Объявите под виджеты.
 * Установите его опции.
 * Объявите и добавьте другие дополнительные под виджеты.
 * Добавьте виджет во внешний layout.
 * Добавьте внешний layout в wibox.
 * Для сложных layouts, нарисуйте макет, как вы хотите чтобы он выглядел перед началом работы.
 * Прочтите документацию по доступным схемам перед началом, чтобы понимать что возможно, а что нет.

Labeling
Чтобы пометить виджет, который отображает данные, такие как прогресс бар, вы можете использовать виджет с align с двумя под виджетами: виджетом данных и текстовым. internal_battery = awful.widget.align.vertical

internal_battery_pb = awful.widget.progressbar internal_battery_pb:set_vertical(true) internal_battery_pb:set_width(8) internal_battery_pb:set_height(20) internal_battery_pb:set_background_color(beautiful.bg_normal) internal_battery_pb:set_border_color(beautiful.fg_normal) internal_battery_pb:set_color({ type = "linear", from = { 0, 0 }, to = { 0, 20 },                                       stops = { { 0,   beautiful.fg_focus},                                        { 0.2, beautiful.fg_focus},                                        { 1,   beautiful.bg_focus}                                    } }) vicious.register(internal_battery_pb, vicious.widgets.bat, "$2", 20, "CMB1") internal_battery:set_middle(internal_battery_pb)

internal_battery_label = wibox.widget.textbox internal_battery_label:set_text("I") internal_battery_label:set_align("center") internal_battery:set_bottom(internal_battery_label) Обратите внимание, что виджет progress bar установлен как средний виджет. По умолчанию средний виджет расширяется, чтобы занять как можно больше места, и поэтому не используется верхний виджет(только средний и нижний), он использует все пространстов, что для label места уже нет. Если вы хотите использовать label сверху, вам необходимо использовать  вместо.