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

Merge pull request #38 from acegoal07/dev

Dev
acegoal07 1 год назад
Родитель
Сommit
cb6e15df9f

+ 4 - 4
.github/ISSUE_TEMPLATE/bug_report.md

@@ -10,11 +10,11 @@ assignees: acegoal07
 **Describe the bug**
 A clear and concise description of what the bug is.
 
-**Screenshots**
-If applicable, add screenshots to help explain your problem.
+**Copy of your playlist**
+[Copy and paste the content of your playlist.txt file this is useful to help find any issues caused by the reading of the playlist]
 
-**Desktop (please complete the following information):**
- - Firmware [e.g. Xtreme]
+**Fap information:**
+ - Firmware [e.g. Momentum]
  - Version [e.g. 1.1]
 
 **Additional context**

+ 1 - 1
.github/ISSUE_TEMPLATE/feature_request.md

@@ -8,4 +8,4 @@ assignees: acegoal07
 ---
 
 **Describe the feature**
-A indepth description of what you want
+A in depth description of what you want

+ 4 - 0
README.md

@@ -27,6 +27,10 @@ As i know these firmwares are supported and working if you know any more please
 - Rename playlist (Renames the selected playlist to the new name provided)
 - Add NFC Item (Adds the selected nfc item to the currently selected playlist)
 - Remove NFC Item (Opens a menu allowing you to select a line to remove from the playlist)
+- Move NFC Item (Allows you to change the order of the NFC items in the playlist)
 - View playlist content (Allows you to view the contents of the playlist)
+## Feature ideas:
+- A function to allow you to add multiple nfc items to a playlist at once
+- A view playlist function which only shows the name of the playlist items excluding the file path
 
 Any feedback is welcome and would be very much appreciated

+ 1 - 1
application.fam

