Просмотр исходного кода

Merge pull request #42 from acegoal07/dev

Duplicate detection
acegoal07 1 год назад
Родитель
Сommit
8135228968

+ 1 - 0
scenes/nfc_playlist_scene_config.h

@@ -1,4 +1,5 @@
 ADD_SCENE(nfc_playlist, confirm_delete, ConfirmDelete)
+ADD_SCENE(nfc_playlist, nfc_duplicate, NfcDuplicate)
 ADD_SCENE(nfc_playlist, emulation, Emulation)
 ADD_SCENE(nfc_playlist, error_playlist_already_exists, ErrorPlaylistAlreadyExists)
 ADD_SCENE(nfc_playlist, main_menu, MainMenu)

+ 19 - 12
scenes/nfc_playlist_scene_nfc_add.c

@@ -5,6 +5,7 @@ void nfc_playlist_nfc_add_menu_callback(void* context) {
 
    Storage* storage = furi_record_open(RECORD_STORAGE);
    Stream* stream = file_stream_alloc(storage);
+   bool item_already_in_playlist = false;
 
    if(file_stream_open(
          stream,
@@ -14,28 +15,34 @@ void nfc_playlist_nfc_add_menu_callback(void* context) {
       FuriString* line = furi_string_alloc();
       FuriString* tmp_str = furi_string_alloc();
       while(stream_read_line(stream, line)) {
+         if(furi_string_cmp(line, nfc_playlist->file_browser_output) == 0) {
+            item_already_in_playlist = true;
+            break;
+         }
          furi_string_cat_printf(tmp_str, "%s", furi_string_get_cstr(line));
       }
       furi_string_free(line);
-
-      if(!furi_string_empty(tmp_str)) {
-         furi_string_cat_printf(tmp_str, "\n");
+      if(!item_already_in_playlist) {
+         if(!furi_string_empty(tmp_str)) {
+            furi_string_cat(tmp_str, "\n");
+         }
+         furi_string_cat(tmp_str, furi_string_get_cstr(nfc_playlist->file_browser_output));
+         stream_clean(stream);
+         stream_write_string(stream, tmp_str);
+         nfc_playlist->settings.playlist_length++;
+         furi_string_reset(nfc_playlist->file_browser_output);
       }
-      furi_string_cat_printf(
-         tmp_str, "%s", furi_string_get_cstr(nfc_playlist->file_browser_output));
-
-      stream_clean(stream);
-      stream_write_string(stream, tmp_str);
       file_stream_close(stream);
       furi_string_free(tmp_str);
-      nfc_playlist->settings.playlist_length++;
    }
 
    stream_free(stream);
    furi_record_close(RECORD_STORAGE);
-   furi_string_reset(nfc_playlist->file_browser_output);
-
-   scene_manager_previous_scene(nfc_playlist->scene_manager);
+   if(!item_already_in_playlist) {
+      scene_manager_previous_scene(nfc_playlist->scene_manager);
+   } else {
+      scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcDuplicate);
+   }
 }
 
 void nfc_playlist_nfc_add_scene_on_enter(void* context) {

+ 97 - 0
scenes/nfc_playlist_scene_nfc_duplicate.c

@@ -0,0 +1,97 @@
+#include "../nfc_playlist.h"
+
+void nfc_playlist_nfc_duplicate_menu_callback(GuiButtonType result, InputType type, void* context) {
+   NfcPlaylist* nfc_playlist = context;
+   if(type == InputTypeShort) {
+      view_dispatcher_send_custom_event(nfc_playlist->view_dispatcher, result);
+   }
+}
+
+void nfc_playlist_nfc_duplicate_scene_on_enter(void* context) {
+   NfcPlaylist* nfc_playlist = context;
+
+   widget_add_text_box_element(
+      nfc_playlist->widget,
+      0,
+      0,
+      128,
+      23,
+      AlignCenter,
+      AlignCenter,
+      "\e#This item is already\nin the playlist\e#",
+      false);
+   widget_add_button_element(
+      nfc_playlist->widget,
+      GuiButtonTypeLeft,
+      "Try Again",
+      nfc_playlist_nfc_duplicate_menu_callback,
+      nfc_playlist);
+   widget_add_button_element(
+      nfc_playlist->widget,
+      GuiButtonTypeRight,
+      "Continue",
+      nfc_playlist_nfc_duplicate_menu_callback,
+      nfc_playlist);
+
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_Widget);
+}
+
+bool nfc_playlist_nfc_duplicate_scene_on_event(void* context, SceneManagerEvent event) {
+   NfcPlaylist* nfc_playlist = context;
+   bool consumed = false;
+   if(event.type == SceneManagerEventTypeCustom) {
+      switch(event.event) {
+      case GuiButtonTypeRight: {
+         Storage* storage = furi_record_open(RECORD_STORAGE);
+         Stream* stream = file_stream_alloc(storage);
+
+         if(file_stream_open(
+               stream,
+               furi_string_get_cstr(nfc_playlist->settings.playlist_path),
+               FSAM_READ_WRITE,
+               FSOM_OPEN_EXISTING)) {
+            FuriString* line = furi_string_alloc();
+            FuriString* tmp_str = furi_string_alloc();
+
+            while(stream_read_line(stream, line)) {
+               furi_string_cat_printf(tmp_str, "%s", furi_string_get_cstr(line));
+            }
+            furi_string_free(line);
+
+            if(!furi_string_empty(tmp_str)) {
+               furi_string_cat(tmp_str, "\n");
+            }
+            furi_string_cat(tmp_str, furi_string_get_cstr(nfc_playlist->file_browser_output));
+            stream_clean(stream);
+            stream_write_string(stream, tmp_str);
+            nfc_playlist->settings.playlist_length++;
+            furi_string_reset(nfc_playlist->file_browser_output);
+
+            file_stream_close(stream);
+            furi_string_free(tmp_str);
+         }
+         stream_free(stream);
+         furi_record_close(RECORD_STORAGE);
+
+         furi_string_reset(nfc_playlist->file_browser_output);
+         scene_manager_search_and_switch_to_previous_scene(
+            nfc_playlist->scene_manager, NfcPlaylistScene_PlaylistEdit);
+         consumed = true;
+         break;
+      }
+      case GuiButtonTypeLeft:
+         furi_string_reset(nfc_playlist->file_browser_output);
+         scene_manager_previous_scene(nfc_playlist->scene_manager);
+         consumed = true;
+         break;
+      default:
+         break;
+      }
+   }
+   return consumed;
+}
+
+void nfc_playlist_nfc_duplicate_scene_on_exit(void* context) {
+   NfcPlaylist* nfc_playlist = context;
+   widget_reset(nfc_playlist->widget);
+}