Add ability to register additional attribute providers.
Summary: We have some "internal-only" stuff we want to put in the attribute of a layout node. This allows us to do so a way that keeps it out of open-source and avoid the clunky subclassing. Reviewed By: adamjernst Differential Revision: D24162047 fbshipit-source-id: 518ab9fbf0b4274076f5b0ae1b249e197563fa7f
This commit is contained in:
committed by
Facebook GitHub Bot
parent
2b6bac4227
commit
7711502413
@@ -11,10 +11,20 @@
|
||||
|
||||
@class SKComponentLayoutWrapper;
|
||||
|
||||
typedef SKNamed* (*SKAttributeGenerator)(SKComponentLayoutWrapper* node);
|
||||
|
||||
@interface SKComponentLayoutDescriptor
|
||||
: SKNodeDescriptor<SKComponentLayoutWrapper*>
|
||||
|
||||
+ (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
|
||||
|
||||
@@ -41,6 +41,18 @@ static std::vector<std::pair<NSString*, SKSubDescriptor>>& subDescriptors() {
|
||||
return d;
|
||||
}
|
||||
|
||||
static std::vector<SKAttributeGenerator>& attributeGenerators() {
|
||||
// Avoid a global constructor; we want to lazily initialize this when needed.
|
||||
static std::vector<SKAttributeGenerator> 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<std::pair<NSString*, SKSubDescriptor>>& 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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user