text_box_test.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include <furi.h>
  2. #include <gui/gui.h>
  3. #include <input/input.h>
  4. #include <gui/elements.h>
  5. #define TAG "TextBoxTest"
  6. static void text_box_center_top_secondary_128x22(Canvas* canvas) {
  7. canvas_draw_frame(canvas, 0, 0, 128, 22);
  8. elements_text_box(canvas, 0, 0, 128, 22, AlignCenter, AlignTop, "secondary font test", false);
  9. }
  10. static void text_box_right_bottom_bold_128x22(Canvas* canvas) {
  11. canvas_draw_frame(canvas, 0, 0, 128, 22);
  12. elements_text_box(
  13. canvas, 0, 0, 128, 22, AlignRight, AlignBottom, "\e#Bold font test\e#", false);
  14. }
  15. static void text_box_left_center_mixed_80x50(Canvas* canvas) {
  16. canvas_draw_frame(canvas, 0, 0, 80, 50);
  17. elements_text_box(
  18. canvas,
  19. 0,
  20. 0,
  21. 80,
  22. 50,
  23. AlignLeft,
  24. AlignCenter,
  25. "\e#Never\e# gonna give you up\n\e!Never\e! gonna let you down",
  26. false);
  27. }
  28. static void text_box_center_center_secondary_110x44(Canvas* canvas) {
  29. canvas_draw_frame(canvas, 4, 20, 110, 30);
  30. elements_text_box(
  31. canvas,
  32. 4,
  33. 20,
  34. 110,
  35. 30,
  36. AlignCenter,
  37. AlignCenter,
  38. "Loooooooooooooo0000000ooong file name from happy 100500 Flipper 0wners",
  39. true);
  40. }
  41. static void (*text_box_test_render[])(Canvas* canvas) = {
  42. text_box_center_top_secondary_128x22,
  43. text_box_right_bottom_bold_128x22,
  44. text_box_left_center_mixed_80x50,
  45. text_box_center_center_secondary_110x44,
  46. };
  47. typedef struct {
  48. uint32_t idx;
  49. FuriMutex* mutex;
  50. } TextBoxTestState;
  51. static void text_box_test_render_callback(Canvas* canvas, void* ctx) {
  52. TextBoxTestState* state = ctx;
  53. furi_mutex_acquire(state->mutex, FuriWaitForever);
  54. canvas_clear(canvas);
  55. text_box_test_render[state->idx](canvas);
  56. furi_mutex_release(state->mutex);
  57. }
  58. static void text_box_test_input_callback(InputEvent* input_event, void* ctx) {
  59. FuriMessageQueue* event_queue = ctx;
  60. furi_message_queue_put(event_queue, input_event, FuriWaitForever);
  61. }
  62. int32_t text_box_test_app(void* p) {
  63. UNUSED(p);
  64. FuriMessageQueue* event_queue = furi_message_queue_alloc(32, sizeof(InputEvent));
  65. furi_check(event_queue);
  66. TextBoxTestState state = {.idx = 0, .mutex = NULL};
  67. state.mutex = furi_mutex_alloc(FuriMutexTypeNormal);
  68. if(!state.mutex) {
  69. FURI_LOG_E(TAG, "Cannot create mutex");
  70. return 0;
  71. }
  72. ViewPort* view_port = view_port_alloc();
  73. view_port_draw_callback_set(view_port, text_box_test_render_callback, &state);
  74. view_port_input_callback_set(view_port, text_box_test_input_callback, event_queue);
  75. // Open GUI and register view_port
  76. Gui* gui = furi_record_open(RECORD_GUI);
  77. gui_add_view_port(gui, view_port, GuiLayerFullscreen);
  78. uint32_t test_renders_num = COUNT_OF(text_box_test_render);
  79. InputEvent event;
  80. while(furi_message_queue_get(event_queue, &event, FuriWaitForever) == FuriStatusOk) {
  81. furi_mutex_acquire(state.mutex, FuriWaitForever);
  82. if(event.type == InputTypeShort) {
  83. if(event.key == InputKeyRight) {
  84. if(state.idx < test_renders_num - 1) {
  85. state.idx++;
  86. }
  87. } else if(event.key == InputKeyLeft) {
  88. if(state.idx > 0) {
  89. state.idx--;
  90. }
  91. } else if(event.key == InputKeyBack) {
  92. furi_mutex_release(state.mutex);
  93. break;
  94. }
  95. }
  96. furi_mutex_release(state.mutex);
  97. view_port_update(view_port);
  98. }
  99. // remove & free all stuff created by app
  100. gui_remove_view_port(gui, view_port);
  101. view_port_free(view_port);
  102. furi_message_queue_free(event_queue);
  103. furi_mutex_free(state.mutex);
  104. furi_record_close(RECORD_GUI);
  105. return 0;
  106. }