[FL-1404] iButton long names fix (#528)
* ibutton: long names partial fix\ * ibutton: limit max filename length to 22 chars * elwrapping long names to a new line * Proper m-string size usage Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
		| @@ -48,7 +48,7 @@ static void render_item_menu(Canvas* canvas, ArchiveViewModel* model) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void archive_trim_file_ext(string_t name) { | void archive_trim_file_ext(string_t name) { | ||||||
|     size_t str_len = strlen(string_get_cstr(name)); |     size_t str_len = string_size(name); | ||||||
|     char* buff_ptr = stringi_get_cstr(name); |     char* buff_ptr = stringi_get_cstr(name); | ||||||
|     char* end = buff_ptr + str_len; |     char* end = buff_ptr + str_len; | ||||||
|     while(end > buff_ptr && *end != '.' && *end != '\\' && *end != '/') { |     while(end > buff_ptr && *end != '.' && *end != '\\' && *end != '/') { | ||||||
|   | |||||||
| @@ -184,11 +184,35 @@ void elements_multiline_text_aligned( | |||||||
|  |  | ||||||
|     do { |     do { | ||||||
|         end = strchr(start, '\n'); |         end = strchr(start, '\n'); | ||||||
|  |  | ||||||
|         if(end) { |         if(end) { | ||||||
|             string_set_strn(str, start, end - start); |             string_set_strn(str, start, end - start); | ||||||
|         } else { |         } else { | ||||||
|             string_set_str(str, start); |             string_set_str(str, start); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         uint16_t len_px = canvas_string_width(canvas, string_get_cstr(str)); | ||||||
|  |         uint8_t px_left = | ||||||
|  |             canvas_width(canvas) - (x - (horizontal == AlignCenter ? len_px / 2 : 0)); | ||||||
|  |  | ||||||
|  |         // hacky | ||||||
|  |         if(len_px > px_left) { | ||||||
|  |             string_t buff; | ||||||
|  |             string_init_set(buff, str); | ||||||
|  |             size_t s_len = string_size(str); | ||||||
|  |             uint8_t end_pos = s_len - ((len_px - px_left) / (len_px / s_len) + 2); | ||||||
|  |  | ||||||
|  |             string_left(buff, end_pos); | ||||||
|  |             string_cat(buff, "-"); | ||||||
|  |             string_right(str, end_pos); | ||||||
|  |  | ||||||
|  |             canvas_draw_str_aligned(canvas, x, y, horizontal, vertical, string_get_cstr(buff)); | ||||||
|  |             string_clear(buff); | ||||||
|  |  | ||||||
|  |             start = end + 1; | ||||||
|  |             y += font_height; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         canvas_draw_str_aligned(canvas, x, y, horizontal, vertical, string_get_cstr(str)); |         canvas_draw_str_aligned(canvas, x, y, horizontal, vertical, string_get_cstr(str)); | ||||||
|         start = end + 1; |         start = end + 1; | ||||||
|         y += font_height; |         y += font_height; | ||||||
| @@ -271,7 +295,7 @@ void elements_string_fit_width(Canvas* canvas, string_t string, uint8_t width) { | |||||||
|     uint16_t len_px = canvas_string_width(canvas, string_get_cstr(string)); |     uint16_t len_px = canvas_string_width(canvas, string_get_cstr(string)); | ||||||
|  |  | ||||||
|     if(len_px > width) { |     if(len_px > width) { | ||||||
|         size_t s_len = strlen(string_get_cstr(string)); |         size_t s_len = string_size(string); | ||||||
|         uint8_t end_pos = s_len - ((len_px - width) / ((len_px / s_len) + 2) + 2); |         uint8_t end_pos = s_len - ((len_px - width) / ((len_px / s_len) + 2) + 2); | ||||||
|  |  | ||||||
|         string_mid(string, 0, end_pos); |         string_mid(string, 0, end_pos); | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ static void file_select_draw_callback(Canvas* canvas, void* _model) { | |||||||
|     string_t string_buff; |     string_t string_buff; | ||||||
|     const uint8_t item_height = 16; |     const uint8_t item_height = 16; | ||||||
|     const uint8_t item_width = 123; |     const uint8_t item_width = 123; | ||||||
|     const uint8_t max_width = 100; |     const uint8_t text_max_width = 115; | ||||||
|  |  | ||||||
|     canvas_clear(canvas); |     canvas_clear(canvas); | ||||||
|     canvas_set_font(canvas, FontSecondary); |     canvas_set_font(canvas, FontSecondary); | ||||||
| @@ -61,7 +61,7 @@ static void file_select_draw_callback(Canvas* canvas, void* _model) { | |||||||
|             } |             } | ||||||
|  |  | ||||||
|             string_init_set(string_buff, model->filename[i]); |             string_init_set(string_buff, model->filename[i]); | ||||||
|             elements_string_fit_width(canvas, string_buff, max_width); |             elements_string_fit_width(canvas, string_buff, text_max_width); | ||||||
|             canvas_draw_str( |             canvas_draw_str( | ||||||
|                 canvas, 6, (i * item_height) + item_height - 4, string_get_cstr(string_buff)); |                 canvas, 6, (i * item_height) + item_height - 4, string_get_cstr(string_buff)); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
|  |  | ||||||
| static const uint8_t IBUTTON_KEY_DATA_SIZE = 8; | static const uint8_t IBUTTON_KEY_DATA_SIZE = 8; | ||||||
| static const uint8_t IBUTTON_KEY_NAME_SIZE = 64; | static const uint8_t IBUTTON_KEY_NAME_SIZE = 22; | ||||||
|  |  | ||||||
| enum class iButtonKeyType : uint8_t { | enum class iButtonKeyType : uint8_t { | ||||||
|     KeyDallas, |     KeyDallas, | ||||||
|   | |||||||
| @@ -41,7 +41,7 @@ void iButtonSceneDeleteConfirm::on_enter(iButtonApp* app) { | |||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     dialog_ex_set_text(dialog_ex, app->get_text_store(), 64, 26, AlignCenter, AlignCenter); |     dialog_ex_set_text(dialog_ex, app->get_text_store(), 64, 20, AlignCenter, AlignCenter); | ||||||
|     dialog_ex_set_left_button_text(dialog_ex, "Back"); |     dialog_ex_set_left_button_text(dialog_ex, "Back"); | ||||||
|     dialog_ex_set_right_button_text(dialog_ex, "Delete"); |     dialog_ex_set_right_button_text(dialog_ex, "Delete"); | ||||||
|     dialog_ex_set_result_callback(dialog_ex, callback); |     dialog_ex_set_result_callback(dialog_ex, callback); | ||||||
|   | |||||||
| @@ -51,17 +51,17 @@ void iButtonSceneEmulate::on_enter(iButtonApp* app) { | |||||||
|  |  | ||||||
|     switch(line_count) { |     switch(line_count) { | ||||||
|     case 3: |     case 3: | ||||||
|         popup_set_header(popup, "iButton", 92, 18, AlignCenter, AlignBottom); |         popup_set_header(popup, "iButton", 82, 18, AlignCenter, AlignBottom); | ||||||
|         popup_set_text(popup, app->get_text_store(), 92, 22, AlignCenter, AlignTop); |         popup_set_text(popup, app->get_text_store(), 82, 22, AlignCenter, AlignTop); | ||||||
|         break; |         break; | ||||||
|  |  | ||||||
|     default: |     default: | ||||||
|         popup_set_header(popup, "iButton", 92, 24, AlignCenter, AlignBottom); |         popup_set_header(popup, "iButton", 82, 24, AlignCenter, AlignBottom); | ||||||
|         popup_set_text(popup, app->get_text_store(), 92, 28, AlignCenter, AlignTop); |         popup_set_text(popup, app->get_text_store(), 82, 28, AlignCenter, AlignTop); | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     popup_set_icon(popup, 10, 10, I_iButtonKey_49x44); |     popup_set_icon(popup, 2, 10, I_iButtonKey_49x44); | ||||||
|  |  | ||||||
|     view_manager->switch_to(iButtonAppViewManager::Type::iButtonAppViewPopup); |     view_manager->switch_to(iButtonAppViewManager::Type::iButtonAppViewPopup); | ||||||
|     app->get_key_worker()->start_emulate(app->get_key()); |     app->get_key_worker()->start_emulate(app->get_key()); | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ void iButtonSceneSaveName::on_enter(iButtonApp* app) { | |||||||
|  |  | ||||||
|     text_input_set_header_text(text_input, "Name the key"); |     text_input_set_header_text(text_input, "Name the key"); | ||||||
|     text_input_set_result_callback( |     text_input_set_result_callback( | ||||||
|         text_input, callback, app, app->get_text_store(), app->get_text_store_size()); |         text_input, callback, app, app->get_text_store(), IBUTTON_KEY_NAME_SIZE); | ||||||
|  |  | ||||||
|     view_manager->switch_to(iButtonAppViewManager::Type::iButtonAppViewTextInput); |     view_manager->switch_to(iButtonAppViewManager::Type::iButtonAppViewTextInput); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ void iButtonSceneWriteSuccess::on_enter(iButtonApp* app) { | |||||||
|     auto callback = cbc::obtain_connector(this, &iButtonSceneWriteSuccess::popup_callback); |     auto callback = cbc::obtain_connector(this, &iButtonSceneWriteSuccess::popup_callback); | ||||||
|  |  | ||||||
|     popup_set_icon(popup, 0, 12, I_iButtonDolphinVerySuccess_108x52); |     popup_set_icon(popup, 0, 12, I_iButtonDolphinVerySuccess_108x52); | ||||||
|     popup_set_text(popup, "Successful writing!", 47, 14, AlignLeft, AlignBottom); |     popup_set_text(popup, "Successfully written!", 44, 14, AlignLeft, AlignBottom); | ||||||
|  |  | ||||||
|     popup_set_callback(popup, callback); |     popup_set_callback(popup, callback); | ||||||
|     popup_set_context(popup, app); |     popup_set_context(popup, app); | ||||||
|   | |||||||
| @@ -46,17 +46,17 @@ void iButtonSceneWrite::on_enter(iButtonApp* app) { | |||||||
|  |  | ||||||
|     switch(line_count) { |     switch(line_count) { | ||||||
|     case 3: |     case 3: | ||||||
|         popup_set_header(popup, "iButton", 92, 18, AlignCenter, AlignBottom); |         popup_set_header(popup, "iButton", 82, 18, AlignCenter, AlignBottom); | ||||||
|         popup_set_text(popup, app->get_text_store(), 92, 22, AlignCenter, AlignTop); |         popup_set_text(popup, app->get_text_store(), 82, 22, AlignCenter, AlignTop); | ||||||
|         break; |         break; | ||||||
|  |  | ||||||
|     default: |     default: | ||||||
|         popup_set_header(popup, "iButton", 92, 24, AlignCenter, AlignBottom); |         popup_set_header(popup, "iButton", 82, 24, AlignCenter, AlignBottom); | ||||||
|         popup_set_text(popup, app->get_text_store(), 92, 28, AlignCenter, AlignTop); |         popup_set_text(popup, app->get_text_store(), 82, 28, AlignCenter, AlignTop); | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     popup_set_icon(popup, 10, 10, I_iButtonKey_49x44); |     popup_set_icon(popup, 2, 10, I_iButtonKey_49x44); | ||||||
|  |  | ||||||
|     view_manager->switch_to(iButtonAppViewManager::Type::iButtonAppViewPopup); |     view_manager->switch_to(iButtonAppViewManager::Type::iButtonAppViewPopup); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3,14 +3,14 @@ | |||||||
| size_t args_get_first_word_length(string_t args) { | size_t args_get_first_word_length(string_t args) { | ||||||
|     size_t ws = string_search_char(args, ' '); |     size_t ws = string_search_char(args, ' '); | ||||||
|     if(ws == STRING_FAILURE) { |     if(ws == STRING_FAILURE) { | ||||||
|         ws = strlen(string_get_cstr(args)); |         ws = string_size(args); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return ws; |     return ws; | ||||||
| } | } | ||||||
|  |  | ||||||
| size_t args_length(string_t args) { | size_t args_length(string_t args) { | ||||||
|     return strlen(string_get_cstr(args)); |     return string_size(args); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool args_read_string_and_trim(string_t args, string_t word) { | bool args_read_string_and_trim(string_t args, string_t word) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user