| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- //
- // FLEXShortcut.m
- // FLEX
- //
- // Created by Tanner Bennett on 12/10/19.
- // Copyright © 2019 Flipboard. All rights reserved.
- //
- #import "FLEXShortcut.h"
- #import "FLEXProperty.h"
- #import "FLEXPropertyAttributes.h"
- #import "FLEXIvar.h"
- #import "FLEXMethod.h"
- #import "FLEXRuntime+UIKitHelpers.h"
- #import "FLEXObjectExplorerFactory.h"
- #import "FLEXFieldEditorViewController.h"
- #import "FLEXMethodCallingViewController.h"
- #import "FLEXMetadataSection.h"
- @interface FLEXShortcut () {
- id _item;
- }
- @property (nonatomic, readonly) FLEXMetadataKind metadataKind;
- @property (nonatomic, readonly) FLEXProperty *property;
- @property (nonatomic, readonly) FLEXMethod *method;
- @property (nonatomic, readonly) FLEXIvar *ivar;
- @property (nonatomic, readonly) id<FLEXRuntimeMetadata> metadata;
- @end
- @implementation FLEXShortcut
- + (id<FLEXShortcut>)shortcutFor:(id)item {
- if ([item conformsToProtocol:@protocol(FLEXShortcut)]) {
- return item;
- }
-
- FLEXShortcut *shortcut = [self new];
- shortcut->_item = item;
- if ([item isKindOfClass:[FLEXProperty class]]) {
- if (shortcut.property.isClassProperty) {
- shortcut->_metadataKind = FLEXMetadataKindClassProperties;
- } else {
- shortcut->_metadataKind = FLEXMetadataKindProperties;
- }
- }
- if ([item isKindOfClass:[FLEXIvar class]]) {
- shortcut->_metadataKind = FLEXMetadataKindIvars;
- }
- if ([item isKindOfClass:[FLEXMethod class]]) {
- // We don't care if it's a class method or not
- shortcut->_metadataKind = FLEXMetadataKindMethods;
- }
- return shortcut;
- }
- - (id)propertyOrIvarValue:(id)object {
- return [self.metadata currentValueWithTarget:object];
- }
- - (NSString *)titleWith:(id)object {
- switch (self.metadataKind) {
- case FLEXMetadataKindClassProperties:
- case FLEXMetadataKindProperties:
- // Since we're outside of the "properties" section, prepend @property for clarity.
- return [@"@property " stringByAppendingString:[_item description]];
- default:
- return [_item description];
- }
- NSAssert(
- [_item isKindOfClass:[NSString class]],
- @"Unexpected type: %@", [_item class]
- );
- return _item;
- }
- - (NSString *)subtitleWith:(id)object {
- if (self.metadataKind) {
- return [self.metadata previewWithTarget:object];
- }
- // Item is probably a string; must return empty string since
- // these will be gathered into an array. If the object is a
- // just a string, it doesn't get a subtitle.
- return @"";
- }
- - (UIViewController *)viewerWith:(id)object {
- NSAssert(self.metadataKind, @"Static titles cannot be viewed");
- return [self.metadata viewerWithTarget:object];
- }
- - (UIViewController *)editorWith:(id)object {
- NSAssert(self.metadataKind, @"Static titles cannot be edited");
- return [self.metadata editorWithTarget:object];
- }
- - (UITableViewCellAccessoryType)accessoryTypeWith:(id)object {
- if (self.metadataKind) {
- return [self.metadata suggestedAccessoryTypeWithTarget:object];
- }
- return UITableViewCellAccessoryDisclosureIndicator;
- }
- #pragma mark - Helpers
- - (FLEXProperty *)property { return _item; }
- - (FLEXMethodBase *)method { return _item; }
- - (FLEXIvar *)ivar { return _item; }
- - (id<FLEXRuntimeMetadata>)metadata { return _item; }
- @end
|