input_event.c 4.8 KB

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