xremote_pause_set.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "xremote_pause_set.h"
  2. struct XRemotePauseSet {
  3. View* view;
  4. XRemotePauseSetCallback callback;
  5. void* context;
  6. };
  7. typedef struct {
  8. int type;
  9. const char* name;
  10. int time;
  11. } XRemotePauseSetModel;
  12. static void xremote_pause_set_model_init(XRemotePauseSetModel* const model) {
  13. model->type = XRemoteRemoteItemTypePause;
  14. model->time = 1;
  15. }
  16. void xremote_pause_set_set_callback(
  17. XRemotePauseSet* instance,
  18. XRemotePauseSetCallback callback,
  19. void* context) {
  20. furi_assert(instance);
  21. furi_assert(callback);
  22. instance->callback = callback;
  23. instance->context = context;
  24. }
  25. void xremote_pause_set_draw(Canvas* canvas, XRemotePauseSetModel* model) {
  26. char seconds[14];
  27. snprintf(seconds, SECONDS_LENGHT, SECONDS_FORMAT, model->time);
  28. canvas_clear(canvas);
  29. canvas_set_color(canvas, ColorBlack);
  30. canvas_set_font(canvas, FontPrimary);
  31. canvas_draw_str_aligned(canvas, 64, 10, AlignCenter, AlignTop, "Pause duration");
  32. canvas_set_font(canvas, FontSecondary);
  33. canvas_draw_icon(canvas, 59, 22, &I_ButtonUp_10x5);
  34. canvas_draw_icon(canvas, 59, 42, &I_ButtonDown_10x5);
  35. canvas_draw_str_aligned(canvas, 64, 31, AlignCenter, AlignTop, seconds);
  36. elements_button_center(canvas, "Add");
  37. }
  38. bool xremote_pause_set_input(InputEvent* event, void* context) {
  39. furi_assert(context);
  40. XRemotePauseSet* instance = context;
  41. if(event->type == InputTypeRelease) {
  42. switch(event->key) {
  43. case InputKeyBack:
  44. instance->callback(XRemoteCustomEventPauseSetBack, instance->context);
  45. break;
  46. case InputKeyLeft:
  47. case InputKeyRight:
  48. break;
  49. case InputKeyUp:
  50. with_view_model(
  51. instance->view,
  52. XRemotePauseSetModel * model,
  53. {
  54. model->time++;
  55. if(model->time > 9) {
  56. model->time = 0;
  57. }
  58. },
  59. true);
  60. break;
  61. case InputKeyDown:
  62. with_view_model(
  63. instance->view,
  64. XRemotePauseSetModel * model,
  65. {
  66. model->time--;
  67. if(model->time < 0) {
  68. model->time = 9;
  69. }
  70. },
  71. true);
  72. break;
  73. case InputKeyOk:
  74. with_view_model(
  75. instance->view,
  76. XRemotePauseSetModel * model,
  77. {
  78. XRemote* app = instance->context;
  79. xremote_cross_remote_add_pause(app->cross_remote, model->time);
  80. },
  81. true);
  82. instance->callback(XRemoteCustomEventPauseSetOk, instance->context);
  83. break;
  84. case InputKeyMAX:
  85. break;
  86. }
  87. }
  88. return true;
  89. }
  90. XRemotePauseSet* xremote_pause_set_alloc() {
  91. XRemotePauseSet* instance = malloc(sizeof(XRemotePauseSet));
  92. instance->view = view_alloc();
  93. view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(XRemotePauseSetModel));
  94. view_set_context(instance->view, instance);
  95. view_set_draw_callback(instance->view, (ViewDrawCallback)xremote_pause_set_draw);
  96. view_set_enter_callback(instance->view, xremote_pause_set_enter);
  97. view_set_input_callback(instance->view, xremote_pause_set_input);
  98. with_view_model(
  99. instance->view,
  100. XRemotePauseSetModel * model,
  101. { xremote_pause_set_model_init(model); },
  102. true);
  103. return instance;
  104. }
  105. void xremote_pause_set_enter(void* context) {
  106. furi_assert(context);
  107. XRemotePauseSet* instance = (XRemotePauseSet*)context;
  108. with_view_model(
  109. instance->view,
  110. XRemotePauseSetModel * model,
  111. { xremote_pause_set_model_init(model); },
  112. true);
  113. }
  114. View* xremote_pause_set_get_view(XRemotePauseSet* instance) {
  115. furi_assert(instance);
  116. return instance->view;
  117. }
  118. void xremote_pause_set_free(XRemotePauseSet* instance) {
  119. furi_assert(instance);
  120. with_view_model(
  121. instance->view, XRemotePauseSetModel * model, { UNUSED(model); }, true);
  122. view_free(instance->view);
  123. free(instance);
  124. }