You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
5.9 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Обновление виджетов
Очень важно понимать, как работает билдер и параметры виджета:
```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();
```