[FL-2475] Text Box add three dots trim option (#1136)
* introduce text box debug application * text box: add strip to dots option * applications: update text box usage Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									57312961e8
								
							
						
					
					
						commit
						9351076c89
					
				| @ -43,6 +43,7 @@ extern int32_t usb_test_app(void* p); | |||||||
| extern int32_t vibro_test_app(void* p); | extern int32_t vibro_test_app(void* p); | ||||||
| extern int32_t bt_hid_app(void* p); | extern int32_t bt_hid_app(void* p); | ||||||
| extern int32_t battery_test_app(void* p); | extern int32_t battery_test_app(void* p); | ||||||
|  | extern int32_t text_box_test_app(void* p); | ||||||
| 
 | 
 | ||||||
| // Plugins
 | // Plugins
 | ||||||
| extern int32_t music_player_app(void* p); | extern int32_t music_player_app(void* p); | ||||||
| @ -304,6 +305,10 @@ const FlipperApplication FLIPPER_DEBUG_APPS[] = { | |||||||
| #ifdef APP_BATTERY_TEST | #ifdef APP_BATTERY_TEST | ||||||
|     {.app = battery_test_app, .name = "Battery Test", .stack_size = 1024, .icon = NULL}, |     {.app = battery_test_app, .name = "Battery Test", .stack_size = 1024, .icon = NULL}, | ||||||
| #endif | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef APP_TEXT_BOX_TEST | ||||||
|  |     {.app = text_box_test_app, .name = "Text Box Test", .stack_size = 1024, .icon = NULL}, | ||||||
|  | #endif | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| const size_t FLIPPER_DEBUG_APPS_COUNT = COUNT_OF(FLIPPER_DEBUG_APPS); | const size_t FLIPPER_DEBUG_APPS_COUNT = COUNT_OF(FLIPPER_DEBUG_APPS); | ||||||
|  | |||||||
| @ -165,6 +165,12 @@ CFLAGS		+= -DAPP_DISPLAY_TEST | |||||||
| SRV_GUI = 1 | SRV_GUI = 1 | ||||||
| endif | endif | ||||||
| 
 | 
 | ||||||
|  | APP_TEXT_BOX_TEST ?= 0 | ||||||
|  | ifeq ($(APP_TEXT_BOX_TEST), 1) | ||||||
|  | CFLAGS		+= -DAPP_TEXT_BOX_TEST | ||||||
|  | SRV_GUI = 1 | ||||||
|  | endif | ||||||
|  | 
 | ||||||
| APP_BATTERY_TEST ?= 0 | APP_BATTERY_TEST ?= 0 | ||||||
| ifeq ($(APP_BATTERY_TEST), 1) | ifeq ($(APP_BATTERY_TEST), 1) | ||||||
| CFLAGS		+= -DAPP_BATTERY_TEST | CFLAGS		+= -DAPP_BATTERY_TEST | ||||||
|  | |||||||
| @ -33,7 +33,8 @@ void archive_scene_delete_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     char delete_str[64]; |     char delete_str[64]; | ||||||
|     snprintf(delete_str, sizeof(delete_str), "\e#Delete %s?\e#", name); |     snprintf(delete_str, sizeof(delete_str), "\e#Delete %s?\e#", name); | ||||||
|     widget_add_text_box_element(app->widget, 0, 0, 128, 23, AlignCenter, AlignCenter, delete_str); |     widget_add_text_box_element( | ||||||
|  |         app->widget, 0, 0, 128, 23, AlignCenter, AlignCenter, delete_str, false); | ||||||
| 
 | 
 | ||||||
|     view_dispatcher_switch_to_view(app->view_dispatcher, ArchiveViewWidget); |     view_dispatcher_switch_to_view(app->view_dispatcher, ArchiveViewWidget); | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										126
									
								
								applications/debug_tools/text_box_test.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								applications/debug_tools/text_box_test.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,126 @@ | |||||||
|  | #include <furi.h> | ||||||
|  | #include <gui/gui.h> | ||||||
|  | #include <input/input.h> | ||||||
|  | #include <gui/elements.h> | ||||||
|  | 
 | ||||||
|  | #define TAG "TextBoxTest" | ||||||
|  | 
 | ||||||
|  | static void text_box_center_top_secondary_128x22(Canvas* canvas) { | ||||||
|  |     canvas_draw_frame(canvas, 0, 0, 128, 22); | ||||||
|  |     elements_text_box(canvas, 0, 0, 128, 22, AlignCenter, AlignTop, "secondary font test", false); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void text_box_right_bottom_bold_128x22(Canvas* canvas) { | ||||||
|  |     canvas_draw_frame(canvas, 0, 0, 128, 22); | ||||||
|  |     elements_text_box( | ||||||
|  |         canvas, 0, 0, 128, 22, AlignRight, AlignBottom, "\e#Bold font test\e#", false); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void text_box_left_center_mixed_80x50(Canvas* canvas) { | ||||||
|  |     canvas_draw_frame(canvas, 0, 0, 80, 50); | ||||||
|  |     elements_text_box( | ||||||
|  |         canvas, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         80, | ||||||
|  |         50, | ||||||
|  |         AlignLeft, | ||||||
|  |         AlignCenter, | ||||||
|  |         "\e#Never\e# gonna give you up\n\e!Never\e! gonna let you down", | ||||||
|  |         false); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void text_box_center_center_secondary_110x44(Canvas* canvas) { | ||||||
|  |     canvas_draw_frame(canvas, 4, 20, 110, 30); | ||||||
|  |     elements_text_box( | ||||||
|  |         canvas, | ||||||
|  |         4, | ||||||
|  |         20, | ||||||
|  |         110, | ||||||
|  |         30, | ||||||
|  |         AlignCenter, | ||||||
|  |         AlignCenter, | ||||||
|  |         "Loooooooooooooo0000000ooong file name from happy 100500 Flipper 0wners", | ||||||
|  |         true); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void (*text_box_test_render[])(Canvas* canvas) = { | ||||||
|  |     text_box_center_top_secondary_128x22, | ||||||
|  |     text_box_right_bottom_bold_128x22, | ||||||
|  |     text_box_left_center_mixed_80x50, | ||||||
|  |     text_box_center_center_secondary_110x44, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | typedef struct { | ||||||
|  |     uint32_t idx; | ||||||
|  | } TextBoxTestState; | ||||||
|  | 
 | ||||||
|  | static void text_box_test_render_callback(Canvas* canvas, void* ctx) { | ||||||
|  |     TextBoxTestState* state = acquire_mutex((ValueMutex*)ctx, 25); | ||||||
|  |     canvas_clear(canvas); | ||||||
|  | 
 | ||||||
|  |     text_box_test_render[state->idx](canvas); | ||||||
|  | 
 | ||||||
|  |     release_mutex((ValueMutex*)ctx, state); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void text_box_test_input_callback(InputEvent* input_event, void* ctx) { | ||||||
|  |     osMessageQueueId_t event_queue = ctx; | ||||||
|  |     osMessageQueuePut(event_queue, input_event, 0, osWaitForever); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int32_t text_box_test_app(void* p) { | ||||||
|  |     osMessageQueueId_t event_queue = osMessageQueueNew(32, sizeof(InputEvent), NULL); | ||||||
|  |     furi_check(event_queue); | ||||||
|  | 
 | ||||||
|  |     TextBoxTestState _state = {.idx = 0}; | ||||||
|  | 
 | ||||||
|  |     ValueMutex state_mutex; | ||||||
|  |     if(!init_mutex(&state_mutex, &_state, sizeof(TextBoxTestState))) { | ||||||
|  |         FURI_LOG_E(TAG, "Cannot create mutex"); | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     ViewPort* view_port = view_port_alloc(); | ||||||
|  | 
 | ||||||
|  |     view_port_draw_callback_set(view_port, text_box_test_render_callback, &state_mutex); | ||||||
|  |     view_port_input_callback_set(view_port, text_box_test_input_callback, event_queue); | ||||||
|  | 
 | ||||||
|  |     // Open GUI and register view_port
 | ||||||
|  |     Gui* gui = furi_record_open("gui"); | ||||||
|  |     gui_add_view_port(gui, view_port, GuiLayerFullscreen); | ||||||
|  | 
 | ||||||
|  |     uint32_t test_renders_num = SIZEOF_ARRAY(text_box_test_render); | ||||||
|  |     InputEvent event; | ||||||
|  |     while(osMessageQueueGet(event_queue, &event, NULL, osWaitForever) == osOK) { | ||||||
|  |         TextBoxTestState* state = acquire_mutex_block(&state_mutex); | ||||||
|  | 
 | ||||||
|  |         if(event.type == InputTypeShort) { | ||||||
|  |             if(event.key == InputKeyRight) { | ||||||
|  |                 if(state->idx < test_renders_num - 1) { | ||||||
|  |                     state->idx++; | ||||||
|  |                 } | ||||||
|  |             } else if(event.key == InputKeyLeft) { | ||||||
|  |                 if(state->idx > 0) { | ||||||
|  |                     state->idx--; | ||||||
|  |                 } | ||||||
|  |             } else if(event.key == InputKeyBack) { | ||||||
|  |                 release_mutex(&state_mutex, state); | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         release_mutex(&state_mutex, state); | ||||||
|  |         view_port_update(view_port); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // remove & free all stuff created by app
 | ||||||
|  |     gui_remove_view_port(gui, view_port); | ||||||
|  |     view_port_free(view_port); | ||||||
|  |     osMessageQueueDelete(event_queue); | ||||||
|  |     delete_mutex(&state_mutex); | ||||||
|  | 
 | ||||||
|  |     furi_record_close("gui"); | ||||||
|  | 
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
| @ -547,7 +547,8 @@ void elements_text_box( | |||||||
|     uint8_t height, |     uint8_t height, | ||||||
|     Align horizontal, |     Align horizontal, | ||||||
|     Align vertical, |     Align vertical, | ||||||
|     const char* text) { |     const char* text, | ||||||
|  |     bool strip_to_dots) { | ||||||
|     furi_assert(canvas); |     furi_assert(canvas); | ||||||
| 
 | 
 | ||||||
|     ElementTextBoxLine line[ELEMENTS_MAX_LINES_NUM]; |     ElementTextBoxLine line[ELEMENTS_MAX_LINES_NUM]; | ||||||
| @ -571,6 +572,7 @@ void elements_text_box( | |||||||
|     uint8_t total_height_default = 0; |     uint8_t total_height_default = 0; | ||||||
|     uint16_t i = 0; |     uint16_t i = 0; | ||||||
|     bool full_text_processed = false; |     bool full_text_processed = false; | ||||||
|  |     uint16_t dots_width = canvas_string_width(canvas, "..."); | ||||||
| 
 | 
 | ||||||
|     canvas_set_font(canvas, FontSecondary); |     canvas_set_font(canvas, FontSecondary); | ||||||
| 
 | 
 | ||||||
| @ -663,31 +665,29 @@ void elements_text_box( | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Set vertical alignment for all lines
 |     // Set vertical alignment for all lines
 | ||||||
|     if(full_text_processed) { |     if(total_height_default < height) { | ||||||
|         if(total_height_default < height) { |         if(vertical == AlignTop) { | ||||||
|             if(vertical == AlignTop) { |  | ||||||
|                 line[0].y = y + line[0].height; |  | ||||||
|             } else if(vertical == AlignCenter) { |  | ||||||
|                 line[0].y = y + line[0].height + (height - total_height_default) / 2; |  | ||||||
|             } else if(vertical == AlignBottom) { |  | ||||||
|                 line[0].y = y + line[0].height + (height - total_height_default); |  | ||||||
|             } |  | ||||||
|             if(line_num > 1) { |  | ||||||
|                 for(uint8_t i = 1; i < line_num; i++) { |  | ||||||
|                     line[i].y = line[i - 1].y + line[i - 1].leading_default; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } else if(line_num > 1) { |  | ||||||
|             uint8_t free_pixel_num = height - total_height_min; |  | ||||||
|             uint8_t fill_pixel = 0; |  | ||||||
|             uint8_t j = 1; |  | ||||||
|             line[0].y = y + line[0].height; |             line[0].y = y + line[0].height; | ||||||
|             while(fill_pixel < free_pixel_num) { |         } else if(vertical == AlignCenter) { | ||||||
|                 line[j].y = line[j - 1].y + line[j - 1].leading_min + 1; |             line[0].y = y + line[0].height + (height - total_height_default) / 2; | ||||||
|                 fill_pixel++; |         } else if(vertical == AlignBottom) { | ||||||
|                 j = j % (line_num - 1) + 1; |             line[0].y = y + line[0].height + (height - total_height_default); | ||||||
|  |         } | ||||||
|  |         if(line_num > 1) { | ||||||
|  |             for(uint8_t i = 1; i < line_num; i++) { | ||||||
|  |                 line[i].y = line[i - 1].y + line[i - 1].leading_default; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     } else if(line_num > 1) { | ||||||
|  |         uint8_t free_pixel_num = height - total_height_min; | ||||||
|  |         uint8_t fill_pixel = 0; | ||||||
|  |         uint8_t j = 1; | ||||||
|  |         line[0].y = y + line[0].height; | ||||||
|  |         while(fill_pixel < free_pixel_num) { | ||||||
|  |             line[j].y = line[j - 1].y + line[j - 1].leading_min + 1; | ||||||
|  |             fill_pixel++; | ||||||
|  |             j = j % (line_num - 1) + 1; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Draw line by line
 |     // Draw line by line
 | ||||||
| @ -733,10 +733,17 @@ void elements_text_box( | |||||||
|                 canvas_draw_glyph(canvas, line[i].x, line[i].y, line[i].text[j]); |                 canvas_draw_glyph(canvas, line[i].x, line[i].y, line[i].text[j]); | ||||||
|                 canvas_invert_color(canvas); |                 canvas_invert_color(canvas); | ||||||
|             } else { |             } else { | ||||||
|  |                 if((i == line_num - 1) && strip_to_dots) { | ||||||
|  |                     uint8_t next_symbol_width = canvas_glyph_width(canvas, line[i].text[j]); | ||||||
|  |                     if(line[i].x + next_symbol_width + dots_width > x + width) { | ||||||
|  |                         canvas_draw_str(canvas, line[i].x, line[i].y, "..."); | ||||||
|  |                         break; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|                 canvas_draw_glyph(canvas, line[i].x, line[i].y, line[i].text[j]); |                 canvas_draw_glyph(canvas, line[i].x, line[i].y, line[i].text[j]); | ||||||
|             } |             } | ||||||
|             line[i].x += canvas_glyph_width(canvas, line[i].text[j]); |             line[i].x += canvas_glyph_width(canvas, line[i].text[j]); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     canvas_set_font(canvas, FontSecondary); |     canvas_set_font(canvas, FontSecondary); | ||||||
| } | } | ||||||
|  | |||||||
| @ -194,17 +194,18 @@ void elements_string_fit_width(Canvas* canvas, string_t string, uint8_t width); | |||||||
| 
 | 
 | ||||||
| /** Draw text box element
 | /** Draw text box element
 | ||||||
|  * |  * | ||||||
|  * @param       canvas      Canvas instance |  * @param       canvas          Canvas instance | ||||||
|  * @param       x           x coordinate |  * @param       x               x coordinate | ||||||
|  * @param       y           y coordinate |  * @param       y               y coordinate | ||||||
|  * @param       width       width to fit text |  * @param       width           width to fit text | ||||||
|  * @param       height      height to fit text |  * @param       height          height to fit text | ||||||
|  * @param       horizontal  Align instance |  * @param       horizontal      Align instance | ||||||
|  * @param       vertical    Align instance |  * @param       vertical        Align instance | ||||||
|  * @param[in]   text        Formatted text. The following formats are available: |  * @param[in]   text            Formatted text. The following formats are available: | ||||||
|  *                          "\e#Bold text\e#" - bold font is used |  *                              "\e#Bold text\e#" - bold font is used | ||||||
|  *                          "\e*Monospaced text\e*" - monospaced font is used |  *                              "\e*Monospaced text\e*" - monospaced font is used | ||||||
|  *                          "\e#Inversed text\e#" - white text on black background |  *                              "\e#Inversed text\e#" - white text on black background | ||||||
|  |  * @param      strip_to_dots    Strip text to ... if does not fit to width | ||||||
|  */ |  */ | ||||||
| void elements_text_box( | void elements_text_box( | ||||||
|     Canvas* canvas, |     Canvas* canvas, | ||||||
| @ -214,7 +215,8 @@ void elements_text_box( | |||||||
|     uint8_t height, |     uint8_t height, | ||||||
|     Align horizontal, |     Align horizontal, | ||||||
|     Align vertical, |     Align vertical, | ||||||
|     const char* text); |     const char* text, | ||||||
|  |     bool strip_to_dots); | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										7
									
								
								applications/gui/modules/widget.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										7
									
								
								applications/gui/modules/widget.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							| @ -154,10 +154,11 @@ void widget_add_text_box_element( | |||||||
|     uint8_t height, |     uint8_t height, | ||||||
|     Align horizontal, |     Align horizontal, | ||||||
|     Align vertical, |     Align vertical, | ||||||
|     const char* text) { |     const char* text, | ||||||
|  |     bool strip_to_dots) { | ||||||
|     furi_assert(widget); |     furi_assert(widget); | ||||||
|     WidgetElement* text_box_element = |     WidgetElement* text_box_element = widget_element_text_box_create( | ||||||
|         widget_element_text_box_create(x, y, width, height, horizontal, vertical, text); |         x, y, width, height, horizontal, vertical, text, strip_to_dots); | ||||||
|     widget_add_element(widget, text_box_element); |     widget_add_element(widget, text_box_element); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -81,17 +81,18 @@ void widget_add_string_element( | |||||||
| 
 | 
 | ||||||
| /** Add Text Box Element
 | /** Add Text Box Element
 | ||||||
|  * |  * | ||||||
|  * @param      widget      Widget instance |  * @param      widget           Widget instance | ||||||
|  * @param      x           x coordinate |  * @param      x                x coordinate | ||||||
|  * @param      y           y coordinate |  * @param      y                y coordinate | ||||||
|  * @param      width       width to fit text |  * @param      width            width to fit text | ||||||
|  * @param      height      height to fit text |  * @param      height           height to fit text | ||||||
|  * @param      horizontal  Align instance |  * @param      horizontal       Align instance | ||||||
|  * @param      vertical    Align instance |  * @param      vertical         Align instance | ||||||
|  * @param[in]  text        Formatted text. The following formats are available: |  * @param[in]  text             Formatted text. The following formats are available: | ||||||
|  *                          "\e#Bold text\e#" - bold font is used |  *                               "\e#Bold text\e#" - bold font is used | ||||||
|  *                          "\e*Monospaced text\e*" - monospaced font is used |  *                               "\e*Monospaced text\e*" - monospaced font is used | ||||||
|  *                          "\e#Inversed text\e#" - white text on black background |  *                               "\e#Inversed text\e#" - white text on black background | ||||||
|  |  * @param      strip_to_dots    Strip text to ... if does not fit to width | ||||||
|  */ |  */ | ||||||
| void widget_add_text_box_element( | void widget_add_text_box_element( | ||||||
|     Widget* widget, |     Widget* widget, | ||||||
| @ -101,7 +102,8 @@ void widget_add_text_box_element( | |||||||
|     uint8_t height, |     uint8_t height, | ||||||
|     Align horizontal, |     Align horizontal, | ||||||
|     Align vertical, |     Align vertical, | ||||||
|     const char* text); |     const char* text, | ||||||
|  |     bool strip_to_dots); | ||||||
| 
 | 
 | ||||||
| /** Add Button Element
 | /** Add Button Element
 | ||||||
|  * |  * | ||||||
|  | |||||||
| @ -60,7 +60,8 @@ WidgetElement* widget_element_text_box_create( | |||||||
|     uint8_t height, |     uint8_t height, | ||||||
|     Align horizontal, |     Align horizontal, | ||||||
|     Align vertical, |     Align vertical, | ||||||
|     const char* text); |     const char* text, | ||||||
|  |     bool strip_to_dots); | ||||||
| 
 | 
 | ||||||
| /** Create button element */ | /** Create button element */ | ||||||
| WidgetElement* widget_element_button_create( | WidgetElement* widget_element_button_create( | ||||||
|  | |||||||
| @ -10,6 +10,7 @@ typedef struct { | |||||||
|     Align horizontal; |     Align horizontal; | ||||||
|     Align vertical; |     Align vertical; | ||||||
|     string_t text; |     string_t text; | ||||||
|  |     bool strip_to_dots; | ||||||
| } GuiTextBoxModel; | } GuiTextBoxModel; | ||||||
| 
 | 
 | ||||||
| static void gui_text_box_draw(Canvas* canvas, WidgetElement* element) { | static void gui_text_box_draw(Canvas* canvas, WidgetElement* element) { | ||||||
| @ -26,7 +27,8 @@ static void gui_text_box_draw(Canvas* canvas, WidgetElement* element) { | |||||||
|             model->height, |             model->height, | ||||||
|             model->horizontal, |             model->horizontal, | ||||||
|             model->vertical, |             model->vertical, | ||||||
|             string_get_cstr(model->text)); |             string_get_cstr(model->text), | ||||||
|  |             model->strip_to_dots); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -46,7 +48,8 @@ WidgetElement* widget_element_text_box_create( | |||||||
|     uint8_t height, |     uint8_t height, | ||||||
|     Align horizontal, |     Align horizontal, | ||||||
|     Align vertical, |     Align vertical, | ||||||
|     const char* text) { |     const char* text, | ||||||
|  |     bool strip_to_dots) { | ||||||
|     furi_assert(text); |     furi_assert(text); | ||||||
| 
 | 
 | ||||||
|     // Allocate and init model
 |     // Allocate and init model
 | ||||||
| @ -58,6 +61,7 @@ WidgetElement* widget_element_text_box_create( | |||||||
|     model->horizontal = horizontal; |     model->horizontal = horizontal; | ||||||
|     model->vertical = vertical; |     model->vertical = vertical; | ||||||
|     string_init_set_str(model->text, text); |     string_init_set_str(model->text, text); | ||||||
|  |     model->strip_to_dots = strip_to_dots; | ||||||
| 
 | 
 | ||||||
|     // Allocate and init Element
 |     // Allocate and init Element
 | ||||||
|     WidgetElement* gui_string = malloc(sizeof(WidgetElement)); |     WidgetElement* gui_string = malloc(sizeof(WidgetElement)); | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ void iButtonSceneDeleteConfirm::on_enter(iButtonApp* app) { | |||||||
| 
 | 
 | ||||||
|     app->set_text_store("\e#Delete %s?\e#", ibutton_key_get_name_p(key)); |     app->set_text_store("\e#Delete %s?\e#", ibutton_key_get_name_p(key)); | ||||||
|     widget_add_text_box_element( |     widget_add_text_box_element( | ||||||
|         widget, 0, 0, 128, 27, AlignCenter, AlignCenter, app->get_text_store()); |         widget, 0, 0, 128, 27, AlignCenter, AlignCenter, app->get_text_store(), false); | ||||||
|     widget_add_button_element(widget, GuiButtonTypeLeft, "Cancel", widget_callback, app); |     widget_add_button_element(widget, GuiButtonTypeLeft, "Cancel", widget_callback, app); | ||||||
|     widget_add_button_element(widget, GuiButtonTypeRight, "Delete", widget_callback, app); |     widget_add_button_element(widget, GuiButtonTypeRight, "Delete", widget_callback, app); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ void iButtonSceneInfo::on_enter(iButtonApp* app) { | |||||||
| 
 | 
 | ||||||
|     app->set_text_store("%s", ibutton_key_get_name_p(key)); |     app->set_text_store("%s", ibutton_key_get_name_p(key)); | ||||||
|     widget_add_text_box_element( |     widget_add_text_box_element( | ||||||
|         widget, 0, 0, 128, 28, AlignCenter, AlignCenter, app->get_text_store()); |         widget, 0, 0, 128, 28, AlignCenter, AlignCenter, app->get_text_store(), false); | ||||||
| 
 | 
 | ||||||
|     switch(ibutton_key_get_type(key)) { |     switch(ibutton_key_get_type(key)) { | ||||||
|     case iButtonKeyDS1990: |     case iButtonKeyDS1990: | ||||||
|  | |||||||
| @ -13,7 +13,8 @@ void nfc_scene_delete_on_enter(void* context) { | |||||||
|     // Setup Custom Widget view
 |     // Setup Custom Widget view
 | ||||||
|     char temp_str[64]; |     char temp_str[64]; | ||||||
|     snprintf(temp_str, sizeof(temp_str), "\e#Delete %s?\e#", nfc->dev->dev_name); |     snprintf(temp_str, sizeof(temp_str), "\e#Delete %s?\e#", nfc->dev->dev_name); | ||||||
|     widget_add_text_box_element(nfc->widget, 0, 0, 128, 23, AlignCenter, AlignCenter, temp_str); |     widget_add_text_box_element( | ||||||
|  |         nfc->widget, 0, 0, 128, 23, AlignCenter, AlignCenter, temp_str, false); | ||||||
|     widget_add_button_element( |     widget_add_button_element( | ||||||
|         nfc->widget, GuiButtonTypeLeft, "Back", nfc_scene_delete_widget_callback, nfc); |         nfc->widget, GuiButtonTypeLeft, "Back", nfc_scene_delete_widget_callback, nfc); | ||||||
|     widget_add_button_element( |     widget_add_button_element( | ||||||
|  | |||||||
| @ -36,7 +36,7 @@ void nfc_scene_device_info_on_enter(void* context) { | |||||||
|                                   (nfc->dev->format == NfcDeviceSaveFormatBankCard); |                                   (nfc->dev->format == NfcDeviceSaveFormatBankCard); | ||||||
|     // Setup Custom Widget view
 |     // Setup Custom Widget view
 | ||||||
|     widget_add_text_box_element( |     widget_add_text_box_element( | ||||||
|         nfc->widget, 0, 0, 128, 22, AlignCenter, AlignTop, nfc->dev->dev_name); |         nfc->widget, 0, 0, 128, 22, AlignCenter, AlignTop, nfc->dev->dev_name, false); | ||||||
|     widget_add_button_element( |     widget_add_button_element( | ||||||
|         nfc->widget, GuiButtonTypeLeft, "Back", nfc_scene_device_info_widget_callback, nfc); |         nfc->widget, GuiButtonTypeLeft, "Back", nfc_scene_device_info_widget_callback, nfc); | ||||||
|     if(data_display_supported) { |     if(data_display_supported) { | ||||||
|  | |||||||
| @ -47,7 +47,7 @@ static void nfc_scene_emulate_uid_widget_config(Nfc* nfc, bool data_received) { | |||||||
|     } |     } | ||||||
|     string_strim(info_str); |     string_strim(info_str); | ||||||
|     widget_add_text_box_element( |     widget_add_text_box_element( | ||||||
|         widget, 56, 43, 70, 21, AlignLeft, AlignTop, string_get_cstr(info_str)); |         widget, 56, 43, 70, 21, AlignLeft, AlignTop, string_get_cstr(info_str), true); | ||||||
|     string_clear(info_str); |     string_clear(info_str); | ||||||
|     if(data_received) { |     if(data_received) { | ||||||
|         widget_add_button_element( |         widget_add_button_element( | ||||||
|  | |||||||
| @ -24,7 +24,7 @@ void subghz_scene_delete_raw_on_enter(void* context) { | |||||||
|     char delete_str[64]; |     char delete_str[64]; | ||||||
|     snprintf(delete_str, sizeof(delete_str), "\e#Delete %s?\e#", subghz->file_name); |     snprintf(delete_str, sizeof(delete_str), "\e#Delete %s?\e#", subghz->file_name); | ||||||
|     widget_add_text_box_element( |     widget_add_text_box_element( | ||||||
|         subghz->widget, 0, 0, 128, 23, AlignCenter, AlignCenter, delete_str); |         subghz->widget, 0, 0, 128, 23, AlignCenter, AlignCenter, delete_str, false); | ||||||
| 
 | 
 | ||||||
|     widget_add_string_element( |     widget_add_string_element( | ||||||
|         subghz->widget, 38, 25, AlignLeft, AlignTop, FontSecondary, "RAW signal"); |         subghz->widget, 38, 25, AlignLeft, AlignTop, FontSecondary, "RAW signal"); | ||||||
|  | |||||||
| @ -236,7 +236,15 @@ void subghz_read_raw_draw(Canvas* canvas, SubGhzReadRAWModel* model) { | |||||||
|         elements_button_center(canvas, "Send"); |         elements_button_center(canvas, "Send"); | ||||||
|         elements_button_right(canvas, "More"); |         elements_button_right(canvas, "More"); | ||||||
|         elements_text_box( |         elements_text_box( | ||||||
|             canvas, 4, 12, 110, 44, AlignCenter, AlignCenter, string_get_cstr(model->file_name)); |             canvas, | ||||||
|  |             4, | ||||||
|  |             12, | ||||||
|  |             110, | ||||||
|  |             44, | ||||||
|  |             AlignCenter, | ||||||
|  |             AlignCenter, | ||||||
|  |             string_get_cstr(model->file_name), | ||||||
|  |             true); | ||||||
|         break; |         break; | ||||||
| 
 | 
 | ||||||
|     case SubGhzReadRAWStatusTX: |     case SubGhzReadRAWStatusTX: | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 gornekich
						gornekich