Browse Source

Merge pull request #38 from acegoal07/dev

Dev
acegoal07 1 year ago
parent
commit
cb6e15df9f

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

@@ -10,11 +10,11 @@ assignees: acegoal07
 **Describe the bug**
 **Describe the bug**
 A clear and concise description of what the bug is.
 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]
  - Version [e.g. 1.1]
 
 
 **Additional context**
 **Additional context**

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

@@ -8,4 +8,4 @@ assignees: acegoal07
 ---
 ---
 
 
 **Describe the feature**
 **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)
 - Rename playlist (Renames the selected playlist to the new name provided)
 - Add NFC Item (Adds the selected nfc item to the currently selected playlist)
 - 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)
 - 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)
 - 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
 Any feedback is welcome and would be very much appreciated

+ 1 - 1
application.fam

@@ -8,7 +8,7 @@ App(
     fap_category="NFC",
     fap_category="NFC",
     fap_author="@acegoal07",
     fap_author="@acegoal07",
     fap_weburl="https://github.com/acegoal07/FlipperZero_NFC_Playlist/tree/main",
     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="assets",
     fap_icon="assets/Playlist_10px.png",
     fap_icon="assets/Playlist_10px.png",
     fap_private_libs=[
     fap_private_libs=[

+ 5 - 7
nfc_playlist.c

@@ -17,14 +17,12 @@ static NfcPlaylist* nfc_playlist_alloc() {
    furi_assert(nfc_playlist);
    furi_assert(nfc_playlist);
    nfc_playlist->scene_manager = scene_manager_alloc(&nfc_playlist_scene_handlers, nfc_playlist);
    nfc_playlist->scene_manager = scene_manager_alloc(&nfc_playlist_scene_handlers, nfc_playlist);
    nfc_playlist->view_dispatcher = view_dispatcher_alloc();
    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->variable_item_list = variable_item_list_alloc();
    nfc_playlist->submenu = submenu_alloc();
    nfc_playlist->submenu = submenu_alloc();
    nfc_playlist->widget= widget_alloc();
    nfc_playlist->widget= widget_alloc();
 
 
    nfc_playlist->settings.playlist_path = furi_string_alloc();
    nfc_playlist->settings.playlist_path = furi_string_alloc();
    nfc_playlist->file_browser_output = 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_timeout = default_emulate_timeout;
    nfc_playlist->settings.emulate_delay = default_emulate_delay;
    nfc_playlist->settings.emulate_delay = default_emulate_delay;
    nfc_playlist->settings.emulate_led_indicator = default_emulate_led_indicator;
    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() {
 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) {
 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_LOCATION "/ext/apps_data/nfc_playlist/"
 #define PLAYLIST_DIR "/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
 #define MAX_PLAYLIST_NAME_LEN 50
 
 
 typedef enum {
 typedef enum {
@@ -45,7 +46,6 @@ typedef enum {
 typedef struct {
 typedef struct {
    FuriString* playlist_path;
    FuriString* playlist_path;
    uint8_t playlist_length;
    uint8_t playlist_length;
-   bool playlist_selected;
    uint8_t emulate_timeout;
    uint8_t emulate_timeout;
    uint8_t emulate_delay;
    uint8_t emulate_delay;
    bool emulate_led_indicator;
    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, confirm_delete, ConfirmDelete)
 ADD_SCENE(nfc_playlist, emulation, Emulation)
 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, main_menu, MainMenu)
 ADD_SCENE(nfc_playlist, name_new_playlist, NameNewPlaylist)
 ADD_SCENE(nfc_playlist, name_new_playlist, NameNewPlaylist)
 ADD_SCENE(nfc_playlist, nfc_add, NfcAdd)
 ADD_SCENE(nfc_playlist, nfc_add, NfcAdd)
 ADD_SCENE(nfc_playlist, nfc_remove, NfcRemove)
 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, playlist_select, PlaylistSelect)
 ADD_SCENE(nfc_playlist, settings, Settings)
 ADD_SCENE(nfc_playlist, settings, Settings)
 ADD_SCENE(nfc_playlist, view_playlist_content, ViewPlaylistContent)
 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:
          case GuiButtonTypeRight:
             Storage* storage = furi_record_open(RECORD_STORAGE);
             Storage* storage = furi_record_open(RECORD_STORAGE);
             if (storage_simply_remove(storage, furi_string_get_cstr(nfc_playlist->settings.playlist_path))) {
             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_string_reset(nfc_playlist->settings.playlist_path);               
             }
             }
             furi_record_close(RECORD_STORAGE);
             furi_record_close(RECORD_STORAGE);
             scene_manager_search_and_switch_to_previous_scene(nfc_playlist->scene_manager, NfcPlaylistScene_MainMenu);
             scene_manager_search_and_switch_to_previous_scene(nfc_playlist->scene_manager, NfcPlaylistScene_MainMenu);
             consumed = true;
             consumed = true;
             break;
             break;
-         default:
+         case GuiButtonTypeLeft:
             scene_manager_previous_scene(nfc_playlist->scene_manager);
             scene_manager_previous_scene(nfc_playlist->scene_manager);
+            consumed = true;
+            break;
+         default:
             break;
             break;
       }
       }
    }
    }

+ 12 - 17
scenes/nfc_playlist_scene_main_menu.c

@@ -1,10 +1,10 @@
 #include "../nfc_playlist.h"
 #include "../nfc_playlist.h"
 
 
 typedef enum {
 typedef enum {
-   NfcPlaylistMenuSelection_Start,
-   NfcPlaylistMenuSelection_PlaylistSelect,
-   NfcPlaylistMenuSelection_FileEdit,
-   NfcPlaylistMenuSelection_Settings
+   NfcPlaylistMainMenu_Start,
+   NfcPlaylistMainMenu_PlaylistSelect,
+   NfcPlaylistMainMenu_FileEdit,
+   NfcPlaylistMainMenu_Settings
 } NfcPlaylistMainMenuMenuSelection;
 } NfcPlaylistMainMenuMenuSelection;
 
 
 void nfc_playlist_main_menu_menu_callback(void* context, uint32_t index) {
 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) {
 void nfc_playlist_main_menu_scene_on_enter(void* context) {
    NfcPlaylist* nfc_playlist = 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);
    FuriString* header = furi_string_alloc_printf("NFC Playlist v%s", FAP_VERSION);
    submenu_set_header(nfc_playlist->submenu, furi_string_get_cstr(header));
    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(
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       nfc_playlist->submenu,
       "Start",
       "Start",
-      NfcPlaylistMenuSelection_Start,
+      NfcPlaylistMainMenu_Start,
       nfc_playlist_main_menu_menu_callback,
       nfc_playlist_main_menu_menu_callback,
       nfc_playlist,
       nfc_playlist,
       furi_string_empty(nfc_playlist->settings.playlist_path),
       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(
    submenu_add_item(
       nfc_playlist->submenu,
       nfc_playlist->submenu,
       "Select playlist",
       "Select playlist",
-      NfcPlaylistMenuSelection_PlaylistSelect,
+      NfcPlaylistMainMenu_PlaylistSelect,
       nfc_playlist_main_menu_menu_callback,
       nfc_playlist_main_menu_menu_callback,
       nfc_playlist);
       nfc_playlist);
 
 
    submenu_add_item(
    submenu_add_item(
       nfc_playlist->submenu,
       nfc_playlist->submenu,
       "Edit playlist",
       "Edit playlist",
-      NfcPlaylistMenuSelection_FileEdit,
+      NfcPlaylistMainMenu_FileEdit,
       nfc_playlist_main_menu_menu_callback,
       nfc_playlist_main_menu_menu_callback,
       nfc_playlist);
       nfc_playlist);
 
 
    submenu_add_item(
    submenu_add_item(
       nfc_playlist->submenu,
       nfc_playlist->submenu,
       "Settings",
       "Settings",
-      NfcPlaylistMenuSelection_Settings,
+      NfcPlaylistMainMenu_Settings,
       nfc_playlist_main_menu_menu_callback,
       nfc_playlist_main_menu_menu_callback,
       nfc_playlist);
       nfc_playlist);
 
 
@@ -62,19 +57,19 @@ bool nfc_playlist_main_menu_scene_on_event(void* context, SceneManagerEvent even
    bool consumed = false;
    bool consumed = false;
    if (event.type == SceneManagerEventTypeCustom) {
    if (event.type == SceneManagerEventTypeCustom) {
       switch(event.event) {
       switch(event.event) {
-         case NfcPlaylistMenuSelection_Start:
+         case NfcPlaylistMainMenu_Start:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_Emulation);
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_Emulation);
             consumed = true;
             consumed = true;
             break;
             break;
-         case NfcPlaylistMenuSelection_PlaylistSelect:
+         case NfcPlaylistMainMenu_PlaylistSelect:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_PlaylistSelect);
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_PlaylistSelect);
             consumed = true;
             consumed = true;
             break;
             break;
-         case NfcPlaylistMenuSelection_FileEdit:
+         case NfcPlaylistMainMenu_FileEdit:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_PlaylistEdit);
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_PlaylistEdit);
             consumed = true;
             consumed = true;
             break;
             break;
-         case NfcPlaylistMenuSelection_Settings:
+         case NfcPlaylistMainMenu_Settings:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_Settings);
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_Settings);
             consumed = true;
             consumed = true;
             break;
             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) {
 int32_t nfc_playlist_name_new_playlist_thread_task(void* context) {
    NfcPlaylist* nfc_playlist = 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);
    char const* file_name_cstr = furi_string_get_cstr(file_name);
 
 
    Storage* storage = furi_record_open(RECORD_STORAGE);
    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);
       furi_string_free(line);
 
 
       if (!furi_string_empty(tmp_str)) {
       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_clean(stream);
       stream_write_string(stream, tmp_str);
       stream_write_string(stream, tmp_str);
@@ -39,13 +38,13 @@ void nfc_playlist_nfc_add_scene_on_enter(void* context) {
    file_browser_configure(
    file_browser_configure(
       nfc_playlist->file_browser,
       nfc_playlist->file_browser,
       ".nfc",
       ".nfc",
-      "/ext/nfc/",
+      NFC_ITEM_LOCATION,
       true,
       true,
       true,
       true,
       &I_Nfc_10px,
       &I_Nfc_10px,
       true);
       true);
    file_browser_set_callback(nfc_playlist->file_browser, nfc_playlist_nfc_add_menu_callback, nfc_playlist);
    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);
    file_browser_start(nfc_playlist->file_browser, tmp_str);
    furi_string_free(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"
 #include "../nfc_playlist.h"
 
 
 typedef enum {
 typedef enum {
-   NfcPlaylistSettings_LineSelector,
-   NfcPlaylistSettings_RemoveLine
-} NfcPlaylistSettingsMenuSelection;
+   NfcPlaylistNfcRemove_LineSelector,
+   NfcPlaylistNfcRemove_RemoveLine
+} NfcPlaylistNfcRemoveMenuSelection;
 
 
 uint8_t selected_line;
 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);
    uint8_t option_value_index = variable_item_get_current_value_index(item);
    
    
    switch(current_option) {
    switch(current_option) {
-      case NfcPlaylistSettings_LineSelector: {
+      case NfcPlaylistNfcRemove_LineSelector: {
          selected_line = option_value_index + 1;
          selected_line = option_value_index + 1;
          FuriString* tmp_str = furi_string_alloc_printf("%d", selected_line);
          FuriString* tmp_str = furi_string_alloc_printf("%d", selected_line);
          variable_item_set_current_value_text(item, furi_string_get_cstr(tmp_str));
          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;
    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,
       nfc_playlist->variable_item_list,
       "Select Line",
       "Select Line",
       nfc_playlist->settings.playlist_length,
       nfc_playlist->settings.playlist_length,
       nfc_playlist_nfc_remove_options_change_callback,
       nfc_playlist_nfc_remove_options_change_callback,
       nfc_playlist);
       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);
    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);
    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);
    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;
    bool consumed = false;
    if (event.type == SceneManagerEventTypeCustom) {
    if (event.type == SceneManagerEventTypeCustom) {
       switch(event.event) {
       switch(event.event) {
-         case NfcPlaylistSettings_RemoveLine:
+         case NfcPlaylistNfcRemove_RemoveLine:
             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);
 
 
@@ -76,12 +76,11 @@ bool nfc_playlist_nfc_remove_scene_on_event(void* context, SceneManagerEvent eve
                while(stream_read_line(stream, line)) {
                while(stream_read_line(stream, line)) {
                   current_line++;
                   current_line++;
                   if (current_line != selected_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) {
             if (selected_line == 0) {
                scene_manager_previous_scene(nfc_playlist->scene_manager);
                scene_manager_previous_scene(nfc_playlist->scene_manager);
             } else {
             } 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_values_count(Line_selector, nfc_playlist->settings.playlist_length);
                variable_item_set_current_value_index(Line_selector, selected_line - 1);
                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"
 #include "../nfc_playlist.h"
 
 
 typedef enum {
 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) {
 void nfc_playlist_playlist_edit_menu_callback(void* context, uint32_t index) {
    NfcPlaylist* nfc_playlist = context;
    NfcPlaylist* nfc_playlist = context;
@@ -24,14 +25,14 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_item(
    submenu_add_item(
       nfc_playlist->submenu,
       nfc_playlist->submenu,
       "Create Playlist",
       "Create Playlist",
-      NfcPlaylistMenuSelection_CreatePlaylist,
+      NfcPlaylistPlaylistEdit_CreatePlaylist,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist);
       nfc_playlist);
 
 
    submenu_add_lockable_item(
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       nfc_playlist->submenu,
       "Delete Playlist",
       "Delete Playlist",
-      NfcPlaylistMenuSelection_DeletePlaylist,
+      NfcPlaylistPlaylistEdit_DeletePlaylist,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist,
       nfc_playlist,
       playlist_path_empty,
       playlist_path_empty,
@@ -40,7 +41,7 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_lockable_item(
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       nfc_playlist->submenu,
       "Rename Playlist",
       "Rename Playlist",
-      NfcPlaylistMenuSelection_RenamePlaylist,
+      NfcPlaylistPlaylistEdit_RenamePlaylist,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist,
       nfc_playlist,
       playlist_path_empty,
       playlist_path_empty,
@@ -49,7 +50,7 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_lockable_item(
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       nfc_playlist->submenu,
       "Add NFC Item",
       "Add NFC Item",
-      NfcPlaylistMenuSelection_AddNfcItem,
+      NfcPlaylistPlaylistEdit_AddNfcItem,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist,
       nfc_playlist,
       playlist_path_empty,
       playlist_path_empty,
@@ -58,7 +59,16 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_lockable_item(
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       nfc_playlist->submenu,
       "Remove NFC Item",
       "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_edit_menu_callback,
       nfc_playlist,
       nfc_playlist,
       playlist_path_empty,
       playlist_path_empty,
@@ -67,7 +77,7 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_lockable_item(
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       nfc_playlist->submenu,
       "View Playlist Content",
       "View Playlist Content",
-      NfcPlaylistMenuSelection_ViewPlaylistContent,
+      NfcPlaylistPlaylistEdit_ViewPlaylistContent,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist,
       nfc_playlist,
       playlist_path_empty,
       playlist_path_empty,
@@ -81,27 +91,31 @@ bool nfc_playlist_playlist_edit_scene_on_event(void* context, SceneManagerEvent
    bool consumed = false;
    bool consumed = false;
    if(event.type == SceneManagerEventTypeCustom) {
    if(event.type == SceneManagerEventTypeCustom) {
       switch(event.event) {
       switch(event.event) {
-         case NfcPlaylistMenuSelection_CreatePlaylist:
+         case NfcPlaylistPlaylistEdit_CreatePlaylist:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NameNewPlaylist);
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NameNewPlaylist);
             consumed = true;
             consumed = true;
             break;
             break;
-         case NfcPlaylistMenuSelection_DeletePlaylist:
+         case NfcPlaylistPlaylistEdit_DeletePlaylist:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_ConfirmDelete);
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_ConfirmDelete);
             consumed = true;
             consumed = true;
             break;
             break;
-         case NfcPlaylistMenuSelection_RenamePlaylist:
+         case NfcPlaylistPlaylistEdit_RenamePlaylist:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_PlaylistRename);
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_PlaylistRename);
             consumed = true;
             consumed = true;
             break;
             break;
-         case NfcPlaylistMenuSelection_AddNfcItem:
+         case NfcPlaylistPlaylistEdit_AddNfcItem:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcAdd);
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcAdd);
             consumed = true;
             consumed = true;
             break;
             break;
-         case NfcPlaylistMenuSelection_RemoveNfcItem:
+         case NfcPlaylistPlaylistEdit_RemoveNfcItem:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcRemove);
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcRemove);
             consumed = true;
             consumed = true;
             break;
             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);
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_ViewPlaylistContent);
             consumed = true;
             consumed = true;
             break;
             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_string_free(new_file_path);
-
    furi_record_close(RECORD_STORAGE);
    furi_record_close(RECORD_STORAGE);
 
 
    return 0;
    return 0;