Browse Source

Adds ability to remove playlist lines

acegoal07 1 year ago
parent
commit
b93ee280fd

+ 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="1.8",
+    fap_version="1.9",
     fap_icon="assets/icon.png",
     fap_icon="assets/icon.png",
     fap_private_libs=[
     fap_private_libs=[
         Lib(
         Lib(

+ 1 - 0
nfc_playlist.h

@@ -39,6 +39,7 @@ typedef enum {
 
 
 typedef struct {
 typedef struct {
    FuriString* file_path;
    FuriString* file_path;
+   uint8_t playlist_length;
    bool playlist_selected;
    bool playlist_selected;
    uint8_t emulate_timeout;
    uint8_t emulate_timeout;
    uint8_t emulate_delay;
    uint8_t emulate_delay;

+ 1 - 0
scenes/nfc_playlist_scene_config.h

@@ -5,6 +5,7 @@ ADD_SCENE(nfc_playlist, file_rename, FileRename)
 ADD_SCENE(nfc_playlist, main_menu, MainMenu)
 ADD_SCENE(nfc_playlist, main_menu, MainMenu)
 ADD_SCENE(nfc_playlist, name_new_file, NameNewFile)
 ADD_SCENE(nfc_playlist, name_new_file, NameNewFile)
 ADD_SCENE(nfc_playlist, nfc_select, NfcSelect)
 ADD_SCENE(nfc_playlist, nfc_select, NfcSelect)
+ADD_SCENE(nfc_playlist, nfc_remove, NfcRemove)
 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)

+ 24 - 10
scenes/nfc_playlist_scene_file_edit.c

@@ -4,8 +4,9 @@ typedef enum {
    NfcPlaylistMenuSelection_CreatePlaylist,
    NfcPlaylistMenuSelection_CreatePlaylist,
    NfcPlaylistMenuSelection_DeletePlaylist,
    NfcPlaylistMenuSelection_DeletePlaylist,
    NfcPlaylistMenuSelection_RenamePlaylist,
    NfcPlaylistMenuSelection_RenamePlaylist,
-   NfcPlaylistMenuSelection_ViewPlaylistContent,
-   NfcPlaylistMenuSelection_AddNfcItem
+   NfcPlaylistMenuSelection_AddNfcItem,
+   NfcPlaylistMenuSelection_RemoveNfcItem,
+   NfcPlaylistMenuSelection_ViewPlaylistContent
 } NfcPlaylistFileEditMenuSelection;
 } NfcPlaylistFileEditMenuSelection;
 
 
 void nfc_playlist_file_edit_menu_callback(void* context, uint32_t index) {
 void nfc_playlist_file_edit_menu_callback(void* context, uint32_t index) {
@@ -45,8 +46,8 @@ void nfc_playlist_file_edit_scene_on_enter(void* context) {
 
 
    submenu_add_lockable_item(
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       nfc_playlist->submenu,
-      "View Playlist Content",
-      NfcPlaylistMenuSelection_ViewPlaylistContent,
+      "Add NFC Item",
+      NfcPlaylistMenuSelection_AddNfcItem,
       nfc_playlist_file_edit_menu_callback,
       nfc_playlist_file_edit_menu_callback,
       nfc_playlist,
       nfc_playlist,
       furi_string_empty(nfc_playlist->settings.file_path),
       furi_string_empty(nfc_playlist->settings.file_path),
@@ -54,8 +55,17 @@ void nfc_playlist_file_edit_scene_on_enter(void* context) {
 
 
    submenu_add_lockable_item(
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       nfc_playlist->submenu,
-      "Add NFC Item",
-      NfcPlaylistMenuSelection_AddNfcItem,
+      "Remove NFC Item",
+      NfcPlaylistMenuSelection_RemoveNfcItem,
+      nfc_playlist_file_edit_menu_callback,
+      nfc_playlist,
+      furi_string_empty(nfc_playlist->settings.file_path),
+      "No\nplaylist\nselected");
+
+   submenu_add_lockable_item(
+      nfc_playlist->submenu,
+      "View Playlist Content",
+      NfcPlaylistMenuSelection_ViewPlaylistContent,
       nfc_playlist_file_edit_menu_callback,
       nfc_playlist_file_edit_menu_callback,
       nfc_playlist,
       nfc_playlist,
       furi_string_empty(nfc_playlist->settings.file_path),
       furi_string_empty(nfc_playlist->settings.file_path),
@@ -81,14 +91,18 @@ bool nfc_playlist_file_edit_scene_on_event(void* context, SceneManagerEvent even
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_FileRename);
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_FileRename);
             consumed = true;
             consumed = true;
             break;
             break;
-         case NfcPlaylistMenuSelection_ViewPlaylistContent:
-            scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_ViewPlaylistContent);
-            consumed = true;
-            break;
          case NfcPlaylistMenuSelection_AddNfcItem:
          case NfcPlaylistMenuSelection_AddNfcItem:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcSelect);
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcSelect);
             consumed = true;
             consumed = true;
             break;
             break;
+         case NfcPlaylistMenuSelection_RemoveNfcItem:
+            scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcRemove);
+            consumed = true;
+            break;
+         case NfcPlaylistMenuSelection_ViewPlaylistContent:
+            scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_ViewPlaylistContent);
+            consumed = true;
+            break;
          default:
          default:
             break;
             break;
       }
       }

+ 2 - 0
scenes/nfc_playlist_scene_name_new_file.c

@@ -13,6 +13,8 @@ void nfc_playlist_name_new_file_menu_callback(void* context) {
       furi_string_swap(nfc_playlist->settings.file_path, file_name);
       furi_string_swap(nfc_playlist->settings.file_path, file_name);
    }
    }
 
 
+   nfc_playlist->settings.playlist_length = 0;
+   
    storage_file_free(file);
    storage_file_free(file);
    furi_string_free(file_name);
    furi_string_free(file_name);
    furi_record_close(RECORD_STORAGE);
    furi_record_close(RECORD_STORAGE);

+ 125 - 0
scenes/nfc_playlist_scene_nfc_remove.c

@@ -0,0 +1,125 @@
+#include "../nfc_playlist.h"
+
+typedef enum {
+   NfcPlaylistSettings_LineSelector,
+   NfcPlaylistSettings_RemoveLine
+} NfcPlaylistSettingsMenuSelection;
+
+uint8_t selected_line;
+
+void nfc_playlist_nfc_remove_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_remove_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);
+   FuriString* tmp_str = furi_string_alloc();
+   switch(current_option) {
+      case NfcPlaylistSettings_LineSelector:
+         selected_line = option_value_index + 1;
+         furi_string_printf(tmp_str, "%d", selected_line);
+         variable_item_set_current_value_text(item, furi_string_get_cstr(tmp_str));
+         break;
+      default:
+         break;
+   }
+   furi_string_free(tmp_str);
+}
+
+void nfc_playlist_nfc_remove_scene_on_enter(void* context) {
+   NfcPlaylist* nfc_playlist = context;
+   FuriString* tmp_str = furi_string_alloc();
+
+   selected_line = nfc_playlist->settings.playlist_length;
+
+   variable_item_list_set_header(nfc_playlist->variable_item_list, "Settings");
+
+   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);
+   furi_string_printf(tmp_str, "%d", selected_line);
+   variable_item_set_current_value_text(Line_selector, furi_string_get_cstr(tmp_str));
+   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");
+
+   variable_item_list_set_enter_callback(nfc_playlist->variable_item_list, nfc_playlist_nfc_remove_menu_callback, nfc_playlist);
+   furi_string_free(tmp_str);
+
+   view_dispatcher_switch_to_view(nfc_playlist->view_dispatcher, NfcPlaylistView_VariableItemList);
+}
+
+bool nfc_playlist_nfc_remove_scene_on_event(void* context, SceneManagerEvent event) {
+   NfcPlaylist* nfc_playlist = context;
+   bool consumed = false;
+   if (event.type == SceneManagerEventTypeCustom) {
+      switch(event.event) {
+         case NfcPlaylistSettings_RemoveLine:
+            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.file_path), FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) {
+               FuriString* line = furi_string_alloc();
+               FuriString* tmp_str = furi_string_alloc();
+               uint8_t current_line = 0;
+               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_printf(tmp_str, "%s", furi_string_get_cstr(line));
+                     } else {
+                        furi_string_cat(tmp_str, "\n");
+                        furi_string_cat(tmp_str, furi_string_get_cstr(line));
+                     }
+                  }
+                  furi_string_reset(line);
+               }
+
+               stream_clean(stream);
+               furi_string_free(line);
+               stream_write_string(stream, tmp_str);
+               furi_string_free(tmp_str);
+               file_stream_close(stream);
+               stream_free(stream);
+               nfc_playlist->settings.playlist_length--;
+               selected_line = nfc_playlist->settings.playlist_length;
+            }
+            furi_record_close(RECORD_STORAGE);
+
+            if (selected_line == 0) {
+               scene_manager_previous_scene(nfc_playlist->scene_manager);
+            } else {
+               FuriString* tmp_str = furi_string_alloc();
+
+               VariableItem* Line_selector = variable_item_list_get(nfc_playlist->variable_item_list, NfcPlaylistSettings_LineSelector);
+               variable_item_set_values_count(Line_selector, nfc_playlist->settings.playlist_length);
+               variable_item_set_current_value_index(Line_selector, selected_line - 1);
+               furi_string_printf(tmp_str, "%d", selected_line);
+               variable_item_set_current_value_text(Line_selector, furi_string_get_cstr(tmp_str));
+
+               furi_string_free(tmp_str);
+            }
+
+            consumed = true;
+            break;
+         default:
+            break;
+      }
+   }
+   return consumed;
+}
+
+void nfc_playlist_nfc_remove_scene_on_exit(void* context) {
+   NfcPlaylist* nfc_playlist = context;
+   variable_item_list_reset(nfc_playlist->variable_item_list);
+}

