text_box_test.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. osMessageQueueId_t event_queue = ctx;
  58. osMessageQueuePut(event_queue, input_event, 0, osWaitForever);
  59. }
  60. int32_t text_box_test_app(void* p) {
  61. osMessageQueueId_t event_queue = osMessageQueueNew(32, sizeof(InputEvent), NULL);
  62. furi_check(event_queue);
  63. TextBoxTestState _state = {.idx = 0};
  64. ValueMutex state_mutex;
  65. if(!init_mutex(&state_mutex, &_state, sizeof(TextBoxTestState))) {
  66. FURI_LOG_E(TAG, "Cannot create mutex");
  67. return 0;
  68. }
  69. ViewPort* view_port = view_port_alloc();
  70. view_port_draw_callback_set(view_port, text_box_test_render_callback, &state_mutex);
  71. view_port_input_callback_set(view_port, text_box_test_input_callback, event_queue);
  72. // Open GUI and register view_port
  73. Gui* gui = furi_record_open("gui");
  74. gui_add_view_port(gui, view_port, GuiLayerFullscreen);
  75. uint32_t test_renders_num = SIZEOF_ARRAY(text_box_test_render);
  76. InputEvent event;
  77. while(osMessageQueueGet(event_queue, &event, NULL, osWaitForever) == osOK) {
  78. TextBoxTestState* state = acquire_mutex_block(&state_mutex);
  79. if(event.type == InputTypeShort) {
  80. if(event.key == InputKeyRight) {
  81. if(state->idx < test_renders_num - 1) {
  82. state->idx++;
  83. }
  84. } else if(event.key == InputKeyLeft) {
  85. if(state->idx > 0) {
  86. state->idx--;
  87. }
  88. } else if(event.key == InputKeyBack) {
  89. release_mutex(&state_mutex, state);
  90. break;
  91. }
  92. }
  93. release_mutex(&state_mutex, state);
  94. view_port_update(view_port);
  95. }
  96. // remove & free all stuff created by app
  97. gui_remove_view_port(gui, view_port);
  98. view_port_free(view_port);
  99. osMessageQueueDelete(event_queue);
  100. delete_mutex(&state_mutex);
  101. furi_record_close("gui");
  102. return 0;
  103. }