Приём событий: UI - Panel in и ui - switch

Оператор нажал кнопку, сдвинул ползунок, выбрал строку. Всё это приходит в программу одним потоком сообщений через узел (блок программы U-Logic) UI - Panel in. Чтобы на «Начало совещания» отреагировала одна ветка программы, а на «Камера 2» другая, события нужно разложить по выходам. Это делает узел ui - switch.

Здесь по шагам описана настройка ui - switch: правило для одного элемента, правило для группы элементов, выбор события, несколько выходов и порядок правил.

Что нужно заранее: интерфейс сохранён и опубликован в UI-Designer (редактор интерфейсов), а на вкладке (рабочем листе программы) есть развёрнутый UI - Panel in — правки запущены в работу кнопкой «Развернуть» (шаги — в разделе «Подготовьте U-Logic» страницы «Первый интерфейс»). Что именно приходит с панели и как это увидеть — на странице «Связь интерфейса с программой».

UI - Panel in: вход программы

UI - Panel in настраивается один раз на вкладку. Он принимает события всех открытых панелей и всех интерфейсов. Каждое событие он выдаёт сообщением msg.payload вида «интерфейс → элемент → событие → значение». Правил в нём нет: события раскладывает следующий узел, ui - switch.

В «Демо-зале» один UI - Panel in («События панели») на всю вкладку: он ведёт в узел link out, который разносит события по блокам. Один вход проще проверять: если сломалась связь с панелью, смотрите в одно место. Как это выглядит — на странице «Программа «Демо-зал»: обзор».

ui - switch: правила по порядку

Одно правило — один выход. У узла столько выходов, сколько правил: нажатие на панели посылает сообщение на выход того правила, под которое оно подошло.

Как добавить узел:

  1. Перетащите ui - switch из палитры на вкладку.

  2. Соедините выход UI - Panel in (или link in, который ведёт от него) со входом ui - switch.

  3. Двойным щелчком откройте узел.

Правило для одного элемента

Когда. Нужна реакция на конкретную кнопку: «Начало совещания», «Позвонить».

  1. В поле «Интерфейс» выберите интерфейс, события которого нужны. Без интерфейса узел ничего не пропустит.

  2. В разделе «Правила маршрутизации» добавьте правило.

  3. В поле «Поиск элемента…» введите не меньше двух букв имени и выберите элемент из подсказок (их не больше десяти). Список заполняется после «Сохранить» и «Опубликовать» в UI-Designer.

  4. В выпадающем списке события выберите нужное. По умолчанию стоит «Любое событие». Для кнопок его лучше заменить на push (причины — ниже).

  5. Нажмите «Готово».

../../_images/events-rule-element.png

Окно ui - switch «Главная»: 1 — «Интерфейс», 2 — «Правила маршрутизации», 3 — выбор элемента (рядом поле «Поиск элемента…»), 4 — выбор события push, 5 — «Проверка:»

Что вы увидите: у узла появился выход, подписанный номером правила. Нажмите кнопку на панели — по этому выходу пойдёт сообщение.

Правило для группы элементов (шаблон)

Когда. Много похожих кнопок, и реагировать на них нужно одинаково: шесть источников, 13 мест за столом. Вместо 13 правил хватит одного — по общей части имени.

  1. Добавьте правило и включите флажок «Шаблон». Поле «Поиск элемента…» скрывается, появляются поле шаблона и выбор режима.

  2. Впишите шаблон, например Src_*_b.

  3. В выпадающем списке рядом выберите режим сравнения. Он сам не определяется: подходящий шаблон с неверным режимом просто не сработает.

  4. Выберите событие, как для одного элемента.

Режим

Что значит

Пример шаблона

Подходит

exact

имя целиком

Mic_04_b

только Mic_04_b

startsWith

имя начинается с

Mic_

Mic_04_b, Mic_AllOff_b

endsWith

имя заканчивается на

_vol_sl

Snd_Hall_vol_sl, Snd_Vcs_vol_sl

contains

имя содержит

Cam

Src_Cam1_b, Cam_Home_b

