# Обновление виджетов Очень важно понимать, как работает билдер и параметры виджета: ```cpp int val = 1234; void build(gh::Builder& b) { b.Display(val).label("My disp"); } ``` Все параметры виджета, указанные в билдере таким образом (в данном случае это значение и название), передаются в приложение только **во время загрузки ПУ**, билдер вызывается и отправляет виджеты со значениями. Это происходит в следующих случаях: - Открытие ПУ в приложении - Обновление ПУ в приложении (кнопка обновить в правом углу) - Обновление ПУ из программы через `hub.sendRefresh()` или `b.refresh()` > Если значение переменной изменяется где-то в программе - эти изменения будут отправлены в приложение только при следующей загрузке ПУ. В библиотеке предусмотрено изменение значения и параметров виджета в любой нужный момент, механизм называется обновление виджета. ## Имя виджета Для отправки обновления виджету должно быть присвоено уникальное имя (функция с подчёркиванием): ```cpp b.Display_("disp", val).label("My disp"); ``` ## Обновление значения Если изменить нужно только значение, то можно воспользоваться функцией `sendUpdate()` ```cpp hub.sendUpdate("disp", val); ``` Если в билдере в виджет передаётся переменная, которая всегда хранит актуальное значение (как в примере выше) - можно использовать функцию в таком виде: ```cpp hub.sendUpdate("disp"); ``` Библиотека вызовет билдер, прочитает значение и отправит его в приложение. ## Полное обновление Для обновления других параметров виджета есть следующая конструкция: ```cpp hub.update("имя").параметр(значение).параметр(значение)... ``` Можно обновить любой параметр, который соответствует этому виджету (см. таблицу). Для обновления значения используется параметр `value`: ```cpp hub.update("disp").value(val).label("new label"); // или hub.update("disp").value(random(1000)); ``` ## Пакетное обновление Для одновременного обновления сразу нескольких виджетов можно использовать пакетные обновления: ```cpp gh::Update upd(&hub); upd.update("имя1").параметр(значение).параметр(значение)... upd.update("имя2").параметр(значение).параметр(значение)... upd.update("имя3").параметр(значение).параметр(значение)... upd.send(); ``` ## Время и место обновления Обновления можно отправлять не всегда и не везде, рассмотрим подробнее. ### Из билдера - Отправлять обновление из билдера можно только в том случае, если билдер вызван для обработки действия. Простыми словами - отправить обновление можно только по событию `click()` или в обработчике `attach()` - Отправлять обновление через `sendUpdate(имя)` внутри билдера нельзя Отправим обновление со значением по нажатию на кнопку: ```cpp void build(gh::Builder& b) { b.Display_("disp"); if (b.Button().click()) hub.update("disp").value(random(1000)); } ``` ### Из программы Из остальных мест программы можно отправлять любые обновления, но не следует делать это слишком часто: можно перегрузить интерфейс связи. В библиотеке предусмотрен очень простой программный таймер, периодические обновления можно отправлять по нему: ```cpp 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 для активации: ```cpp 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(); ```