Radical/ru

Оригинал статьи и последние изменения в модуле вы можете найти на GitHub https://github.com/Elv13/radical

Radical это один из самых больших модулей расширения Awesome. Он предоставляет единый интерфейс для создания множества типов меню.



Установка
Установить Radical очень легко, достаточно переместить в каталог ~/.config/awesome клонированный репозиторий. cd ~/.config/awesome git clone https://github.com/Elv13/radical.git Затем затребовать его в верхней части вашегоrc.lua:

local radical = require("radical")

Использование
В отличие от awful.menu Radical действует как и другие схемы(layouts) Awesome 3.5. Вам необходимо добавлять элементы последовательно одни за другим. Это имеет преимущество, позволяя вам взаимодействовать с сами элементами програмно.

Самый просто вид меню, контекстное например, может быть создано примерно так:

local menu = radical.context{} menu:add_item {text="Screen 1",button1=function(_menu,item,mods) print("Hello World! ") end} menu:add_item {text="Screen 9",icon=beautiful.path.."Icon/layouts/tileleft.png"} menu:add_item {text="Sub Menu",sub_menu = function local smenu = radical.context{} smenu:add_item{text="item 1"} smenu:add_item{text="item 2"} return smenu end}

-- Для добавления меню в в виджет: local mytextbox = wibox.widget.textbox mytextbox:set_menu(menu,3)           -- 3 = правая клавиша мыши, 1 = левая клавиша мыши

-- Для добавления клавиатурного сочетания чтобы вызвать меню "box" (и всех других типов) menu:add_key_binding({"Mod4"},",")

В этом примере, созданы 3 простых элемента меню с диманической генерацией подменю. Пожалуйста помните, что создавая подменю с использованием функции, оно создается при каждом его отображении. Для статичного меню, быстрее просто создать его однажды и передать объекту подменю свойство элемента "sub_menu".

Второй параметр не является обязательным, по умолчанию его значение = 1.

Она может также вызывать функцию в качестве 3-го параметра. Тем не менее, это обычно верное размещение контекстного меню, в том месте где вы ожидаете его. Это работает лучше чем меню "box".

Типы меню
Действующие типы меню:


 * Context: Обычное контекстное меню
 * Box: Размещенное в центре меню (по типу меню alt-tab в Windows)
 * Embed: Меню в меню. Его можно использовать как подраздел в больших меню
 * Bar: Компактный горизонтальный видждет wibox
 * Flexbar: Расширяемый горизонтальный виджет wibox

Стили меню
Любому меню подходят различные стили для различных применений. Новый стиль может также быть создан в теме beautiful. Текущими являются:


 * Arrow: Gnome3 и Mac OSX похоже на меню с границами по краям и стрелками
 * Classic: Повторяет внешний вид awful.menu

Arrow также подразделяется на несколько типов:


 * radical.base.arrow_type.NONE
 * radical.base.arrow_type.PRETTY
 * radical.base.arrow_type.CENTERED

Стили элементов
Как и меню, элементы тоже могут иметь из собственный стиль. Допустимые значения:


 * Basic: Самый простой тип элементов, не содержит границ или специальных форм
 * Classic: 1px граница в конце каждого элемента
 * Rounded: 3px закругленные границы в каждом углу
 * Arrow_alt: "Powerline" стрелки с различными цветами
 * Arrow_prefix: Элемент с префиксом "Powerlined"
 * Arrow_single: Элемент начинается с < и заканчивается >

Схемы меню
В верхней части каждого стиля меню также можнет содержать различные схемы для отображения элементов:


 * Vertical: Элементы отображаются поверх друг друга
 * Horizontal: Элементы отображаются рядом друг с другом
 * Grid: Элементы отображаются в виде 2D таблицы

Схемы элементов
Схема элементов(item) это то, как виджеты (icons, label, prefix) располагаются в элементе

horizontal: Стандартная схема, используется в стиле context icon: Выглядит как иконка рабочего стола, используется в горизонтальном меню centerred: Выравнивает виджеты по центру вместо использования всего пространства

Использование styles и layouts
local radical = require("radical")

local m = radical.context { style     = radical.style.classic      , item_style = radical.item.style.classic , layout    = radical.layout.vertical    }

Подсказки
Radical также имеет свой собственный стиль виджета подсказки. Он может быть использован в меню, но также и в каждом виджете используя метод set_tooltip: local mytextbox = wibox.widget.textbox mytextbox:set_tooltip("foo bar")

"Underlay"
The "underlay" is the opposite of an overlay. Think of it as a background label. Radical add this option to all Awesome widget by calling the set_underlay method. The first argument is the text (or table of string) and the second is an array with the style, color and alpha keys.

