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

Merge nfc_playlist from https://github.com/acegoal07/FlipperZero_NFC_Playlist

Willy-JL 1 год назад
Родитель
Сommit
297db98f2b

+ 1 - 0
nfc_playlist/scenes/nfc_playlist_scene_config.h

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

+ 19 - 12
nfc_playlist/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);
     Storage* storage = furi_record_open(RECORD_STORAGE);
     Stream* stream = file_stream_alloc(storage);
     Stream* stream = file_stream_alloc(storage);
+    bool item_already_in_playlist = false;
 
 
     if(file_stream_open(
     if(file_stream_open(
            stream,
            stream,
@@ -14,28 +15,34 @@ void nfc_playlist_nfc_add_menu_callback(void* context) {
         FuriString* line = furi_string_alloc();
         FuriString* line = furi_string_alloc();
         FuriString* tmp_str = furi_string_alloc();
         FuriString* tmp_str = furi_string_alloc();
         while(stream_read_line(stream, line)) {
         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_cat_printf(tmp_str, "%s", furi_string_get_cstr(line));
         }
         }
         furi_string_free(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);
         file_stream_close(stream);
         furi_string_free(tmp_str);
         furi_string_free(tmp_str);
-        nfc_playlist->settings.playlist_length++;
     }
     }
 
 
     stream_free(stream);
     stream_free(stream);
     furi_record_close(RECORD_STORAGE);
     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) {
 void nfc_playlist_nfc_add_scene_on_enter(void* context) {

+ 97 - 0
nfc_playlist/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);
+}

+ 3 - 4
nfc_playlist/scenes/nfc_playlist_scene_nfc_move_item.c

@@ -109,7 +109,7 @@ bool nfc_playlist_nfc_move_item_scene_on_event(void* context, SceneManagerEvent
                     counter++;
                     counter++;
                     if(counter == selected_target) {
                     if(counter == selected_target) {
                         furi_string_trim(line);
                         furi_string_trim(line);
-                        furi_string_cat_printf(tmp_target_str, "%s", furi_string_get_cstr(line));
+                        furi_string_cat(tmp_target_str, line);
                         stream_rewind(stream);
                         stream_rewind(stream);
                         counter = 0;
                         counter = 0;
                         break;
                         break;
@@ -126,7 +126,7 @@ bool nfc_playlist_nfc_move_item_scene_on_event(void* context, SceneManagerEvent
                     }
                     }
 
 
                     if(!furi_string_empty(tmp_new_order_str)) {
                     if(!furi_string_empty(tmp_new_order_str)) {
-                        furi_string_cat_printf(tmp_new_order_str, "%s", "\n");
+                        furi_string_cat(tmp_new_order_str, "\n");
                     }
                     }
 
 
                     furi_string_trim(line);
                     furi_string_trim(line);
@@ -147,8 +147,7 @@ bool nfc_playlist_nfc_move_item_scene_on_event(void* context, SceneManagerEvent
                         }
                         }
                         furi_string_free(tmp_target_str);
                         furi_string_free(tmp_target_str);
                     } else {
                     } else {
-                        furi_string_cat_printf(
-                            tmp_new_order_str, "%s", furi_string_get_cstr(line));
+                        furi_string_cat(tmp_new_order_str, furi_string_get_cstr(line));
                     }
                     }
                 }
                 }
 
 

+ 2 - 2
nfc_playlist/scenes/nfc_playlist_scene_nfc_remove.c

@@ -93,9 +93,9 @@ bool nfc_playlist_nfc_remove_scene_on_event(void* context, SceneManagerEvent eve
                     if(current_line != selected_line) {
                     if(current_line != selected_line) {
                         furi_string_trim(line);
                         furi_string_trim(line);
                         if(!furi_string_empty(tmp_str)) {
                         if(!furi_string_empty(tmp_str)) {
-                            furi_string_cat_printf(tmp_str, "\n");
+                            furi_string_cat(tmp_str, "\n");
                         }
                         }
-                        furi_string_cat_printf(tmp_str, "%s", furi_string_get_cstr(line));
+                        furi_string_cat(tmp_str, furi_string_get_cstr(line));
                     }
                     }
                 }
                 }