input_event.c 5.2 KB

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