widget.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "widget.h"
  2. #include "widget_i.h"
  3. #include <cmsis_os.h>
  4. #include <flipper.h>
  5. #include <flipper_v2.h>
  6. #include "gui.h"
  7. #include "gui_i.h"
  8. // TODO add mutex to widget ops
  9. struct Widget {
  10. Gui* gui;
  11. bool is_enabled;
  12. WidgetDrawCallback draw_callback;
  13. void* draw_callback_context;
  14. WidgetInputCallback input_callback;
  15. void* input_callback_context;
  16. };
  17. Widget* widget_alloc(WidgetDrawCallback callback, void* callback_context) {
  18. Widget* widget = furi_alloc(sizeof(Widget));
  19. widget->is_enabled = true;
  20. return widget;
  21. }
  22. void widget_free(Widget* widget) {
  23. furi_assert(widget);
  24. furi_check(widget->gui == NULL);
  25. free(widget);
  26. }
  27. void widget_enabled_set(Widget* widget, bool enabled) {
  28. furi_assert(widget);
  29. if(widget->is_enabled != enabled) {
  30. widget->is_enabled = enabled;
  31. widget_update(widget);
  32. }
  33. }
  34. bool widget_is_enabled(Widget* widget) {
  35. furi_assert(widget);
  36. return widget->is_enabled;
  37. }
  38. void widget_draw_callback_set(Widget* widget, WidgetDrawCallback callback, void* context) {
  39. furi_assert(widget);
  40. widget->draw_callback = callback;
  41. widget->draw_callback_context = context;
  42. }
  43. void widget_input_callback_set(Widget* widget, WidgetInputCallback callback, void* context) {
  44. furi_assert(widget);
  45. widget->input_callback = callback;
  46. widget->input_callback_context = context;
  47. }
  48. void widget_update(Widget* widget) {
  49. furi_assert(widget);
  50. if(widget->gui) gui_update(widget->gui);
  51. }
  52. void widget_gui_set(Widget* widget, Gui* gui) {
  53. furi_assert(widget);
  54. furi_assert(gui);
  55. widget->gui = gui;
  56. }
  57. void widget_draw(Widget* widget, CanvasApi* canvas_api) {
  58. furi_assert(widget);
  59. furi_assert(canvas_api);
  60. furi_check(widget->gui);
  61. if(widget->draw_callback) {
  62. widget->draw_callback(canvas_api, widget->draw_callback_context);
  63. }
  64. }
  65. void widget_input(Widget* widget, InputEvent* event) {
  66. furi_assert(widget);
  67. furi_assert(event);
  68. furi_check(widget->gui);
  69. if(widget->input_callback) widget->input_callback(event, widget->input_callback_context);
  70. }