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

Behaviour + Move nfc items

- Changes how the app acts at certain points
- Also starts adding move functionality
acegoal07 1 год назад
Родитель
Сommit
60f8961f86

+ 0 - 1
nfc_playlist.c

@@ -24,7 +24,6 @@ static NfcPlaylist* nfc_playlist_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;

+ 0 - 1
nfc_playlist.h

@@ -46,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;

+ 2 - 2
scenes/nfc_playlist_scene_config.h

@@ -1,11 +1,11 @@
 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, 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)

+ 0 - 1
scenes/nfc_playlist_scene_confirm_delete.c

@@ -32,7 +32,6 @@ 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);

+ 0 - 5
scenes/nfc_playlist_scene_main_menu.c

@@ -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));

+ 159 - 0
scenes/nfc_playlist_scene_nfc_move_item

@@ -0,0 +1,159 @@
+// This is currently not working so its not included at the moment
+
+
+#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 = 0;
+   selected_destination = 0;
+
+   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;
+   UNUSED(nfc_playlist);
+
+   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)) {
+               int counter = 0;
+               FuriString* tmp_target_line = furi_string_alloc();
+               FuriString* line = furi_string_alloc();
+
+               while(stream_read_line(stream, line)) {
+                  counter++;
+                  if (counter == selected_target) {
+                     furi_string_set(tmp_target_line, line);
+                  }
+               }
+               furi_string_reset(line);
+               stream_rewind(stream);
+
+               counter = 0;
+               FuriString* tmp_new_playlist_order = furi_string_alloc();
+
+               while(stream_read_line(stream, line)) {
+                  counter++;
+
+                  if(counter == selected_target) {
+                     continue;
+                  }
+
+                  furi_string_trim(line);
+
+                  if(!furi_string_empty(tmp_new_playlist_order)) {
+                     furi_string_cat_printf(tmp_new_playlist_order, "\n");
+                  }
+                  if(counter == selected_destination) {
+                     furi_string_cat_printf(tmp_new_playlist_order, "%s\n%s", furi_string_get_cstr(tmp_target_line), furi_string_get_cstr(line));
+                  } else {
+                     furi_string_cat_printf(tmp_new_playlist_order, "%s", furi_string_get_cstr(line));
+                  }
+               }
+
+               FURI_LOG_RAW_I("New playlist order: %s\n", furi_string_get_cstr(tmp_new_playlist_order));
+
+               stream_clean(stream);
+               stream_write_string(stream, tmp_new_playlist_order);
+               file_stream_close(stream);
+               furi_string_free(tmp_new_playlist_order);
+               furi_string_free(tmp_target_line);
+               furi_string_free(line);
+            }
+
+            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);
+}

+ 14 - 14
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,7 +76,7 @@ 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", "");
+                     furi_string_trim(line);
                      if (furi_string_empty(tmp_str)) {
                         furi_string_cat_printf(tmp_str, "%s", furi_string_get_cstr(line));
                      } else {
@@ -99,7 +99,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);
 

+ 18 - 18
scenes/nfc_playlist_scene_playlist_edit.c

@@ -1,12 +1,12 @@
 #include "../nfc_playlist.h"
 
 typedef enum {
-   NfcPlaylistMenuSelection_CreatePlaylist,
-   NfcPlaylistMenuSelection_DeletePlaylist,
-   NfcPlaylistMenuSelection_RenamePlaylist,
-   NfcPlaylistMenuSelection_AddNfcItem,
-   NfcPlaylistMenuSelection_RemoveNfcItem,
-   NfcPlaylistMenuSelection_ViewPlaylistContent
+   NfcPlaylistFileEdit_CreatePlaylist,
+   NfcPlaylistFileEdit_DeletePlaylist,
+   NfcPlaylistFileEdit_RenamePlaylist,
+   NfcPlaylistFileEdit_AddNfcItem,
+   NfcPlaylistFileEdit_RemoveNfcItem,
+   NfcPlaylistFileEdit_ViewPlaylistContent
 } NfcPlaylistFileEditMenuSelection;
 
 void nfc_playlist_playlist_edit_menu_callback(void* context, uint32_t index) {
@@ -24,14 +24,14 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_item(
       nfc_playlist->submenu,
       "Create Playlist",
-      NfcPlaylistMenuSelection_CreatePlaylist,
+      NfcPlaylistFileEdit_CreatePlaylist,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist);
 
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       "Delete Playlist",
-      NfcPlaylistMenuSelection_DeletePlaylist,
+      NfcPlaylistFileEdit_DeletePlaylist,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist,
       playlist_path_empty,
@@ -40,7 +40,7 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       "Rename Playlist",
-      NfcPlaylistMenuSelection_RenamePlaylist,
+      NfcPlaylistFileEdit_RenamePlaylist,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist,
       playlist_path_empty,
@@ -49,7 +49,7 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       "Add NFC Item",
-      NfcPlaylistMenuSelection_AddNfcItem,
+      NfcPlaylistFileEdit_AddNfcItem,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist,
       playlist_path_empty,
@@ -58,7 +58,7 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       "Remove NFC Item",
-      NfcPlaylistMenuSelection_RemoveNfcItem,
+      NfcPlaylistFileEdit_RemoveNfcItem,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist,
       playlist_path_empty,
@@ -67,7 +67,7 @@ void nfc_playlist_playlist_edit_scene_on_enter(void* context) {
    submenu_add_lockable_item(
       nfc_playlist->submenu,
       "View Playlist Content",
-      NfcPlaylistMenuSelection_ViewPlaylistContent,
+      NfcPlaylistFileEdit_ViewPlaylistContent,
       nfc_playlist_playlist_edit_menu_callback,
       nfc_playlist,
       playlist_path_empty,
@@ -81,27 +81,27 @@ 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 NfcPlaylistFileEdit_CreatePlaylist:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NameNewPlaylist);
             consumed = true;
             break;
-         case NfcPlaylistMenuSelection_DeletePlaylist:
+         case NfcPlaylistFileEdit_DeletePlaylist:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_ConfirmDelete);
             consumed = true;
             break;
-         case NfcPlaylistMenuSelection_RenamePlaylist:
+         case NfcPlaylistFileEdit_RenamePlaylist:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_PlaylistRename);
             consumed = true;
             break;
-         case NfcPlaylistMenuSelection_AddNfcItem:
+         case NfcPlaylistFileEdit_AddNfcItem:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcAdd);
             consumed = true;
             break;
-         case NfcPlaylistMenuSelection_RemoveNfcItem:
+         case NfcPlaylistFileEdit_RemoveNfcItem:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_NfcRemove);
             consumed = true;
             break;
-         case NfcPlaylistMenuSelection_ViewPlaylistContent:
+         case NfcPlaylistFileEdit_ViewPlaylistContent:
             scene_manager_next_scene(nfc_playlist->scene_manager, NfcPlaylistScene_ViewPlaylistContent);
             consumed = true;
             break;