wildcard (*, ?)

* — любая часть имени, ? — один символ

Mic_0?_b

Mic_01_b … Mic_09_b

regex

регулярное выражение

^Cam_(Up|Down)_b$

Cam_Up_b, Cam_Down_b

В режиме regex звёздочка — не «любая часть», а спецсимвол выражения; для привычных шаблонов с * берите wildcard. Во всех режимах регистр различается.

../../_images/ui-switch-template.png

Правило с шаблоном в узле ui - switch «Экран» (блок «Экран»): 1 — «Интерфейс», 2 — номер правила, 3 — шаблон Src_*_b с флажком «Шаблон», 4 — режим wildcard (*, ?), 5 — «Проверка:»

Один шаблон вместо семи правил: в блоке «Экран» все кнопки источников попадают в одно правило Src_*_b. Если добавить восьмой источник, правило менять не нужно.

Имена в «Демо-зале» построены по схеме Группа_Объект_тип, поэтому шаблоны получаются короткими:

Шаблон

Какие элементы

Куда ведёт

Src_*_b

шесть источников и кнопка «Убрать источник»

команда матрице

Mic_*_b

13 мест за столом и «Выключить все»

команда звуковому процессору

Snd_*_vol_sl

ползунки громкости зала и ВКС

команда уровня

Snd_*_b, Hdr_Mics_b, Hdr_Sound_b

кнопки звука

mute или шаг громкости (кнопки +/−)

Cam_Home_b, Cam_Wide_b и шесть кнопок движения (регулярным выражением)

кнопки управления камерой

команда камеры

Rcp_Nav_*_b

вкладки интерфейса «Рецепты»

повторная отправка значений на вкладки

Какое событие выбрать

Список событий зависит от типа элемента, который вы выбрали в правиле:

Элемент

События в списке

Какое брать

Кнопка

push, release, tap, hold

push — для команды; push и release отдельными правилами — для действия «пока держат»; hold приходит, пока кнопку держат, если в UI-Designer у неё включён «Повтор нажатия при удержании»: первый — через «Задержку удержания», дальше с «Частотой повтора» (см. «Кнопки и состояния»)

Ползунок

slide_begin, value_changed, slide_end

slide_end — команда уйдёт один раз, когда оператор отпустил ползунок

Спидометр

gauge_slide_begin, gauge_value_changed, gauge_slide_end

gauge_slide_end — в value придёт показание от 0 до 1, которое оператор поставил касанием или перетаскиванием по дуге; gauge_slide_begin приносит показание до касания

Список

item_selected

item_selected — в value придёт ключ строки

Фрейм (окно)

popup_show, popup_hide

не используйте: об открытии окна программа узнаёт по push кнопки, которая его открывает, о закрытии кнопкой — по push этой кнопки

Инпут

value_changed

value_changed — приходит после «Кнопки отправки»

Если тип элемента неизвестен (например, в правиле с шаблоном), в списке показаны события всех типов.

Один клик по кнопке — три сообщения: push, release, tap. Если в правиле осталось «Любое событие», действие выполнится три раза. Поэтому везде, где кнопка запускает действие, в «Демо-зале» правило ловит только push.

Несколько выходов, порядок и «Проверка:»

Правила проверяются сверху вниз. Поле «Проверка:» решает, что делать после совпадения:

  • «остановка после первого совпадения» — событие уходит только по первому подошедшему правилу;

  • «проверка всех правил» — событие уходит по каждому подошедшему правилу, то есть может уйти на несколько выходов.

Порядок правил меняется перетаскиванием. Номер выхода равен позиции правила в списке, поэтому после перестановки выходы нумеруются заново.

Порядок правил. В блоке «Микрофоны» два правила. Первое — Mic_AllOff_b («Выключить все»). Второе — шаблон Mic_*_b для 13 мест. Имя Mic_AllOff_b подходит и под шаблон, поэтому порядок важен: «Выключить все» стоит первым, и после его совпадения проверка останавливается. Если поменять правила местами, «Выключить все» попадёт в ветку «одно место», где для него нет канала.

