pokemon_number_input.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include <furi.h>
  2. #include <gui/modules/text_input.h>
  3. #include <gui/view_dispatcher.h>
  4. #include <stdlib.h>
  5. #include "../pokemon_app.h"
  6. #include "../pokemon_data.h"
  7. #include "pokemon_menu.h"
  8. static char number_buf[LEN_NUM_BUF];
  9. static bool select_number_input_validator(const char* text, FuriString* error, void* context) {
  10. PokemonFap* pokemon_fap = (PokemonFap*)context;
  11. uint32_t state = scene_manager_get_scene_state(pokemon_fap->scene_manager, SelectLevelScene);
  12. int number;
  13. char* error_str;
  14. int min;
  15. int max;
  16. DataStat stat;
  17. bool rc = true;
  18. unsigned int i;
  19. switch(state) {
  20. case SelectLevelScene:
  21. error_str = "Level must\nbe a number\nbetween\n2-100!";
  22. min = 2;
  23. max = 100;
  24. stat = STAT_LEVEL;
  25. break;
  26. case SelectOTIDScene:
  27. error_str = "OT ID must\nbe between\n0-65535!";
  28. min = 0;
  29. max = 65535;
  30. stat = STAT_OT_ID;
  31. break;
  32. default:
  33. return false;
  34. }
  35. /* Need to check each byte to ensure is not alpha. atoi returns 0 which is
  36. * technically a valid OTID, so we need to separately check for alpha chars.
  37. */
  38. for(i = 0; i < sizeof(text); i++) {
  39. if(!isdigit((unsigned int)text[i])) {
  40. if(text[i] == '\0') break;
  41. rc = false;
  42. break;
  43. }
  44. }
  45. number = atoi(text);
  46. if(number < min || number > max || rc == false) {
  47. furi_string_printf(error, error_str);
  48. rc = false;
  49. } else {
  50. pokemon_stat_set(pokemon_fap->pdata, stat, NONE, number);
  51. }
  52. return rc;
  53. }
  54. static void select_number_input_callback(void* context) {
  55. PokemonFap* pokemon_fap = (PokemonFap*)context;
  56. scene_manager_previous_scene(pokemon_fap->scene_manager);
  57. }
  58. void select_number_scene_on_enter(void* context) {
  59. PokemonFap* pokemon_fap = (PokemonFap*)context;
  60. char* header;
  61. uint32_t state = scene_manager_get_scene_state(pokemon_fap->scene_manager, SelectLevelScene);
  62. int len;
  63. DataStat stat;
  64. switch(state) {
  65. case SelectLevelScene:
  66. header = "Enter level (numbers only)";
  67. len = LEN_LEVEL;
  68. stat = STAT_LEVEL;
  69. break;
  70. case SelectOTIDScene:
  71. header = "Enter OT ID (numbers only)";
  72. len = LEN_OT_ID;
  73. stat = STAT_OT_ID;
  74. break;
  75. default:
  76. furi_crash("Num: invalid state");
  77. break;
  78. }
  79. snprintf(number_buf, len, "%d", pokemon_stat_get(pokemon_fap->pdata, stat, NONE));
  80. text_input_reset(pokemon_fap->text_input);
  81. text_input_set_validator(pokemon_fap->text_input, select_number_input_validator, pokemon_fap);
  82. text_input_set_result_callback(
  83. pokemon_fap->text_input, select_number_input_callback, pokemon_fap, number_buf, len, true);
  84. text_input_set_header_text(pokemon_fap->text_input, header);
  85. view_dispatcher_add_view(
  86. pokemon_fap->view_dispatcher, AppViewOpts, text_input_get_view(pokemon_fap->text_input));
  87. view_dispatcher_switch_to_view(pokemon_fap->view_dispatcher, AppViewOpts);
  88. }