Skip to content

5. Обновление виджетов

AlexGyver edited this page Feb 25, 2024 · 1 revision

Обновление виджетов

Очень важно понимать, как работает билдер и параметры виджета:

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

Некоторые виджеты требуют отправки обновления 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();