text_box_test.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. } TextBoxTestState;
  50. static void text_box_test_render_callback(Canvas* canvas, void* ctx) {
  51. TextBoxTestState* state = acquire_mutex((ValueMutex*)ctx, 25);
  52. canvas_clear(canvas);
  53. text_box_test_render[state->idx](canvas);
  54. release_mutex((ValueMutex*)ctx, state);
  55. }
  56. static void text_box_test_input_callback(InputEvent* input_event, void* ctx) {
  57. FuriMessageQueue* event_queue = ctx;
  58. furi_message_queue_put(event_queue, input_event, FuriWaitForever);
  59. }
  60. int32_t text_box_test_app(void* p) {
  61. UNUSED(p);
  62. FuriMessageQueue* event_queue = furi_message_queue_alloc(32, sizeof(InputEvent));
  63. furi_check(event_queue);
  64. TextBoxTestState _state = {.idx = 0};
  65. ValueMutex state_mutex;
  66. if(!init_mutex(&state_mutex, &_state, sizeof(TextBoxTestState))) {
  67. FURI_LOG_E(TAG, "Cannot create mutex");
  68. return 0;
  69. }
  70. ViewPort* view_port = view_port_alloc();
  71. view_port_draw_callback_set(view_port, text_box_test_render_callback, &state_mutex);
  72. view_port_input_callback_set(view_port, text_box_test_input_callback, event_queue);
  73. // Open GUI and register view_port
  74. Gui* gui = furi_record_open(RECORD_GUI);
  75. gui_add_view_port(gui, view_port, GuiLayerFullscreen);
  76. uint32_t test_renders_num = COUNT_OF(text_box_test_render);
  77. InputEvent event;
  78. while(furi_message_queue_get(event_queue, &event, FuriWaitForever) == FuriStatusOk) {
  79. TextBoxTestState* state = acquire_mutex_block(&state_mutex);
  80. if(event.type == InputTypeShort) {
  81. if(event.key == InputKeyRight) {
  82. if(state->idx < test_renders_num - 1) {
  83. state->idx++;
  84. }
  85. } else if(event.key == InputKeyLeft) {
  86. if(state->idx > 0) {
  87. state->idx--;
  88. }
  89. } else if(event.key == InputKeyBack) {
  90. release_mutex(&state_mutex, state);
  91. break;
  92. }
  93. }
  94. release_mutex(&state_mutex, state);
  95. view_port_update(view_port);
  96. }
  97. // remove & free all stuff created by app
  98. gui_remove_view_port(gui, view_port);
  99. view_port_free(view_port);
  100. furi_message_queue_free(event_queue);
  101. delete_mutex(&state_mutex);
  102. furi_record_close(RECORD_GUI);
  103. return 0;
  104. }