+ 2 - 0
scenes/nfc_playlist_scene_nfc_select.c

@@ -23,6 +23,8 @@ void nfc_playlist_nfc_select_menu_callback(void* context) {
 
 
       storage_file_write(file, furi_string_get_cstr(playlist_content), sizeof(char) * furi_string_utf8_length(playlist_content));
       storage_file_write(file, furi_string_get_cstr(playlist_content), sizeof(char) * furi_string_utf8_length(playlist_content));
 
 
+      nfc_playlist->settings.playlist_length++;
+
       furi_string_free(playlist_content);
       furi_string_free(playlist_content);
       storage_file_close(file);
       storage_file_close(file);
    }
    }

+ 17 - 0
scenes/nfc_playlist_scene_playlist_select.c

@@ -4,6 +4,23 @@ void nfc_playlist_playlist_select_menu_callback(void* context) {
    NfcPlaylist* nfc_playlist = context;
    NfcPlaylist* nfc_playlist = context;
    furi_string_swap(nfc_playlist->settings.file_path, nfc_playlist->file_browser_output);
    furi_string_swap(nfc_playlist->settings.file_path, nfc_playlist->file_browser_output);
    furi_string_reset(nfc_playlist->file_browser_output);
    furi_string_reset(nfc_playlist->file_browser_output);
+
+   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.file_path), FSAM_READ, FSOM_OPEN_EXISTING)) {
+      nfc_playlist->settings.playlist_length = 0;
+      FuriString* line = furi_string_alloc();
+      while(stream_read_line(stream, line)) {
+         nfc_playlist->settings.playlist_length++;
+      }
+      furi_string_free(line);
+      file_stream_close(stream);
+      stream_free(stream);
+   }
+
+   furi_record_close(RECORD_STORAGE);
+
    scene_manager_previous_scene(nfc_playlist->scene_manager);
    scene_manager_previous_scene(nfc_playlist->scene_manager);
 }
 }