Приём событий: 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: правила по порядку
Одно правило — один выход. У узла столько выходов, сколько правил: нажатие на панели посылает сообщение на выход того правила, под которое оно подошло.
Как добавить узел:
Перетащите
ui - switchиз палитры на вкладку.Соедините выход
UI - Panel in(илиlink in, который ведёт от него) со входомui - switch.Двойным щелчком откройте узел.
Правило для одного элемента
Когда. Нужна реакция на конкретную кнопку: «Начало совещания», «Позвонить».
В поле «Интерфейс» выберите интерфейс, события которого нужны. Без интерфейса узел ничего не пропустит.
В разделе «Правила маршрутизации» добавьте правило.
В поле «Поиск элемента…» введите не меньше двух букв имени и выберите элемент из подсказок (их не больше десяти). Список заполняется после «Сохранить» и «Опубликовать» в UI-Designer.
В выпадающем списке события выберите нужное. По умолчанию стоит «Любое событие». Для кнопок его лучше заменить на
push(причины — ниже).Нажмите «Готово».
Окно ui - switch «Главная»: 1 — «Интерфейс», 2 — «Правила маршрутизации», 3 — выбор элемента (рядом поле «Поиск элемента…»), 4 — выбор события push, 5 — «Проверка:»
Что вы увидите: у узла появился выход, подписанный номером правила. Нажмите кнопку на панели — по этому выходу пойдёт сообщение.
Правило для группы элементов (шаблон)
Когда. Много похожих кнопок, и реагировать на них нужно одинаково: шесть источников, 13 мест за столом. Вместо 13 правил хватит одного — по общей части имени.
Добавьте правило и включите флажок «Шаблон». Поле «Поиск элемента…» скрывается, появляются поле шаблона и выбор режима.
Впишите шаблон, например
Src_*_b.В выпадающем списке рядом выберите режим сравнения. Он сам не определяется: подходящий шаблон с неверным режимом просто не сработает.
Выберите событие, как для одного элемента.
Режим |
Что значит |
Пример шаблона |
Подходит |
|---|---|---|---|
|
имя целиком |
|
только |
|
имя начинается с |
|
|
|
имя заканчивается на |
|
|
|
имя содержит |
|
|
|
|
|
|
|
регулярное выражение |
|
|
В режиме regex звёздочка — не «любая часть», а спецсимвол выражения; для привычных шаблонов с * берите wildcard. Во всех режимах регистр различается.
Правило с шаблоном в узле ui - switch «Экран» (блок «Экран»): 1 — «Интерфейс», 2 — номер правила, 3 — шаблон Src_*_b с флажком «Шаблон», 4 — режим wildcard (*, ?), 5 — «Проверка:»
Один шаблон вместо семи правил: в блоке «Экран» все кнопки источников попадают в одно правило Src_*_b. Если добавить восьмой источник, правило менять не нужно.
Имена в «Демо-зале» построены по схеме Группа_Объект_тип, поэтому шаблоны получаются короткими:
Шаблон |
Какие элементы |
Куда ведёт |
|---|---|---|
|
шесть источников и кнопка «Убрать источник» |
команда матрице |
|
13 мест за столом и «Выключить все» |
команда звуковому процессору |
|
ползунки громкости зала и ВКС |
команда уровня |
|
кнопки звука |
mute или шаг громкости (кнопки +/−) |
|
кнопки управления камерой |
команда камеры |
|
вкладки интерфейса «Рецепты» |
повторная отправка значений на вкладки |
Какое событие выбрать
Список событий зависит от типа элемента, который вы выбрали в правиле:
Элемент |
События в списке |
Какое брать |
|---|---|---|
Кнопка |
|
|
Ползунок |
|
|
Спидометр |
|
|
Список |
|
|
Фрейм (окно) |
|
не используйте: об открытии окна программа узнаёт по |
Инпут |
|
|
Если тип элемента неизвестен (например, в правиле с шаблоном), в списке показаны события всех типов.
Один клик по кнопке — три сообщения: 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 выбирают управляемую камеру и идут отдельными правилами по элементам.
Правила блока «Камеры»: 1 — шаблон кнопок движения и событие push, 2 — тот же шаблон и событие release, 3 — «Проверка:»
Что приходит на выходе
На выходе правила в msg.payload добавлены отдельные поля, которые можно брать в change и function:
Поле |
Что в нём |
|---|---|
|
имя интерфейса |
|
имя элемента |
|
событие |
|
значение, если событие его несёт |
|
адрес устройства, где открыта панель |
Исходная запись события (UI, Client) остаётся рядом.
Все правила «Демо-зала»
Событие, которое ловит правило, указано в последнем столбце:
Блок (по первым словам названия) |
Элемент или шаблон |
Событие |
|---|---|---|
Главная: сценарии |
|
|
Экран |
|
|
ВКС: кнопки и список |
|
|
ВКС: кнопки и список |
|
|
ВКС: кнопки и список |
|
|
Микрофоны |
|
|
Звук: ползунки и кнопки |
|
|
Звук: ползунки и кнопки |
|
|
Камеры |
|
|
Камеры |
шесть кнопок движения (регулярное выражение) |
|
Рецепты |
|
|
Ввод с клавиатуры |
|
|
В блоке «Ввод с клавиатуры» есть и второе правило — «любое другое событие» инпута: оно ведёт только в выключенный узел debug. Так можно увидеть, что ещё присылает поле ввода, если вы включите ему отправку символов (в готовом интерфейсе она выключена).
Как проверить
Подключите к выходу
UI - Panel inузелdebugс выводом$string(payload)(как — на странице «Связь интерфейса с программой») и нажмите элемент на панели: увидите имяobjectи событиеevent.Подключите
debugк выходу правила вui - switchи нажмите тот же элемент. Сообщение пришло — правило сработало. Нет — смотрите ниже.
Что вы увидите: на каждом выходе правила, которому подошло событие, в отладке появляется сообщение с полями ui, object, event, value.
Частые ошибки
Правило не срабатывает. Проверьте по порядку: выбран ли интерфейс; совпадает ли имя элемента до буквы (регистр, пробелы); для шаблона — включён ли флажок «Шаблон» и верно ли выбран режим (
*работает только вwildcard, а вregexэто спецсимвол); нет ли выше правила, которое перехватывает событие при «остановке после первого совпадения»; не изменилось ли событие (кнопка шлётpush, а неvalue_changed).Узел молча ничего не делает.
ui - switchигнорирует сообщения безUI, чужого интерфейса, безobjectилиevent. Сообщениеdisconnected(панель закрыли) не имеетobject— оно тоже уходит без выхода.Действие выполняется три раза. В правиле оставили «Любое событие». Выберите
push.Элемента нет в списке «Поиск элемента…». Интерфейс не сохранён и не опубликован. Если рядом с именем звёздочки
**— такого элемента в интерфейсе уже нет: его переименовали или удалили.Подошло не то правило. Имя элемента подходит под два правила, а проверка остановилась на первом. Поставьте точное правило выше шаблона.