input_event.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  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. break;
  58. }
  59. case SUBMENU_PATTERN_LOAD_SONG:
  60. {
  61. FlizzerTrackerEvent event = {.type = EventTypeLoadSong, .input = {0}, .period = 0};
  62. furi_message_queue_put(tracker->event_queue, &event, FuriWaitForever);
  63. view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_TRACKER);
  64. break;
  65. }
  66. default:
  67. break;
  68. }
  69. break;
  70. }
  71. case INST_EDITOR_VIEW:
  72. {
  73. switch (index)
  74. {
  75. case SUBMENU_INSTRUMENT_RETURN:
  76. {
  77. view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_TRACKER);
  78. break;
  79. }
  80. case SUBMENU_INSTRUMENT_EXIT:
  81. {
  82. tracker->quit = true;
  83. static InputEvent inevent = {.sequence = 0, .key = InputKeyLeft, .type = InputTypeMAX};
  84. FlizzerTrackerEvent event = {.type = EventTypeInput, .input = inevent, .period = 0}; // making an event so tracker does not wait for next keypress and exits immediately
  85. furi_message_queue_put(tracker->event_queue, &event, FuriWaitForever);
  86. view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_TRACKER);
  87. break;
  88. }
  89. default:
  90. break;
  91. }
  92. break;
  93. }
  94. default:
  95. break;
  96. }
  97. }
  98. void cycle_focus(FlizzerTrackerApp *tracker)
  99. {
  100. switch (tracker->mode)
  101. {
  102. case PATTERN_VIEW:
  103. {
  104. tracker->focus++;
  105. if (tracker->focus > EDIT_SONGINFO)
  106. {
  107. tracker->focus = EDIT_PATTERN;
  108. }
  109. break;
  110. }
  111. case INST_EDITOR_VIEW:
  112. {
  113. tracker->focus++;
  114. if (tracker->focus > EDIT_PROGRAM)
  115. {
  116. tracker->focus = EDIT_INSTRUMENT;
  117. }
  118. break;
  119. }
  120. default:
  121. break;
  122. }
  123. }
  124. void cycle_view(FlizzerTrackerApp *tracker)
  125. {
  126. if (tracker->mode == PATTERN_VIEW)
  127. {
  128. tracker->mode = INST_EDITOR_VIEW;
  129. tracker->focus = EDIT_INSTRUMENT;
  130. tracker->selected_param = 0;
  131. tracker->current_digit = 0;
  132. return;
  133. }
  134. if (tracker->mode == INST_EDITOR_VIEW)
  135. {
  136. tracker->mode = PATTERN_VIEW;
  137. tracker->focus = EDIT_PATTERN;
  138. if (tracker->tracker_engine.song == NULL)
  139. {
  140. stop_song(tracker);
  141. tracker_engine_set_song(&tracker->tracker_engine, &tracker->song);
  142. }
  143. tracker->selected_param = 0;
  144. tracker->current_digit = 0;
  145. return;
  146. }
  147. }
  148. void process_input_event(FlizzerTrackerApp *tracker, FlizzerTrackerEvent *event)
  149. {
  150. if (event->input.key == InputKeyBack && event->input.type == InputTypeShort && event->period > 0 && event->period < 300 && !(tracker->editing))
  151. {
  152. cycle_view(tracker);
  153. return;
  154. }
  155. else if (event->input.key == InputKeyBack && event->input.type == InputTypeShort && !(tracker->editing))
  156. {
  157. cycle_focus(tracker);
  158. return;
  159. }
  160. // Если нажата кнопка "назад", то выходим из цикла, а следовательно и из приложения
  161. if (event->input.key == InputKeyBack && event->input.type == InputTypeLong)
  162. {
  163. switch (tracker->mode)
  164. {
  165. case PATTERN_VIEW:
  166. {
  167. submenu_set_selected_item(tracker->pattern_submenu, SUBMENU_PATTERN_RETURN);
  168. view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_SUBMENU_PATTERN);
  169. break;
  170. }
  171. case INST_EDITOR_VIEW:
  172. {
  173. submenu_set_selected_item(tracker->instrument_submenu, SUBMENU_INSTRUMENT_RETURN);
  174. view_dispatcher_switch_to_view(tracker->view_dispatcher, VIEW_SUBMENU_INSTRUMENT);
  175. break;
  176. }
  177. default:
  178. break;
  179. }
  180. return;
  181. }
  182. switch (tracker->focus)
  183. {
  184. case EDIT_PATTERN:
  185. {
  186. pattern_edit_event(tracker, event);
  187. break;
  188. }
  189. case EDIT_SEQUENCE:
  190. {
  191. sequence_edit_event(tracker, event);
  192. break;
  193. }
  194. case EDIT_SONGINFO:
  195. {
  196. songinfo_edit_event(tracker, event);
  197. break;
  198. }
  199. case EDIT_INSTRUMENT:
  200. {
  201. instrument_edit_event(tracker, event);
  202. break;
  203. }
  204. case EDIT_PROGRAM:
  205. {
  206. instrument_program_edit_event(tracker, event);
  207. break;
  208. }
  209. default:
  210. break;
  211. }
  212. }