view.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #pragma once
  2. #include <input/input.h>
  3. #include "canvas.h"
  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif
  7. /* Hides drawing view_port */
  8. #define VIEW_NONE 0xFFFFFFFF
  9. /* Ignore navigation event */
  10. #define VIEW_IGNORE 0xFFFFFFFE
  11. /* Deatch from gui, deallocate Views and ViewDispatcher
  12. * BE SUPER CAREFUL, deallocation happens automatically on GUI thread
  13. * You ARE NOT owning ViewDispatcher and Views instances
  14. */
  15. #define VIEW_DESTROY 0xFFFFFFFA
  16. /* View Draw callback
  17. * @param canvas, pointer to canvas
  18. * @param view_model, pointer to context
  19. * @warning called from GUI thread
  20. */
  21. typedef void (*ViewDrawCallback)(Canvas* canvas, void* model);
  22. /* View Input callback
  23. * @param event, pointer to input event data
  24. * @param context, pointer to context
  25. * @return true if event handled, false if event ignored
  26. * @warning called from GUI thread
  27. */
  28. typedef bool (*ViewInputCallback)(InputEvent* event, void* context);
  29. /* View navigation callback
  30. * @param context, pointer to context
  31. * @return next view id
  32. * @warning called from GUI thread
  33. */
  34. typedef uint32_t (*ViewNavigationCallback)(void* context);
  35. /* View model types */
  36. typedef enum {
  37. /* Model is not allocated */
  38. ViewModelTypeNone,
  39. /* Model consist of atomic types and/or partial update is not critical for rendering.
  40. * Lock free.
  41. */
  42. ViewModelTypeLockFree,
  43. /* Model access is guarded with mutex.
  44. * Locking gui thread.
  45. */
  46. ViewModelTypeLocking,
  47. } ViewModelType;
  48. typedef struct View View;
  49. /* Allocate and init View
  50. * @return pointer to View
  51. */
  52. View* view_alloc();
  53. /* Free View
  54. * @param pointer to View
  55. */
  56. void view_free(View* view);
  57. /* Set View Draw callback
  58. * @param view, pointer to View
  59. * @param callback, draw callback
  60. */
  61. void view_set_draw_callback(View* view, ViewDrawCallback callback);
  62. /* Set View Draw callback
  63. * @param view, pointer to View
  64. * @param callback, input callback
  65. */
  66. void view_set_input_callback(View* view, ViewInputCallback callback);
  67. /* Set Navigation Previous callback
  68. * @param view, pointer to View
  69. * @param callback, input callback
  70. */
  71. void view_set_previous_callback(View* view, ViewNavigationCallback callback);
  72. /* Set Navigation Next callback
  73. * @param view, pointer to View
  74. * @param callback, input callback
  75. */
  76. void view_set_next_callback(View* view, ViewNavigationCallback callback);
  77. /* Set View Draw callback
  78. * @param view, pointer to View
  79. * @param context, context for callbacks
  80. */
  81. void view_set_context(View* view, void* context);
  82. /* Allocate view model.
  83. * @param view, pointer to View
  84. * @param type, View Model Type
  85. * @param size, size
  86. */
  87. void view_allocate_model(View* view, ViewModelType type, size_t size);
  88. /* Free view model data memory.
  89. * @param view, pointer to View
  90. */
  91. void view_free_model(View* view);
  92. /* Get view model data
  93. * @param view, pointer to View
  94. * @return pointer to model data
  95. * @warning Don't forget to commit model changes
  96. */
  97. void* view_get_model(View* view);
  98. /* Commit view model
  99. * @param view, pointer to View
  100. */
  101. void view_commit_model(View* view);
  102. /*
  103. * With clause for view model
  104. * @param view, View instance pointer
  105. * @param function_body a (){} lambda declaration,
  106. * executed within you parent function context.
  107. */
  108. #define with_view_model(view, function_body) \
  109. { \
  110. void* p = view_get_model(view); \
  111. ({ void __fn__ function_body __fn__; })(p); \
  112. view_commit_model(view); \
  113. }
  114. #ifdef __cplusplus
  115. }
  116. #endif