5. Обновление виджетов
Очень важно понимать, как работает билдер и параметры виджета:
int val = 1234;
void build(gh::Builder& b) {
b.Display(val).label("My disp");
}
Все параметры виджета, указанные в билдере таким образом (в данном случае это значение и название), передаются в приложение только во время загрузки ПУ, билдер вызывается и отправляет виджеты со значениями. Это происходит в следующих случаях:
- Открытие ПУ в приложении
- Обновление ПУ в приложении (кнопка обновить в правом углу)
- Обновление ПУ из программы через
hub.sendRefresh()
илиb.refresh()
Если значение переменной изменяется где-то в программе - эти изменения будут отправлены в приложение только при следующей загрузке ПУ.
В библиотеке предусмотрено изменение значения и параметров виджета в любой нужный момент, механизм называется обновление виджета.
Для отправки обновления виджету должно быть присвоено уникальное имя (функция с подчёркиванием):
b.Display_("disp", val).label("My disp");
Если изменить нужно только значение, то можно воспользоваться функцией sendUpdate()
hub.sendUpdate("disp", val);
Если в билдере в виджет передаётся переменная, которая всегда хранит актуальное значение (как в примере выше) - можно использовать функцию в таком виде:
hub.sendUpdate("disp");
Библиотека вызовет билдер, прочитает значение и отправит его в приложение.
Для обновления других параметров виджета есть следующая конструкция:
hub.update("имя").параметр(значение).параметр(значение)...
Можно обновить любой параметр, который соответствует этому виджету (см. таблицу). Для обновления значения используется параметр value
:
hub.update("disp").value(val).label("new label");
// или
hub.update("disp").value(random(1000));
Для одновременного обновления сразу нескольких виджетов можно использовать пакетные обновления:
gh::Update upd(&hub);
upd.update("имя1").параметр(значение).параметр(значение)...
upd.update("имя2").параметр(значение).параметр(значение)...
upd.update("имя3").параметр(значение).параметр(значение)...
upd.send();
Обновления можно отправлять не всегда и не везде, рассмотрим подробнее.
- Отправлять обновление из билдера можно только в том случае, если билдер вызван для обработки действия. Простыми словами - отправить обновление можно только по событию
click()
или в обработчикеattach()
- Отправлять обновление через
sendUpdate(имя)
внутри билдера нельзя
Отправим обновление со значением по нажатию на кнопку:
void build(gh::Builder& b) {
b.Display_("disp");
if (b.Button().click()) hub.update("disp").value(random(1000));
}
Из остальных мест программы можно отправлять любые обновления, но не следует делать это слишком часто: можно перегрузить интерфейс связи. В библиотеке предусмотрен очень простой программный таймер, периодические обновления можно отправлять по нему:
void build(gh::Builder& b) {
b.Title_("tit").value("Title");
}
void loop() {
hub.tick();
// отправляем обновление каждую секунду
static gh::Timer tmr(1000);
if (tmr) hub.update("tit").value(millis());
}
Некоторые виджеты требуют отправки обновления action
для совершения некоторых действий. Например всплывающие окна Confirm
и Prompt
требуют action для активации:
if (b.Confirm_("cfm").text("confirm text").click()) {
Serial.print("confirm: ");
Serial.println(b.build.value);
}
String prom;
if (b.Prompt_("prom", &prom).text("prompt text").click()) {
Serial.print("prompt: ");
Serial.println(prom);
}
// так
if (b.Button().label("confirm").click()) hub.sendAction("cfm");
// или так
if (b.Button().label("prompt").click()) hub.update("prom").action();