mirror of
https://github.com/SoPat712/YTLitePlus.git
synced 2025-08-24 03:26:09 -04:00
155 lines
5.2 KiB
Objective-C
155 lines
5.2 KiB
Objective-C
//
|
|
// FLEXHierarchyViewController.m
|
|
// FLEX
|
|
//
|
|
// Created by Tanner Bennett on 1/9/20.
|
|
// Copyright © 2020 FLEX Team. All rights reserved.
|
|
//
|
|
|
|
#import "FLEXHierarchyViewController.h"
|
|
#import "FLEXHierarchyTableViewController.h"
|
|
#import "FHSViewController.h"
|
|
#import "FLEXUtility.h"
|
|
#import "FLEXTabList.h"
|
|
#import "FLEXResources.h"
|
|
#import "UIBarButtonItem+FLEX.h"
|
|
|
|
typedef NS_ENUM(NSUInteger, FLEXHierarchyViewMode) {
|
|
FLEXHierarchyViewModeTree = 1,
|
|
FLEXHierarchyViewMode3DSnapshot
|
|
};
|
|
|
|
@interface FLEXHierarchyViewController ()
|
|
@property (nonatomic, readonly, weak) id<FLEXHierarchyDelegate> hierarchyDelegate;
|
|
@property (nonatomic, readonly) FHSViewController *snapshotViewController;
|
|
@property (nonatomic, readonly) FLEXHierarchyTableViewController *treeViewController;
|
|
|
|
@property (nonatomic) FLEXHierarchyViewMode mode;
|
|
|
|
@property (nonatomic, readonly) UIView *selectedView;
|
|
@end
|
|
|
|
@implementation FLEXHierarchyViewController
|
|
|
|
#pragma mark - Initialization
|
|
|
|
+ (instancetype)delegate:(id<FLEXHierarchyDelegate>)delegate {
|
|
return [self delegate:delegate viewsAtTap:nil selectedView:nil];
|
|
}
|
|
|
|
+ (instancetype)delegate:(id<FLEXHierarchyDelegate>)delegate
|
|
viewsAtTap:(NSArray<UIView *> *)viewsAtTap
|
|
selectedView:(UIView *)selectedView {
|
|
return [[self alloc] initWithDelegate:delegate viewsAtTap:viewsAtTap selectedView:selectedView];
|
|
}
|
|
|
|
- (id)initWithDelegate:(id)delegate viewsAtTap:(NSArray<UIView *> *)viewsAtTap selectedView:(UIView *)view {
|
|
self = [super init];
|
|
if (self) {
|
|
NSArray<UIWindow *> *allWindows = FLEXUtility.allWindows;
|
|
_hierarchyDelegate = delegate;
|
|
_treeViewController = [FLEXHierarchyTableViewController
|
|
windows:allWindows viewsAtTap:viewsAtTap selectedView:view
|
|
];
|
|
|
|
if (viewsAtTap) {
|
|
_snapshotViewController = [FHSViewController snapshotViewsAtTap:viewsAtTap selectedView:view];
|
|
} else {
|
|
_snapshotViewController = [FHSViewController snapshotWindows:allWindows];
|
|
}
|
|
|
|
self.modalPresentationStyle = UIModalPresentationFullScreen;
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
|
|
#pragma mark - Lifecycle
|
|
|
|
- (void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
|
|
// 3D toggle button
|
|
self.treeViewController.navigationItem.leftBarButtonItem = [UIBarButtonItem
|
|
flex_itemWithImage:FLEXResources.toggle3DIcon target:self action:@selector(toggleHierarchyMode)
|
|
];
|
|
|
|
// Dismiss when tree view row is selected
|
|
__weak id<FLEXHierarchyDelegate> delegate = self.hierarchyDelegate;
|
|
self.treeViewController.didSelectRowAction = ^(UIView *selectedView) {
|
|
[delegate viewHierarchyDidDismiss:selectedView];
|
|
};
|
|
|
|
// Start of in tree view
|
|
_mode = FLEXHierarchyViewModeTree;
|
|
[self pushViewController:self.treeViewController animated:NO];
|
|
}
|
|
|
|
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
|
|
// Done button: manually added here because the hierarhcy screens need to actually pass
|
|
// data back to the explorer view controller so that it can highlight selected views
|
|
viewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]
|
|
initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(donePressed)
|
|
];
|
|
|
|
[super pushViewController:viewController animated:animated];
|
|
}
|
|
|
|
|
|
#pragma mark - Private
|
|
|
|
- (void)donePressed {
|
|
// We need to manually close ourselves here because
|
|
// FLEXNavigationController doesn't ever close tabs itself
|
|
[FLEXTabList.sharedList closeTab:self];
|
|
[self.hierarchyDelegate viewHierarchyDidDismiss:self.selectedView];
|
|
}
|
|
|
|
- (void)toggleHierarchyMode {
|
|
switch (self.mode) {
|
|
case FLEXHierarchyViewModeTree:
|
|
self.mode = FLEXHierarchyViewMode3DSnapshot;
|
|
break;
|
|
case FLEXHierarchyViewMode3DSnapshot:
|
|
self.mode = FLEXHierarchyViewModeTree;
|
|
break;
|
|
}
|
|
}
|
|
|
|
- (void)setMode:(FLEXHierarchyViewMode)mode {
|
|
if (mode != _mode) {
|
|
// The tree view controller is our top stack view controller, and
|
|
// changing the mode simply pushes the snapshot view. In the future,
|
|
// I would like to have the 3D toggle button transparently switch
|
|
// between two views instead of pushing a new view controller.
|
|
// This way the views should share the search controller somehow.
|
|
switch (mode) {
|
|
case FLEXHierarchyViewModeTree:
|
|
[self popViewControllerAnimated:NO];
|
|
self.toolbarHidden = YES;
|
|
self.treeViewController.selectedView = self.selectedView;
|
|
break;
|
|
case FLEXHierarchyViewMode3DSnapshot:
|
|
[self pushViewController:self.snapshotViewController animated:NO];
|
|
self.toolbarHidden = NO;
|
|
self.snapshotViewController.selectedView = self.selectedView;
|
|
break;
|
|
}
|
|
|
|
// Change this last so that self.selectedView works right above
|
|
_mode = mode;
|
|
}
|
|
}
|
|
|
|
- (UIView *)selectedView {
|
|
switch (self.mode) {
|
|
case FLEXHierarchyViewModeTree:
|
|
return self.treeViewController.selectedView;
|
|
case FLEXHierarchyViewMode3DSnapshot:
|
|
return self.snapshotViewController.selectedView;
|
|
}
|
|
}
|
|
|
|
@end
|