xremote_navigation_view.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*!
  2. * @file flipper-xremote/views/xremote_navigation_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 Navigation page view callbacks and infrared functionality.
  7. */
  8. #include "xremote_navigation_view.h"
  9. #include "../xremote_app.h"
  10. static void xremote_navigation_view_draw_callback(Canvas* canvas, void* context)
  11. {
  12. furi_assert(context);
  13. XRemoteViewModel* model = context;
  14. XRemoteAppContext *app_ctx = model->context;
  15. xremote_canvas_draw_header(canvas, "Navigation");
  16. xremote_canvas_draw_button(canvas, model->up_pressed, 23, 30, XRemoteIconArrowUp);
  17. xremote_canvas_draw_button(canvas, model->down_pressed, 23, 72, XRemoteIconArrowDown);
  18. xremote_canvas_draw_button(canvas, model->left_pressed, 2, 51, XRemoteIconArrowLeft);
  19. xremote_canvas_draw_button(canvas, model->right_pressed, 44, 51, XRemoteIconArrowRight);
  20. xremote_canvas_draw_button(canvas, model->ok_pressed, 23, 51, XRemoteIconOk);
  21. xremote_canvas_draw_button(canvas, model->back_pressed, 2, 95, XRemoteIconBack);
  22. if (app_ctx->app_settings->exit_behavior == XRemoteAppExitPress)
  23. canvas_draw_icon(canvas, 22, 107, &I_Hold_Text_17x4);
  24. xremote_canvas_draw_exit_footer(canvas, xremote_app_context_get_exit_str(app_ctx));
  25. }
  26. static void xremote_navigation_view_process(XRemoteView* view, InputEvent* event)
  27. {
  28. with_view_model(
  29. xremote_view_get_view(view),
  30. XRemoteViewModel* model,
  31. {
  32. XRemoteAppContext* app_ctx = xremote_view_get_app_context(view);
  33. XRemoteAppExit exit = app_ctx->app_settings->exit_behavior;
  34. model->context = app_ctx;
  35. if (event->type == InputTypePress)
  36. {
  37. if (event->key == InputKeyUp)
  38. {
  39. model->up_pressed = true;
  40. xremote_view_send_ir(view, XREMOTE_COMMAND_UP);
  41. }
  42. else if (event->key == InputKeyDown)
  43. {
  44. model->down_pressed = true;
  45. xremote_view_send_ir(view, XREMOTE_COMMAND_DOWN);
  46. }
  47. else if (event->key == InputKeyLeft)
  48. {
  49. model->left_pressed = true;
  50. xremote_view_send_ir(view, XREMOTE_COMMAND_LEFT);
  51. }
  52. else if (event->key == InputKeyRight)
  53. {
  54. model->right_pressed = true;
  55. xremote_view_send_ir(view, XREMOTE_COMMAND_RIGHT);
  56. }
  57. else if (event->key == InputKeyOk)
  58. {
  59. model->ok_pressed = true;
  60. xremote_view_send_ir(view, XREMOTE_COMMAND_OK);
  61. }
  62. }
  63. else if (event->type == InputTypeShort &&
  64. event->key == InputKeyBack &&
  65. exit == XRemoteAppExitHold)
  66. {
  67. model->back_pressed = true;
  68. xremote_view_send_ir(view, XREMOTE_COMMAND_BACK);
  69. }
  70. else if (event->type == InputTypeLong)
  71. {
  72. if (event->key == InputKeyBack && exit == XRemoteAppExitPress)
  73. {
  74. model->back_pressed = true;
  75. xremote_view_send_ir(view, XREMOTE_COMMAND_BACK);
  76. }
  77. }
  78. else if (event->type == InputTypeRelease)
  79. {
  80. if (event->key == InputKeyUp) model->up_pressed = false;
  81. else if (event->key == InputKeyDown) model->down_pressed = false;
  82. else if (event->key == InputKeyLeft) model->left_pressed = false;
  83. else if (event->key == InputKeyRight) model->right_pressed = false;
  84. else if (event->key == InputKeyOk) model->ok_pressed = false;
  85. else if (event->key == InputKeyBack) model->back_pressed = false;
  86. }
  87. },
  88. true);
  89. }
  90. static bool xremote_navigation_view_input_callback(InputEvent* event, void* context)
  91. {
  92. furi_assert(context);
  93. XRemoteView* view = (XRemoteView*)context;
  94. XRemoteAppContext* app_ctx = xremote_view_get_app_context(view);
  95. XRemoteAppExit exit = app_ctx->app_settings->exit_behavior;
  96. if (event->key == InputKeyBack &&
  97. event->type == InputTypeShort &&
  98. exit == XRemoteAppExitPress) return false;
  99. else if (event->key == InputKeyBack &&
  100. event->type == InputTypeLong &&
  101. exit == XRemoteAppExitHold) return false;
  102. xremote_navigation_view_process(view, event);
  103. return true;
  104. }
  105. XRemoteView* xremote_navigation_view_alloc(void* app_ctx)
  106. {
  107. XRemoteView *view = xremote_view_alloc(app_ctx,
  108. xremote_navigation_view_input_callback,
  109. xremote_navigation_view_draw_callback);
  110. with_view_model(
  111. xremote_view_get_view(view),
  112. XRemoteViewModel* model,
  113. {
  114. model->context = xremote_view_get_app_context(view);
  115. model->up_pressed = false;
  116. model->down_pressed = false;
  117. model->left_pressed = false;
  118. model->right_pressed = false;
  119. model->back_pressed = false;
  120. model->ok_pressed = false;
  121. }, true);
  122. return view;
  123. }