2022-01-05 19:10:18 +03:00
|
|
|
#include "accessor_view_manager.h"
|
|
|
|
|
#include "accessor_event.h"
|
2024-02-21 16:27:56 +00:00
|
|
|
#include "callback_connector.h"
|
2021-04-28 22:13:25 +10:00
|
|
|
|
|
|
|
|
AccessorAppViewManager::AccessorAppViewManager() {
|
2022-07-20 13:56:33 +03:00
|
|
|
event_queue = furi_message_queue_alloc(10, sizeof(AccessorEvent));
|
2021-04-28 22:13:25 +10:00
|
|
|
|
2024-08-10 14:32:27 +03:00
|
|
|
view_holder = view_holder_alloc();
|
|
|
|
|
auto callback =
|
|
|
|
|
cbc::obtain_connector(this, &AccessorAppViewManager::view_holder_back_callback);
|
2021-04-28 22:13:25 +10:00
|
|
|
|
|
|
|
|
// allocate views
|
|
|
|
|
submenu = submenu_alloc();
|
|
|
|
|
popup = popup_alloc();
|
|
|
|
|
|
2024-08-10 14:32:27 +03:00
|
|
|
// set back callback
|
|
|
|
|
view_holder_set_back_callback(view_holder, callback, NULL);
|
2021-04-28 22:13:25 +10:00
|
|
|
|
2024-08-10 14:32:27 +03:00
|
|
|
gui = static_cast<Gui*>(furi_record_open(RECORD_GUI));
|
|
|
|
|
view_holder_attach_to_gui(view_holder, gui);
|
2021-04-28 22:13:25 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AccessorAppViewManager::~AccessorAppViewManager() {
|
2024-08-10 14:32:27 +03:00
|
|
|
// remove current view
|
|
|
|
|
view_holder_set_view(view_holder, NULL);
|
2021-04-28 22:13:25 +10:00
|
|
|
// free view modules
|
2022-08-11 11:28:57 +03:00
|
|
|
furi_record_close(RECORD_GUI);
|
2021-04-28 22:13:25 +10:00
|
|
|
submenu_free(submenu);
|
|
|
|
|
popup_free(popup);
|
2024-08-10 14:32:27 +03:00
|
|
|
// free view holder
|
|
|
|
|
view_holder_free(view_holder);
|
2021-04-28 22:13:25 +10:00
|
|
|
// free event queue
|
2022-07-20 13:56:33 +03:00
|
|
|
furi_message_queue_free(event_queue);
|
2021-04-28 22:13:25 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AccessorAppViewManager::switch_to(ViewType type) {
|
2024-08-10 14:32:27 +03:00
|
|
|
View* view;
|
|
|
|
|
|
|
|
|
|
switch(type) {
|
|
|
|
|
case ViewType::Submenu:
|
|
|
|
|
view = submenu_get_view(submenu);
|
|
|
|
|
break;
|
|
|
|
|
case ViewType::Popup:
|
|
|
|
|
view = popup_get_view(popup);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
furi_crash();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
view_holder_set_view(view_holder, view);
|
2021-04-28 22:13:25 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Submenu* AccessorAppViewManager::get_submenu() {
|
|
|
|
|
return submenu;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Popup* AccessorAppViewManager::get_popup() {
|
|
|
|
|
return popup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AccessorAppViewManager::receive_event(AccessorEvent* event) {
|
2022-07-20 13:56:33 +03:00
|
|
|
if(furi_message_queue_get(event_queue, event, 100) != FuriStatusOk) {
|
2021-04-28 22:13:25 +10:00
|
|
|
event->type = AccessorEvent::Type::Tick;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AccessorAppViewManager::send_event(AccessorEvent* event) {
|
2022-07-20 13:56:33 +03:00
|
|
|
FuriStatus result = furi_message_queue_put(event_queue, event, 0);
|
|
|
|
|
furi_check(result == FuriStatusOk);
|
2021-04-28 22:13:25 +10:00
|
|
|
}
|
|
|
|
|
|
2024-08-10 14:32:27 +03:00
|
|
|
void AccessorAppViewManager::view_holder_back_callback(void*) {
|
2021-04-28 22:13:25 +10:00
|
|
|
if(event_queue != NULL) {
|
|
|
|
|
AccessorEvent event;
|
|
|
|
|
event.type = AccessorEvent::Type::Back;
|
|
|
|
|
send_event(&event);
|
|
|
|
|
}
|
2022-05-06 16:37:10 +03:00
|
|
|
}
|