xremote_player_view.c 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*!
  2. * @file flipper-xremote/views/xremote_player_view.c
  3. @license This project is released under the GNU GPLv3 License
  4. * @copyright (c) 2023 Sandro Kalatozishvili (s.kalatoz@gmail.com)
  5. *
  6. * @brief Playback page view callbacks and infrared functionality.
  7. */
  8. #include "xremote_player_view.h"
  9. static void xremote_player_view_draw_callback(Canvas* canvas, void* context)
  10. {
  11. furi_assert(context);
  12. XRemoteViewModel* model = context;
  13. xremote_canvas_draw_header(canvas, "Playback");
  14. xremote_canvas_draw_button(canvas, model->up_pressed, 23, 30, XRemoteIconJumpForward);
  15. xremote_canvas_draw_button(canvas, model->down_pressed, 23, 72, XRemoteIconJumpBackward);
  16. xremote_canvas_draw_button(canvas, model->ok_pressed, 23, 51, XRemoteIconPlayPause);
  17. xremote_canvas_draw_button(canvas, model->left_pressed, 2, 51, XRemoteIconFastBackward);
  18. xremote_canvas_draw_button(canvas, model->right_pressed, 44, 51, XRemoteIconFastForward);
  19. xremote_canvas_draw_button(canvas, model->back_pressed, 2, 95, XRemoteIconStop);
  20. xremote_canvas_draw_exit_footer(canvas, "Hold to exit");
  21. }
  22. static void xremote_player_view_process(XRemoteView* view, InputEvent* event)
  23. {
  24. with_view_model(
  25. xremote_view_get_view(view),
  26. XRemoteViewModel* model,
  27. {
  28. if (event->type == InputTypePress)
  29. {
  30. if (event->key == InputKeyUp)
  31. {
  32. model->up_pressed = true;
  33. xremote_view_send_ir(view, XREMOTE_COMMAND_JUMP_FORWARD);
  34. }
  35. else if (event->key == InputKeyDown)
  36. {
  37. model->down_pressed = true;
  38. xremote_view_send_ir(view, XREMOTE_COMMAND_JUMP_BACKWARD);
  39. }
  40. else if (event->key == InputKeyLeft)
  41. {
  42. model->left_pressed = true;
  43. xremote_view_send_ir(view, XREMOTE_COMMAND_FAST_BACKWARD);
  44. }
  45. else if (event->key == InputKeyRight)
  46. {
  47. model->right_pressed = true;
  48. xremote_view_send_ir(view, XREMOTE_COMMAND_FAST_FORWARD);
  49. }
  50. else if (event->key == InputKeyOk)
  51. {
  52. model->ok_pressed = true;
  53. xremote_view_send_ir(view, XREMOTE_COMMAND_PLAY_PAUSE);
  54. }
  55. else if (event->key == InputKeyBack)
  56. {
  57. model->back_pressed = true;
  58. xremote_view_send_ir(view, XREMOTE_COMMAND_STOP);
  59. }
  60. }
  61. else if (event->type == InputTypeRelease)
  62. {
  63. if (event->key == InputKeyUp) model->up_pressed = false;
  64. else if (event->key == InputKeyDown) model->down_pressed = false;
  65. else if (event->key == InputKeyLeft) model->left_pressed = false;
  66. else if (event->key == InputKeyRight) model->right_pressed = false;
  67. else if (event->key == InputKeyOk) model->ok_pressed = false;
  68. else if (event->key == InputKeyBack) model->back_pressed = false;
  69. }
  70. },
  71. true);
  72. }
  73. static bool xremote_player_view_input_callback(InputEvent* event, void* context)
  74. {
  75. furi_assert(context);
  76. XRemoteView* view = (XRemoteView*)context;
  77. if (event->type == InputTypeLong &&
  78. event->key == InputKeyBack) return false;
  79. xremote_player_view_process(view, event);
  80. return true;
  81. }
  82. XRemoteView* xremote_player_view_alloc(NotificationApp* notifications)
  83. {
  84. return xremote_view_alloc(notifications,
  85. xremote_player_view_input_callback,
  86. xremote_player_view_draw_callback);
  87. }