boilerplate_startscreen.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "../malveke_gb_photo.h"
  2. #include <furi.h>
  3. #include <furi_hal.h>
  4. #include <input/input.h>
  5. #include <gui/elements.h>
  6. extern const uint8_t u8g2_font_5x7_mf[1911]; // Declare as extern
  7. struct BoilerplateStartscreen
  8. {
  9. View *view;
  10. BoilerplateStartscreenCallback callback;
  11. void *context;
  12. };
  13. typedef struct
  14. {
  15. int some_value;
  16. } BoilerplateStartscreenModel;
  17. void boilerplate_startscreen_set_callback(
  18. BoilerplateStartscreen *instance,
  19. BoilerplateStartscreenCallback callback,
  20. void *context)
  21. {
  22. furi_assert(instance);
  23. furi_assert(callback);
  24. instance->callback = callback;
  25. instance->context = context;
  26. }
  27. void boilerplate_startscreen_draw(Canvas *canvas, BoilerplateStartscreenModel *model)
  28. {
  29. UNUSED(model);
  30. canvas_clear(canvas);
  31. canvas_set_color(canvas, ColorBlack);
  32. canvas_set_font(canvas, FontPrimary);
  33. canvas_draw_str_aligned(canvas, 64, 10, AlignCenter, AlignTop, "GAME BOY PHOTO");
  34. canvas_set_custom_u8g2_font(canvas, u8g2_font_5x7_mf);
  35. canvas_draw_str_aligned(canvas, 64, 28, AlignCenter, AlignTop, "SELECT A '.SAV' FILE ");
  36. canvas_draw_str_aligned(canvas, 64, 38, AlignCenter, AlignTop, "FROM GB CAMERA TO PROCEED");
  37. canvas_set_font(canvas, FontSecondary);
  38. elements_button_center(canvas, "Start");
  39. }
  40. static void boilerplate_startscreen_model_init(BoilerplateStartscreenModel *const model)
  41. {
  42. model->some_value = 1;
  43. }
  44. bool boilerplate_startscreen_input(InputEvent *event, void *context)
  45. {
  46. furi_assert(context);
  47. BoilerplateStartscreen *instance = context;
  48. if (event->type == InputTypeRelease)
  49. {
  50. switch (event->key)
  51. {
  52. case InputKeyBack:
  53. with_view_model(
  54. instance->view,
  55. BoilerplateStartscreenModel * model,
  56. {
  57. UNUSED(model);
  58. instance->callback(BoilerplateCustomEventStartscreenBack, instance->context);
  59. },
  60. true);
  61. break;
  62. case InputKeyLeft:
  63. case InputKeyRight:
  64. case InputKeyUp:
  65. case InputKeyDown:
  66. case InputKeyOk:
  67. instance->callback(BoilerplateCustomEventStartscreenOk, instance->context);
  68. break;
  69. case InputKeyMAX:
  70. break;
  71. }
  72. }
  73. return true;
  74. }
  75. void boilerplate_startscreen_exit(void *context)
  76. {
  77. furi_assert(context);
  78. }
  79. void boilerplate_startscreen_enter(void *context)
  80. {
  81. furi_assert(context);
  82. BoilerplateStartscreen *instance = (BoilerplateStartscreen *)context;
  83. with_view_model(
  84. instance->view,
  85. BoilerplateStartscreenModel * model,
  86. {
  87. boilerplate_startscreen_model_init(model);
  88. },
  89. true);
  90. }
  91. BoilerplateStartscreen *boilerplate_startscreen_alloc()
  92. {
  93. BoilerplateStartscreen *instance = malloc(sizeof(BoilerplateStartscreen));
  94. instance->view = view_alloc();
  95. view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(BoilerplateStartscreenModel));
  96. view_set_context(instance->view, instance); // furi_assert crashes in events without this
  97. view_set_draw_callback(instance->view, (ViewDrawCallback)boilerplate_startscreen_draw);
  98. view_set_input_callback(instance->view, boilerplate_startscreen_input);
  99. with_view_model(
  100. instance->view,
  101. BoilerplateStartscreenModel * model,
  102. {
  103. boilerplate_startscreen_model_init(model);
  104. },
  105. true);
  106. return instance;
  107. }
  108. void boilerplate_startscreen_free(BoilerplateStartscreen *instance)
  109. {
  110. furi_assert(instance);
  111. with_view_model(
  112. instance->view,
  113. BoilerplateStartscreenModel * model,
  114. {
  115. UNUSED(model);
  116. },
  117. true);
  118. view_free(instance->view);
  119. free(instance);
  120. }
  121. View *boilerplate_startscreen_get_view(BoilerplateStartscreen *instance)
  122. {
  123. furi_assert(instance);
  124. return instance->view;
  125. }