diff --git a/applications/main/subghz/scenes/subghz_scene_decode_raw.c b/applications/main/subghz/scenes/subghz_scene_decode_raw.c index b2be9b8e2..09cc806c8 100644 --- a/applications/main/subghz/scenes/subghz_scene_decode_raw.c +++ b/applications/main/subghz/scenes/subghz_scene_decode_raw.c @@ -66,24 +66,18 @@ static void subghz_scene_add_to_history_callback( if(subghz->remove_duplicates) { // Look in history for signal hash uint8_t hash_data = subghz_protocol_decoder_base_get_hash_data(decoder_base); - uint16_t menu_idx = subghz_view_receiver_get_idx_menu(subghz->subghz_receiver); subghz_view_receiver_disable_draw_callback(subghz->subghz_receiver); for(uint16_t i = idx; i > 0; i--) { i--; // Iterating in reverse with off by one if(subghz_history_get_hash_data(subghz->history, i) == hash_data) { // Remove previous instance and update menu index subghz_history_delete_item(subghz->history, i); - subghz_view_receiver_set_idx_menu(subghz->subghz_receiver, i); - subghz_view_receiver_delete_element_callback(subghz->subghz_receiver); - if(menu_idx > i) { - menu_idx--; - idx--; - } + subghz_view_receiver_delete_item(subghz->subghz_receiver, i); + idx--; } i++; } // Restore ui state - subghz_view_receiver_set_idx_menu(subghz->subghz_receiver, menu_idx); subghz->idx_menu_chosen = subghz_view_receiver_get_idx_menu(subghz->subghz_receiver); subghz_view_receiver_enable_draw_callback(subghz->subghz_receiver); if(subghz_history_get_last_index(subghz->history) == 0) { diff --git a/applications/main/subghz/scenes/subghz_scene_receiver.c b/applications/main/subghz/scenes/subghz_scene_receiver.c index 713a67f19..9309d197c 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver.c @@ -148,24 +148,18 @@ static void subghz_scene_add_to_history_callback( if(subghz->remove_duplicates) { // Look in history for signal hash uint8_t hash_data = subghz_protocol_decoder_base_get_hash_data(decoder_base); - uint16_t menu_idx = subghz_view_receiver_get_idx_menu(subghz->subghz_receiver); subghz_view_receiver_disable_draw_callback(subghz->subghz_receiver); for(uint16_t i = idx; i > 0; i--) { i--; // Iterating in reverse with off by one if(subghz_history_get_hash_data(subghz->history, i) == hash_data) { // Remove previous instance and update menu index subghz_history_delete_item(subghz->history, i); - subghz_view_receiver_set_idx_menu(subghz->subghz_receiver, i); - subghz_view_receiver_delete_element_callback(subghz->subghz_receiver); - if(menu_idx > i) { - menu_idx--; - idx--; - } + subghz_view_receiver_delete_item(subghz->subghz_receiver, i); + idx--; } i++; } // Restore ui state - subghz_view_receiver_set_idx_menu(subghz->subghz_receiver, menu_idx); subghz->idx_menu_chosen = subghz_view_receiver_get_idx_menu(subghz->subghz_receiver); subghz_view_receiver_enable_draw_callback(subghz->subghz_receiver); @@ -334,7 +328,9 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { subghz_view_receiver_disable_draw_callback(subghz->subghz_receiver); subghz_history_delete_item(subghz->history, subghz->idx_menu_chosen); - subghz_view_receiver_delete_element_callback(subghz->subghz_receiver); + subghz_view_receiver_delete_item( + subghz->subghz_receiver, + subghz_view_receiver_get_idx_menu(subghz->subghz_receiver)); subghz_view_receiver_enable_draw_callback(subghz->subghz_receiver); subghz_scene_receiver_update_statusbar(subghz); diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index ab5ca0365..6de3eca66 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -117,27 +117,19 @@ void subghz_history_reset(SubGhzHistory* instance) { instance->code_last_hash_data = 0; } -void subghz_history_delete_item(SubGhzHistory* instance, uint16_t item_id) { +void subghz_history_delete_item(SubGhzHistory* instance, uint16_t idx) { furi_assert(instance); - SubGhzHistoryItemArray_it_t it; - //SubGhzHistoryItem* target_item = SubGhzHistoryItemArray_get(instance->history->data, item_id); - SubGhzHistoryItemArray_it_last(it, instance->history->data); - while(!SubGhzHistoryItemArray_end_p(it)) { - SubGhzHistoryItem* item = SubGhzHistoryItemArray_ref(it); - - if(it->index == (size_t)(item_id)) { - furi_string_free(item->item_str); - furi_string_free(item->preset->name); - free(item->preset); - flipper_format_free(item->flipper_string); - item->type = 0; - SubGhzHistoryItemArray_remove(instance->history->data, it); - break; - } - SubGhzHistoryItemArray_previous(it); + if(idx < SubGhzHistoryItemArray_size(instance->history->data)) { + SubGhzHistoryItem* item = SubGhzHistoryItemArray_get(instance->history->data, idx); + furi_string_free(item->item_str); + furi_string_free(item->preset->name); + free(item->preset); + flipper_format_free(item->flipper_string); + item->type = 0; + SubGhzHistoryItemArray_remove_v(instance->history->data, idx, idx + 1); + instance->last_index_write--; } - instance->last_index_write--; } uint16_t subghz_history_get_item(SubGhzHistory* instance) { diff --git a/applications/main/subghz/subghz_history.h b/applications/main/subghz/subghz_history.h index debd66765..84da80a8a 100644 --- a/applications/main/subghz/subghz_history.h +++ b/applications/main/subghz/subghz_history.h @@ -27,7 +27,7 @@ void subghz_history_free(SubGhzHistory* instance); */ void subghz_history_reset(SubGhzHistory* instance); -void subghz_history_delete_item(SubGhzHistory* instance, uint16_t item_id); +void subghz_history_delete_item(SubGhzHistory* instance, uint16_t idx); /** Get hash data to history[idx] * diff --git a/applications/main/subghz/views/receiver.c b/applications/main/subghz/views/receiver.c index e2b3a1a46..372283889 100644 --- a/applications/main/subghz/views/receiver.c +++ b/applications/main/subghz/views/receiver.c @@ -707,41 +707,33 @@ uint16_t subghz_view_receiver_get_idx_menu(SubGhzViewReceiver* subghz_receiver) return idx; } -void subghz_view_receiver_delete_element_callback(SubGhzViewReceiver* subghz_receiver) { +void subghz_view_receiver_delete_item(SubGhzViewReceiver* subghz_receiver, uint16_t idx) { furi_assert(subghz_receiver); with_view_model( subghz_receiver->view, SubGhzViewReceiverModel * model, { - SubGhzReceiverMenuItemArray_it_t it; - // SubGhzReceiverMenuItem* target_item = - // SubGhzReceiverMenuItemArray_get(model->history->data, model->idx); - SubGhzReceiverMenuItemArray_it_last(it, model->history->data); - while(!SubGhzReceiverMenuItemArray_end_p(it)) { - SubGhzReceiverMenuItem* item = SubGhzReceiverMenuItemArray_ref(it); + if(idx < SubGhzReceiverMenuItemArray_size(model->history->data)) { + SubGhzReceiverMenuItem* item = + SubGhzReceiverMenuItemArray_get(model->history->data, idx); + furi_string_free(item->item_str); + furi_string_free(item->time); + item->type = 0; + item->repeats = 0; + SubGhzReceiverMenuItemArray_remove_v(model->history->data, idx, idx + 1); - if(it->index == (size_t)(model->idx)) { - furi_string_free(item->item_str); - furi_string_free(item->time); - item->type = 0; - item->repeats = 0; - SubGhzReceiverMenuItemArray_remove(model->history->data, it); + if(model->history_item == 5) { + if(model->idx >= 2) { + model->idx = model->history_item - 1; + } } + model->history_item--; - SubGhzReceiverMenuItemArray_previous(it); - } - - if(model->history_item == 5) { - if(model->idx >= 2) { - model->idx = model->history_item - 1; + if(model->idx && (model->idx > idx || model->idx == model->history_item)) { + model->idx--; } } - model->history_item--; - - if(model->idx != 0) { - model->idx--; - } }, true); } diff --git a/applications/main/subghz/views/receiver.h b/applications/main/subghz/views/receiver.h index f376aca51..9d66b8b4a 100644 --- a/applications/main/subghz/views/receiver.h +++ b/applications/main/subghz/views/receiver.h @@ -55,7 +55,7 @@ uint16_t subghz_view_receiver_get_idx_menu(SubGhzViewReceiver* subghz_receiver); void subghz_view_receiver_set_idx_menu(SubGhzViewReceiver* subghz_receiver, uint16_t idx); -void subghz_view_receiver_delete_element_callback(SubGhzViewReceiver* subghz_receiver); +void subghz_view_receiver_delete_item(SubGhzViewReceiver* subghz_receiver, uint16_t idx); void subghz_view_receiver_enable_draw_callback(SubGhzViewReceiver* subghz_receiver);