desktop_view_slideshow.c 3.2 KB

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