mirror of
https://github.com/SoPat712/YTLitePlus.git
synced 2025-08-25 03:48:51 -04:00
added files via upload
This commit is contained in:
243
Tweaks/FLEX/ObjectExplorers/FLEXObjectExplorerFactory.m
Normal file
243
Tweaks/FLEX/ObjectExplorers/FLEXObjectExplorerFactory.m
Normal file
@@ -0,0 +1,243 @@
|
||||
//
|
||||
// FLEXObjectExplorerFactory.m
|
||||
// Flipboard
|
||||
//
|
||||
// Created by Ryan Olson on 5/15/14.
|
||||
// Copyright (c) 2020 FLEX Team. All rights reserved.
|
||||
//
|
||||
|
||||
#import "FLEXObjectExplorerFactory.h"
|
||||
#import "FLEXGlobalsViewController.h"
|
||||
#import "FLEXClassShortcuts.h"
|
||||
#import "FLEXViewShortcuts.h"
|
||||
#import "FLEXViewControllerShortcuts.h"
|
||||
#import "FLEXUIAppShortcuts.h"
|
||||
#import "FLEXImageShortcuts.h"
|
||||
#import "FLEXLayerShortcuts.h"
|
||||
#import "FLEXColorPreviewSection.h"
|
||||
#import "FLEXDefaultsContentSection.h"
|
||||
#import "FLEXBundleShortcuts.h"
|
||||
#import "FLEXNSStringShortcuts.h"
|
||||
#import "FLEXNSDataShortcuts.h"
|
||||
#import "FLEXBlockShortcuts.h"
|
||||
#import "FLEXUtility.h"
|
||||
|
||||
@implementation FLEXObjectExplorerFactory
|
||||
static NSMutableDictionary<id<NSCopying>, Class> *classesToRegisteredSections = nil;
|
||||
|
||||
+ (void)initialize {
|
||||
if (self == [FLEXObjectExplorerFactory class]) {
|
||||
// DO NOT USE STRING KEYS HERE
|
||||
// We NEED to use the class as a key, because we CANNOT
|
||||
// differentiate a class's name from the metaclass's name.
|
||||
// These mappings are per-class-object, not per-class-name.
|
||||
//
|
||||
// For example, if we used class names, this would result in
|
||||
// the object explorer trying to render a color preview for
|
||||
// the UIColor class object, which is not a color itself.
|
||||
#define ClassKey(name) (id<NSCopying>)[name class]
|
||||
#define ClassKeyByName(str) (id<NSCopying>)NSClassFromString(@ #str)
|
||||
#define MetaclassKey(meta) (id<NSCopying>)object_getClass([meta class])
|
||||
classesToRegisteredSections = [NSMutableDictionary dictionaryWithDictionary:@{
|
||||
MetaclassKey(NSObject) : [FLEXClassShortcuts class],
|
||||
ClassKey(NSArray) : [FLEXCollectionContentSection class],
|
||||
ClassKey(NSSet) : [FLEXCollectionContentSection class],
|
||||
ClassKey(NSDictionary) : [FLEXCollectionContentSection class],
|
||||
ClassKey(NSOrderedSet) : [FLEXCollectionContentSection class],
|
||||
ClassKey(NSUserDefaults) : [FLEXDefaultsContentSection class],
|
||||
ClassKey(UIViewController) : [FLEXViewControllerShortcuts class],
|
||||
ClassKey(UIApplication) : [FLEXUIAppShortcuts class],
|
||||
ClassKey(UIView) : [FLEXViewShortcuts class],
|
||||
ClassKey(UIImage) : [FLEXImageShortcuts class],
|
||||
ClassKey(CALayer) : [FLEXLayerShortcuts class],
|
||||
ClassKey(UIColor) : [FLEXColorPreviewSection class],
|
||||
ClassKey(NSBundle) : [FLEXBundleShortcuts class],
|
||||
ClassKey(NSString) : [FLEXNSStringShortcuts class],
|
||||
ClassKey(NSData) : [FLEXNSDataShortcuts class],
|
||||
ClassKeyByName(NSBlock) : [FLEXBlockShortcuts class],
|
||||
}];
|
||||
#undef ClassKey
|
||||
#undef ClassKeyByName
|
||||
#undef MetaclassKey
|
||||
}
|
||||
}
|
||||
|
||||
+ (FLEXObjectExplorerViewController *)explorerViewControllerForObject:(id)object {
|
||||
// Can't explore nil
|
||||
if (!object) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
// If we're given an object, this will look up it's class hierarchy
|
||||
// until it finds a registration. This will work for KVC classes,
|
||||
// since they are children of the original class, and not siblings.
|
||||
// If we are given an object, object_getClass will return a metaclass,
|
||||
// and the same thing will happen. FLEXClassShortcuts is the default
|
||||
// shortcut section for NSObject.
|
||||
//
|
||||
// TODO: rename it to FLEXNSObjectShortcuts or something?
|
||||
FLEXShortcutsSection *shortcutsSection = [FLEXShortcutsSection forObject:object];
|
||||
NSArray *sections = @[shortcutsSection];
|
||||
|
||||
Class customSectionClass = nil;
|
||||
Class cls = object_getClass(object);
|
||||
do {
|
||||
customSectionClass = classesToRegisteredSections[(id<NSCopying>)cls];
|
||||
} while (!customSectionClass && (cls = [cls superclass]));
|
||||
|
||||
if (customSectionClass) {
|
||||
id customSection = [customSectionClass forObject:object];
|
||||
BOOL isFLEXShortcutSection = [customSection respondsToSelector:@selector(isNewSection)];
|
||||
|
||||
// If the section "replaces" the default shortcuts section,
|
||||
// only return that section. Otherwise, return both this
|
||||
// section and the default shortcuts section.
|
||||
if (isFLEXShortcutSection && ![customSection isNewSection]) {
|
||||
sections = @[customSection];
|
||||
} else {
|
||||
// Custom section will go before shortcuts
|
||||
sections = @[customSection, shortcutsSection];
|
||||
}
|
||||
}
|
||||
|
||||
return [FLEXObjectExplorerViewController
|
||||
exploringObject:object
|
||||
customSections:sections
|
||||
];
|
||||
}
|
||||
|
||||
+ (void)registerExplorerSection:(Class)explorerClass forClass:(Class)objectClass {
|
||||
classesToRegisteredSections[(id<NSCopying>)objectClass] = explorerClass;
|
||||
}
|
||||
|
||||
#pragma mark - FLEXGlobalsEntry
|
||||
|
||||
+ (NSString *)globalsEntryTitle:(FLEXGlobalsRow)row {
|
||||
switch (row) {
|
||||
case FLEXGlobalsRowAppDelegate:
|
||||
return @"🎟 App Delegate";
|
||||
case FLEXGlobalsRowKeyWindow:
|
||||
return @"🔑 Key Window";
|
||||
case FLEXGlobalsRowRootViewController:
|
||||
return @"🌴 Root View Controller";
|
||||
case FLEXGlobalsRowProcessInfo:
|
||||
return @"🚦 NSProcessInfo.processInfo";
|
||||
case FLEXGlobalsRowUserDefaults:
|
||||
return @"💾 Preferences";
|
||||
case FLEXGlobalsRowMainBundle:
|
||||
return @"📦 NSBundle.mainBundle";
|
||||
case FLEXGlobalsRowApplication:
|
||||
return @"🚀 UIApplication.sharedApplication";
|
||||
case FLEXGlobalsRowMainScreen:
|
||||
return @"💻 UIScreen.mainScreen";
|
||||
case FLEXGlobalsRowCurrentDevice:
|
||||
return @"📱 UIDevice.currentDevice";
|
||||
case FLEXGlobalsRowPasteboard:
|
||||
return @"📋 UIPasteboard.generalPasteboard";
|
||||
case FLEXGlobalsRowURLSession:
|
||||
return @"📡 NSURLSession.sharedSession";
|
||||
case FLEXGlobalsRowURLCache:
|
||||
return @"⏳ NSURLCache.sharedURLCache";
|
||||
case FLEXGlobalsRowNotificationCenter:
|
||||
return @"🔔 NSNotificationCenter.defaultCenter";
|
||||
case FLEXGlobalsRowMenuController:
|
||||
return @"📎 UIMenuController.sharedMenuController";
|
||||
case FLEXGlobalsRowFileManager:
|
||||
return @"🗄 NSFileManager.defaultManager";
|
||||
case FLEXGlobalsRowTimeZone:
|
||||
return @"🌎 NSTimeZone.systemTimeZone";
|
||||
case FLEXGlobalsRowLocale:
|
||||
return @"🗣 NSLocale.currentLocale";
|
||||
case FLEXGlobalsRowCalendar:
|
||||
return @"📅 NSCalendar.currentCalendar";
|
||||
case FLEXGlobalsRowMainRunLoop:
|
||||
return @"🏃🏻♂️ NSRunLoop.mainRunLoop";
|
||||
case FLEXGlobalsRowMainThread:
|
||||
return @"🧵 NSThread.mainThread";
|
||||
case FLEXGlobalsRowOperationQueue:
|
||||
return @"📚 NSOperationQueue.mainQueue";
|
||||
default: return nil;
|
||||
}
|
||||
}
|
||||
|
||||
+ (UIViewController *)globalsEntryViewController:(FLEXGlobalsRow)row {
|
||||
switch (row) {
|
||||
case FLEXGlobalsRowAppDelegate: {
|
||||
id<UIApplicationDelegate> appDelegate = UIApplication.sharedApplication.delegate;
|
||||
return [self explorerViewControllerForObject:appDelegate];
|
||||
}
|
||||
case FLEXGlobalsRowProcessInfo:
|
||||
return [self explorerViewControllerForObject:NSProcessInfo.processInfo];
|
||||
case FLEXGlobalsRowUserDefaults:
|
||||
return [self explorerViewControllerForObject:NSUserDefaults.standardUserDefaults];
|
||||
case FLEXGlobalsRowMainBundle:
|
||||
return [self explorerViewControllerForObject:NSBundle.mainBundle];
|
||||
case FLEXGlobalsRowApplication:
|
||||
return [self explorerViewControllerForObject:UIApplication.sharedApplication];
|
||||
case FLEXGlobalsRowMainScreen:
|
||||
return [self explorerViewControllerForObject:UIScreen.mainScreen];
|
||||
case FLEXGlobalsRowCurrentDevice:
|
||||
return [self explorerViewControllerForObject:UIDevice.currentDevice];
|
||||
case FLEXGlobalsRowPasteboard:
|
||||
return [self explorerViewControllerForObject:UIPasteboard.generalPasteboard];
|
||||
case FLEXGlobalsRowURLSession:
|
||||
return [self explorerViewControllerForObject:NSURLSession.sharedSession];
|
||||
case FLEXGlobalsRowURLCache:
|
||||
return [self explorerViewControllerForObject:NSURLCache.sharedURLCache];
|
||||
case FLEXGlobalsRowNotificationCenter:
|
||||
return [self explorerViewControllerForObject:NSNotificationCenter.defaultCenter];
|
||||
case FLEXGlobalsRowMenuController:
|
||||
return [self explorerViewControllerForObject:UIMenuController.sharedMenuController];
|
||||
case FLEXGlobalsRowFileManager:
|
||||
return [self explorerViewControllerForObject:NSFileManager.defaultManager];
|
||||
case FLEXGlobalsRowTimeZone:
|
||||
return [self explorerViewControllerForObject:NSTimeZone.systemTimeZone];
|
||||
case FLEXGlobalsRowLocale:
|
||||
return [self explorerViewControllerForObject:NSLocale.currentLocale];
|
||||
case FLEXGlobalsRowCalendar:
|
||||
return [self explorerViewControllerForObject:NSCalendar.currentCalendar];
|
||||
case FLEXGlobalsRowMainRunLoop:
|
||||
return [self explorerViewControllerForObject:NSRunLoop.mainRunLoop];
|
||||
case FLEXGlobalsRowMainThread:
|
||||
return [self explorerViewControllerForObject:NSThread.mainThread];
|
||||
case FLEXGlobalsRowOperationQueue:
|
||||
return [self explorerViewControllerForObject:NSOperationQueue.mainQueue];
|
||||
|
||||
case FLEXGlobalsRowKeyWindow:
|
||||
return [FLEXObjectExplorerFactory
|
||||
explorerViewControllerForObject:FLEXUtility.appKeyWindow
|
||||
];
|
||||
case FLEXGlobalsRowRootViewController: {
|
||||
id<UIApplicationDelegate> delegate = UIApplication.sharedApplication.delegate;
|
||||
if ([delegate respondsToSelector:@selector(window)]) {
|
||||
return [self explorerViewControllerForObject:delegate.window.rootViewController];
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
default: return nil;
|
||||
}
|
||||
}
|
||||
|
||||
+ (FLEXGlobalsEntryRowAction)globalsEntryRowAction:(FLEXGlobalsRow)row {
|
||||
switch (row) {
|
||||
case FLEXGlobalsRowRootViewController: {
|
||||
// Check if the app delegate responds to -window. If not, present an alert
|
||||
return ^(UITableViewController *host) {
|
||||
id<UIApplicationDelegate> delegate = UIApplication.sharedApplication.delegate;
|
||||
if ([delegate respondsToSelector:@selector(window)]) {
|
||||
UIViewController *explorer = [self explorerViewControllerForObject:
|
||||
delegate.window.rootViewController
|
||||
];
|
||||
[host.navigationController pushViewController:explorer animated:YES];
|
||||
} else {
|
||||
NSString *msg = @"The app delegate doesn't respond to -window";
|
||||
[FLEXAlert showAlert:@":(" message:msg from:host];
|
||||
}
|
||||
};
|
||||
}
|
||||
default: return nil;
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
Reference in New Issue
Block a user