FLEXManager.m 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. //
  2. // FLEXManager.m
  3. // Flipboard
  4. //
  5. // Created by Ryan Olson on 4/4/14.
  6. // Copyright (c) 2014 Flipboard. All rights reserved.
  7. //
  8. #import "FLEXManager.h"
  9. #import "FLEXExplorerViewController.h"
  10. #import "FLEXWindow.h"
  11. #import "FLEXGlobalsTableViewControllerEntry.h"
  12. #import "FLEXObjectExplorerFactory.h"
  13. #import "FLEXObjectExplorerViewController.h"
  14. @interface FLEXManager () <FLEXWindowEventDelegate, FLEXExplorerViewControllerDelegate>
  15. @property (nonatomic, strong) FLEXWindow *explorerWindow;
  16. @property (nonatomic, strong) FLEXExplorerViewController *explorerViewController;
  17. @property (nonatomic, readonly, strong) NSMutableArray *userGlobalEntries;
  18. @end
  19. @implementation FLEXManager
  20. + (instancetype)sharedManager
  21. {
  22. static FLEXManager *sharedManager = nil;
  23. static dispatch_once_t onceToken;
  24. dispatch_once(&onceToken, ^{
  25. sharedManager = [[[self class] alloc] init];
  26. });
  27. return sharedManager;
  28. }
  29. - (instancetype)init
  30. {
  31. self = [super init];
  32. if (self) {
  33. _userGlobalEntries = [[NSMutableArray alloc] init];
  34. }
  35. return self;
  36. }
  37. - (FLEXWindow *)explorerWindow
  38. {
  39. NSAssert([NSThread isMainThread], @"You must use %@ from the main thread only.", NSStringFromClass([self class]));
  40. if (!_explorerWindow) {
  41. _explorerWindow = [[FLEXWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  42. _explorerWindow.eventDelegate = self;
  43. _explorerWindow.rootViewController = self.explorerViewController;
  44. }
  45. return _explorerWindow;
  46. }
  47. - (FLEXExplorerViewController *)explorerViewController
  48. {
  49. if (!_explorerViewController) {
  50. _explorerViewController = [[FLEXExplorerViewController alloc] init];
  51. _explorerViewController.delegate = self;
  52. }
  53. return _explorerViewController;
  54. }
  55. - (void)showExplorer
  56. {
  57. self.explorerWindow.hidden = NO;
  58. }
  59. - (void)hideExplorer
  60. {
  61. self.explorerWindow.hidden = YES;
  62. }
  63. - (BOOL)isHidden
  64. {
  65. return self.explorerWindow.isHidden;
  66. }
  67. #pragma mark - FLEXWindowEventDelegate
  68. - (BOOL)shouldHandleTouchAtPoint:(CGPoint)pointInWindow
  69. {
  70. // Ask the explorer view controller
  71. return [self.explorerViewController shouldReceiveTouchAtWindowPoint:pointInWindow];
  72. }
  73. #pragma mark - FLEXExplorerViewControllerDelegate
  74. - (void)explorerViewControllerDidFinish:(FLEXExplorerViewController *)explorerViewController
  75. {
  76. [self hideExplorer];
  77. }
  78. #pragma mark - Extensions
  79. - (void)registerGlobalEntryWithName:(NSString *)entryName objectFutureBlock:(id (^)(void))objectFutureBlock
  80. {
  81. NSParameterAssert(entryName);
  82. NSParameterAssert(objectFutureBlock);
  83. NSAssert([NSThread isMainThread], @"This method must be called from the main thread.");
  84. entryName = entryName.copy;
  85. FLEXGlobalsTableViewControllerEntry *entry = [FLEXGlobalsTableViewControllerEntry entryWithNameFuture:^NSString *{
  86. return entryName;
  87. } viewControllerFuture:^UIViewController *{
  88. return [FLEXObjectExplorerFactory explorerViewControllerForObject:objectFutureBlock()];
  89. }];
  90. [self.userGlobalEntries addObject:entry];
  91. }
  92. @end