container_vm.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "container_vm.h"
  2. #include "elements/generic_element.h"
  3. #include "elements/string_element.h"
  4. #include "elements/icon_element.h"
  5. #include "elements/button_element.h"
  6. #include <list>
  7. class ContainerVMData {
  8. public:
  9. ContainerVMData(){};
  10. ~ContainerVMData() {
  11. for(auto& it : elements) delete it;
  12. };
  13. std::list<GenericElement*> elements;
  14. template <typename T> T add(const T element, View* view) {
  15. elements.push_back(element);
  16. element->set_parent_view(view);
  17. return element;
  18. }
  19. void clean() {
  20. for(auto& it : elements) delete it;
  21. elements.clear();
  22. }
  23. };
  24. struct ContainerVMModel {
  25. ContainerVMData* data;
  26. };
  27. ContainerVM::ContainerVM() {
  28. view = view_alloc();
  29. view_set_context(view, this);
  30. view_allocate_model(view, ViewModelTypeLocking, sizeof(ContainerVMModel));
  31. with_view_model_cpp(view, ContainerVMModel, model, {
  32. model->data = new ContainerVMData();
  33. return true;
  34. });
  35. view_set_draw_callback(view, view_draw_callback);
  36. view_set_input_callback(view, view_input_callback);
  37. }
  38. ContainerVM::~ContainerVM() {
  39. with_view_model_cpp(view, ContainerVMModel, model, {
  40. delete model->data;
  41. model->data = NULL;
  42. return false;
  43. });
  44. view_free(view);
  45. }
  46. View* ContainerVM::get_view() {
  47. return view;
  48. }
  49. void ContainerVM::clean() {
  50. with_view_model_cpp(view, ContainerVMModel, model, {
  51. model->data->clean();
  52. return true;
  53. });
  54. }
  55. template <typename T> T* ContainerVM::add() {
  56. T* element = new T();
  57. with_view_model_cpp(view, ContainerVMModel, model, {
  58. model->data->add(element, view);
  59. return true;
  60. });
  61. return element;
  62. }
  63. void ContainerVM::view_draw_callback(Canvas* canvas, void* model) {
  64. ContainerVMData* data = static_cast<ContainerVMModel*>(model)->data;
  65. canvas_clear(canvas);
  66. canvas_set_color(canvas, ColorBlack);
  67. canvas_set_font(canvas, FontPrimary);
  68. for(const auto& element : data->elements) {
  69. element->draw(canvas);
  70. }
  71. }
  72. bool ContainerVM::view_input_callback(InputEvent* event, void* context) {
  73. bool consumed = false;
  74. View* view = static_cast<ContainerVM*>(context)->view;
  75. with_view_model_cpp(view, ContainerVMModel, model, {
  76. for(const auto& element : model->data->elements) {
  77. if(element->input(event)) {
  78. consumed = true;
  79. }
  80. if(consumed) {
  81. break;
  82. }
  83. }
  84. return consumed;
  85. });
  86. return consumed;
  87. }
  88. template StringElement* ContainerVM::add<StringElement>();
  89. template IconElement* ContainerVM::add<IconElement>();
  90. template ButtonElement* ContainerVM::add<ButtonElement>();