17#include "localization.h"
27#include "os_io_seph_ux.h"
29#include "os_helpers.h"
36#define INTERNAL_SPACE 16
38#define INNER_MARGIN 12
40#define NB_MAX_LAYOUTS 3
43#define NB_MAX_CONTAINER_CHILDREN 20
45#define TAG_VALUE_ICON_WIDTH 32
47#if defined(TARGET_STAX)
48#define RADIO_CHOICE_HEIGHT 96
49#define BAR_INTERVALE 12
50#define FOOTER_BUTTON_HEIGHT 128
51#define FOOTER_IN_PAIR_HEIGHT 80
52#define ROUNDED_AND_FOOTER_FOOTER_HEIGHT 192
53#define FOOTER_TEXT_AND_NAV_WIDTH 160
54#define TAP_TO_CONTINUE_MARGIN 24
55#define SUB_HEADER_MARGIN 24
56#define PRE_FIRST_TEXT_MARGIN 24
57#define INTER_PARAGRAPHS_MARGIN 40
58#define PRE_TITLE_MARGIN 24
59#define PRE_DESCRIPTION_MARGIN 16
60#define INTER_DESCRIPTIONS_MARGIN 16
61#define PRE_FIRST_ROW_MARGIN 32
62#define INTER_ROWS_MARGIN 16
63#define QR_PRE_TEXT_MARGIN 24
64#define QR_INTER_TEXTS_MARGIN 40
65#define SPINNER_TEXT_MARGIN 20
66#define SPINNER_INTER_TEXTS_MARGIN 20
67#define BAR_TEXT_MARGIN 24
68#define BAR_INTER_TEXTS_MARGIN 16
69#define LEFT_CONTENT_TEXT_PADDING 0
70#define BUTTON_FROM_BOTTOM_MARGIN 4
71#define TOP_BUTTON_MARGIN VERTICAL_BORDER_MARGIN
72#define TOP_BUTTON_MARGIN_WITH_ACTION VERTICAL_BORDER_MARGIN
73#define SINGLE_BUTTON_MARGIN 24
74#define LONG_PRESS_PROGRESS_HEIGHT 8
75#define LONG_PRESS_PROGRESS_ALIGN 1
76#define LEFT_CONTENT_ICON_TEXT_X 16
77#define TIP_BOX_MARGIN_Y 24
78#define TIP_BOX_TEXT_ICON_MARGIN 24
79#elif defined(TARGET_FLEX)
80#define RADIO_CHOICE_HEIGHT 92
81#define BAR_INTERVALE 16
82#define FOOTER_BUTTON_HEIGHT 136
83#define FOOTER_IN_PAIR_HEIGHT 88
84#define ROUNDED_AND_FOOTER_FOOTER_HEIGHT 208
85#define FOOTER_TEXT_AND_NAV_WIDTH 192
86#define TAP_TO_CONTINUE_MARGIN 30
87#define SUB_HEADER_MARGIN 28
88#define PRE_FIRST_TEXT_MARGIN 0
89#define INTER_PARAGRAPHS_MARGIN 24
90#define PRE_TITLE_MARGIN 16
91#define PRE_DESCRIPTION_MARGIN 24
92#define INTER_DESCRIPTIONS_MARGIN 24
93#define PRE_FIRST_ROW_MARGIN 32
94#define INTER_ROWS_MARGIN 24
95#define QR_PRE_TEXT_MARGIN 24
96#define QR_INTER_TEXTS_MARGIN 28
97#define SPINNER_TEXT_MARGIN 24
98#define SPINNER_INTER_TEXTS_MARGIN 16
99#define BAR_TEXT_MARGIN 24
100#define BAR_INTER_TEXTS_MARGIN 16
101#define LEFT_CONTENT_TEXT_PADDING 4
102#define BUTTON_FROM_BOTTOM_MARGIN 4
103#define TOP_BUTTON_MARGIN VERTICAL_BORDER_MARGIN
104#define TOP_BUTTON_MARGIN_WITH_ACTION VERTICAL_BORDER_MARGIN
105#define SINGLE_BUTTON_MARGIN 24
106#define LONG_PRESS_PROGRESS_HEIGHT 8
107#define LONG_PRESS_PROGRESS_ALIGN 1
108#define LEFT_CONTENT_ICON_TEXT_X 16
109#define TIP_BOX_MARGIN_Y 24
110#define TIP_BOX_TEXT_ICON_MARGIN 32
111#elif defined(TARGET_APEX)
112#define RADIO_CHOICE_HEIGHT 68
113#define BAR_INTERVALE 8
114#define FOOTER_BUTTON_HEIGHT 88
115#define FOOTER_IN_PAIR_HEIGHT 60
116#define ROUNDED_AND_FOOTER_FOOTER_HEIGHT 128
117#define FOOTER_TEXT_AND_NAV_WIDTH 120
118#define TAP_TO_CONTINUE_MARGIN 30
119#define SUB_HEADER_MARGIN 16
120#define PRE_FIRST_TEXT_MARGIN 0
121#define INTER_PARAGRAPHS_MARGIN 16
122#define PRE_TITLE_MARGIN 16
123#define PRE_DESCRIPTION_MARGIN 12
124#define INTER_DESCRIPTIONS_MARGIN 12
125#define PRE_FIRST_ROW_MARGIN 24
126#define INTER_ROWS_MARGIN 12
127#define QR_PRE_TEXT_MARGIN 16
128#define QR_INTER_TEXTS_MARGIN 20
129#define SPINNER_TEXT_MARGIN 16
130#define SPINNER_INTER_TEXTS_MARGIN 16
131#define BAR_TEXT_MARGIN 16
132#define BAR_INTER_TEXTS_MARGIN 12
133#define LEFT_CONTENT_TEXT_PADDING 4
134#define BUTTON_FROM_BOTTOM_MARGIN 0
135#define TOP_BUTTON_MARGIN 12
136#define TOP_BUTTON_MARGIN_WITH_ACTION 0
137#define SINGLE_BUTTON_MARGIN 16
138#define LONG_PRESS_PROGRESS_HEIGHT 4
139#define LONG_PRESS_PROGRESS_ALIGN 0
140#define LEFT_CONTENT_ICON_TEXT_X 8
141#define TIP_BOX_MARGIN_Y 12
142#define TIP_BOX_TEXT_ICON_MARGIN 20
144#error Undefined target
148#define SPINNER_REFRESH_PERIOD 400
195static uint8_t nbTouchableControls = 0;
203#if defined(TARGET_FLEX)
205#define HOLD_TO_APPROVE_STEP_PERCENT (7)
207#define HOLD_TO_APPROVE_STEP_DURATION_MS (100)
209#define HOLD_TO_APPROVE_FIRST_STEP (0)
210#elif defined(TARGET_STAX)
211#define HOLD_TO_APPROVE_STEP_PERCENT (25)
212#define HOLD_TO_APPROVE_STEP_DURATION_MS (400)
213#define HOLD_TO_APPROVE_FIRST_STEP (1)
214#elif defined(TARGET_APEX)
215#define HOLD_TO_APPROVE_STEP_PERCENT (20)
216#define HOLD_TO_APPROVE_STEP_DURATION_MS (300)
217#define HOLD_TO_APPROVE_FIRST_STEP (1)
220static inline uint8_t get_hold_to_approve_percent(uint32_t touch_duration)
222 uint8_t current_step_nb
223 = (touch_duration / HOLD_TO_APPROVE_STEP_DURATION_MS) + HOLD_TO_APPROVE_FIRST_STEP;
224 return (current_step_nb * HOLD_TO_APPROVE_STEP_PERCENT);
228static bool getLayoutAndLayoutObj(
nbgl_obj_t *obj,
235 if ((topLayout) && (topLayout->
isUsed)) {
242 "getLayoutAndLayoutObj(): obj found in layout %p "
243 "nbUsedCallbackObjs = %d\n",
256static void radioTouchCallback(
nbgl_obj_t *obj,
269 bool needRefresh =
false;
275 if (getLayoutAndLayoutObj(obj, &layout, &layoutObj) ==
false) {
277 if (getLayoutAndLayoutObj(obj->parent, &layout, &layoutObj) ==
false) {
280 "touchCallback(): eventType = %d, obj = %p, no active layout or obj not found\n",
298 layoutObj->
index = eventType;
347 layoutObj->
index = lSwitch->state;
353 radioTouchCallback(obj, eventType, layout);
360 longTouchCallback(obj, eventType, layout, layoutObj);
365#ifdef HAVE_PIEZO_SOUND
367 os_io_seph_cmd_piezo_play_tune(layoutObj->
tuneId);
394 uint8_t new_state = get_hold_to_approve_percent(touchDuration);
398 bool trigger_callback = (new_state >= 100) && (progressBar->state < 100);
401 if (new_state >= 100) {
406 if (new_state != progressBar->state) {
407 progressBar->partialRedraw =
true;
408 progressBar->state = new_state;
417 if (trigger_callback) {
428 progressBar->partialRedraw =
true;
429 progressBar->state = 0;
439static void radioTouchCallback(
nbgl_obj_t *obj,
443 uint8_t i =
NB_MAX_LAYOUTS, radioIndex = 0, foundRadio = 0xFF, foundRadioIndex;
451 while (i < layout->nbUsedCallbackObjs) {
461 foundRadioIndex = radioIndex;
463 textArea->textColor =
BLACK;
464 textArea->fontId = SMALL_BOLD_FONT;
486 textArea->fontId = SMALL_REGULAR_FONT;
494 if (foundRadio != 0xFF) {
496#ifdef HAVE_PIEZO_SOUND
508static void spinnerTickerCallback(
void)
513 if (!topLayout || !topLayout->
isUsed) {
518 while (i < topLayout->container->nbChildren) {
521 if (container->nbChildren && (container->children[0]->type ==
SPINNER)) {
526 spinner->position = 0;
538static void animTickerCallback(
void)
549 while (i < layout->container->nbChildren) {
552 if (container->children[1]->type ==
IMAGE) {
591static nbgl_line_t *createHorizontalLine(uint8_t layer)
597 line->obj.area.width = SCREEN_WIDTH;
598 line->obj.area.height = 1;
605static nbgl_line_t *createLeftVerticalLine(uint8_t layer)
611 line->obj.area.width = 1;
612 line->obj.area.height = SCREEN_HEIGHT;
632 layoutObj->
obj = obj;
633 layoutObj->
token = token;
634 layoutObj->
tuneId = tuneId;
683 layoutInt->
container->obj.touchMask = swipesMask;
721 container->nbChildren = 0;
724 container->obj.area.height
725 = LIST_ITEM_MIN_TEXT_HEIGHT
726 + 2 * (itemDesc->
large ? LIST_ITEM_PRE_HEADING_LARGE : LIST_ITEM_PRE_HEADING);
728 container->obj.alignmentMarginX = BORDER_MARGIN;
730 container->obj.alignTo = NULL;
735 container->obj.touchMask = (1 <<
TOUCHED);
736 container->obj.touchId =
CONTROLS_ID + nbTouchableControls;
737 nbTouchableControls++;
741 if (itemDesc->
text != NULL) {
743 textArea->textColor = color;
744 textArea->text = PIC(itemDesc->
text);
745 textArea->onDrawCallback = NULL;
746 textArea->fontId = fontId;
747 textArea->wrapping =
true;
748 textArea->obj.area.width = container->obj.area.width;
751 textArea->obj.area.width
756 textArea->obj.area.width
760 textArea->obj.area.width -= SWITCH_ICON.width + BAR_INTERVALE;
762 textArea->obj.area.height =
MAX(
763 LIST_ITEM_MIN_TEXT_HEIGHT,
765 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping));
768 textArea->obj.alignmentMarginY
769 = itemDesc->
large ? LIST_ITEM_PRE_HEADING_LARGE : LIST_ITEM_PRE_HEADING;
770 if (textArea->obj.area.height > LIST_ITEM_MIN_TEXT_HEIGHT) {
771 textArea->obj.alignmentMarginY
772 -= (textArea->obj.area.height - LIST_ITEM_MIN_TEXT_HEIGHT) / 2;
775 container->children[container->nbChildren] = (
nbgl_obj_t *) textArea;
776 container->nbChildren++;
782 imageLeft->foregroundColor = color;
783 imageLeft->buffer = PIC(itemDesc->
iconLeft);
785 imageLeft->obj.alignment =
MID_LEFT;
786 imageLeft->obj.alignTo = (
nbgl_obj_t *) textArea;
787 imageLeft->obj.alignmentMarginX = BAR_INTERVALE;
788 container->children[container->nbChildren] = (
nbgl_obj_t *) imageLeft;
789 container->nbChildren++;
791 if (textArea != NULL) {
792 textArea->obj.alignmentMarginX = imageLeft->buffer->width + BAR_INTERVALE;
798 imageRight->foregroundColor = color;
799 imageRight->buffer = PIC(itemDesc->
iconRight);
802 imageRight->obj.alignmentMarginX = BAR_INTERVALE;
803 imageRight->obj.alignTo = (
nbgl_obj_t *) textArea;
805 container->children[container->nbChildren] = (
nbgl_obj_t *) imageRight;
806 container->nbChildren++;
810 switchObj->onColor =
BLACK;
812 switchObj->state = itemDesc->
state;
814 switchObj->obj.alignmentMarginX = BAR_INTERVALE;
815 switchObj->obj.alignTo = (
nbgl_obj_t *) textArea;
817 container->children[container->nbChildren] = (
nbgl_obj_t *) switchObj;
818 container->nbChildren++;
821 if (itemDesc->
subText != NULL) {
825 subTextArea->textColor = color;
826 subTextArea->text = PIC(itemDesc->
subText);
827 subTextArea->textAlignment =
MID_LEFT;
828 subTextArea->fontId = SMALL_REGULAR_FONT;
830 subTextArea->wrapping =
true;
831 if (itemDesc->
text != NULL) {
833 subTextArea->obj.alignTo = (
nbgl_obj_t *) textArea;
834 subTextArea->obj.alignmentMarginY = LIST_ITEM_HEADING_SUB_TEXT;
837 subTextArea->obj.alignment =
TOP_LEFT;
838 subTextArea->obj.alignmentMarginY = SUB_HEADER_MARGIN;
839 container->obj.area.height = SUB_HEADER_MARGIN;
842 subTextArea->obj.alignmentMarginX
845 subTextArea->obj.area.width = container->obj.area.width;
848 subTextArea->obj.area.width,
849 subTextArea->wrapping);
850 container->children[container->nbChildren] = (
nbgl_obj_t *) subTextArea;
851 container->nbChildren++;
852 container->obj.area.height
853 += subTextArea->obj.area.height + subTextArea->obj.alignmentMarginY;
875 uint16_t fullHeight = 0;
880 container->nbChildren = 0;
885 if (info->
icon != NULL) {
888 image->buffer = PIC(info->
icon);
890 image->obj.alignmentMarginY = info->
iconHug;
892 fullHeight += image->buffer->height + info->
iconHug;
893 container->children[container->nbChildren] = (
nbgl_obj_t *) image;
894 container->nbChildren++;
905 container->children[container->nbChildren] = (
nbgl_obj_t *) anim;
906 container->nbChildren++;
917 tickerCfg.tickerCallback = &animTickerCallback;
922 if (info->
title != NULL) {
925 textArea->text = PIC(info->
title);
926 textArea->textAlignment =
CENTER;
927 textArea->fontId = LARGE_MEDIUM_FONT;
928 textArea->wrapping =
true;
931 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
934 if (container->nbChildren > 0) {
937 textArea->obj.alignmentMarginY = ICON_TITLE_MARGIN + info->
iconHug;
943 fullHeight += textArea->obj.area.height + textArea->obj.alignmentMarginY;
945 container->children[container->nbChildren] = (
nbgl_obj_t *) textArea;
946 container->nbChildren++;
953 textArea->textAlignment =
CENTER;
954 textArea->fontId = SMALL_BOLD_FONT;
955 textArea->wrapping =
true;
958 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
961 if (container->nbChildren > 0) {
963 textArea->obj.alignTo = (
nbgl_obj_t *) container->children[container->nbChildren - 1];
964 textArea->obj.alignmentMarginY = VERTICAL_BORDER_MARGIN;
965 if (container->children[container->nbChildren - 1]->type ==
IMAGE) {
966 textArea->obj.alignmentMarginY = VERTICAL_BORDER_MARGIN + info->
iconHug;
969 textArea->obj.alignmentMarginY = TITLE_DESC_MARGIN;
976 fullHeight += textArea->obj.area.height + textArea->obj.alignmentMarginY;
978 container->children[container->nbChildren] = (
nbgl_obj_t *) textArea;
979 container->nbChildren++;
986 textArea->textAlignment =
CENTER;
987 textArea->fontId = SMALL_REGULAR_FONT;
988 textArea->wrapping =
true;
991 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
994 if (container->nbChildren > 0) {
996 textArea->obj.alignTo = (
nbgl_obj_t *) container->children[container->nbChildren - 1];
997 if (container->children[container->nbChildren - 1]->type ==
TEXT_AREA) {
999 textArea->obj.alignmentMarginY = TITLE_DESC_MARGIN;
1002 textArea->obj.alignmentMarginY = ICON_TITLE_MARGIN + info->
iconHug;
1009 fullHeight += textArea->obj.area.height + textArea->obj.alignmentMarginY;
1011 container->children[container->nbChildren] = (
nbgl_obj_t *) textArea;
1012 container->nbChildren++;
1018 textArea->text = PIC(info->
subText);
1019 textArea->textAlignment =
CENTER;
1020 textArea->fontId = SMALL_REGULAR_FONT;
1021 textArea->wrapping =
true;
1024 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
1026 textArea->obj.area.height += 2 * 8;
1028 if (container->nbChildren > 0) {
1030 textArea->obj.alignTo = (
nbgl_obj_t *) container->children[container->nbChildren - 1];
1031 textArea->obj.alignmentMarginY = 16;
1032 if (container->children[container->nbChildren - 1]->type ==
IMAGE) {
1033 textArea->obj.alignmentMarginY += info->
iconHug;
1040 fullHeight += textArea->obj.area.height + textArea->obj.alignmentMarginY;
1042 container->children[container->nbChildren] = (
nbgl_obj_t *) textArea;
1043 container->nbChildren++;
1046 container->obj.alignment =
CENTER;
1048 container->obj.area.height = fullHeight;
1050 container->obj.area.height += 40;
1073 if (description->
modal) {
1077 if (!gLayout[i].isUsed) {
1078 layout = &gLayout[i];
1084 layout = &gLayout[0];
1085 if (topLayout == NULL) {
1089 if (layout == NULL) {
1098 if (description->
modal) {
1099 if (topLayout != NULL) {
1101 topLayout->
top = layout;
1102 layout->
bottom = topLayout;
1106 layout->
bottom = &gLayout[0];
1107 gLayout[0].
top = layout;
1113 gLayout[0].
top = backgroundTop;
1116 nbTouchableControls = 0;
1121 if (description->
modal) {
1135 layout->
container->obj.area.width = SCREEN_WIDTH;
1136 layout->
container->obj.area.height = SCREEN_HEIGHT;
1148 const char *tapActionText = PIC(description->
tapActionText);
1158 if (strlen(tapActionText) > 0) {
1161 footerDesc.
text.text = tapActionText;
1182 uint16_t swipesMask,
1185 tune_index_e tuneId)
1190 if (layout == NULL) {
1197 layoutInt->
tapText->text = PIC(text);
1199 layoutInt->
tapText->fontId = SMALL_REGULAR_FONT;
1203 layoutInt->
tapText->obj.alignmentMarginY = TAP_TO_CONTINUE_MARGIN;
1221 if (layout == NULL) {
1251 tune_index_e tuneId)
1258 if (layout == NULL) {
1269 button->radius = BUTTON_RADIUS;
1270 button->obj.alignmentMarginX = BORDER_MARGIN;
1271 button->obj.alignmentMarginY = BORDER_MARGIN;
1272 button->foregroundColor =
BLACK;
1273 button->innerColor =
WHITE;
1275 button->obj.touchMask = (1 <<
TOUCHED);
1277 button->icon = PIC(icon);
1322 bool separationLine,
1323 tune_index_e tuneId)
1352 if (layout == NULL) {
1356 if (barLayout->
text == NULL) {
1369 container = addListItem(layoutInt, &itemDesc);
1371 if (container == NULL) {
1374 return container->obj.area.height;
1391 if (layout == NULL) {
1395 if (switchLayout->
text == NULL) {
1399 itemDesc.
text = switchLayout->
text;
1404 itemDesc.
large =
false;
1406 container = addListItem(layoutInt, &itemDesc);
1408 if (container == NULL) {
1411 return container->obj.area.height;
1429 if (layout == NULL) {
1433 itemDesc.
text = text;
1438 container = addListItem(layoutInt, &itemDesc);
1440 if (container == NULL) {
1443 return container->obj.area.height;
1459 const char *subText,
1467 if (layout == NULL) {
1471 itemDesc.
text = text;
1474 itemDesc.
token = token;
1477 itemDesc.
index = index;
1479 container = addListItem(layoutInt, &itemDesc);
1481 if (container == NULL) {
1484 return container->obj.area.height;
1501 if (layout == NULL) {
1507 textArea->text = PIC(text);
1508 textArea->textAlignment =
MID_LEFT;
1509 textArea->fontId = LARGE_MEDIUM_FONT;
1511 textArea->wrapping =
true;
1513 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
1516 textArea->obj.alignmentMarginX = BORDER_MARGIN;
1517 if (layoutInt->
container->nbChildren == 0) {
1519 textArea->obj.alignmentMarginY += PRE_FIRST_TEXT_MARGIN;
1522 textArea->obj.alignmentMarginY = INTER_PARAGRAPHS_MARGIN;
1548 if (layout == NULL) {
1553 if (content->
title != NULL) {
1555 textArea->textColor =
BLACK;
1556 textArea->text = PIC(content->
title);
1557 textArea->textAlignment =
MID_LEFT;
1558 textArea->fontId = LARGE_MEDIUM_FONT;
1560 textArea->wrapping =
true;
1562 textArea->obj.alignmentMarginX = BORDER_MARGIN;
1563 textArea->obj.alignmentMarginY = PRE_TITLE_MARGIN;
1566 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
1574 textArea->textColor =
BLACK;
1576 textArea->fontId = SMALL_REGULAR_FONT;
1578 textArea->wrapping =
true;
1581 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
1582 textArea->textAlignment =
MID_LEFT;
1584 textArea->obj.alignmentMarginX = BORDER_MARGIN;
1585 textArea->obj.alignmentMarginY
1586 = (i == 0) ? PRE_DESCRIPTION_MARGIN : INTER_DESCRIPTIONS_MARGIN;
1592 if (content->
info != NULL) {
1595 textArea->text = PIC(content->
info);
1596 textArea->fontId = SMALL_REGULAR_FONT;
1598 textArea->wrapping =
true;
1601 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
1602 textArea->textAlignment =
MID_LEFT;
1604 textArea->obj.alignmentMarginX = BORDER_MARGIN;
1605 textArea->obj.alignmentMarginY = 40;
1610 return layoutInt->
container->obj.area.height;
1627 if (layout == NULL) {
1630 for (i = 0; i < choices->
nbChoices; i++) {
1647 container->nbChildren = 2;
1650 container->obj.area.height = RADIO_CHOICE_HEIGHT;
1652 container->obj.alignmentMarginX = BORDER_MARGIN;
1653 container->obj.alignTo = (
nbgl_obj_t *) NULL;
1656 button->activeColor =
BLACK;
1658 button->obj.alignTo = (
nbgl_obj_t *) container;
1661 container->children[1] = (
nbgl_obj_t *) button;
1665#ifdef HAVE_LANGUAGE_PACK
1666 textArea->text = get_ux_loc_string(choices->nameIds[i]);
1670 textArea->text = PIC(choices->
names[i]);
1672 textArea->textAlignment =
MID_LEFT;
1673 textArea->obj.area.width = container->obj.area.width - RADIO_WIDTH;
1675 textArea->obj.alignment =
MID_LEFT;
1676 textArea->obj.alignTo = (
nbgl_obj_t *) container;
1677 container->children[0] = (
nbgl_obj_t *) textArea;
1680 container->obj.touchMask = (1 <<
TOUCHED);
1681 container->obj.touchId =
CONTROLS_ID + nbTouchableControls;
1682 nbTouchableControls++;
1687 textArea->textColor =
BLACK;
1688 textArea->fontId = SMALL_BOLD_FONT;
1693 textArea->fontId = SMALL_REGULAR_FONT;
1697 line = createHorizontalLine(layoutInt->
layer);
1698 line->obj.alignmentMarginY = -1;
1723 if (layout == NULL) {
1730 if (info->
text1 != NULL) {
1738 if (info->
text2 != NULL) {
1746 if (info->
text3 != NULL) {
1754 container = addContentCenter(layoutInt, ¢eredInfo);
1757 container->obj.alignmentMarginX = BORDER_MARGIN;
1758 container->obj.alignmentMarginY = BORDER_MARGIN + info->
offsetY;
1762 container->obj.alignmentMarginY = info->
offsetY;
1765 return container->obj.area.height;
1782 if (layout == NULL) {
1786 container = addContentCenter(layoutInt, info);
1788 return container->obj.area.height;
1806 if (layout == NULL) {
1812 container->nbChildren = info->
nbRows + 1;
1816 container->obj.alignmentMarginX = BORDER_MARGIN;
1820 textArea->textColor =
BLACK;
1821 textArea->text = PIC(info->
title);
1822 textArea->textAlignment =
MID_LEFT;
1823 textArea->fontId = LARGE_MEDIUM_FONT;
1824 textArea->wrapping =
true;
1826 textArea->obj.alignmentMarginY = 24;
1830 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
1832 container->obj.area.height += textArea->obj.area.height + textArea->obj.alignmentMarginY;
1834 container->children[0] = (
nbgl_obj_t *) textArea;
1836 for (row = 0; row < info->
nbRows; row++) {
1842 rowContainer->nbChildren = 2;
1847 image->foregroundColor =
BLACK;
1848 image->buffer = PIC(info->
rowIcons[row]);
1849 rowContainer->children[0] = (
nbgl_obj_t *) image;
1852 textArea->textColor =
BLACK;
1853 textArea->text = PIC(info->
rowTexts[row]);
1854 textArea->textAlignment =
MID_LEFT;
1855 textArea->fontId = SMALL_REGULAR_FONT;
1856 textArea->wrapping =
true;
1857 textArea->obj.area.width
1860 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
1862 rowContainer->children[1] = (
nbgl_obj_t *) textArea;
1863 rowContainer->obj.area.height
1864 =
MAX(image->buffer->height, textArea->obj.area.height + LEFT_CONTENT_TEXT_PADDING);
1867 rowContainer->obj.alignmentMarginY = PRE_FIRST_ROW_MARGIN;
1870 rowContainer->obj.alignmentMarginY = INTER_ROWS_MARGIN;
1872 container->children[1 + row] = (
nbgl_obj_t *) rowContainer;
1873 container->obj.area.height
1874 += rowContainer->obj.area.height + rowContainer->obj.alignmentMarginY;
1878 return container->obj.area.height;
1896 uint16_t fullHeight = 0;
1899 if (layout == NULL) {
1907 container->nbChildren = 0;
1911 if (strlen(PIC(info->
url)) > 62) {
1917 qrcode->foregroundColor =
BLACK;
1923 qrcode->obj.area.width
1926 qrcode->obj.area.width
1929 qrcode->obj.area.height = qrcode->obj.area.width;
1930 qrcode->text = PIC(info->
url);
1934 fullHeight += qrcode->obj.area.height;
1935 container->children[container->nbChildren] = (
nbgl_obj_t *) qrcode;
1936 container->nbChildren++;
1938 if (info->
text1 != NULL) {
1940 textArea->textColor =
BLACK;
1941 textArea->text = PIC(info->
text1);
1942 textArea->textAlignment =
CENTER;
1943 textArea->fontId = (info->
largeText1 ==
true) ? LARGE_MEDIUM_FONT : SMALL_REGULAR_FONT;
1944 textArea->wrapping =
true;
1947 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
1949 textArea->obj.alignTo = (
nbgl_obj_t *) container->children[container->nbChildren - 1];
1950 textArea->obj.alignmentMarginY = QR_PRE_TEXT_MARGIN;
1952 fullHeight += textArea->obj.area.height + textArea->obj.alignmentMarginY;
1954 container->children[container->nbChildren] = (
nbgl_obj_t *) textArea;
1955 container->nbChildren++;
1957 if (info->
text2 != NULL) {
1960 textArea->text = PIC(info->
text2);
1961 textArea->textAlignment =
CENTER;
1962 textArea->fontId = SMALL_REGULAR_FONT;
1963 textArea->wrapping =
true;
1966 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
1968 textArea->obj.alignTo = (
nbgl_obj_t *) container->children[container->nbChildren - 1];
1969 if (info->
text1 != NULL) {
1970 textArea->obj.alignmentMarginY = QR_INTER_TEXTS_MARGIN;
1973 textArea->obj.alignmentMarginY = QR_PRE_TEXT_MARGIN + 8;
1976 fullHeight += textArea->obj.area.height + textArea->obj.alignmentMarginY + 8;
1978 container->children[container->nbChildren] = (
nbgl_obj_t *) textArea;
1979 container->nbChildren++;
1982 if ((fullHeight >= (layoutInt->
container->obj.area.height - 16))
1987 qrcode->obj.area.height = qrcode->obj.area.width;
1990 container->obj.area.height = fullHeight;
1993 container->obj.alignment =
CENTER;
1997 container->obj.alignTo
2000 container->obj.alignmentMarginY = info->
offsetY;
2046 .horizontalButtons.leftIcon = info->
leftIcon,
2047 .horizontalButtons.leftToken = info->
leftToken,
2048 .horizontalButtons.rightText = info->
rightText,
2049 .horizontalButtons.rightToken = info->
rightToken,
2050 .horizontalButtons.tuneId = info->
tuneId};
2070 if (layout == NULL) {
2074 for (i = 0; i < list->
nbPairs; i++) {
2076 uint16_t fullHeight = 0;
2080 uint8_t nbChildren = 2;
2083 if (list->
pairs != NULL) {
2084 pair = &list->
pairs[i];
2108 itemTextArea->text = PIC(pair->
item);
2109 itemTextArea->textAlignment =
MID_LEFT;
2110 itemTextArea->fontId = SMALL_REGULAR_FONT;
2111 itemTextArea->wrapping =
true;
2114 itemTextArea->fontId, itemTextArea->text,
AVAILABLE_WIDTH, itemTextArea->wrapping);
2115 container->children[container->nbChildren] = (
nbgl_obj_t *) itemTextArea;
2116 container->nbChildren++;
2118 fullHeight += itemTextArea->obj.area.height;
2121 valueTextArea->textColor =
BLACK;
2122 valueTextArea->text = PIC(pair->
value);
2123 valueTextArea->textAlignment =
MID_LEFT;
2125 valueTextArea->fontId = SMALL_BOLD_FONT;
2128 valueTextArea->fontId = LARGE_MEDIUM_FONT;
2136 valueIcon = &MINI_PUSH_ICON;
2143 valueTextArea->obj.area.width
2150 valueTextArea->text,
2151 valueTextArea->obj.area.width,
2160 valueTextArea->obj.area.height = nbLines * font->
line_height;
2163 valueTextArea->obj.alignTo = (
nbgl_obj_t *) itemTextArea;
2164 valueTextArea->wrapping = list->
wrapping;
2165 container->children[container->nbChildren] = (
nbgl_obj_t *) valueTextArea;
2166 container->nbChildren++;
2168 fullHeight += valueTextArea->obj.area.height + valueTextArea->obj.alignmentMarginY;
2169 if (valueIcon != NULL) {
2175 image->foregroundColor =
BLACK;
2176 image->buffer = valueIcon;
2179 image->obj.alignTo = (
nbgl_obj_t *) valueTextArea;
2181 container->obj.touchMask = (1 <<
TOUCHED);
2184 container->children[container->nbChildren] = (
nbgl_obj_t *) image;
2185 container->nbChildren++;
2191 textArea->textColor =
BLACK;
2193 textArea->textAlignment =
MID_LEFT;
2194 textArea->nbMaxLines = 1;
2195 textArea->fontId = SMALL_REGULAR_FONT;
2197 textArea->obj.area.width = valueTextArea->obj.area.width;
2200 textArea->obj.alignTo = (
nbgl_obj_t *) valueTextArea;
2201 textArea->wrapping = list->
wrapping;
2202 container->children[container->nbChildren] = (
nbgl_obj_t *) textArea;
2203 container->nbChildren++;
2204 fullHeight += textArea->obj.area.height + textArea->obj.alignmentMarginY;
2209 container->obj.area.height = fullHeight;
2211 container->obj.alignmentMarginX = BORDER_MARGIN;
2213 container->obj.alignmentMarginY = INTER_TAG_VALUE_MARGIN;
2221 container->obj.alignmentMarginY = INTER_TAG_VALUE_MARGIN;
2224 container->obj.alignmentMarginY = PRE_TAG_VALUE_MARGIN;
2249 const char *subText,
2258 if (layout == NULL) {
2265 container->nbChildren = (subText != NULL) ? 3 : 2;
2270 container->obj.alignment =
CENTER;
2274 progress->foregroundColor =
BLACK;
2275 progress->withBorder =
true;
2276 progress->state = percentage;
2277 progress->obj.area.width = PROGRESSBAR_WIDTH;
2278 progress->obj.area.height = PROGRESSBAR_HEIGHT;
2282 container->children[0] = (
nbgl_obj_t *) progress;
2285 container->obj.area.height = progress->obj.alignmentMarginY + progress->obj.area.height;
2289 textArea->textColor =
BLACK;
2290 textArea->text = PIC(text);
2291 textArea->textAlignment =
CENTER;
2292 textArea->fontId = LARGE_MEDIUM_FONT;
2293 textArea->wrapping =
true;
2294 textArea->obj.alignmentMarginY = BAR_TEXT_MARGIN;
2295 textArea->obj.alignTo = (
nbgl_obj_t *) progress;
2299 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
2303 container->obj.area.height += textArea->obj.alignmentMarginY + textArea->obj.area.height;
2306 container->children[1] = (
nbgl_obj_t *) textArea;
2308 if (subText != NULL) {
2312 subTextArea->textColor =
BLACK;
2313 subTextArea->text = PIC(subText);
2314 subTextArea->textAlignment =
CENTER;
2315 subTextArea->fontId = SMALL_REGULAR_FONT;
2316 subTextArea->wrapping =
true;
2317 subTextArea->obj.alignmentMarginY = BAR_INTER_TEXTS_MARGIN;
2318 subTextArea->obj.alignTo = (
nbgl_obj_t *) textArea;
2323 subTextArea->obj.area.width,
2324 subTextArea->wrapping);
2328 container->obj.area.height
2329 += subTextArea->obj.alignmentMarginY + subTextArea->obj.area.height;
2332 container->children[2] = (
nbgl_obj_t *) subTextArea;
2335 container->obj.area.height = (container->obj.area.height + 7) & 0xFFF8;
2354 line = createHorizontalLine(layoutInt->
layer);
2355 line->obj.alignmentMarginY = -1;
2374 if (layout == NULL) {
2410 button->obj.alignmentMarginX = BORDER_MARGIN;
2411 button->obj.alignmentMarginY = 12;
2414 button->innerColor =
BLACK;
2415 button->foregroundColor =
WHITE;
2418 button->innerColor =
WHITE;
2419 button->foregroundColor =
BLACK;
2422 button->borderColor =
WHITE;
2426 button->borderColor =
BLACK;
2432 button->text = PIC(buttonInfo->
text);
2433 button->fontId = SMALL_BOLD_FONT;
2434 button->icon = PIC(buttonInfo->
icon);
2437 + SMALL_BUTTON_HEIGHT
2438 + ((button->icon) ? (button->icon->width + 12) : 0);
2439 button->obj.area.height = SMALL_BUTTON_HEIGHT;
2440 button->radius = SMALL_BUTTON_RADIUS_INDEX;
2441 if (buttonInfo->
onBottom !=
true) {
2442 button->obj.alignmentMarginX += (
AVAILABLE_WIDTH - button->obj.area.width) / 2;
2448 button->radius = BUTTON_RADIUS;
2450 button->obj.alignTo = NULL;
2451 button->obj.touchMask = (1 <<
TOUCHED);
2471 tune_index_e tuneId)
2474 .longPress.text = text,
2475 .longPress.token = token,
2476 .longPress.tuneId = tuneId};
2479 if (layout == NULL) {
2499 tune_index_e tuneId)
2524 const char *leftText,
2526 const char *rightText,
2528 tune_index_e tuneId)
2559 if (layout == NULL) {
2573 switch (headerDesc->
type) {
2604 button->innerColor =
WHITE;
2606 button->borderColor =
WHITE;
2607 button->obj.area.width = BACK_KEY_WIDTH;
2608 button->obj.area.height = TOUCHABLE_HEADER_BAR_HEIGHT;
2609 button->text = NULL;
2610 button->icon = PIC(&LEFT_ARROW_ICON);
2623 image->foregroundColor =
BLACK;
2624 image->obj.alignment =
CENTER;
2639 textArea->obj.touchMask = (1 <<
TOUCHED);
2641 textArea->obj.alignment =
CENTER;
2642 textArea->textColor =
BLACK;
2643 textArea->obj.area.width
2647 textArea->obj.area.width -= 16 + image->buffer->width;
2649 textArea->obj.area.height = TOUCHABLE_HEADER_BAR_HEIGHT;
2650 textArea->text = text;
2651 textArea->fontId = SMALL_BOLD_FONT;
2652 textArea->textAlignment =
CENTER;
2653 textArea->wrapping =
true;
2658 textArea->obj.area.width,
2661 textArea->obj.area.height
2663#ifndef BUILD_SCREENSHOTS
2665 "nbgl_layoutAddHeader: text [%s] is too long for header\n",
2677 textArea->obj.alignmentMarginX = 8 + image->buffer->width / 2;
2678 image->obj.alignmentMarginX = -8 - textArea->obj.area.width / 2;
2694 actionButton->obj.touchMask = (1 <<
TOUCHED);
2697 actionButton->obj.alignment =
MID_RIGHT;
2698 actionButton->innerColor =
WHITE;
2699 button->foregroundColor
2702 actionButton->borderColor =
WHITE;
2703 actionButton->obj.area.width = BACK_KEY_WIDTH;
2704 actionButton->obj.area.height = TOUCHABLE_HEADER_BAR_HEIGHT;
2705 actionButton->text = NULL;
2713 layoutInt->
headerContainer->obj.area.height = TOUCHABLE_HEADER_BAR_HEIGHT;
2719 line = createHorizontalLine(layoutInt->
layer);
2721 line->obj.alignmentMarginY = TOUCHABLE_HEADER_BAR_HEIGHT;
2727 subTextArea->textColor =
BLACK;
2729 subTextArea->textAlignment =
MID_LEFT;
2730 subTextArea->fontId = SMALL_REGULAR_FONT;
2731 subTextArea->wrapping =
true;
2733 subTextArea->obj.alignmentMarginY = SUB_HEADER_MARGIN;
2735 subTextArea->obj.area.height
2738 subTextArea->obj.area.width,
2739 subTextArea->wrapping);
2744 += subTextArea->obj.area.height + 2 * SUB_HEADER_MARGIN;
2746 if (button != NULL) {
2747 button->obj.alignmentMarginY
2748 -= (subTextArea->obj.area.height + 2 * SUB_HEADER_MARGIN) / 2;
2750 if (textArea != NULL) {
2751 textArea->obj.alignmentMarginY
2752 -= (subTextArea->obj.area.height + 2 * SUB_HEADER_MARGIN) / 2;
2754 if (actionButton != NULL) {
2755 actionButton->obj.alignmentMarginY
2756 -= (subTextArea->obj.area.height + 2 * SUB_HEADER_MARGIN) / 2;
2775 button->innerColor =
WHITE;
2776 button->foregroundColor =
BLACK;
2777 button->borderColor =
WHITE;
2778 button->obj.area.width = BACK_KEY_WIDTH;
2779 button->obj.area.height = TOUCHABLE_HEADER_BAR_HEIGHT;
2780 button->text = NULL;
2781 button->icon = PIC(&LEFT_ARROW_ICON);
2782 button->obj.touchMask = (1 <<
TOUCHED);
2799 progress->obj.area.width = 224;
2800 progress->obj.alignment =
CENTER;
2808 layoutInt->
headerContainer->obj.area.height = TOUCHABLE_HEADER_BAR_HEIGHT;
2814 textArea->textColor =
BLACK;
2816 textArea->obj.area.height = TOUCHABLE_HEADER_BAR_HEIGHT;
2817 textArea->text = PIC(headerDesc->
title.
text);
2818 textArea->fontId = SMALL_BOLD_FONT;
2819 textArea->textAlignment =
CENTER;
2820 textArea->wrapping =
true;
2824 layoutInt->
headerContainer->obj.area.height = textArea->obj.area.height;
2837 textArea->obj.alignmentMarginX = BORDER_MARGIN;
2838 textArea->textColor =
BLACK;
2840 textArea->obj.area.height = TOUCHABLE_HEADER_BAR_HEIGHT;
2842 textArea->fontId = SMALL_BOLD_FONT;
2844 textArea->obj.touchMask = (1 <<
TOUCHED);
2850 layoutInt->
headerContainer->obj.area.height = textArea->obj.area.height;
2858 line = createHorizontalLine(layoutInt->
layer);
2894 if (layout == NULL) {
2908 switch (footerDesc->
type) {
2926 textArea->obj.area.height
2931 textArea->textAlignment =
CENTER;
2932 textArea->obj.touchMask = (1 <<
TOUCHED);
2937 layoutInt->
footerContainer->obj.area.height = textArea->obj.area.height;
2950 textArea->textColor =
BLACK;
2952 textArea->obj.area.height = SIMPLE_FOOTER_HEIGHT;
2954 textArea->fontId = SMALL_BOLD_FONT;
2955 textArea->textAlignment =
CENTER;
2956 textArea->obj.touchMask = (1 <<
TOUCHED);
2974 textArea->textColor =
BLACK;
2976 textArea->obj.area.height = SIMPLE_FOOTER_HEIGHT;
2978 textArea->fontId = SMALL_BOLD_FONT;
2979 textArea->textAlignment =
CENTER;
2980 textArea->obj.touchMask = (1 <<
TOUCHED);
2986 layoutInt->
footerContainer->obj.area.height = textArea->obj.area.height;
2991 separationLine->obj.area.width = 1;
2992 separationLine->obj.area.height = layoutInt->
footerContainer->obj.area.height;
2993 separationLine->direction =
VERTICAL;
2994 separationLine->thickness = 1;
2995 separationLine->obj.alignment =
MID_LEFT;
2996 separationLine->obj.alignTo = (
nbgl_obj_t *) textArea;
2997 separationLine->obj.alignmentMarginX = -1;
3012 textArea->textColor =
BLACK;
3013 textArea->obj.area.width = FOOTER_TEXT_AND_NAV_WIDTH;
3014 textArea->obj.area.height = SIMPLE_FOOTER_HEIGHT;
3016 textArea->fontId = SMALL_BOLD_FONT;
3017 textArea->textAlignment =
CENTER;
3018 textArea->obj.touchMask = (1 <<
TOUCHED);
3030 navContainer->nbChildren = 4;
3031 navContainer->children
3034 navContainer->obj.area.width = SCREEN_WIDTH - textArea->obj.area.width;
3035 navContainer->obj.area.height = SIMPLE_FOOTER_HEIGHT;
3048 separationLine->obj.area.width = 1;
3049 separationLine->obj.area.height = layoutInt->
footerContainer->obj.area.height;
3050 separationLine->direction =
VERTICAL;
3051 separationLine->thickness = 1;
3052 separationLine->obj.alignment =
MID_LEFT;
3053 separationLine->obj.alignTo = (
nbgl_obj_t *) navContainer;
3054 separationLine->obj.alignmentMarginX = -1;
3092 button->obj.alignmentMarginY = SINGLE_BUTTON_MARGIN;
3094 button->innerColor =
BLACK;
3095 button->foregroundColor =
WHITE;
3098 button->innerColor =
WHITE;
3099 button->foregroundColor =
BLACK;
3103 button->borderColor =
WHITE;
3107 button->borderColor =
BLACK;
3114 button->fontId = SMALL_BOLD_FONT;
3116 button->radius = BUTTON_RADIUS;
3125 button->obj.touchMask = (1 <<
TOUCHED);
3153 button->innerColor =
WHITE;
3155 button->obj.alignmentMarginY
3156 = SINGLE_BUTTON_MARGIN;
3161 button->obj.alignmentMarginY
3162 = BUTTON_FROM_BOTTOM_MARGIN;
3163 button->borderColor =
WHITE;
3164 button->obj.area.height = FOOTER_IN_PAIR_HEIGHT;
3166 button->foregroundColor =
BLACK;
3168 button->radius = BUTTON_RADIUS;
3170 button->fontId = SMALL_BOLD_FONT;
3171 button->obj.touchMask = (1 <<
TOUCHED);
3181 line = createHorizontalLine(layoutInt->
layer);
3202 button->obj.alignmentMarginY = TOP_BUTTON_MARGIN;
3205 button->obj.alignmentMarginY
3206 = SINGLE_BUTTON_MARGIN;
3209 button->obj.alignmentMarginY
3210 = TOP_BUTTON_MARGIN_WITH_ACTION;
3213 button->innerColor =
WHITE;
3215 button->foregroundColor =
BLACK;
3218 button->innerColor =
BLACK;
3219 button->borderColor =
BLACK;
3220 button->foregroundColor =
WHITE;
3224 button->radius = BUTTON_RADIUS;
3229 button->fontId = SMALL_BOLD_FONT;
3230 button->obj.touchMask = (1 <<
TOUCHED);
3238 layoutInt->
footerContainer->obj.area.height = ROUNDED_AND_FOOTER_FOOTER_HEIGHT;
3241 layoutInt->
footerContainer->obj.area.height = BOTH_ROUNDED_FOOTER_HEIGHT;
3244 layoutInt->
footerContainer->obj.area.height = ACTION_AND_FOOTER_FOOTER_HEIGHT;
3255 addSwipeInternal(layoutInt,
3266 line = createHorizontalLine(layoutInt->
layer);
3272 if (separationLine != NULL) {
3305 if (layout == NULL) {
3322 switch (upFooterDesc->
type) {
3341 button->obj.alignmentMarginX = BORDER_MARGIN;
3343 button->innerColor =
BLACK;
3344 button->foregroundColor =
WHITE;
3345 button->borderColor =
BLACK;
3348 button->radius = BUTTON_RADIUS;
3349 button->icon = PIC(&VALIDATE_ICON);
3353 textArea->textColor =
BLACK;
3355 textArea->textAlignment =
MID_LEFT;
3356 textArea->fontId = LARGE_MEDIUM_FONT;
3357 textArea->wrapping =
true;
3358 textArea->obj.area.width = SCREEN_WIDTH - 3 * BORDER_MARGIN - button->obj.area.width;
3360 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
3362 textArea->obj.alignment =
MID_LEFT;
3363 textArea->obj.alignmentMarginX = BORDER_MARGIN;
3366 line = createHorizontalLine(layoutInt->
layer);
3371 progressBar->obj.area.width = SCREEN_WIDTH;
3372 progressBar->obj.area.height = LONG_PRESS_PROGRESS_HEIGHT;
3374 progressBar->obj.alignmentMarginY = LONG_PRESS_PROGRESS_ALIGN;
3375 progressBar->resetIfOverriden =
true;
3376 progressBar->partialRedraw =
true;
3392 button->obj.alignment =
CENTER;
3395 button->innerColor =
BLACK;
3396 button->foregroundColor =
WHITE;
3399 button->innerColor =
WHITE;
3400 button->foregroundColor =
BLACK;
3403 button->borderColor =
WHITE;
3407 button->borderColor =
BLACK;
3413 button->text = PIC(upFooterDesc->
button.
text);
3414 button->fontId = SMALL_BOLD_FONT;
3415 button->icon = PIC(upFooterDesc->
button.
icon);
3418 button->radius = BUTTON_RADIUS;
3420 button->obj.alignTo = NULL;
3421 button->obj.touchMask = (1 <<
TOUCHED);
3448 button->obj.alignmentMarginX = BORDER_MARGIN;
3450 button->innerColor =
WHITE;
3451 button->foregroundColor =
BLACK;
3454 button->radius = BUTTON_RADIUS;
3456 button->fontId = SMALL_BOLD_FONT;
3457 button->obj.touchMask = (1 <<
TOUCHED);
3473 button->obj.alignmentMarginX = BORDER_MARGIN;
3474 button->innerColor =
BLACK;
3475 button->borderColor =
BLACK;
3476 button->foregroundColor =
WHITE;
3479 button->radius = BUTTON_RADIUS;
3481 button->fontId = SMALL_BOLD_FONT;
3482 button->obj.touchMask = (1 <<
TOUCHED);
3504 textArea->textColor =
BLACK;
3505 textArea->text = PIC(upFooterDesc->
tipBox.
text);
3506 textArea->textAlignment =
MID_LEFT;
3507 textArea->fontId = SMALL_REGULAR_FONT;
3508 textArea->wrapping =
true;
3511 textArea->obj.area.width
3513 + TIP_BOX_TEXT_ICON_MARGIN;
3516 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
3517 textArea->obj.alignment =
MID_LEFT;
3518 textArea->obj.alignmentMarginX = BORDER_MARGIN;
3522 line = createHorizontalLine(layoutInt->
layer);
3528 image->obj.alignmentMarginX = BORDER_MARGIN;
3530 image->foregroundColor =
BLACK;
3531 image->buffer = PIC(upFooterDesc->
tipBox.
icon);
3544 upFooterDesc->
text.token,
3545 upFooterDesc->
text.tuneId);
3555 if (strlen(PIC(upFooterDesc->
text.text))) {
3558 textArea->text = PIC(upFooterDesc->
text.text);
3559 textArea->textAlignment =
CENTER;
3560 textArea->fontId = SMALL_REGULAR_FONT;
3561 textArea->wrapping =
true;
3564 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
3565 textArea->obj.alignment =
CENTER;
3602 tune_index_e tuneId)
3605 .separationLine =
false,
3606 .progressAndBack.activePage = activePage,
3607 .progressAndBack.nbPages = nbPages,
3608 .progressAndBack.token = backToken,
3609 .progressAndBack.tuneId = tuneId,
3610 .progressAndBack.withBack = withBack,
3611 .progressAndBack.actionIcon = NULL,
3630 const char *subText,
3631 uint8_t initPosition)
3639 if (layout == NULL) {
3645 container->nbChildren = 3;
3650 container->obj.alignment =
CENTER;
3654 spinner->position = initPosition;
3657 container->children[0] = (
nbgl_obj_t *) spinner;
3660 container->obj.area.height += SPINNER_HEIGHT;
3664 textArea->textColor =
BLACK;
3665 textArea->text = PIC(text);
3666 textArea->textAlignment =
CENTER;
3667 textArea->fontId = (subText != NULL) ? LARGE_MEDIUM_FONT : SMALL_REGULAR_FONT;
3668 textArea->wrapping =
true;
3669 textArea->obj.alignmentMarginY = SPINNER_TEXT_MARGIN;
3670 textArea->obj.alignTo = (
nbgl_obj_t *) spinner;
3674 textArea->fontId, textArea->text, textArea->obj.area.width, textArea->wrapping);
3678 container->obj.area.height += textArea->obj.alignmentMarginY + textArea->obj.area.height;
3681 container->children[1] = (
nbgl_obj_t *) textArea;
3683 if (subText != NULL) {
3687 subTextArea->textColor =
BLACK;
3688 subTextArea->text = PIC(subText);
3689 subTextArea->textAlignment =
CENTER;
3690 subTextArea->fontId = SMALL_REGULAR_FONT;
3691 subTextArea->wrapping =
true;
3692 subTextArea->obj.alignmentMarginY = SPINNER_INTER_TEXTS_MARGIN;
3693 subTextArea->obj.alignTo = (
nbgl_obj_t *) textArea;
3698 subTextArea->obj.area.width,
3699 subTextArea->wrapping);
3703 container->obj.area.height
3704 += subTextArea->obj.alignmentMarginY + subTextArea->obj.area.height;
3707 container->children[2] = (
nbgl_obj_t *) subTextArea;
3717 tickerCfg.tickerCallback = &spinnerTickerCallback;
3737 const char *subText,
3747 if ((layout == NULL) || (layoutInt->
container->nbChildren == 0)) {
3752 if ((container->obj.type !=
CONTAINER) || (container->nbChildren < 2)) {
3757 if (spinner->obj.type !=
SPINNER) {
3761 if (spinner->position != position) {
3762 spinner->position = position;
3772 const char *newText = PIC(text);
3773 size_t newTextLen = strlen(newText);
3775 if ((newTextLen != strlen(textArea->text)) || memcmp(textArea->text, newText, newTextLen)) {
3776 textArea->text = newText;
3781 if (subText != NULL) {
3784 if (container->nbChildren != 3) {
3788 if (subTextArea->obj.type !=
TEXT_AREA) {
3791 const char *newSubText = PIC(subText);
3792 size_t newSubTextLen = strlen(newSubText);
3794 if ((newSubTextLen != strlen(subTextArea->text))
3795 || memcmp(subTextArea->text, newSubText, newSubTextLen)) {
3796 subTextArea->text = newSubText;
3815 if (layout == NULL) {
3845 if ((layout == NULL) || (!layout->
isUsed)) {
3849 if (layout->
modal) {
3852 if (layout == topLayout) {
3853 topLayout = layout->
bottom;
3854 topLayout->
top = NULL;
Random Number Generation.
@ ANIM_ILLUSTRATION
animation
@ ICON_ILLUSTRATION
simple icon
#define LOG_WARN(__logger,...)
#define LOG_DEBUG(__logger,...)
#define LOG_FATAL(__logger,...)
Middle Level API of the new BOLOS Graphical Library.
#define QR_V10_NB_PIX_SIZE
#define QR_V4_NB_PIX_SIZE
uint8_t nbgl_getFontHeight(nbgl_font_id_e fontId)
uint16_t nbgl_getTextWidth(nbgl_font_id_e fontId, const char *text)
uint16_t nbgl_getTextHeightInWidth(nbgl_font_id_e fontId, const char *text, uint16_t maxWidth, bool wrapping)
uint16_t nbgl_getTextNbLinesInWidth(nbgl_font_id_e fontId, const char *text, uint16_t maxWidth, bool wrapping)
const nbgl_font_t * nbgl_getFont(nbgl_font_id_e fontId)
uint8_t nbgl_getFontLineHeight(nbgl_font_id_e fontId)
Font screen low-Level driver API, to draw elementary forms.
int nbgl_layoutAddTagValueList(nbgl_layout_t *layout, const nbgl_layoutTagValueList_t *list)
Creates a list of [tag,value] pairs.
int nbgl_layoutAddContentCenter(nbgl_layout_t *layout, const nbgl_contentCenter_t *info)
Creates an area on the center of the main panel, with a possible icon, and possible texts under it.
int nbgl_layoutAddUpFooter(nbgl_layout_t *layout, const nbgl_layoutUpFooter_t *upFooterDesc)
Creates a touchable area on top of the footer of the screen, containing various controls,...
int nbgl_layoutDraw(nbgl_layout_t *layoutParam)
Applies given layout. The screen will be redrawn.
#define NB_MAX_CONTAINER_CHILDREN
int nbgl_layoutAddText(nbgl_layout_t *layout, const char *text, const char *subText)
Creates an area with given text (in bold) and sub text (in regular)
int nbgl_layoutAddProgressIndicator(nbgl_layout_t *layout, uint8_t activePage, uint8_t nbPages, bool withBack, uint8_t backToken, tune_index_e tuneId)
Creates a kind of navigation bar with an optional <- arrow on the left. This widget is placed on top ...
int nbgl_layoutAddNavigationBar(nbgl_layout_t *layout, const nbgl_layoutNavigationBar_t *info)
Creates a navigation bar on bottom of main container.
int nbgl_layoutAddSeparationLine(nbgl_layout_t *layout)
adds a separation line on bottom of the last added item
int nbgl_layoutAddQRCode(nbgl_layout_t *layout, const nbgl_layoutQRCode_t *info)
Creates an area on the center of the main panel, with a QRCode, a possible text in black (bold) under...
int nbgl_layoutAddRadioChoice(nbgl_layout_t *layout, const nbgl_layoutRadioChoice_t *choices)
Creates a list of radio buttons (on the right)
int nbgl_layoutAddCenteredInfo(nbgl_layout_t *layout, const nbgl_layoutCenteredInfo_t *info)
Creates an area on the center of the main panel, with a possible icon/image, a possible text in black...
int nbgl_layoutAddSplitFooter(nbgl_layout_t *layout, const char *leftText, uint8_t leftToken, const char *rightText, uint8_t rightToken, tune_index_e tuneId)
Creates 2 touchable texts at the footer of the screen, separated with a thin line from the rest of th...
int nbgl_layoutAddTextWithAlias(nbgl_layout_t *layout, const char *text, const char *subText, uint8_t token, uint8_t index)
Creates an area with given text (in bold) and sub text (in regular), with a icon on right of text to...
int nbgl_layoutAddTouchableBar(nbgl_layout_t *layout, const nbgl_layoutBar_t *barLayout)
Creates a touchable bar in main panel.
#define SPINNER_REFRESH_PERIOD
int nbgl_layoutAddTopRightButton(nbgl_layout_t *layout, const nbgl_icon_details_t *icon, uint8_t token, tune_index_e tuneId)
Creates a Top-right button in the top right corner of the top panel.
int nbgl_layoutInvertBackground(nbgl_layout_t *layout)
Inverts the background color (black instead of white)
int nbgl_layoutAddTextContent(nbgl_layout_t *layout, nbgl_layoutTextContent_t *content)
Creates in the main container three text areas:
int nbgl_layoutAddSwipe(nbgl_layout_t *layout, uint16_t swipesMask, const char *text, uint8_t token, tune_index_e tuneId)
Creates a swipe interaction on the main container.
int nbgl_layoutAddSwitch(nbgl_layout_t *layout, const nbgl_layoutSwitch_t *switchLayout)
Creates a switch with the given text and its state.
int nbgl_layoutAddHorizontalButtons(nbgl_layout_t *layout, const nbgl_layoutHorizontalButtons_t *info)
Creates two buttons to make a choice. Both buttons are mandatory The left one contains only an icon a...
int nbgl_layoutAddButton(nbgl_layout_t *layout, const nbgl_layoutButton_t *buttonInfo)
Creates a rounded button in the main container.
nbgl_layout_t * nbgl_layoutGet(const nbgl_layoutDescription_t *description)
returns a layout of the given type. The layout is reset
int nbgl_layoutAddExtendedFooter(nbgl_layout_t *layout, const nbgl_layoutFooter_t *footerDesc)
Creates a touchable area at the footer of the screen, containing various controls,...
int nbgl_layoutAddLeftContent(nbgl_layout_t *layout, const nbgl_layoutLeftContent_t *info)
Creates an area with a title, and rows of icon + text, left aligned.
int nbgl_layoutAddChoiceButtons(nbgl_layout_t *layout, const nbgl_layoutChoiceButtons_t *info)
Creates two buttons to make a choice. Both buttons are mandatory. Both buttons are full width,...
int nbgl_layoutRelease(nbgl_layout_t *layoutParam)
Release the layout obtained with nbgl_layoutGet()
int nbgl_layoutAddSpinner(nbgl_layout_t *layout, const char *text, const char *subText, uint8_t initPosition)
Creates a centered (vertically & horizontally) spinner with a text under it.
int nbgl_layoutUpdateSpinner(nbgl_layout_t *layout, const char *text, const char *subText, uint8_t position)
Update an existing spinner (must be the only object of the layout)
int nbgl_layoutAddLongPressButton(nbgl_layout_t *layout, const char *text, uint8_t token, tune_index_e tuneId)
Creates a long press button in the main container.
void layoutAddObject(nbgl_layoutInternal_t *layout, nbgl_obj_t *obj)
adds the given obj to the main container
int nbgl_layoutAddProgressBar(nbgl_layout_t *layout, const char *text, const char *subText, uint8_t percentage)
Creates an area in main panel to display a progress bar, with a title text and a subtext if needed.
int nbgl_layoutAddHeader(nbgl_layout_t *layout, const nbgl_layoutHeader_t *headerDesc)
Creates a touchable (or not) area at the header of the screen, containing various controls,...
int nbgl_layoutAddBottomButton(nbgl_layout_t *layout, const nbgl_icon_details_t *icon, uint8_t token, bool separationLine, tune_index_e tuneId)
Creates a centered button at bottom of main container.
int nbgl_layoutAddFooter(nbgl_layout_t *layout, const char *text, uint8_t token, tune_index_e tuneId)
Creates a touchable text at the footer of the screen, separated with a thin line from the rest of the...
int nbgl_layoutAddLargeCaseText(nbgl_layout_t *layout, const char *text, bool grayedOut)
Creates an area with given text in 32px font (in Black or Light Gray)
layoutObj_t * layoutAddCallbackObj(nbgl_layoutInternal_t *layout, nbgl_obj_t *obj, uint8_t token, tune_index_e tuneId)
void(* nbgl_layoutTouchCallback_t)(int token, uint8_t index)
prototype of function to be called when an object is touched
#define VALUE_ICON_INTERVALE
@ WHITE_BACKGROUND
rounded bordered button, with text/icon in black, on white background
@ NO_BORDER
simple clickable text, in black
@ BLACK_BACKGROUND
rounded bordered button, with text/icon in white, on black background
@ UP_FOOTER_TEXT
grayed-out text, for example "Tap to continue"
@ UP_FOOTER_BUTTON
simple button
@ UP_FOOTER_LONG_PRESS
long-press button
@ UP_FOOTER_TIP_BOX
Tip-box.
@ UP_FOOTER_HORIZONTAL_BUTTONS
2 buttons, on the same line
void * nbgl_layout_t
type shared externally
@ HEADER_TITLE
simple centered text
@ HEADER_BACK_AND_PROGRESS
optional back key and progress indicator (only on Stax)
@ HEADER_EMPTY
empty space, to have a better vertical centering of centered info
@ HEADER_EXTENDED_BACK
back key, centered text and touchable key on the right
@ HEADER_BACK_AND_TEXT
back key and optional text
@ HEADER_RIGHT_TEXT
touchable text on the right, with a vertical separation line
@ HEADER_BACK_ICON_AND_TEXT
back key and optional icon and text
#define NBGL_INVALID_TOKEN
#define SPINNER_FIXED
position to use for a "fixed" spinner
@ SOFT_ACTION_AND_FOOTER_STYLE
A white button on top of a footer, with a separation line.
@ BOTH_ROUNDED_STYLE
A black button on top of a white button.
@ ROUNDED_AND_FOOTER_STYLE
A black background button on top of a footer.
#define NBGL_NO_PROGRESS_INDICATOR
To be used when a control token shall not be used.
#define TAG_VALUE_INTERVALE
@ FOOTER_SIMPLE_TEXT
simple touchable text in bold
@ FOOTER_NAV
navigation bar
@ FOOTER_SIMPLE_BUTTON
simple black or white button (see nbgl_layoutButtonStyle_t)
@ FOOTER_DOUBLE_TEXT
2 touchable texts in bold, separated by a vertical line (only on Stax)
@ FOOTER_EMPTY
empty space, to have a better vertical centering of centered info
@ FOOTER_CHOICE_BUTTONS
double buttons (see nbgl_layoutChoiceButtonsStyle_t)
Internal functions/constants of NBGL layout layer.
@ SWIPE_USAGE_SUGGESTIONS
bool keyboardSwipeCallback(nbgl_obj_t *obj, nbgl_touchType_t eventType)
void layoutNavigationPopulate(nbgl_container_t *navContainer, const nbgl_layoutNavigationBar_t *navConfig, uint8_t layer)
This function creates a full navigation bar "object", with buttons and returns it as a container.
#define LAYOUT_OBJ_POOL_LEN
Max number of complex objects with callback retrievable from pool.
bool layoutNavigationCallback(nbgl_obj_t *obj, nbgl_touchType_t eventType, uint8_t nbPages, uint8_t *activePage)
function to be called when any of the controls in navigation bar is touched
API to draw all basic graphic objects.
struct PACKED__ nbgl_line_s nbgl_line_t
struct to represent a vertical or horizontal line
struct PACKED__ nbgl_navigation_bar_s nbgl_page_indicator_t
struct to represent a navigation bar (PAGE_INDICATOR type) There can be up to 5 page indicators,...
struct PACKED__ nbgl_radio_s nbgl_radio_t
struct to represent a radio button (RADIO_BUTTON type)
#define NB_SPINNER_POSITIONS
void(* nbgl_touchCallback_t)(void *obj, nbgl_touchType_t eventType)
prototype of function to be called when a touch event is received by an object
struct PACKED__ nbgl_text_area_s nbgl_text_area_t
struct to represent a text area (TEXT_AREA type)
void nbgl_objDraw(nbgl_obj_t *obj)
struct PACKED__ nbgl_progress_bar_s nbgl_progress_bar_t
struct to represent a progress bar (PROGRESS_BAR type)
nbgl_obj_t ** nbgl_containerPoolGet(uint8_t nbObjs, uint8_t layer)
nbgl_obj_t * nbgl_objPoolGet(nbgl_obj_type_t type, uint8_t layer)
void nbgl_refreshSpecial(nbgl_refresh_mode_t mode)
struct PACKED__ nbgl_image_s nbgl_image_t
struct to represent an image (IMAGE type)
#define INACTIVE_SMALL_FONT
struct PACKED__ nbgl_button_s nbgl_button_t
struct to represent a button (BUTTON type) that can contain a text and/or an icon
#define INACTIVE_TEXT_COLOR
void nbgl_refreshSpecialWithPostRefresh(nbgl_refresh_mode_t mode, nbgl_post_refresh_t post_refresh)
struct PACKED__ nbgl_container_s nbgl_container_t
struct to represent a container (CONTAINER type)
struct PACKED__ nbgl_switch_s nbgl_switch_t
struct to represent a switch (size is fixed) (SWITCH type)
struct PACKED__ nbgl_obj_s nbgl_obj_t
Common structure for all graphical objects.
struct PACKED__ nbgl_spinner_s nbgl_spinner_t
struct to represent a "spinner", represented by the Ledger corners, in gray, with one of the corners ...
struct PACKED__ nbgl_qrcode_s nbgl_qrcode_t
struct to represent a QR code (QR_CODE type), whose size is fixed
int nbgl_screenSet(nbgl_obj_t ***elements, uint8_t nbElements, const nbgl_screenTickerConfiguration_t *ticker, nbgl_touchCallback_t touchCallback)
int nbgl_screenPush(nbgl_obj_t ***elements, uint8_t nbElements, const nbgl_screenTickerConfiguration_t *ticker, nbgl_touchCallback_t touchCallback)
void nbgl_wait_pipeline(void)
int nbgl_screenUpdateTicker(uint8_t screenIndex, const nbgl_screenTickerConfiguration_t *ticker)
int nbgl_screenPop(uint8_t screenIndex)
struct PACKED__ nbgl_screenTickerConfiguration_s nbgl_screenTickerConfiguration_t
struct to configure a screen layer
int nbgl_screenUpdateBackgroundColor(uint8_t screenIndex, color_t color)
void nbgl_screenRedraw(void)
uint32_t nbgl_touchGetTouchDuration(nbgl_obj_t *obj)
nbgl_state_t
to represent a boolean state.
@ POST_REFRESH_FORCE_POWER_OFF
Force screen power off after refresh.
@ POST_REFRESH_FORCE_POWER_ON
Force screen power on after refresh.
@ POST_REFRESH_FORCE_POWER_ON_WITH_PIPELINE
Force screen power on and enable pipeline.
nbgl_touchType_t
The different types of Touchscreen events.
@ TOUCHING
corresponding to an object that is currently touched
@ QRCODE_V10
QRCode V10, can encode text len up to 1500 chars, display size = 228*228.
@ QRCODE_V4_SMALL
QRCode V4, can encode text len up to 1500 chars, display size = 132*132.
@ QRCODE_V4
QRCode V4, can encode text len up to 62 chars, display size = 264*264.
@ VERTICAL
from top to bottom
@ HORIZONTAL
from left to right
@ LOOP_PARSING
0, 1, 2, 0, 1, 2, ...
struct PACKED__ nbgl_icon_details_s nbgl_icon_details_t
Represents all information about an icon.
@ NO_ALIGNMENT
used when parent container layout is used
@ RIGHT_TOP
on outside right
@ IMAGE
Bitmap (y and height must be multiple of 4 on Stax)
@ SWITCH
Switch to turn on/off something.
@ RADIO_BUTTON
Indicator to inform whether something is on or off.
@ BUTTON
Rounded rectangle button with icon and/or text.
@ PROGRESS_BAR
horizontal bar to indicate progression of something (between 0% and 100%)
@ PAGE_INDICATOR
horizontal bar to indicate position within pages
@ LINE
Vertical or Horizontal line.
@ CONTAINER
Empty container.
@ TEXT_AREA
Area to contain text line(s)
@ NBGL_BPP_1
1 bit per pixel
@ BLACK_AND_WHITE_REFRESH
to be used for pure B&W area, when contrast is important
@ BLACK_AND_WHITE_FAST_REFRESH
to be used for pure B&W area, when contrast is not priority
@ FULL_COLOR_PARTIAL_REFRESH
to be used for small partial refresh (radio buttons, switches)
const nbgl_icon_details_t * iconRight
const nbgl_icon_details_t * iconLeft
uint16_t delayMs
delay between 2 drawings
uint8_t nbIcons
number of icons in icons array
const nbgl_icon_details_t ** icons
array of nbIcons pointers on icons
nbgl_parsingType_t parsing
This structure contains info to build a centered (vertically and horizontally) area,...
uint16_t iconHug
vertical margin to apply on top and bottom of the icon
const nbgl_icon_details_t * icon
the icon (can be null)
const char * title
title in black large (can be null)
const char * description
description in black small regular case (can be null)
const char * subText
sub-text in dark gray regular small case
uint16_t animOffsetY
vertical offset of animation in icon if integrated (but usually 0)
bool padding
if true, apply a padding of 40px at the bottom
const nbgl_animation_t * animation
the animation (can be null), used if illustrType is ANIM_ILLUSTRATION
const char * smallTitle
sub-title in black small bold case (can be null)
uint16_t animOffsetX
horizontal offset of animation in icon if integrated (but usually 0)
nbgl_contentIllustrationType_t illustrType
This structure contains info to build a centered (vertically and horizontally) area,...
const char * text2
second text (can be null)
const char * text1
first text (can be null)
bool onTop
if set to true, align only horizontally
nbgl_contentCenteredInfoStyle_t style
style to apply to this info
int16_t offsetY
vertical shift to apply to this info (if >0, shift to bottom)
const char * text3
third text (can be null)
const nbgl_icon_details_t * icon
a buffer containing the 1BPP icon
This structure contains a list of names to build a list of radio buttons (on the right part of screen...
tune_index_e tuneId
if not NBGL_NO_TUNE, a tune will be played when selecting a radio button)
uint8_t token
the token that will be used as argument of the callback
bool localized
if set to true, use nameIds and not names
uint8_t initChoice
index of the current choice
const char *const * names
array of strings giving the choices (nbChoices)
uint8_t nbChoices
number of choices
This structure contains info to build a switch (on the right) with a description (on the left),...
const char * text
main text for the switch
uint8_t token
the token that will be used as argument of the callback (unused on Nano)
nbgl_state_t initState
initial state of the switch
tune_index_e tuneId
if not NBGL_NO_TUNE, a tune will be played
const char * subText
description under main text (NULL terminated, single line, may be null)
This structure contains a list of [tag,value] pairs.
const nbgl_contentTagValue_t * pairs
array of [tag,value] pairs (nbPairs items). If NULL, callback is used instead
nbgl_contentTagValueCallback_t callback
function to call to retrieve a given pair
uint8_t nbMaxLinesForValue
if > 0, set the max number of lines for value field.
bool hideEndOfLastLine
if set to true, replace 3 last chars of last line by "..."
bool wrapping
if set to true, value text will be wrapped on ' ' to avoid cutting words
uint8_t startIndex
index of the first pair to get with callback
This structure contains a [tag,value] pair and possible extensions.
const nbgl_contentValueExt_t * extension
if not NULL, gives additional info on value field
const nbgl_icon_details_t * valueIcon
const char * value
string giving the value name
const char * item
string giving the tag name
const char * text
text of the tip-box
const nbgl_icon_details_t * icon
icon of the tip-box
uint8_t token
token used when tip-box is tapped
tune_index_e tuneId
tune played when tip-box is tapped
const char * aliasSubName
string displayed under alias and in details view
structure defining an ASCII font
uint8_t line_height
height of a line for all characters in pixels
This structure contains info to build a clickable "bar" with a text and an icon.
bool inactive
if set to true, the bar is grayed-out and cannot be touched
const char * text
text (can be NULL)
uint8_t token
the token that will be used as argument of the callback
bool large
set to true only for the main level of OS settings
const char * subText
sub text (can be NULL)
tune_index_e tuneId
if not NBGL_NO_TUNE, a tune will be played
const nbgl_icon_details_t * iconLeft
a buffer containing the 1BPP icon for icon on left (can be NULL)
const nbgl_icon_details_t * iconRight
Structure containing all information when creating a layout. This structure must be passed as argumen...
nbgl_screenTickerConfiguration_t ticker
const char * tapActionText
Light gray text used when main container is "tapable".
nbgl_layoutTouchCallback_t onActionCallback
the callback to be called on any action on the layout
Structure containing all information about the current layout.
uint8_t nbUsedCallbackObjs
nbgl_container_t * footerContainer
container used to store footer (buttons, nav....)
uint8_t activePage
index of active page for navigation bar
uint8_t layer
layer in screen stack
struct nbgl_layoutInternal_s * top
layout above this one, in stack
nbgl_swipe_usage_t swipeUsage
nbgl_layoutTouchCallback_t callback
user callback for all controls
struct nbgl_layoutInternal_s * bottom
layout under this one, in stack
uint8_t invertedColors
if true, means that background is black
nbgl_container_t * container
uint8_t iconIdxInAnim
current icon index in animation
nbgl_container_t * headerContainer
container used to store header (progress, back, empty space...)
uint8_t isUsed
if true, means this layout is in use
nbgl_layoutFooterType_t footerType
type of footer
nbgl_layoutHeaderType_t headerType
type of header
nbgl_container_t * upFooterContainer
uint8_t incrementAnim
if true, means that animation index is currently incrementing
uint8_t nbPages
number of pages for navigation bar
nbgl_layoutUpFooterType_t upFooterType
type of up-footer
uint8_t modal
if true, means the screen is a modal
layoutObj_t callbackObjPool[LAYOUT_OBJ_POOL_LEN]
nbgl_text_area_t * tapText
nbgl_obj_t ** children
children for main screen
const nbgl_animation_t * animation
current animation (if not NULL)
This structure contains info to build a left content area.
uint8_t nbRows
number of rows in the area
const char * title
title of area in bold
const nbgl_icon_details_t ** rowIcons
array of nbRows icon
const char ** rowTexts
array of nbRows texts (displayed in regular)
This structure contains info to build a navigation bar at the bottom of the screen.
uint8_t activePage
index of active page (from 0 to nbPages-1).
tune_index_e tuneId
if not NBGL_NO_TUNE, a tune will be played when pressing keys)
bool withBackKey
if set to true, the "back" key is drawn
bool withExitKey
if set to true, an exit button is drawn (X on the left)
uint8_t token
the token that will be used as argument of the callback
uint8_t nbPages
number of pages. (if 0, no navigation)
This structure contains info to build a centered (vertically and horizontally) area,...
const char * text2
second text (can be null)
const char * text1
first text (can be null)
const char * url
URL for QR code.
bool largeText1
if set to true, use 32px font for text1
int16_t offsetY
vertical shift to apply to this info (if > 0, shift to bottom)
bool centered
if set to true, center vertically
This structure contains info for Text content, to be set with nbgl_layoutAddTextContent.
const char * descriptions[NB_MAX_DESCRIPTIONS]
uint8_t nbDescriptions
number of used descriptions in above array
const char * info
description at bottom (in small gray)
const char * title
main text (in large bold font)