accessor-view-manager.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include "accessor-view-manager.h"
  2. #include "accessor-event.h"
  3. #include <callback-connector.h>
  4. AccessorAppViewManager::AccessorAppViewManager() {
  5. event_queue = osMessageQueueNew(10, sizeof(AccessorEvent), NULL);
  6. view_dispatcher = view_dispatcher_alloc();
  7. auto callback = cbc::obtain_connector(this, &AccessorAppViewManager::previous_view_callback);
  8. // allocate views
  9. submenu = submenu_alloc();
  10. add_view(ViewType::Submenu, submenu_get_view(submenu));
  11. popup = popup_alloc();
  12. add_view(ViewType::Popup, popup_get_view(popup));
  13. gui = static_cast<Gui*>(furi_record_open("gui"));
  14. view_dispatcher_attach_to_gui(view_dispatcher, gui, ViewDispatcherTypeFullscreen);
  15. // set previous view callback for all views
  16. view_set_previous_callback(submenu_get_view(submenu), callback);
  17. view_set_previous_callback(popup_get_view(popup), callback);
  18. }
  19. AccessorAppViewManager::~AccessorAppViewManager() {
  20. // remove views
  21. view_dispatcher_remove_view(
  22. view_dispatcher, static_cast<uint32_t>(AccessorAppViewManager::ViewType::Submenu));
  23. view_dispatcher_remove_view(
  24. view_dispatcher, static_cast<uint32_t>(AccessorAppViewManager::ViewType::Popup));
  25. // free view modules
  26. submenu_free(submenu);
  27. popup_free(popup);
  28. // free dispatcher
  29. view_dispatcher_free(view_dispatcher);
  30. // free event queue
  31. osMessageQueueDelete(event_queue);
  32. }
  33. void AccessorAppViewManager::switch_to(ViewType type) {
  34. view_dispatcher_switch_to_view(view_dispatcher, static_cast<uint32_t>(type));
  35. }
  36. Submenu* AccessorAppViewManager::get_submenu() {
  37. return submenu;
  38. }
  39. Popup* AccessorAppViewManager::get_popup() {
  40. return popup;
  41. }
  42. void AccessorAppViewManager::receive_event(AccessorEvent* event) {
  43. if(osMessageQueueGet(event_queue, event, NULL, 100) != osOK) {
  44. event->type = AccessorEvent::Type::Tick;
  45. }
  46. }
  47. void AccessorAppViewManager::send_event(AccessorEvent* event) {
  48. osStatus_t result = osMessageQueuePut(event_queue, event, 0, 0);
  49. furi_check(result == osOK);
  50. }
  51. uint32_t AccessorAppViewManager::previous_view_callback(void* context) {
  52. if(event_queue != NULL) {
  53. AccessorEvent event;
  54. event.type = AccessorEvent::Type::Back;
  55. send_event(&event);
  56. }
  57. return VIEW_IGNORE;
  58. }
  59. void AccessorAppViewManager::add_view(ViewType view_type, View* view) {
  60. view_dispatcher_add_view(view_dispatcher, static_cast<uint32_t>(view_type), view);
  61. }