feat(ui): Enhance AppClickUserData management for proper cleanup and tracking

This commit is contained in:
GW_MC
2026-04-20 15:12:11 +08:00
parent 4cfa7333f1
commit 8d642c7d12
2 changed files with 15 additions and 1 deletions

View File

@@ -1,6 +1,7 @@
#include "ui/ui_handler.h" #include "ui/ui_handler.h"
#include "ui/apps/registry.h" #include "ui/apps/registry.h"
#include "esp_log.h" #include "esp_log.h"
#include <algorithm>
#define TAG "UIHandler" #define TAG "UIHandler"
@@ -11,6 +12,11 @@ struct AppClickUserData {
UIHandler::~UIHandler() { UIHandler::~UIHandler() {
deinit(); deinit();
// Clean up all allocated AppClickUserData
for (void* data : app_click_user_data_) {
delete static_cast<AppClickUserData*>(data);
}
app_click_user_data_.clear();
} }
esp_err_t UIHandler::init(void) { esp_err_t UIHandler::init(void) {
@@ -267,6 +273,10 @@ esp_err_t UIHandler::create_main_screen_(lv_obj_t* parent) {
// Center the icon container // Center the icon container
lv_obj_center(app_icon_container); lv_obj_center(app_icon_container);
// Create and track user data for the callback
auto* click_data = new AppClickUserData { this, name };
app_click_user_data_.push_back(click_data);
// Register click event to switch to the app // Register click event to switch to the app
lv_obj_add_event_cb(app_icon_container, lv_obj_add_event_cb(app_icon_container,
[](lv_event_t* e) { [](lv_event_t* e) {
@@ -282,7 +292,7 @@ esp_err_t UIHandler::create_main_screen_(lv_obj_t* parent) {
} }
}, },
LV_EVENT_CLICKED, LV_EVENT_CLICKED,
new AppClickUserData { this, name } click_data
); );
} }

View File

@@ -7,6 +7,7 @@
#include "ui/interaction_handler.h" #include "ui/interaction_handler.h"
#include "lvgl.h" #include "lvgl.h"
#include <memory> #include <memory>
#include <vector>
/** /**
* @brief UI Handler - manages app lifecycle and rendering * @brief UI Handler - manages app lifecycle and rendering
@@ -115,4 +116,7 @@ private:
lv_obj_t* main_screen_ = nullptr; ///< Root screen lv_obj_t* main_screen_ = nullptr; ///< Root screen
RootLayout root_layout_; ///< Main screen layout manager RootLayout root_layout_; ///< Main screen layout manager
AppDescriptor* active_descriptor_ = nullptr; ///< Currently active app descriptor (managed by AppRegistry) AppDescriptor* active_descriptor_ = nullptr; ///< Currently active app descriptor (managed by AppRegistry)
// Track allocated user data for cleanup
std::vector<void*> app_click_user_data_;
}; };