input_event.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. #include "input_event.h"
  2. #include "diskop.h"
  3. void overwrite_file_widget_yes_input_callback(GuiButtonType result, InputType type, void* ctx)
  4. {
  5. UNUSED(result);
  6. FlizzerTrackerApp* tracker = (FlizzerTrackerApp*)ctx;
  7. if(type == InputTypeShort)
  8. {
  9. tracker->is_saving = true;
  10. view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_TRACKER);
  11. //save_song(tracker, tracker->filepath);
  12. static FlizzerTrackerEvent event = {.type = EventTypeSaveSong, .input = {0}, .period = 0};
  13. furi_message_queue_put(tracker->event_queue, &event, FuriWaitForever);
  14. }
  15. }
  16. void overwrite_file_widget_no_input_callback(GuiButtonType result, InputType type, void* ctx)
  17. {
  18. UNUSED(result);
  19. FlizzerTrackerApp* tracker = (FlizzerTrackerApp*)ctx;
  20. if(type == InputTypeShort)
  21. {
  22. tracker->is_saving = false;
  23. furi_string_free(tracker->filepath);
  24. view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_TRACKER);
  25. }
  26. }
  27. void submenu_callback(void *context, uint32_t index)
  28. {
  29. FlizzerTrackerApp *tracker = (FlizzerTrackerApp *)context;
  30. switch (tracker->mode)
  31. {
  32. case PATTERN_VIEW:
  33. {
  34. switch (index)
  35. {
  36. case SUBMENU_PATTERN_RETURN:
  37. {
  38. view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_TRACKER);
  39. break;
  40. }
  41. case SUBMENU_PATTERN_EXIT:
  42. {
  43. tracker->quit = true;
  44. static InputEvent inevent = {.sequence = 0, .key = InputKeyLeft, .type = InputTypeMAX};
  45. FlizzerTrackerEvent event = {.type = EventTypeInput, .input = inevent, .period = 0}; // making an event so tracker does not wait for next keypress and exits immediately
  46. furi_message_queue_put(tracker->event_queue, &event, FuriWaitForever);
  47. view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_TRACKER);
  48. break;
  49. }
  50. case SUBMENU_PATTERN_SAVE_SONG:
  51. {
  52. text_input_set_header_text(tracker->text_input, "Song filename:");
  53. memset(&tracker->filename, 0, FILE_NAME_LEN);
  54. text_input_set_result_callback(tracker->text_input, return_from_keyboard_callback, tracker, (char *)&tracker->filename, FILE_NAME_LEN, true);
  55. tracker->is_saving = true;
  56. view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_KEYBOARD);
  57. }
  58. default:
  59. break;
  60. }
  61. break;
  62. }
  63. case INST_EDITOR_VIEW:
  64. {
  65. switch (index)
  66. {
  67. case SUBMENU_INSTRUMENT_RETURN:
  68. {
  69. view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_TRACKER);
  70. break;
  71. }
  72. case SUBMENU_INSTRUMENT_EXIT:
  73. {
  74. tracker->quit = true;
  75. static InputEvent inevent = {.sequence = 0, .key = InputKeyLeft, .type = InputTypeMAX};
  76. FlizzerTrackerEvent event = {.type = EventTypeInput, .input = inevent, .period = 0}; // making an event so tracker does not wait for next keypress and exits immediately
  77. furi_message_queue_put(tracker->event_queue, &event, FuriWaitForever);
  78. view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_TRACKER);
  79. break;
  80. }
  81. default:
  82. break;
  83. }
  84. break;
  85. }
  86. default:
  87. break;
  88. }
  89. }
  90. void cycle_focus(FlizzerTrackerApp *tracker)
  91. {
  92. switch (tracker->mode)
  93. {
  94. case PATTERN_VIEW:
  95. {
  96. tracker->focus++;
  97. if (tracker->focus > EDIT_SONGINFO)
  98. {
  99. tracker->focus = EDIT_PATTERN;
  100. }
  101. break;
  102. }
  103. case INST_EDITOR_VIEW:
  104. {
  105. tracker->focus++;
  106. if (tracker->focus > EDIT_PROGRAM)
  107. {
  108. tracker->focus = EDIT_INSTRUMENT;
  109. }
  110. break;
  111. }
  112. default:
  113. break;
  114. }
  115. }
  116. void cycle_view(FlizzerTrackerApp *tracker)
  117. {
  118. if (tracker->mode == PATTERN_VIEW)
  119. {
  120. tracker->mode = INST_EDITOR_VIEW;
  121. tracker->focus = EDIT_INSTRUMENT;
  122. tracker->selected_param = 0;
  123. tracker->current_digit = 0;
  124. return;
  125. }
  126. if (tracker->mode == INST_EDITOR_VIEW)
  127. {
  128. tracker->mode = PATTERN_VIEW;
  129. tracker->focus = EDIT_PATTERN;
  130. if (tracker->tracker_engine.song == NULL)
  131. {
  132. stop_song(tracker);
  133. tracker_engine_set_song(&tracker->tracker_engine, &tracker->song);
  134. }
  135. tracker->selected_param = 0;
  136. tracker->current_digit = 0;
  137. return;
  138. }
  139. }
  140. void process_input_event(FlizzerTrackerApp *tracker, FlizzerTrackerEvent *event)
  141. {
  142. if (event->input.key == InputKeyBack && event->input.type == InputTypeShort && event->period > 0 && event->period < 300 && !(tracker->editing))
  143. {
  144. cycle_view(tracker);
  145. return;
  146. }
  147. else if (event->input.key == InputKeyBack && event->input.type == InputTypeShort && !(tracker->editing))
  148. {
  149. cycle_focus(tracker);
  150. return;
  151. }
  152. // Если нажата кнопка "назад", то выходим из цикла, а следовательно и из приложения
  153. if (event->input.key == InputKeyBack && event->input.type == InputTypeLong)
  154. {
  155. switch (tracker->mode)
  156. {
  157. case PATTERN_VIEW:
  158. {
  159. submenu_set_selected_item(tracker->pattern_submenu, SUBMENU_PATTERN_RETURN);
  160. view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_SUBMENU_PATTERN);
  161. break;
  162. }
  163. case INST_EDITOR_VIEW:
  164. {
  165. submenu_set_selected_item(tracker->instrument_submenu, SUBMENU_INSTRUMENT_RETURN);
  166. view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_SUBMENU_INSTRUMENT);
  167. break;
  168. }
  169. default:
  170. break;
  171. }
  172. return;
  173. }
  174. switch (tracker->focus)
  175. {
  176. case EDIT_PATTERN:
  177. {
  178. pattern_edit_event(tracker, event);
  179. break;
  180. }
  181. case EDIT_SEQUENCE:
  182. {
  183. sequence_edit_event(tracker, event);
  184. break;
  185. }
  186. case EDIT_SONGINFO:
  187. {
  188. songinfo_edit_event(tracker, event);
  189. break;
  190. }
  191. case EDIT_INSTRUMENT:
  192. {
  193. instrument_edit_event(tracker, event);
  194. break;
  195. }
  196. case EDIT_PROGRAM:
  197. {
  198. instrument_program_edit_event(tracker, event);
  199. break;
  200. }
  201. default:
  202. break;
  203. }
  204. }