desktop_view_slideshow.c 3.3 KB

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