dialog.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include "dialog.h"
  2. #include <gui/elements.h>
  3. #include <furi.h>
  4. struct Dialog {
  5. View* view;
  6. void* context;
  7. DialogResultCallback callback;
  8. };
  9. typedef struct {
  10. const char* header_text;
  11. const char* text;
  12. const char* left_text;
  13. const char* right_text;
  14. } DialogModel;
  15. static void dialog_view_draw_callback(Canvas* canvas, void* _model) {
  16. DialogModel* model = _model;
  17. uint8_t canvas_center = canvas_width(canvas) / 2;
  18. // Prepare canvas
  19. canvas_clear(canvas);
  20. canvas_set_color(canvas, ColorBlack);
  21. // Draw header
  22. canvas_set_font(canvas, FontPrimary);
  23. canvas_draw_str_aligned(
  24. canvas, canvas_center, 17, AlignCenter, AlignBottom, model->header_text);
  25. // Draw text
  26. canvas_set_font(canvas, FontSecondary);
  27. elements_multiline_text_aligned(
  28. canvas, canvas_center, 32, AlignCenter, AlignCenter, model->text);
  29. // Draw buttons
  30. elements_button_left(canvas, model->left_text);
  31. elements_button_right(canvas, model->right_text);
  32. }
  33. static bool dialog_view_input_callback(InputEvent* event, void* context) {
  34. Dialog* dialog = context;
  35. bool consumed = false;
  36. // Process key presses only
  37. if(event->type == InputTypeShort && dialog->callback) {
  38. if(event->key == InputKeyLeft) {
  39. dialog->callback(DialogResultLeft, dialog->context);
  40. consumed = true;
  41. } else if(event->key == InputKeyRight) {
  42. dialog->callback(DialogResultRight, dialog->context);
  43. consumed = true;
  44. } else if(event->key == InputKeyBack) {
  45. dialog->callback(DialogResultBack, dialog->context);
  46. consumed = true;
  47. }
  48. }
  49. return consumed;
  50. }
  51. Dialog* dialog_alloc() {
  52. Dialog* dialog = furi_alloc(sizeof(Dialog));
  53. dialog->view = view_alloc();
  54. view_set_context(dialog->view, dialog);
  55. view_allocate_model(dialog->view, ViewModelTypeLockFree, sizeof(DialogModel));
  56. view_set_draw_callback(dialog->view, dialog_view_draw_callback);
  57. view_set_input_callback(dialog->view, dialog_view_input_callback);
  58. return dialog;
  59. }
  60. void dialog_free(Dialog* dialog) {
  61. furi_assert(dialog);
  62. view_free(dialog->view);
  63. free(dialog);
  64. }
  65. View* dialog_get_view(Dialog* dialog) {
  66. furi_assert(dialog);
  67. return dialog->view;
  68. }
  69. void dialog_set_result_callback(Dialog* dialog, DialogResultCallback callback) {
  70. furi_assert(dialog);
  71. dialog->callback = callback;
  72. }
  73. void dialog_set_context(Dialog* dialog, void* context) {
  74. furi_assert(dialog);
  75. dialog->context = context;
  76. }
  77. void dialog_set_header_text(Dialog* dialog, const char* text) {
  78. furi_assert(dialog);
  79. furi_assert(text);
  80. with_view_model(
  81. dialog->view, (DialogModel * model) {
  82. model->header_text = text;
  83. return true;
  84. });
  85. }
  86. void dialog_set_text(Dialog* dialog, const char* text) {
  87. furi_assert(dialog);
  88. furi_assert(text);
  89. with_view_model(
  90. dialog->view, (DialogModel * model) {
  91. model->text = text;
  92. return true;
  93. });
  94. }
  95. void dialog_set_left_button_text(Dialog* dialog, const char* text) {
  96. furi_assert(dialog);
  97. furi_assert(text);
  98. with_view_model(
  99. dialog->view, (DialogModel * model) {
  100. model->left_text = text;
  101. return true;
  102. });
  103. }
  104. void dialog_set_right_button_text(Dialog* dialog, const char* text) {
  105. furi_assert(dialog);
  106. furi_assert(text);
  107. with_view_model(
  108. dialog->view, (DialogModel * model) {
  109. model->right_text = text;
  110. return true;
  111. });
  112. }