dialog.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. }
  45. }
  46. return consumed;
  47. }
  48. Dialog* dialog_alloc() {
  49. Dialog* dialog = furi_alloc(sizeof(Dialog));
  50. dialog->view = view_alloc();
  51. view_set_context(dialog->view, dialog);
  52. view_allocate_model(dialog->view, ViewModelTypeLockFree, sizeof(DialogModel));
  53. view_set_draw_callback(dialog->view, dialog_view_draw_callback);
  54. view_set_input_callback(dialog->view, dialog_view_input_callback);
  55. return dialog;
  56. }
  57. void dialog_free(Dialog* dialog) {
  58. furi_assert(dialog);
  59. view_free(dialog->view);
  60. free(dialog);
  61. }
  62. View* dialog_get_view(Dialog* dialog) {
  63. furi_assert(dialog);
  64. return dialog->view;
  65. }
  66. void dialog_set_result_callback(Dialog* dialog, DialogResultCallback callback) {
  67. furi_assert(dialog);
  68. dialog->callback = callback;
  69. }
  70. void dialog_set_context(Dialog* dialog, void* context) {
  71. furi_assert(dialog);
  72. dialog->context = context;
  73. }
  74. void dialog_set_header_text(Dialog* dialog, const char* text) {
  75. furi_assert(dialog);
  76. furi_assert(text);
  77. with_view_model(
  78. dialog->view, (DialogModel * model) {
  79. model->header_text = text;
  80. return true;
  81. });
  82. }
  83. void dialog_set_text(Dialog* dialog, const char* text) {
  84. furi_assert(dialog);
  85. furi_assert(text);
  86. with_view_model(
  87. dialog->view, (DialogModel * model) {
  88. model->text = text;
  89. return true;
  90. });
  91. }
  92. void dialog_set_left_button_text(Dialog* dialog, const char* text) {
  93. furi_assert(dialog);
  94. furi_assert(text);
  95. with_view_model(
  96. dialog->view, (DialogModel * model) {
  97. model->left_text = text;
  98. return true;
  99. });
  100. }
  101. void dialog_set_right_button_text(Dialog* dialog, const char* text) {
  102. furi_assert(dialog);
  103. furi_assert(text);
  104. with_view_model(
  105. dialog->view, (DialogModel * model) {
  106. model->right_text = text;
  107. return true;
  108. });
  109. }