desktop_view_slideshow.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include <furi.h>
  2. #include <furi_hal.h>
  3. #include <gui/elements.h>
  4. #include "../desktop_i.h"
  5. #include "desktop_view_slideshow.h"
  6. #include "../helpers/slideshow.h"
  7. struct DesktopSlideshowView {
  8. View* view;
  9. DesktopSlideshowViewCallback callback;
  10. void* context;
  11. };
  12. typedef struct {
  13. uint8_t page;
  14. Slideshow* slideshow;
  15. } DesktopSlideshowViewModel;
  16. static void desktop_view_slideshow_draw(Canvas* canvas, void* model) {
  17. DesktopSlideshowViewModel* m = model;
  18. canvas_clear(canvas);
  19. if(slideshow_is_loaded(m->slideshow)) {
  20. slideshow_draw(m->slideshow, canvas, 0, 0);
  21. }
  22. }
  23. static bool desktop_view_slideshow_input(InputEvent* event, void* context) {
  24. furi_assert(event);
  25. DesktopSlideshowView* instance = context;
  26. if(event->type == InputTypeShort) {
  27. DesktopSlideshowViewModel* model = view_get_model(instance->view);
  28. bool end_slideshow = false;
  29. switch(event->key) {
  30. case InputKeyLeft:
  31. slideshow_goback(model->slideshow);
  32. break;
  33. case InputKeyRight:
  34. case InputKeyOk:
  35. end_slideshow = !slideshow_advance(model->slideshow);
  36. break;
  37. case InputKeyBack:
  38. end_slideshow = true;
  39. default:
  40. break;
  41. }
  42. if(end_slideshow) {
  43. instance->callback(DesktopSlideshowCompleted, instance->context);
  44. }
  45. view_commit_model(instance->view, true);
  46. }
  47. return true;
  48. }
  49. static void desktop_view_slideshow_enter(void* context) {
  50. DesktopSlideshowView* instance = context;
  51. DesktopSlideshowViewModel* model = view_get_model(instance->view);
  52. model->slideshow = slideshow_alloc();
  53. if(!slideshow_load(model->slideshow, "/int/slideshow")) {
  54. instance->callback(DesktopSlideshowCompleted, instance->context);
  55. }
  56. view_commit_model(instance->view, false);
  57. }
  58. static void desktop_view_slideshow_exit(void* context) {
  59. DesktopSlideshowView* instance = context;
  60. DesktopSlideshowViewModel* model = view_get_model(instance->view);
  61. slideshow_free(model->slideshow);
  62. view_commit_model(instance->view, false);
  63. }
  64. DesktopSlideshowView* desktop_view_slideshow_alloc() {
  65. DesktopSlideshowView* instance = malloc(sizeof(DesktopSlideshowView));
  66. instance->view = view_alloc();
  67. view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(DesktopSlideshowViewModel));
  68. view_set_context(instance->view, instance);
  69. view_set_draw_callback(instance->view, (ViewDrawCallback)desktop_view_slideshow_draw);
  70. view_set_input_callback(instance->view, desktop_view_slideshow_input);
  71. view_set_enter_callback(instance->view, desktop_view_slideshow_enter);
  72. view_set_exit_callback(instance->view, desktop_view_slideshow_exit);
  73. return instance;
  74. }
  75. void desktop_view_slideshow_free(DesktopSlideshowView* instance) {
  76. furi_assert(instance);
  77. view_free(instance->view);
  78. free(instance);
  79. }
  80. View* desktop_view_slideshow_get_view(DesktopSlideshowView* instance) {
  81. furi_assert(instance);
  82. return instance->view;
  83. }
  84. void desktop_view_slideshow_set_callback(
  85. DesktopSlideshowView* instance,
  86. DesktopSlideshowViewCallback callback,
  87. void* context) {
  88. furi_assert(instance);
  89. furi_assert(callback);
  90. instance->callback = callback;
  91. instance->context = context;
  92. }