wifi_marauder_scene_script_edit_list.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #include "../wifi_marauder_app_i.h"
  2. static void wifi_marauder_scene_script_stage_edit_list_add_callback(void* context, uint32_t index) {
  3. WifiMarauderApp* app = context;
  4. // Creates new item
  5. WifiMarauderScriptStageListItem* new_item = (WifiMarauderScriptStageListItem*) malloc(sizeof(WifiMarauderScriptStageListItem));
  6. new_item->value = malloc(64);
  7. new_item->next_item = NULL;
  8. if (app->script_stage_edit_first_item == NULL) {
  9. app->script_stage_edit_first_item = new_item;
  10. } else {
  11. WifiMarauderScriptStageListItem* last_item = app->script_stage_edit_first_item;
  12. while (last_item->next_item != NULL) {
  13. last_item = last_item->next_item;
  14. }
  15. last_item->next_item = new_item;
  16. }
  17. scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptStageEditList, index);
  18. app->user_input_type = WifiMarauderUserInputTypeString;
  19. app->user_input_string_reference = &new_item->value;
  20. scene_manager_next_scene(app->scene_manager, WifiMarauderSceneUserInput);
  21. }
  22. static void wifi_marauder_scene_script_stage_edit_list_deallocate_items(WifiMarauderApp* app) {
  23. WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
  24. while (current_item != NULL) {
  25. WifiMarauderScriptStageListItem* next_item = current_item->next_item;
  26. free(current_item->value);
  27. free(current_item);
  28. current_item = next_item;
  29. }
  30. app->script_stage_edit_first_item = NULL;
  31. }
  32. static void wifi_marauder_scene_script_stage_edit_list_save_strings(WifiMarauderApp* app) {
  33. WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
  34. int array_size = 0;
  35. // Calculates the required array size
  36. while (current_item != NULL) {
  37. array_size++;
  38. current_item = current_item->next_item;
  39. }
  40. // Reallocate the array of strings if necessary
  41. if (*app->script_stage_edit_string_count_reference < array_size) {
  42. *app->script_stage_edit_strings_reference = realloc(*app->script_stage_edit_strings_reference, array_size * sizeof(char*));
  43. }
  44. // Fills the array of strings
  45. current_item = app->script_stage_edit_first_item;
  46. int i = 0;
  47. while (current_item != NULL) {
  48. char* current_str = malloc(strlen(current_item->value) + 1);
  49. strncpy(current_str, current_item->value, strlen(current_item->value) + 1);
  50. (*app->script_stage_edit_strings_reference)[i] = current_str;
  51. current_item = current_item->next_item;
  52. i++;
  53. }
  54. *app->script_stage_edit_string_count_reference = array_size;
  55. }
  56. static void wifi_marauder_scene_script_stage_edit_list_save_numbers(WifiMarauderApp* app) {
  57. WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
  58. int array_size = 0;
  59. // Calculates the required array size
  60. while (current_item != NULL) {
  61. array_size++;
  62. current_item = current_item->next_item;
  63. }
  64. // Reallocate the array of integers if necessary
  65. if (*app->script_stage_edit_number_count_reference < array_size) {
  66. *app->script_stage_edit_numbers_reference = realloc(*app->script_stage_edit_numbers_reference, array_size * sizeof(int));
  67. }
  68. // Fills the array of integers
  69. current_item = app->script_stage_edit_first_item;
  70. int i = 0;
  71. while (current_item != NULL) {
  72. (*app->script_stage_edit_numbers_reference)[i] = atoi(current_item->value);
  73. current_item = current_item->next_item;
  74. i++;
  75. }
  76. *app->script_stage_edit_number_count_reference = array_size;
  77. }
  78. static void wifi_marauder_scene_script_stage_edit_list_save_callback(void* context, uint32_t index) {
  79. UNUSED(index);
  80. WifiMarauderApp* app = context;
  81. if (app->script_stage_edit_strings_reference != NULL && app->script_stage_edit_string_count_reference != NULL) {
  82. wifi_marauder_scene_script_stage_edit_list_save_strings(app);
  83. }
  84. if (app->script_stage_edit_numbers_reference != NULL && app->script_stage_edit_number_count_reference != NULL) {
  85. wifi_marauder_scene_script_stage_edit_list_save_numbers(app);
  86. }
  87. wifi_marauder_scene_script_stage_edit_list_deallocate_items(app);
  88. scene_manager_previous_scene(app->scene_manager);
  89. }
  90. static void wifi_marauder_scene_script_stage_edit_list_clear_callback(void* context, uint32_t index) {
  91. UNUSED(index);
  92. WifiMarauderApp* app = context;
  93. wifi_marauder_scene_script_stage_edit_list_deallocate_items(app);
  94. submenu_reset(app->submenu);
  95. submenu_add_item(app->submenu, "[+] ADD ITEM", 99, wifi_marauder_scene_script_stage_edit_list_add_callback, app);
  96. submenu_add_item(app->submenu, "[*] SAVE ITEMS", 99, wifi_marauder_scene_script_stage_edit_list_save_callback, app);
  97. submenu_add_item(app->submenu, "[-] CLEAR LIST", 99, wifi_marauder_scene_script_stage_edit_list_clear_callback, app);
  98. }
  99. void wifi_marauder_scene_script_stage_edit_list_on_enter(void* context) {
  100. WifiMarauderApp* app = context;
  101. int item_index = 0;
  102. WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
  103. while (current_item != NULL) {
  104. submenu_add_item(app->submenu, current_item->value, item_index++, NULL, app);
  105. current_item = current_item->next_item;
  106. }
  107. submenu_add_item(app->submenu, "[+] ADD ITEM", 99, wifi_marauder_scene_script_stage_edit_list_add_callback, app);
  108. submenu_add_item(app->submenu, "[*] SAVE ITEMS", 99, wifi_marauder_scene_script_stage_edit_list_save_callback, app);
  109. submenu_add_item(app->submenu, "[-] CLEAR LIST", 99, wifi_marauder_scene_script_stage_edit_list_clear_callback, app);
  110. submenu_set_selected_item(app->submenu, scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptStageEditList));
  111. view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewSubmenu);
  112. }
  113. bool wifi_marauder_scene_script_stage_edit_list_on_event(void* context, SceneManagerEvent event) {
  114. UNUSED(context);
  115. UNUSED(event);
  116. return false;
  117. }
  118. void wifi_marauder_scene_script_stage_edit_list_on_exit(void* context) {
  119. WifiMarauderApp* app = context;
  120. submenu_reset(app->submenu);
  121. }