Опции
Radical предлагает (очень, очень) широкий спектр опций позволяющих создавать роскошные и оригинальные меню. Опции доступны в 2х форматах: menu wide и item specific. Опции menu wide воздействуют на все элементы и непосредственно на само меню, в то время как "specific item" применятеся только для элементов. Разные элементы могут иметь разные наборы опций.

Colors options
Опции цвета доступны как для меню, так и для элементов объекта.

Common methods
Все меню обеспечиваются кучей методов. Большинство из них была описана выше, но здесь еще небольшой список:

Сигналы
Меню также производит множество сигналов, синтакс обычно следующий PROPERTY_NAME::changed. Есть и другие другие - item::moved, item::swapped, item::removed, item::appended

Ниже приведен пример того, как уловить изменение "прозрачности":

mymenu:connect_signal("opacity::changed",function(value)       -- какие то действия    end)

Большинство item_layout также заменяют стандартные сигналы виджетов. Они как правило делают то же самое, как при использовании атрибута меню buttonX, но преимущественно в сценариях, где исльзуется модификатор(Ctrl, Shift, прочие).

mods является массивом с приложенным модификатором в качестве ключа. Если значение отсутсвует (=nil), то модификатора нет. Обычые модификаторы это Control, Shift, mod1 (Alt) и mod4(Win).

Пример их использования:

local menubar = radical.bar{} menubar:connect_signal("button::press",function(data,item,button,mods)       if mods.Control then            print("Foo menu pressed!",item.text,button,data.rowcount)        end    end)

-- Также работает с элементами menubar:add_item{text="bar"}:connect_signal("button::release",function(d,i,b,m)       print("bar click released!")    end)

Beautiful опции
Radical также использует некоторые из опций тем awful.menu, в дополнение к:

Стилизирование также может быть сделано с помощью опции icon_transformation. Эта возможность позволяет скрыть такие возможности как desaturation, tinting, invert или некоторые matrix которые применяются на изображении прежде чем оно будет отрисованно. Эта функция получает ссылку на путь/поверхность, как единственный параметр и возвращает уже измененную поверхность.

Расширение Radical
Radical не предназначался для использования "как есть". Каждое меню отличается от другого. В то время как распространенные меню могут создаваться без расширения возможностей Radical, более продвинутые наверняка потребует этого. Хорошей новостью будет то, что Radical предназначен для этого. Предыдущие версии доказали мне, что любой недостаток или необходимость расширить функционал приведет к раздуванию кода, когда придется добавлять новые возможности. Radical параллельно разработал возможность добавлять больше модулей и свойств без необходимости затрагивать основные файлы.

Объектная модель
Объектная модель Radical схожа с моделью Awesome. Каждый объект имеет набор сигналов, разработчик может прослушивать их для получения уведомления об изменении. Большая разница в том, что объектная модель Radical автоматически создает собственные свойства. Если вы хотите добавить новый сигнал,     это возможно добавив прослушивание item::added, для элемента или применить его непосредственно для его меню от которого зависит этот элемент, если это свойства для меню или для элемента. Далее приведен пример того, как это работает: local menu = radical.context{}

-- Create the setter menu.set_foo = function(m,value) print("Setting value to:",value) m._foo_real = value end

-- Create the getter menu.get_foo = function(m) print("Getter called, returning",m._foo_real) end

-- The property is now created, this will call the setter: menu.foo = "my foo value"

-- This will call the getter: print(menu.foo)

-- The signals will be automatically generated data:connect_signal("foo::changed",function(m,value)       print("foo changed:",value)    end)

-- New signals don't need to be registered and can be called right away data:connect_signal("my_new_signal::action_name",function(m,value1,value2,value3)       print("Callback",m,value1,value2,value3)    end)

-- Manually emiting a signal menu:emit_signal("my_new_signal::action_name",value1,value2,value3)

State model
Radical поддерживает одновременно множество состояний для элемента. Текущее состояние("current state") имеет наименьший ID. state ID это число с -inf до +inf. Более важные, например проверка сравнения срочности(urgent), может быть реализовано с использованием соответсвующих ордеров. Стандартный набор состояний это объекты которые могут изменяться, поэтому будет разумнее использовать совершенно другой диапазон, если кто то захочет изменить один из существующих. Каждому состоянию может быть присвоен фон и цвет переднего фона используя метод radical.theme.register_color(id, radical_name, beautiful_name, true ). Переключать состояние можно используя мета таблицу item.state[]:

local my_state_name = 9999 -- <== The ID   local menu = radical.context{} local item = menu:add_item{text="text"}

-- Activate a state item.state[my_state_name] = true

-- Desactivate a state item.state[my_state_name] = nil

Radical позаботится о выборе текущего состояния и перересует элемент с правильными цветами переднего и заднего фона.