desktop_view_lock_menu.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include <furi.h>
  2. #include <gui/elements.h>
  3. #include "../desktop_i.h"
  4. #include "desktop_view_lock_menu.h"
  5. #define LOCK_MENU_ITEMS_NB 3
  6. void desktop_lock_menu_set_callback(
  7. DesktopLockMenuView* lock_menu,
  8. DesktopLockMenuViewCallback callback,
  9. void* context) {
  10. furi_assert(lock_menu);
  11. furi_assert(callback);
  12. lock_menu->callback = callback;
  13. lock_menu->context = context;
  14. }
  15. void desktop_lock_menu_pin_set(DesktopLockMenuView* lock_menu, bool pin_is_set) {
  16. with_view_model(
  17. lock_menu->view, (DesktopLockMenuViewModel * model) {
  18. model->pin_set = pin_is_set;
  19. return true;
  20. });
  21. }
  22. void desktop_lock_menu_set_idx(DesktopLockMenuView* lock_menu, uint8_t idx) {
  23. furi_assert(idx < LOCK_MENU_ITEMS_NB);
  24. with_view_model(
  25. lock_menu->view, (DesktopLockMenuViewModel * model) {
  26. model->idx = idx;
  27. return true;
  28. });
  29. }
  30. static void lock_menu_callback(void* context, uint8_t index) {
  31. furi_assert(context);
  32. DesktopLockMenuView* lock_menu = context;
  33. switch(index) {
  34. case 0: // lock
  35. lock_menu->callback(DesktopLockMenuEventLock, lock_menu->context);
  36. break;
  37. case 1: // lock
  38. lock_menu->callback(DesktopLockMenuEventPinLock, lock_menu->context);
  39. break;
  40. default: // wip message
  41. with_view_model(
  42. lock_menu->view, (DesktopLockMenuViewModel * model) {
  43. model->hint_timeout = HINT_TIMEOUT;
  44. return true;
  45. });
  46. break;
  47. }
  48. }
  49. void desktop_lock_menu_render(Canvas* canvas, void* model) {
  50. const char* Lockmenu_Items[LOCK_MENU_ITEMS_NB] = {"Lock", "Lock with PIN", "DUMB mode"};
  51. DesktopLockMenuViewModel* m = model;
  52. canvas_clear(canvas);
  53. canvas_set_color(canvas, ColorBlack);
  54. canvas_draw_icon(canvas, -57, 0 + STATUS_BAR_Y_SHIFT, &I_DoorLeft_70x55);
  55. canvas_draw_icon(canvas, 116, 0 + STATUS_BAR_Y_SHIFT, &I_DoorRight_70x55);
  56. canvas_set_font(canvas, FontSecondary);
  57. for(uint8_t i = 0; i < LOCK_MENU_ITEMS_NB; ++i) {
  58. const char* str = Lockmenu_Items[i];
  59. if(i == 1 && !m->pin_set) str = "Set PIN";
  60. if(m->hint_timeout && m->idx == 2 && m->idx == i) str = "Not implemented";
  61. if(str != NULL)
  62. canvas_draw_str_aligned(
  63. canvas, 64, 9 + (i * 17) + STATUS_BAR_Y_SHIFT, AlignCenter, AlignCenter, str);
  64. if(m->idx == i) elements_frame(canvas, 15, 1 + (i * 17) + STATUS_BAR_Y_SHIFT, 98, 15);
  65. }
  66. }
  67. View* desktop_lock_menu_get_view(DesktopLockMenuView* lock_menu) {
  68. furi_assert(lock_menu);
  69. return lock_menu->view;
  70. }
  71. bool desktop_lock_menu_input(InputEvent* event, void* context) {
  72. furi_assert(event);
  73. furi_assert(context);
  74. DesktopLockMenuView* lock_menu = context;
  75. uint8_t idx;
  76. if(event->type != InputTypeShort) return false;
  77. with_view_model(
  78. lock_menu->view, (DesktopLockMenuViewModel * model) {
  79. model->hint_timeout = 0; // clear hint timeout
  80. if(event->key == InputKeyUp) {
  81. model->idx = CLAMP(model->idx - 1, LOCK_MENU_ITEMS_NB - 1, 0);
  82. } else if(event->key == InputKeyDown) {
  83. model->idx = CLAMP(model->idx + 1, LOCK_MENU_ITEMS_NB - 1, 0);
  84. }
  85. idx = model->idx;
  86. return true;
  87. });
  88. if(event->key == InputKeyBack) {
  89. lock_menu->callback(DesktopLockMenuEventExit, lock_menu->context);
  90. } else if(event->key == InputKeyOk) {
  91. lock_menu_callback(lock_menu, idx);
  92. }
  93. return true;
  94. }
  95. DesktopLockMenuView* desktop_lock_menu_alloc() {
  96. DesktopLockMenuView* lock_menu = malloc(sizeof(DesktopLockMenuView));
  97. lock_menu->view = view_alloc();
  98. view_allocate_model(lock_menu->view, ViewModelTypeLocking, sizeof(DesktopLockMenuViewModel));
  99. view_set_context(lock_menu->view, lock_menu);
  100. view_set_draw_callback(lock_menu->view, (ViewDrawCallback)desktop_lock_menu_render);
  101. view_set_input_callback(lock_menu->view, desktop_lock_menu_input);
  102. return lock_menu;
  103. }
  104. void desktop_lock_menu_free(DesktopLockMenuView* lock_menu_view) {
  105. furi_assert(lock_menu_view);
  106. view_free(lock_menu_view->view);
  107. free(lock_menu_view);
  108. }