widget.c 1.8 KB

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