scene_manager.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /**
  2. * @file scene_manager.h
  3. * GUI: SceneManager API
  4. */
  5. #pragma once
  6. #include <stddef.h>
  7. #include <stdint.h>
  8. #include <stdbool.h>
  9. #ifdef __cplusplus
  10. extern "C" {
  11. #endif
  12. /** Scene Manager events type */
  13. typedef enum {
  14. SceneManagerEventTypeCustom,
  15. SceneManagerEventTypeBack,
  16. SceneManagerEventTypeTick,
  17. } SceneManagerEventType;
  18. /** Scene Manager event
  19. */
  20. typedef struct {
  21. SceneManagerEventType type;
  22. uint32_t event;
  23. } SceneManagerEvent;
  24. /** Prototype for Scene on_enter handler */
  25. typedef void (*AppSceneOnEnterCallback)(void* context);
  26. /** Prototype for Scene on_event handler */
  27. typedef bool (*AppSceneOnEventCallback)(void* context, SceneManagerEvent event);
  28. /** Prototype for Scene on_exit handler */
  29. typedef void (*AppSceneOnExitCallback)(void* context);
  30. /** Scene Manager configuration structure
  31. * Contains array of Scene handlers
  32. */
  33. typedef struct {
  34. const AppSceneOnEnterCallback* on_enter_handlers;
  35. const AppSceneOnEventCallback* on_event_handlers;
  36. const AppSceneOnExitCallback* on_exit_handlers;
  37. const uint32_t scene_num;
  38. } SceneManagerHandlers;
  39. typedef struct SceneManager SceneManager;
  40. /** Set Scene state
  41. *
  42. * @param scene_manager SceneManager instance
  43. * @param scene_id Scene ID
  44. * @param state Scene new state
  45. */
  46. void scene_manager_set_scene_state(SceneManager* scene_manager, uint32_t scene_id, uint32_t state);
  47. /** Get Scene state
  48. *
  49. * @param scene_manager SceneManager instance
  50. * @param scene_id Scene ID
  51. *
  52. * @return Scene state
  53. */
  54. uint32_t scene_manager_get_scene_state(SceneManager* scene_manager, uint32_t scene_id);
  55. /** Scene Manager allocation and configuration
  56. *
  57. * Scene Manager allocates all scenes internally
  58. *
  59. * @param app_scene_handlers SceneManagerHandlers instance
  60. * @param context context to be set on Scene handlers calls
  61. *
  62. * @return SceneManager instance
  63. */
  64. SceneManager* scene_manager_alloc(const SceneManagerHandlers* app_scene_handlers, void* context);
  65. /** Free Scene Manager with allocated Scenes
  66. *
  67. * @param scene_manager SceneManager instance
  68. */
  69. void scene_manager_free(SceneManager* scene_manager);
  70. /** Custom event handler
  71. *
  72. * Calls Scene event handler with Custom event parameter
  73. *
  74. * @param scene_manager SceneManager instance
  75. * @param custom_event Custom event code
  76. *
  77. * @return true if event was consumed, false otherwise
  78. */
  79. bool scene_manager_handle_custom_event(SceneManager* scene_manager, uint32_t custom_event);
  80. /** Back event handler
  81. *
  82. * Calls Scene event handler with Back event parameter
  83. *
  84. * @param scene_manager SceneManager instance
  85. *
  86. * @return true if event was consumed, false otherwise
  87. */
  88. bool scene_manager_handle_back_event(SceneManager* scene_manager);
  89. /** Tick event handler
  90. *
  91. * Calls Scene event handler with Tick event parameter
  92. *
  93. * @param scene_manager SceneManager instance
  94. * @return true if event was consumed, false otherwise
  95. */
  96. void scene_manager_handle_tick_event(SceneManager* scene_manager);
  97. /** Add and run next Scene
  98. *
  99. * @param scene_manager SceneManager instance
  100. * @param next_scene_id next Scene ID
  101. */
  102. void scene_manager_next_scene(SceneManager* scene_manager, uint32_t next_scene_id);
  103. /** Run previous Scene
  104. *
  105. * @param scene_manager SceneManager instance
  106. *
  107. * @return true if previous scene was found, false otherwise
  108. */
  109. bool scene_manager_previous_scene(SceneManager* scene_manager);
  110. /** Search previous Scene
  111. *
  112. * @param scene_manager SceneManager instance
  113. * @param scene_id Scene ID
  114. *
  115. * @return true if previous scene was found, false otherwise
  116. */
  117. bool scene_manager_has_previous_scene(SceneManager* scene_manager, uint32_t scene_id);
  118. /** Search and switch to previous Scene
  119. *
  120. * @param scene_manager SceneManager instance
  121. * @param scene_id Scene ID
  122. *
  123. * @return true if previous scene was found, false otherwise
  124. */
  125. bool scene_manager_search_and_switch_to_previous_scene(
  126. SceneManager* scene_manager,
  127. uint32_t scene_id);
  128. /** Search and switch to previous Scene, multiple choice
  129. *
  130. * @param scene_manager SceneManager instance
  131. * @param scene_ids Array of scene IDs
  132. * @param scene_ids_size Array of scene IDs size
  133. *
  134. * @return true if one of previous scenes was found, false otherwise
  135. */
  136. bool scene_manager_search_and_switch_to_previous_scene_one_of(
  137. SceneManager* scene_manager,
  138. const uint32_t* scene_ids,
  139. size_t scene_ids_size);
  140. /** Clear Scene stack and switch to another Scene
  141. *
  142. * @param scene_manager SceneManager instance
  143. * @param scene_id Scene ID
  144. *
  145. * @return true if previous scene was found, false otherwise
  146. */
  147. bool scene_manager_search_and_switch_to_another_scene(
  148. SceneManager* scene_manager,
  149. uint32_t scene_id);
  150. /** Exit from current scene
  151. *
  152. * @param scene_manager SceneManager instance
  153. */
  154. void scene_manager_stop(SceneManager* scene_manager);
  155. #ifdef __cplusplus
  156. }
  157. #endif