desktop_main.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "gui/canvas.h"
  2. #include "input/input.h"
  3. #include <furi.h>
  4. #include "../desktop_i.h"
  5. #include "desktop_main.h"
  6. void desktop_main_set_callback(
  7. DesktopMainView* main_view,
  8. DesktopMainViewCallback callback,
  9. void* context) {
  10. furi_assert(main_view);
  11. furi_assert(callback);
  12. main_view->callback = callback;
  13. main_view->context = context;
  14. }
  15. void desktop_main_reset_hint(DesktopMainView* main_view) {
  16. with_view_model(
  17. main_view->view, (DesktopMainViewModel * model) {
  18. model->hint_expire_at = 0;
  19. return true;
  20. });
  21. }
  22. void desktop_main_switch_dolphin_animation(DesktopMainView* main_view, const Icon* icon) {
  23. with_view_model(
  24. main_view->view, (DesktopMainViewModel * model) {
  25. if(model->animation) icon_animation_free(model->animation);
  26. model->animation = icon_animation_alloc(icon);
  27. view_tie_icon_animation(main_view->view, model->animation);
  28. icon_animation_start(model->animation);
  29. model->icon = NULL;
  30. return true;
  31. });
  32. }
  33. void desktop_main_switch_dolphin_icon(DesktopMainView* main_view, const Icon* icon) {
  34. with_view_model(
  35. main_view->view, (DesktopMainViewModel * model) {
  36. if(model->animation) icon_animation_free(model->animation);
  37. model->animation = NULL;
  38. model->icon = icon;
  39. return true;
  40. });
  41. }
  42. void desktop_main_render(Canvas* canvas, void* model) {
  43. canvas_clear(canvas);
  44. DesktopMainViewModel* m = model;
  45. uint32_t now = osKernelGetTickCount();
  46. if(m->icon) {
  47. canvas_draw_icon(canvas, 0, 0, m->icon);
  48. } else if(m->animation) {
  49. canvas_draw_icon_animation(canvas, 0, 0, m->animation);
  50. }
  51. if(now < m->hint_expire_at) {
  52. canvas_set_font(canvas, FontPrimary);
  53. elements_multiline_text_framed(canvas, 42, 30, "Unlocked");
  54. }
  55. }
  56. View* desktop_main_get_view(DesktopMainView* main_view) {
  57. furi_assert(main_view);
  58. return main_view->view;
  59. }
  60. bool desktop_main_input(InputEvent* event, void* context) {
  61. furi_assert(event);
  62. furi_assert(context);
  63. DesktopMainView* main_view = context;
  64. if(event->key == InputKeyOk && event->type == InputTypeShort) {
  65. main_view->callback(DesktopMainEventOpenMenu, main_view->context);
  66. } else if(event->key == InputKeyDown && event->type == InputTypeLong) {
  67. main_view->callback(DesktopMainEventOpenDebug, main_view->context);
  68. } else if(event->key == InputKeyUp && event->type == InputTypeShort) {
  69. main_view->callback(DesktopMainEventOpenLockMenu, main_view->context);
  70. } else if(event->key == InputKeyDown && event->type == InputTypeShort) {
  71. main_view->callback(DesktopMainEventOpenArchive, main_view->context);
  72. } else if(event->key == InputKeyLeft && event->type == InputTypeShort) {
  73. main_view->callback(DesktopMainEventOpenFavorite, main_view->context);
  74. } else if(event->key == InputKeyRight && event->type == InputTypeShort) {
  75. main_view->callback(DesktopMainEventRightShort, main_view->context);
  76. }
  77. desktop_main_reset_hint(main_view);
  78. return true;
  79. }
  80. void desktop_main_enter(void* context) {
  81. DesktopMainView* main_view = context;
  82. with_view_model(
  83. main_view->view, (DesktopMainViewModel * model) {
  84. if(model->animation) icon_animation_start(model->animation);
  85. return false;
  86. });
  87. }
  88. void desktop_main_exit(void* context) {
  89. DesktopMainView* main_view = context;
  90. with_view_model(
  91. main_view->view, (DesktopMainViewModel * model) {
  92. if(model->animation) icon_animation_stop(model->animation);
  93. return false;
  94. });
  95. }
  96. DesktopMainView* desktop_main_alloc() {
  97. DesktopMainView* main_view = furi_alloc(sizeof(DesktopMainView));
  98. main_view->view = view_alloc();
  99. view_allocate_model(main_view->view, ViewModelTypeLocking, sizeof(DesktopMainViewModel));
  100. view_set_context(main_view->view, main_view);
  101. view_set_draw_callback(main_view->view, (ViewDrawCallback)desktop_main_render);
  102. view_set_input_callback(main_view->view, desktop_main_input);
  103. view_set_enter_callback(main_view->view, desktop_main_enter);
  104. view_set_exit_callback(main_view->view, desktop_main_exit);
  105. return main_view;
  106. }
  107. void desktop_main_free(DesktopMainView* main_view) {
  108. furi_assert(main_view);
  109. view_free(main_view->view);
  110. free(main_view);
  111. }
  112. void desktop_main_unlocked(DesktopMainView* main_view) {
  113. with_view_model(
  114. main_view->view, (DesktopMainViewModel * model) {
  115. model->hint_expire_at = osKernelGetTickCount() + osKernelGetTickFreq();
  116. return true;
  117. });
  118. }