Несколько выходов для разных событий. В блоке «Камеры» шаблон шести кнопок движения задан дважды: один выход ловит push (начать движение), другой — release (стоп). Шаблон — регулярное выражение ^Cam_(Up|Down|Left|Right|ZoomIn|ZoomOut)_b$. Кнопки Cam_1_b…Cam_3_b выбирают управляемую камеру и идут отдельными правилами по элементам.

../../_images/events-two-outputs.png

Правила блока «Камеры»: 1 — шаблон кнопок движения и событие push, 2 — тот же шаблон и событие release, 3 — «Проверка:»

Что приходит на выходе

На выходе правила в msg.payload добавлены отдельные поля, которые можно брать в change и function:

Поле

Что в нём

msg.payload.ui

имя интерфейса

msg.payload.object

имя элемента

msg.payload.event

событие

msg.payload.value

значение, если событие его несёт

msg.payload.client

адрес устройства, где открыта панель

Исходная запись события (UI, Client) остаётся рядом.

Все правила «Демо-зала»

Событие, которое ловит правило, указано в последнем столбце:

Блок (по первым словам названия)

Элемент или шаблон

Событие

Главная: сценарии

Home_Meeting_b, Home_Vcs_b, Pop_Yes_b (по одному правилу на элемент)

push

Экран

Src_*_b

push

ВКС: кнопки и список

Vcs_Contacts_b, Vcs_History_b, Vcs_Call_b, Vcs_Hangup_b

push

ВКС: кнопки и список

Vcs_Mic_b (кнопка-переключатель)

value_changed

ВКС: кнопки и список

Vcs_List_ls

item_selected

Микрофоны

Mic_AllOff_b, затем Mic_*_b

push

Звук: ползунки и кнопки

Snd_*_vol_sl

slide_end

Звук: ползунки и кнопки

Snd_*_b, Hdr_Mics_b, Hdr_Sound_b

push

Камеры

Cam_1_b, Cam_2_b, Cam_3_b, Cam_Home_b, Cam_Wide_b

push

Камеры

шесть кнопок движения (регулярное выражение)

push — начать, release — остановить

Рецепты

Rcp_Nav_*_b

push

Ввод с клавиатуры

Rcp_In*_in

value_changed

В блоке «Ввод с клавиатуры» есть и второе правило — «любое другое событие» инпута: оно ведёт только в выключенный узел debug. Так можно увидеть, что ещё присылает поле ввода, если вы включите ему отправку символов (в готовом интерфейсе она выключена).

Как проверить

  1. Подключите к выходу UI - Panel in узел debug с выводом $string(payload) (как — на странице «Связь интерфейса с программой») и нажмите элемент на панели: увидите имя object и событие event.

  2. Подключите debug к выходу правила в ui - switch и нажмите тот же элемент. Сообщение пришло — правило сработало. Нет — смотрите ниже.

Что вы увидите: на каждом выходе правила, которому подошло событие, в отладке появляется сообщение с полями ui, object, event, value.

Частые ошибки

  • Правило не срабатывает. Проверьте по порядку: выбран ли интерфейс; совпадает ли имя элемента до буквы (регистр, пробелы); для шаблона — включён ли флажок «Шаблон» и верно ли выбран режим (* работает только в wildcard, а в regex это спецсимвол); нет ли выше правила, которое перехватывает событие при «остановке после первого совпадения»; не изменилось ли событие (кнопка шлёт push, а не value_changed).

  • Узел молча ничего не делает. ui - switch игнорирует сообщения без UI, чужого интерфейса, без object или event. Сообщение disconnected (панель закрыли) не имеет object — оно тоже уходит без выхода.

  • Действие выполняется три раза. В правиле оставили «Любое событие». Выберите push.

  • Элемента нет в списке «Поиск элемента…». Интерфейс не сохранён и не опубликован. Если рядом с именем звёздочки ** — такого элемента в интерфейсе уже нет: его переименовали или удалили.

  • Подошло не то правило. Имя элемента подходит под два правила, а проверка остановилась на первом. Поставьте точное правило выше шаблона.