@@ -8,7 +8,7 @@ App(
     fap_category="NFC",
     fap_author="@acegoal07",
     fap_weburl="https://github.com/acegoal07/FlipperZero_NFC_Playlist/tree/main",
-    fap_version="2.4",
+    fap_version="2.5",
     fap_icon_assets="assets",
     fap_icon="assets/Playlist_10px.png",
     fap_private_libs=[

+ 5 - 7
nfc_playlist.c

@@ -17,14 +17,12 @@ static NfcPlaylist* nfc_playlist_alloc() {
    furi_assert(nfc_playlist);
    nfc_playlist->scene_manager = scene_manager_alloc(&nfc_playlist_scene_handlers, nfc_playlist);
    nfc_playlist->view_dispatcher = view_dispatcher_alloc();
-   view_dispatcher_enable_queue(nfc_playlist->view_dispatcher);
    nfc_playlist->variable_item_list = variable_item_list_alloc();
    nfc_playlist->submenu = submenu_alloc();
    nfc_playlist->widget= widget_alloc();
 
    nfc_playlist->settings.playlist_path = furi_string_alloc();
    nfc_playlist->file_browser_output = furi_string_alloc();
-   nfc_playlist->settings.playlist_selected = false;
    nfc_playlist->settings.emulate_timeout = default_emulate_timeout;
    nfc_playlist->settings.emulate_delay = default_emulate_delay;
    nfc_playlist->settings.emulate_led_indicator = default_emulate_led_indicator;
@@ -82,11 +80,11 @@ static void nfc_playlist_free(NfcPlaylist* nfc_playlist) {
 }
 
 void nfc_playlist_set_log_level() {
-#ifdef FURI_DEBUG
-   furi_log_set_level(FuriLogLevelTrace);
-#else
-   furi_log_set_level(FuriLogLevelInfo);
-#endif
+   #ifdef FURI_DEBUG
+      furi_log_set_level(FuriLogLevelTrace);
+   #else
+      furi_log_set_level(FuriLogLevelInfo);
+   #endif
 }
 
 int32_t nfc_playlist_main(void* p) {

+ 1 - 1
nfc_playlist.h

@@ -31,6 +31,7 @@
 
 #define PLAYLIST_LOCATION "/ext/apps_data/nfc_playlist/"
 #define PLAYLIST_DIR "/ext/apps_data/nfc_playlist"
+#define NFC_ITEM_LOCATION "/ext/nfc/"
 #define MAX_PLAYLIST_NAME_LEN 50
 
 typedef enum {
@@ -45,7 +46,6 @@ typedef enum {
 typedef struct {
    FuriString* playlist_path;
    uint8_t playlist_length;
-   bool playlist_selected;
    uint8_t emulate_timeout;
    uint8_t emulate_delay;
    bool emulate_led_indicator;

+ 3 - 2
scenes/nfc_playlist_scene_config.h

@@ -1,11 +1,12 @@
 ADD_SCENE(nfc_playlist, confirm_delete, ConfirmDelete)
 ADD_SCENE(nfc_playlist, emulation, Emulation)
-ADD_SCENE(nfc_playlist, playlist_edit, PlaylistEdit)
-ADD_SCENE(nfc_playlist, playlist_rename, PlaylistRename)
 ADD_SCENE(nfc_playlist, main_menu, MainMenu)
 ADD_SCENE(nfc_playlist, name_new_playlist, NameNewPlaylist)
 ADD_SCENE(nfc_playlist, nfc_add, NfcAdd)
 ADD_SCENE(nfc_playlist, nfc_remove, NfcRemove)
+ADD_SCENE(nfc_playlist, nfc_move_item, NfcMoveItem)
+ADD_SCENE(nfc_playlist, playlist_edit, PlaylistEdit)
+ADD_SCENE(nfc_playlist, playlist_rename, PlaylistRename)
 ADD_SCENE(nfc_playlist, playlist_select, PlaylistSelect)
 ADD_SCENE(nfc_playlist, settings, Settings)
 ADD_SCENE(nfc_playlist, view_playlist_content, ViewPlaylistContent)

+ 4 - 2
scenes/nfc_playlist_scene_confirm_delete.c

@@ -32,15 +32,17 @@ bool nfc_playlist_confirm_delete_scene_on_event(void* context, SceneManagerEvent
          case GuiButtonTypeRight:
             Storage* storage = furi_record_open(RECORD_STORAGE);
             if (storage_simply_remove(storage, furi_string_get_cstr(nfc_playlist->settings.playlist_path))) {
-               nfc_playlist->settings.playlist_selected = false;
                furi_string_reset(nfc_playlist->settings.playlist_path);               
             }
             furi_record_close(RECORD_STORAGE);
             scene_manager_search_and_switch_to_previous_scene(nfc_playlist->scene_manager, NfcPlaylistScene_MainMenu);
             consumed = true;
             break;
-         default:
+         case GuiButtonTypeLeft:
             scene_manager_previous_scene(nfc_playlist->scene_manager);
+            consumed = true;
+            break;
+         default:
             break;
       }
    }

+ 12 - 17
scenes/nfc_playlist_scene_main_menu.c

@@ -1,10 +1,10 @@
 #include "../nfc_playlist.h"
 
 typedef enum {
-   NfcPlaylistMenuSelection_Start,
-   NfcPlaylistMenuSelection_PlaylistSelect,
-   NfcPlaylistMenuSelection_FileEdit,
-   NfcPlaylistMenuSelection_Settings
+   NfcPlaylistMainMenu_Start,
+   NfcPlaylistMainMenu_PlaylistSelect,
+   NfcPlaylistMainMenu_FileEdit,
+   NfcPlaylistMainMenu_Settings
 } NfcPlaylistMainMenuMenuSelection;
 
 void nfc_playlist_main_menu_menu_callback(void* context, uint32_t index) {
@@ -14,11 +14,6 @@ void nfc_playlist_main_menu_menu_callback(void* context, uint32_t index) {
 
 void nfc_playlist_main_menu_scene_on_enter(void* context) {
    NfcPlaylist* nfc_playlist = context;
-   if (!nfc_playlist->settings.playlist_selected) {
-      nfc_playlist->settings.playlist_selected = true;
-      scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_PlaylistSelect);
-      return;
-   }
 
    FuriString* header = furi_string_alloc_printf("NFC Playlist v%s", FAP_VERSION);
    submenu_set_header(nfc_playlist->submenu, furi_string_get_cstr(header));
@@ -27,7 +22,7 @@ void nfc_playlist_main_menu_scene_on_enter(void* context) {
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       "Start",
-      NfcPlaylistMenuSelection_Start,
+      NfcPlaylistMainMenu_Start,
       nfc_playlist_main_menu_menu_callback,
       nfc_playlist,
       furi_string_empty(nfc_playlist->settings.playlist_path),
@@ -36,21 +31,21 @@ void nfc_playlist_main_menu_scene_on_enter(void* context) {
    submenu_add_item(
       nfc_playlist->submenu,
       "Select playlist",
-      NfcPlaylistMenuSelection_PlaylistSelect,
+      NfcPlaylistMainMenu_PlaylistSelect,
       nfc_playlist_main_menu_menu_callback,
       nfc_playlist);
 
    submenu_add_item(
       nfc_playlist->submenu,
       "Edit playlist",
-      NfcPlaylistMenuSelection_FileEdit,
+      NfcPlaylistMainMenu_FileEdit,
       nfc_playlist_main_menu_menu_callback,
       nfc_playlist);
 
    submenu_add_item(
       nfc_playlist->submenu,
       "Settings",
-      NfcPlaylistMenuSelection_Settings,
+      NfcPlaylistMainMenu_Settings,
       nfc_playlist_main_menu_menu_callback,
       nfc_playlist);
 
@@ -62,19 +57,19 @@ bool nfc_playlist_main_menu_scene_on_event(void* context, SceneManagerEvent even
    bool consumed = false;
    if (event.type == SceneManagerEventTypeCustom) {
       switch(event.event) {
-         case NfcPlaylistMenuSelection_Start:
+         case NfcPlaylistMainMenu_Start:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_Emulation);
             consumed = true;
             break;
-         case NfcPlaylistMenuSelection_PlaylistSelect:
+         case NfcPlaylistMainMenu_PlaylistSelect:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_PlaylistSelect);
             consumed = true;
             break;
-         case NfcPlaylistMenuSelection_FileEdit:
+         case NfcPlaylistMainMenu_FileEdit:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_PlaylistEdit);
             consumed = true;
             break;
-         case NfcPlaylistMenuSelection_Settings:
+         case NfcPlaylistMainMenu_Settings:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_Settings);
             consumed = true;
             break;

+ 1 - 1
scenes/nfc_playlist_scene_name_new_playlist.c

@@ -3,7 +3,7 @@
 int32_t nfc_playlist_name_new_playlist_thread_task(void* context) {
    NfcPlaylist* nfc_playlist = context;
 
-   FuriString* file_name = furi_string_alloc_printf("/ext/apps_data/nfc_playlist/%s.txt", nfc_playlist->text_input_output);
+   FuriString* file_name = furi_string_alloc_printf("%s%s.txt", PLAYLIST_LOCATION, nfc_playlist->text_input_output);
    char const* file_name_cstr = furi_string_get_cstr(file_name);
 
    Storage* storage = furi_record_open(RECORD_STORAGE);

+ 4 - 5
scenes/nfc_playlist_scene_nfc_add.c

@@ -15,10 +15,9 @@ void nfc_playlist_nfc_add_menu_callback(void* context) {
       furi_string_free(line);
 
       if (!furi_string_empty(tmp_str)) {
-         furi_string_cat_printf(tmp_str, "\n%s", furi_string_get_cstr(nfc_playlist->file_browser_output));
-      } else {
-         furi_string_printf(tmp_str, "%s", furi_string_get_cstr(nfc_playlist->file_browser_output));
+         furi_string_cat_printf(tmp_str, "\n");
       }
+      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);
@@ -39,13 +38,13 @@ void nfc_playlist_nfc_add_scene_on_enter(void* context) {
    file_browser_configure(
       nfc_playlist->file_browser,
       ".nfc",
-      "/ext/nfc/",
+      NFC_ITEM_LOCATION,
       true,
       true,
       &I_Nfc_10px,
       true);
    file_browser_set_callback(nfc_playlist->file_browser, nfc_playlist_nfc_add_menu_callback, nfc_playlist);
-   FuriString* tmp_str = furi_string_alloc_set_str("/ext/nfc/");
+   FuriString* tmp_str = furi_string_alloc_set_str(NFC_ITEM_LOCATION);
    file_browser_start(nfc_playlist->file_browser, tmp_str);
    furi_string_free(tmp_str);
 

+ 156 - 0
scenes/nfc_playlist_scene_nfc_move_item.c

@@ -0,0 +1,156 @@
+#include "../nfc_playlist.h"
+
+typedef enum {
+   NfcPlaylistNfcMoveItem_TargetSelector,
+   NfcPlaylistNfcMoveItem_DestinationSelector,
+   NfcPlaylistNfcMoveItem_MoveItem
+} NfcPlaylistNfcMoveItemMenuSelection;
+
+uint8_t selected_target;
+uint8_t selected_destination;
+
+void nfc_playlist_nfc_move_item_menu_callback(void* context, uint32_t index) {
+   NfcPlaylist* nfc_playlist = context;
+   scene_manager_handle_custom_event(nfc_playlist->scene_manager, index);
+}
+
+void nfc_playlist_nfc_move_item_options_change_callback(VariableItem* item) {
+   NfcPlaylist* nfc_playlist = variable_item_get_context(item);
+
+   uint8_t current_option = variable_item_list_get_selected_item_index(nfc_playlist->variable_item_list);
+   uint8_t option_value_index = variable_item_get_current_value_index(item);
+
+   switch(current_option) {
+      case NfcPlaylistNfcMoveItem_TargetSelector: {
+         selected_target = option_value_index + 1;
+         FuriString* tmp_str = furi_string_alloc_printf("%d", selected_target);
+         variable_item_set_current_value_text(item, furi_string_get_cstr(tmp_str));
+         furi_string_free(tmp_str);
+         break;
+      }
+      case NfcPlaylistNfcMoveItem_DestinationSelector: {
+         selected_destination = option_value_index + 1;
+         FuriString* tmp_str = furi_string_alloc_printf("%d", selected_destination);
+         variable_item_set_current_value_text(item, furi_string_get_cstr(tmp_str));
+         furi_string_free(tmp_str);
+         break;
+      }
+      default:
+         break;
+   }
+
+   variable_item_set_locked(variable_item_list_get(nfc_playlist->variable_item_list, NfcPlaylistNfcMoveItem_MoveItem), (selected_target == selected_destination), "Target\nand\nDestination\nare the same");
+}
+
+void nfc_playlist_nfc_move_item_scene_on_enter(void* context) {
+   NfcPlaylist* nfc_playlist = context;
+
+   selected_target = 1;
+   selected_destination = 1;
+
+   variable_item_list_set_header(nfc_playlist->variable_item_list, "Move NFC Item");
+
+   VariableItem* target_selector = variable_item_list_add(
+      nfc_playlist->variable_item_list,
+      "Select Target",
+      nfc_playlist->settings.playlist_length,
+      nfc_playlist_nfc_move_item_options_change_callback,
+      nfc_playlist);
+   variable_item_set_current_value_index(target_selector, 0);
+   variable_item_set_current_value_text(target_selector, "1");
+
+   VariableItem* destination_selector = variable_item_list_add(
+      nfc_playlist->variable_item_list,
+      "Select Destination",
+      nfc_playlist->settings.playlist_length,
+      nfc_playlist_nfc_move_item_options_change_callback,
+      nfc_playlist);
+   variable_item_set_current_value_index(destination_selector, 0);
+   variable_item_set_current_value_text(destination_selector, "1");
+
+   VariableItem* move_button = variable_item_list_add(nfc_playlist->variable_item_list, "Move Item", 0, NULL, NULL);
+   variable_item_set_locked(move_button, (selected_target == selected_destination), "Target\nand\nDestination\nare the same");
+
+   variable_item_list_set_enter_callback(nfc_playlist->variable_item_list, nfc_playlist_nfc_move_item_menu_callback, nfc_playlist);
+
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_VariableItemList);
+}
+
+bool nfc_playlist_nfc_move_item_scene_on_event(void* context, SceneManagerEvent event) {
+   NfcPlaylist* nfc_playlist = context;
+   bool consumed = false;
+
+   if(event.type == SceneManagerEventTypeCustom) {
+      switch(event.event) {
+         case NfcPlaylistNfcMoveItem_MoveItem: {
+            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* tmp_target_str = furi_string_alloc();
+               FuriString* line = furi_string_alloc();
+               uint8_t counter = 0;
+
+               while(stream_read_line(stream, line)) {
+                  counter++;
+                  if(counter == selected_target) {
+                     furi_string_trim(line);
+                     furi_string_cat_printf(tmp_target_str, "%s", furi_string_get_cstr(line));
+                     stream_rewind(stream);
+                     counter = 0;
+                     break;
+                  }
+               }
+
+               FuriString* tmp_new_order_str = furi_string_alloc();
+
+               while(stream_read_line(stream, line)) {
+                  counter++;
+
+                  if(counter == selected_target) {
+                     continue;
+                  }
+
+                  if(!furi_string_empty(tmp_new_order_str)) {
+                     furi_string_cat_printf(tmp_new_order_str, "%s", "\n");
+                  }
+
+                  furi_string_trim(line);
+
+                  if(counter == selected_destination) {
+                     if(counter == 1) {
+                        furi_string_cat_printf(tmp_new_order_str, "%s\n%s", furi_string_get_cstr(tmp_target_str), furi_string_get_cstr(line));
+                     } else {
+                        furi_string_cat_printf(tmp_new_order_str, "%s\n%s", furi_string_get_cstr(line), furi_string_get_cstr(tmp_target_str));
+                     }
+                     furi_string_free(tmp_target_str);
+                  } else {
+                     furi_string_cat_printf(tmp_new_order_str, "%s", furi_string_get_cstr(line));
+                  }
+               }
+
+               furi_string_free(line);
+               stream_clean(stream);
+               stream_write_string(stream, tmp_new_order_str);
+               furi_string_free(tmp_new_order_str);
+               file_stream_close(stream);
+            }
+
+            stream_free(stream);
+            furi_record_close(RECORD_STORAGE);
+
+            consumed = true;
+            break;
+         }
+         default:
+            break;
+      }
+   }
+
+   return consumed;
+}
+
+void nfc_playlist_nfc_move_item_scene_on_exit(void* context) {
+   NfcPlaylist* nfc_playlist = context;
+   variable_item_list_reset(nfc_playlist->variable_item_list);
+}

+ 17 - 18
scenes/nfc_playlist_scene_nfc_remove.c

@@ -1,9 +1,9 @@
 #include "../nfc_playlist.h"
 
 typedef enum {
-   NfcPlaylistSettings_LineSelector,
-   NfcPlaylistSettings_RemoveLine
-} NfcPlaylistSettingsMenuSelection;
+   NfcPlaylistNfcRemove_LineSelector,
+   NfcPlaylistNfcRemove_RemoveLine
+} NfcPlaylistNfcRemoveMenuSelection;
 
 uint8_t selected_line;
 
@@ -19,7 +19,7 @@ void nfc_playlist_nfc_remove_options_change_callback(VariableItem* item) {
    uint8_t option_value_index = variable_item_get_current_value_index(item);
    
    switch(current_option) {
-      case NfcPlaylistSettings_LineSelector: {
+      case NfcPlaylistNfcRemove_LineSelector: {
          selected_line = option_value_index + 1;
          FuriString* tmp_str = furi_string_alloc_printf("%d", selected_line);
          variable_item_set_current_value_text(item, furi_string_get_cstr(tmp_str));
@@ -36,24 +36,24 @@ void nfc_playlist_nfc_remove_scene_on_enter(void* context) {
 
    selected_line = nfc_playlist->settings.playlist_length;
 
-   variable_item_list_set_header(nfc_playlist->variable_item_list, "Settings");
+   variable_item_list_set_header(nfc_playlist->variable_item_list, "Remove Nfc Item");
 
-   VariableItem* Line_selector = variable_item_list_add(
+   VariableItem* line_selector = variable_item_list_add(
       nfc_playlist->variable_item_list,
       "Select Line",
       nfc_playlist->settings.playlist_length,
       nfc_playlist_nfc_remove_options_change_callback,
       nfc_playlist);
-   variable_item_set_current_value_index(Line_selector, nfc_playlist->settings.playlist_length - 1);
+   variable_item_set_current_value_index(line_selector, nfc_playlist->settings.playlist_length - 1);
 
    FuriString* tmp_str = furi_string_alloc_printf("%d", selected_line);
-   variable_item_set_current_value_text(Line_selector, furi_string_get_cstr(tmp_str));
+   variable_item_set_current_value_text(line_selector, furi_string_get_cstr(tmp_str));
    furi_string_free(tmp_str);
 
-   variable_item_set_locked(Line_selector, nfc_playlist->settings.playlist_length == 0 ? true : false, "Playlist\nis empty");
+   variable_item_set_locked(line_selector, nfc_playlist->settings.playlist_length == 0 ? true : false, "Playlist\nis empty");
 
-   variable_item_list_add(nfc_playlist->variable_item_list, "Remove Line", 0, NULL, NULL);
-   variable_item_set_locked(variable_item_list_get(nfc_playlist->variable_item_list, NfcPlaylistSettings_RemoveLine), nfc_playlist->settings.playlist_length == 0 ? true : false, "Playlist\nis empty");
+   VariableItem* remove_button = variable_item_list_add(nfc_playlist->variable_item_list, "Remove Line", 0, NULL, NULL);
+   variable_item_set_locked(remove_button, nfc_playlist->settings.playlist_length == 0 ? true : false, "Playlist\nis empty");
 
    variable_item_list_set_enter_callback(nfc_playlist->variable_item_list, nfc_playlist_nfc_remove_menu_callback, nfc_playlist);
 
@@ -65,7 +65,7 @@ bool nfc_playlist_nfc_remove_scene_on_event(void* context, SceneManagerEvent eve
    bool consumed = false;
    if (event.type == SceneManagerEventTypeCustom) {
       switch(event.event) {
-         case NfcPlaylistSettings_RemoveLine:
+         case NfcPlaylistNfcRemove_RemoveLine:
             Storage* storage = furi_record_open(RECORD_STORAGE);
             Stream* stream = file_stream_alloc(storage);
 
@@ -76,12 +76,11 @@ bool nfc_playlist_nfc_remove_scene_on_event(void* context, SceneManagerEvent eve
                while(stream_read_line(stream, line)) {
                   current_line++;
                   if (current_line != selected_line) {
-                     furi_string_replace_all(line, "\n", "");
-                     if (furi_string_empty(tmp_str)) {
-                        furi_string_cat_printf(tmp_str, "%s", furi_string_get_cstr(line));
-                     } else {
-                        furi_string_cat_printf(tmp_str, "\n%s", furi_string_get_cstr(line));
+                     furi_string_trim(line);
+                     if (!furi_string_empty(tmp_str)) {
+                        furi_string_cat_printf(tmp_str, "\n");
                      }
+                     furi_string_cat_printf(tmp_str, "%s", furi_string_get_cstr(line));
                   }
                }
 
@@ -99,7 +98,7 @@ bool nfc_playlist_nfc_remove_scene_on_event(void* context, SceneManagerEvent eve
             if (selected_line == 0) {
                scene_manager_previous_scene(nfc_playlist->scene_manager);
             } else {
-               VariableItem* Line_selector = variable_item_list_get(nfc_playlist->variable_item_list, NfcPlaylistSettings_LineSelector);
+               VariableItem* Line_selector = variable_item_list_get(nfc_playlist->variable_item_list, NfcPlaylistNfcRemove_LineSelector);
                variable_item_set_values_count(Line_selector, nfc_playlist->settings.playlist_length);
                variable_item_set_current_value_index(Line_selector, selected_line - 1);
 

+ 33 - 19
scenes/nfc_playlist_scene_playlist_edit.c

@@ -1,13 +1,14 @@
 #include "../nfc_playlist.h"
 
 typedef enum {
-   NfcPlaylistMenuSelection_CreatePlaylist,
-   NfcPlaylistMenuSelection_DeletePlaylist,
-   NfcPlaylistMenuSelection_RenamePlaylist,
-   NfcPlaylistMenuSelection_AddNfcItem,
-   NfcPlaylistMenuSelection_RemoveNfcItem,
-   NfcPlaylistMenuSelection_ViewPlaylistContent
-} NfcPlaylistFileEditMenuSelection;
+   NfcPlaylistPlaylistEdit_CreatePlaylist,
+   NfcPlaylistPlaylistEdit_DeletePlaylist,
+   NfcPlaylistPlaylistEdit_RenamePlaylist,
+   NfcPlaylistPlaylistEdit_AddNfcItem,
+   NfcPlaylistPlaylistEdit_RemoveNfcItem,
+   NfcPlaylistPlaylistEdit_MoveNfcItem,
+   NfcPlaylistPlaylistEdit_ViewPlaylistContent
+} NfcPlaylistPlaylistEditMenuSelection;
 
 void nfc_playlist_playlist_edit_menu_callback(void* context, uint32_t index) {
    NfcPlaylist* nfc_playlist = context;
@@ -24,14 +25,14 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_item(
       nfc_playlist->submenu,
       "Create Playlist",
-      NfcPlaylistMenuSelection_CreatePlaylist,
+      NfcPlaylistPlaylistEdit_CreatePlaylist,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist);
 
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       "Delete Playlist",
-      NfcPlaylistMenuSelection_DeletePlaylist,
+      NfcPlaylistPlaylistEdit_DeletePlaylist,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist,
       playlist_path_empty,
@@ -40,7 +41,7 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       "Rename Playlist",
-      NfcPlaylistMenuSelection_RenamePlaylist,
+      NfcPlaylistPlaylistEdit_RenamePlaylist,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist,
       playlist_path_empty,
@@ -49,7 +50,7 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       "Add NFC Item",
-      NfcPlaylistMenuSelection_AddNfcItem,
+      NfcPlaylistPlaylistEdit_AddNfcItem,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist,
       playlist_path_empty,
@@ -58,7 +59,16 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       "Remove NFC Item",
-      NfcPlaylistMenuSelection_RemoveNfcItem,
+      NfcPlaylistPlaylistEdit_RemoveNfcItem,
+      nfc_playlist_playlist_edit_menu_callback,
+      nfc_playlist,
+      playlist_path_empty,
+      "No\nplaylist\nselected");
+
+   submenu_add_lockable_item(
+      nfc_playlist->submenu,
+      "Move NFC Item",
+      NfcPlaylistPlaylistEdit_MoveNfcItem,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist,
       playlist_path_empty,
@@ -67,7 +77,7 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       "View Playlist Content",
-      NfcPlaylistMenuSelection_ViewPlaylistContent,
+      NfcPlaylistPlaylistEdit_ViewPlaylistContent,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist,
       playlist_path_empty,
@@ -81,27 +91,31 @@ bool nfc_playlist_playlist_edit_scene_on_event(void* context, SceneManagerEvent
    bool consumed = false;
    if(event.type == SceneManagerEventTypeCustom) {
       switch(event.event) {
-         case NfcPlaylistMenuSelection_CreatePlaylist:
+         case NfcPlaylistPlaylistEdit_CreatePlaylist:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NameNewPlaylist);
             consumed = true;
             break;
-         case NfcPlaylistMenuSelection_DeletePlaylist:
+         case NfcPlaylistPlaylistEdit_DeletePlaylist:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_ConfirmDelete);
             consumed = true;
             break;
-         case NfcPlaylistMenuSelection_RenamePlaylist:
+         case NfcPlaylistPlaylistEdit_RenamePlaylist:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_PlaylistRename);
             consumed = true;
             break;
-         case NfcPlaylistMenuSelection_AddNfcItem:
+         case NfcPlaylistPlaylistEdit_AddNfcItem:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcAdd);
             consumed = true;
             break;
-         case NfcPlaylistMenuSelection_RemoveNfcItem:
+         case NfcPlaylistPlaylistEdit_RemoveNfcItem:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcRemove);
             consumed = true;
             break;
-         case NfcPlaylistMenuSelection_ViewPlaylistContent:
+         case NfcPlaylistPlaylistEdit_MoveNfcItem:
+            scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcMoveItem);
+            consumed = true;
+            break;
+         case NfcPlaylistPlaylistEdit_ViewPlaylistContent:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_ViewPlaylistContent);
             consumed = true;
             break;

+ 0 - 1
scenes/nfc_playlist_scene_playlist_rename.c

@@ -19,7 +19,6 @@ int32_t nfc_playlist_playlist_rename_thread_task(void* context) {
    }
 
    furi_string_free(new_file_path);
-
    furi_record_close(RECORD_STORAGE);
 
    return 0;