diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.h b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.h index 27a858917..f0135f410 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.h +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.h @@ -11,10 +11,20 @@ @class SKComponentLayoutWrapper; +typedef SKNamed* (*SKAttributeGenerator)(SKComponentLayoutWrapper* node); + @interface SKComponentLayoutDescriptor : SKNodeDescriptor + (void)registerSubDescriptor:(SKSubDescriptor)descriptor forName:(NSString*)name; +/** + Allows you to 'plug-in' additional logic to update the attribute + string displayed for a node. + + You can return a `nil` object from this, it will be gracefully ignored. + */ ++ (void)registerAttributeGenerator:(SKAttributeGenerator)generator; + @end diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm index bce835eb9..2aa4dfff5 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm @@ -41,6 +41,18 @@ static std::vector>& subDescriptors() { return d; } +static std::vector& attributeGenerators() { + // Avoid a global constructor; we want to lazily initialize this when needed. + static std::vector d; + return d; +} + ++ (void)registerAttributeGenerator:(SKAttributeGenerator)generator { + if (generator) { + attributeGenerators().push_back(generator); + } +} + + (void)registerSubDescriptor:(SKSubDescriptor)descriptor forName:(NSString*)name { if (name && descriptor) { @@ -170,6 +182,17 @@ static std::vector>& subDescriptors() { newWithName:@"responder" withValue:SKObject(NSStringFromClass( [node.component.nextResponder class]))]]; + for (SKAttributeGenerator generator : attributeGenerators()) { + if (!generator) { + // technically, this could be nullptr, so lets be careful. + continue; + } + + SKNamed* const attribute = generator(node); + if (attribute) { + [attributes addObject:attribute]; + } + } return attributes; }