FLEXHierarchyViewController.m 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. //
  2. // FLEXHierarchyViewController.m
  3. // FLEX
  4. //
  5. // Created by Tanner Bennett on 1/9/20.
  6. // Copyright © 2020 Flipboard. All rights reserved.
  7. //
  8. #import "FLEXHierarchyViewController.h"
  9. #import "FLEXHierarchyTableViewController.h"
  10. #import "FHSViewController.h"
  11. #import "FLEXUtility.h"
  12. #import "FLEXTabList.h"
  13. typedef NS_ENUM(NSUInteger, FLEXHierarchyViewMode) {
  14. FLEXHierarchyViewModeTree = 1,
  15. FLEXHierarchyViewMode3DSnapshot
  16. };
  17. @interface FLEXHierarchyViewController ()
  18. @property (nonatomic, readonly, weak) id<FLEXHierarchyDelegate> hierarchyDelegate;
  19. @property (nonatomic, readonly) FHSViewController *snapshotViewController;
  20. @property (nonatomic, readonly) FLEXHierarchyTableViewController *treeViewController;
  21. @property (nonatomic) FLEXHierarchyViewMode mode;
  22. @property (nonatomic, readonly) UIView *selectedView;
  23. @end
  24. @implementation FLEXHierarchyViewController
  25. #pragma mark - Initialization
  26. + (instancetype)delegate:(id<FLEXHierarchyDelegate>)delegate {
  27. return [self delegate:delegate viewsAtTap:nil selectedView:nil];
  28. }
  29. + (instancetype)delegate:(id<FLEXHierarchyDelegate>)delegate
  30. viewsAtTap:(NSArray<UIView *> *)viewsAtTap
  31. selectedView:(UIView *)selectedView {
  32. return [[self alloc] initWithDelegate:delegate viewsAtTap:viewsAtTap selectedView:selectedView];
  33. }
  34. - (id)initWithDelegate:(id)delegate viewsAtTap:(NSArray<UIView *> *)viewsAtTap selectedView:(UIView *)view {
  35. self = [super init];
  36. if (self) {
  37. NSArray<UIWindow *> *allWindows = [FLEXUtility allWindows];
  38. _hierarchyDelegate = delegate;
  39. _treeViewController = [FLEXHierarchyTableViewController
  40. windows:allWindows viewsAtTap:viewsAtTap selectedView:view
  41. ];
  42. if (viewsAtTap) {
  43. _snapshotViewController = [FHSViewController snapshotViewsAtTap:viewsAtTap selectedView:view];
  44. } else {
  45. _snapshotViewController = [FHSViewController snapshotWindows:allWindows];
  46. }
  47. self.modalPresentationStyle = UIModalPresentationFullScreen;
  48. }
  49. return self;
  50. }
  51. #pragma mark - Lifecycle
  52. - (void)viewDidLoad {
  53. [super viewDidLoad];
  54. // 3D toggle button
  55. self.treeViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
  56. initWithTitle:@"3D" style:UIBarButtonItemStylePlain target:self action:@selector(toggleHierarchyMode)
  57. ];
  58. // Dismiss when tree view row is selected
  59. __weak id<FLEXHierarchyDelegate> delegate = self.hierarchyDelegate;
  60. self.treeViewController.didSelectRowAction = ^(UIView *selectedView) {
  61. [delegate viewHierarchyDidDismiss:selectedView];
  62. };
  63. // Start of in tree view
  64. _mode = FLEXHierarchyViewModeTree;
  65. [self pushViewController:self.treeViewController animated:NO];
  66. }
  67. - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
  68. // Done button: manually added here because the hierarhcy screens need to actually pass
  69. // data back to the explorer view controller so that it can highlight selected views
  70. viewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]
  71. initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(donePressed)
  72. ];
  73. [super pushViewController:viewController animated:animated];
  74. }
  75. #pragma mark - Private
  76. - (void)donePressed {
  77. // We need to manually close ourselves here because
  78. // FLEXNavigationController doesn't ever close tabs itself
  79. [FLEXTabList.sharedList closeTab:self];
  80. [self.hierarchyDelegate viewHierarchyDidDismiss:self.selectedView];
  81. }
  82. - (void)toggleHierarchyMode {
  83. switch (self.mode) {
  84. case FLEXHierarchyViewModeTree:
  85. self.mode = FLEXHierarchyViewMode3DSnapshot;
  86. break;
  87. case FLEXHierarchyViewMode3DSnapshot:
  88. self.mode = FLEXHierarchyViewModeTree;
  89. break;
  90. }
  91. }
  92. - (void)setMode:(FLEXHierarchyViewMode)mode {
  93. if (mode != _mode) {
  94. // The tree view controller is our top stack view controller, and
  95. // changing the mode simply pushes the snapshot view. In the future,
  96. // I would like to have the 3D toggle button transparently switch
  97. // between two views instead of pushing a new view controller.
  98. // This way the views should share the search controller somehow.
  99. switch (mode) {
  100. case FLEXHierarchyViewModeTree:
  101. [self popViewControllerAnimated:NO];
  102. self.toolbarHidden = YES;
  103. self.treeViewController.selectedView = self.selectedView;
  104. break;
  105. case FLEXHierarchyViewMode3DSnapshot:
  106. [self pushViewController:self.snapshotViewController animated:NO];
  107. self.toolbarHidden = NO;
  108. self.snapshotViewController.selectedView = self.selectedView;
  109. break;
  110. }
  111. // Change this last so that self.selectedView works right above
  112. _mode = mode;
  113. }
  114. }
  115. - (UIView *)selectedView {
  116. switch (self.mode) {
  117. case FLEXHierarchyViewModeTree:
  118. return self.treeViewController.selectedView;
  119. case FLEXHierarchyViewMode3DSnapshot:
  120. return self.snapshotViewController.selectedView;
  121. }
  122. }
  123. @end