view_holder.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include "view_holder.h"
  2. #include <gui/view_i.h>
  3. struct ViewHolder {
  4. View* view;
  5. ViewPort* view_port;
  6. Gui* gui;
  7. FreeCallback free_callback;
  8. void* free_context;
  9. BackCallback back_callback;
  10. void* back_context;
  11. };
  12. static void view_holder_draw_callback(Canvas* canvas, void* context);
  13. static void view_holder_input_callback(InputEvent* event, void* context);
  14. ViewHolder* view_holder_alloc() {
  15. ViewHolder* view_holder = furi_alloc(sizeof(ViewHolder));
  16. view_holder->view_port = view_port_alloc();
  17. view_port_draw_callback_set(view_holder->view_port, view_holder_draw_callback, view_holder);
  18. view_port_input_callback_set(view_holder->view_port, view_holder_input_callback, view_holder);
  19. view_port_enabled_set(view_holder->view_port, false);
  20. return view_holder;
  21. }
  22. void view_holder_free(ViewHolder* view_holder) {
  23. furi_assert(view_holder);
  24. if(view_holder->gui) {
  25. gui_remove_view_port(view_holder->gui, view_holder->view_port);
  26. }
  27. view_port_free(view_holder->view_port);
  28. if(view_holder->free_callback) {
  29. view_holder->free_callback(view_holder->free_context);
  30. }
  31. free(view_holder);
  32. }
  33. void view_holder_set_view(ViewHolder* view_holder, View* view) {
  34. furi_assert(view_holder);
  35. view_holder->view = view;
  36. }
  37. void view_holder_set_free_callback(
  38. ViewHolder* view_holder,
  39. FreeCallback free_callback,
  40. void* free_context) {
  41. furi_assert(view_holder);
  42. view_holder->free_callback = free_callback;
  43. view_holder->free_context = free_context;
  44. }
  45. void* view_holder_get_free_context(ViewHolder* view_holder) {
  46. return view_holder->free_context;
  47. }
  48. void view_holder_set_back_callback(
  49. ViewHolder* view_holder,
  50. BackCallback back_callback,
  51. void* back_context) {
  52. furi_assert(view_holder);
  53. view_holder->back_callback = back_callback;
  54. view_holder->back_context = back_context;
  55. }
  56. void view_holder_attach_to_gui(ViewHolder* view_holder, Gui* gui) {
  57. furi_assert(gui);
  58. furi_assert(view_holder);
  59. view_holder->gui = gui;
  60. gui_add_view_port(gui, view_holder->view_port, GuiLayerFullscreen);
  61. }
  62. void view_holder_start(ViewHolder* view_holder) {
  63. view_port_enabled_set(view_holder->view_port, true);
  64. }
  65. void view_holder_stop(ViewHolder* view_holder) {
  66. view_port_enabled_set(view_holder->view_port, false);
  67. }
  68. static void view_holder_draw_callback(Canvas* canvas, void* context) {
  69. ViewHolder* view_holder = context;
  70. if(view_holder->view) {
  71. view_draw(view_holder->view, canvas);
  72. }
  73. }
  74. static void view_holder_input_callback(InputEvent* event, void* context) {
  75. ViewHolder* view_holder = context;
  76. bool is_consumed = false;
  77. if(view_holder->view) {
  78. is_consumed = view_input(view_holder->view, event);
  79. }
  80. if(!is_consumed && event->type == InputTypeShort) {
  81. if(event->key == InputKeyBack) {
  82. if(view_holder->back_callback) {
  83. view_holder->back_callback(view_holder->back_context);
  84. }
  85. }
  86. }
  87. }