| 25 | } |
| 26 | |
| 27 | JsonUiUpdateInput setJsonUiHandlers(const JsonUiUpdateOutput& updateJsHandler) FL_NOEXCEPT { |
| 28 | // FL_WARN("setJsonUiHandlers: ENTRY - updateJsHandler is " << (updateJsHandler ? "VALID" : "nullptr/EMPTY")); |
| 29 | |
| 30 | // Create internal JsonUiManager only if updateJsHandler is valid (not empty) |
| 31 | if (updateJsHandler) { |
| 32 | // FL_WARN("setJsonUiHandlers: updateJsHandler is valid, creating JsonUiManager"); |
| 33 | auto& manager = getInternalManager(); |
| 34 | // FL_WARN("setJsonUiHandlers: Old manager pointer=" << manager.get()); |
| 35 | |
| 36 | // Only create a new manager if one doesn't exist |
| 37 | // This prevents destroying existing components when called multiple times |
| 38 | |
| 39 | if (!manager) { |
| 40 | manager = fl::make_unique<JsonUiManager>(updateJsHandler); |
| 41 | } else { |
| 42 | manager->resetCallback(updateJsHandler); |
| 43 | } |
| 44 | |
| 45 | // Flush any pending components to the internal manager |
| 46 | auto& pending = getPendingComponents(); |
| 47 | if (!pending.empty()) { |
| 48 | // FL_WARN("Flushing " << pending.size() << " pending UI components to internal JsonUiManager"); |
| 49 | for (const auto& component : pending) { |
| 50 | // Only add components that are still valid (not destroyed) |
| 51 | if (!component.expired()) { |
| 52 | manager->addComponent(component); |
| 53 | } |
| 54 | } |
| 55 | pending.clear(); |
| 56 | } else { |
| 57 | // FL_WARN("setJsonUiHandlers: No pending components to flush"); |
| 58 | } |
| 59 | |
| 60 | // Return a function that allows updating the driver state |
| 61 | // FL_WARN("setJsonUiHandlers: Creating and returning updateEngineState lambda"); |
| 62 | auto result = fl::function<void(const char*)>([](const char* jsonStr) FL_NOEXCEPT { |
| 63 | // FL_WARN("*** updateEngineState lambda CALLED ***"); |
| 64 | // FL_WARN("*** updateEngineState lambda ENTRY: jsonStr=" << (jsonStr ? jsonStr : "nullptr")); |
| 65 | // FL_WARN("*** updateEngineState lambda JSON LENGTH: " << (jsonStr ? strlen(jsonStr) : 0)); |
| 66 | auto& manager = getInternalManager(); |
| 67 | // FL_WARN("*** updateEngineState lambda: manager pointer=" << manager.get()); |
| 68 | if (manager) { |
| 69 | // FL_WARN("*** updateEngineState lambda: manager exists, calling updateUiComponents"); |
| 70 | // FL_WARN("*** updateEngineState lambda: PASSING JSON TO MANAGER: " << (jsonStr ? jsonStr : "nullptr")); |
| 71 | manager->updateUiComponents(jsonStr); |
| 72 | // FL_WARN("*** updateEngineState lambda: updateUiComponents completed"); |
| 73 | } else { |
| 74 | FL_WARN("*** updateEngineState lambda: NO MANAGER EXISTS!"); |
| 75 | } |
| 76 | }); |
| 77 | // FL_WARN("setJsonUiHandlers: updateEngineState lambda created, returning it (is " << (result ? "VALID" : "nullptr") << ")"); |
| 78 | return result; |
| 79 | } else { |
| 80 | // No updateJs handler, clear any existing internal manager |
| 81 | auto& manager = getInternalManager(); |
| 82 | manager.reset(); // Clear the internal manager |
| 83 | return fl::function<void(const char*)>{}; |
| 84 | } |
no test coverage detected