1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-03 09:57:46 +01:00
Telegram/Telegraph/TGRootController.m
2016-02-25 01:03:51 +01:00

313 lines
11 KiB
Objective-C

#import "TGRootController.h"
#import "TGAppDelegate.h"
#import "TGImageUtils.h"
#import "TGTabletMainView.h"
#import "TGNavigationController.h"
#import "TGDialogListController.h"
#import "TGTelegraphDialogListCompanion.h"
#import "TGContactsController.h"
#import "TGAccountSettingsController.h"
#import "TGMainTabsController.h"
#import "TGKeyCommand.h"
@interface TGRootController ()
{
TGTabletMainView *_mainView;
TGNavigationController *_masterNavigationController;
TGNavigationController *_detailNavigationController;
UIUserInterfaceSizeClass _currentSizeClass;
SVariable *_sizeClassVariable;
}
@end
@implementation TGRootController
- (instancetype)init
{
self = [super init];
if (self != nil)
{
[self setNavigationBarHidden:true animated:false];
self.automaticallyManageScrollViewInsets = false;
TGTelegraphDialogListCompanion *dialogListCompanion = [[TGTelegraphDialogListCompanion alloc] init];
dialogListCompanion.showBroadcastsMenu = true;
_dialogListController = [[TGDialogListController alloc] initWithCompanion:dialogListCompanion];
_contactsController = [[TGContactsController alloc] initWithContactsMode:TGContactsModeMainContacts | TGContactsModeRegistered | TGContactsModePhonebook | TGContactsModeSortByLastSeen];
_accountSettingsController = [[TGAccountSettingsController alloc] initWithUid:0];
_mainTabsController = [[TGMainTabsController alloc] init];
[_mainTabsController setViewControllers:[NSArray arrayWithObjects:_contactsController, _dialogListController, _accountSettingsController, nil]];
[_mainTabsController setSelectedIndex:1];
_masterNavigationController = [TGNavigationController navigationControllerWithControllers:@[]];
_detailNavigationController = [TGNavigationController navigationControllerWithControllers:@[]];
[_detailNavigationController setDisplayPlayer:true];
if (iosMajorVersion() >= 8)
{
_currentSizeClass = UIUserInterfaceSizeClassCompact;
}
else
{
switch ([UIDevice currentDevice].userInterfaceIdiom)
{
case UIUserInterfaceIdiomPad:
_currentSizeClass = UIUserInterfaceSizeClassRegular;
break;
default:
_currentSizeClass = UIUserInterfaceSizeClassCompact;
break;
}
}
_sizeClassVariable = [[SVariable alloc] init];
[_sizeClassVariable set:[SSignal single:@(_currentSizeClass)]];
}
return self;
}
- (bool)shouldAutorotate {
return [(UIViewController *)[self viewControllers].lastObject shouldAutorotate];
}
- (void)loadView
{
[super loadView];
self.view.backgroundColor = UIColorRGBA(0xf2f2f5, 1.0f);
_mainView = [[TGTabletMainView alloc] initWithFrame:self.view.bounds];
_mainView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view addSubview:_mainView];
[self updateSizeClass];
if (_masterNavigationController.viewControllers.count != 0) {
[self addMasterController];
}
if (_detailNavigationController.viewControllers.count != 0) {
[self addDetailController];
}
}
- (void)pushContentController:(UIViewController *)contentController {
if (_detailNavigationController.viewControllers.count == 0) {
[_detailNavigationController setViewControllers:@[contentController] animated:false];
[self addDetailController];
} else {
[_detailNavigationController pushViewController:contentController animated:true];
}
}
- (void)replaceContentController:(UIViewController *)contentController {
if (_currentSizeClass == UIUserInterfaceSizeClassCompact) {
bool addDetail = _detailNavigationController.viewControllers.count == 0;
[_detailNavigationController setViewControllers:@[_mainTabsController, contentController] animated:true];
if (addDetail) {
[self addDetailController];
}
} else {
bool addDetail = _detailNavigationController.viewControllers.count == 0;
[_detailNavigationController setViewControllers:@[contentController] animated:false];
if (addDetail) {
[self addDetailController];
}
}
}
- (void)popToContentController:(UIViewController *)contentController {
[_detailNavigationController popToViewController:contentController animated:true];
}
- (void)clearContentControllers {
if (_currentSizeClass == UIUserInterfaceSizeClassCompact) {
[_detailNavigationController popToRootViewControllerAnimated:true];
} else if (_detailNavigationController.viewControllers.count != 0) {
[_detailNavigationController setViewControllers:@[] animated:false];
[self removeDetailController];
}
}
- (NSArray *)viewControllers {
return [_masterNavigationController.viewControllers arrayByAddingObjectsFromArray:_detailNavigationController.viewControllers];
}
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];
if (_currentSizeClass != self.traitCollection.horizontalSizeClass && [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) {
_currentSizeClass = self.traitCollection.horizontalSizeClass;
[self updateSizeClass];
[_sizeClassVariable set:[SSignal single:@(_currentSizeClass)]];
}
}
- (void)updateSizeClass {
if (_currentSizeClass == UIUserInterfaceSizeClassCompact) {
[self removeMasterController];
NSMutableArray *viewControllers = [[NSMutableArray alloc] init];
if (_masterNavigationController.viewControllers.count != 0) {
[viewControllers addObject:_masterNavigationController.viewControllers[0]];
} else {
[viewControllers addObject:_mainTabsController];
}
for (UIViewController *controller in _detailNavigationController.viewControllers) {
if (![viewControllers containsObject:controller]) {
[viewControllers addObject:controller];
}
}
if (_masterNavigationController.viewControllers.count > 1) {
for (NSUInteger i = 1; i < _masterNavigationController.viewControllers.count - 1; i++) {
[viewControllers addObject:_masterNavigationController.viewControllers[i]];
}
}
[_masterNavigationController setViewControllers:@[] animated:false];
for (UIViewController *controller in [[NSArray alloc] initWithArray:_masterNavigationController.viewControllers]) {
[controller willMoveToParentViewController:nil];
[controller.view removeFromSuperview];
[controller removeFromParentViewController];
[controller didMoveToParentViewController:nil];
}
bool addDetail = _detailNavigationController.viewControllers.count == 0;
[_detailNavigationController setViewControllers:viewControllers animated:false];
if (addDetail) {
[self addDetailController];
}
[_mainView setFullScreenDetail:true];
} else {
[_mainTabsController willMoveToParentViewController:nil];
[_mainTabsController.view removeFromSuperview];
[_mainTabsController removeFromParentViewController];
[_mainTabsController didMoveToParentViewController:nil];
NSMutableArray *viewControllers = [[NSMutableArray alloc] initWithArray:_detailNavigationController.viewControllers];
[viewControllers removeObject:_mainTabsController];
[_detailNavigationController setViewControllers:viewControllers animated:false];
[_masterNavigationController setViewControllers:@[_mainTabsController] animated:false];
if (_masterNavigationController.viewControllers.count != 0) {
[self addMasterController];
}
if (_detailNavigationController.viewControllers.count == 0) {
[self removeDetailController];
} else {
[self addDetailController];
}
[_mainView setFullScreenDetail:false];
}
}
- (void)localizationUpdated {
[_mainTabsController localizationUpdated];
}
- (void)removeDetailController {
if (_detailNavigationController.parentViewController != nil) {
[_detailNavigationController willMoveToParentViewController:nil];
[_detailNavigationController removeFromParentViewController];
[_mainView setDetailView:nil];
[_detailNavigationController didMoveToParentViewController:nil];
}
}
- (void)addDetailController {
if (_detailNavigationController.parentViewController != self) {
[_detailNavigationController willMoveToParentViewController:self];
[self addChildViewController:_detailNavigationController];
[_mainView setDetailView:_detailNavigationController.view];
[_detailNavigationController didMoveToParentViewController:self];
}
}
- (void)removeMasterController {
if (_masterNavigationController.parentViewController != nil) {
[_masterNavigationController willMoveToParentViewController:nil];
[_masterNavigationController removeFromParentViewController];
[_mainView setMasterView:nil];
[_masterNavigationController didMoveToParentViewController:nil];
}
}
- (void)addMasterController {
if (_masterNavigationController.parentViewController != self) {
[_masterNavigationController willMoveToParentViewController:self];
[self addChildViewController:_masterNavigationController];
[_mainView setMasterView:_masterNavigationController.view];
[_masterNavigationController didMoveToParentViewController:self];
}
}
- (SSignal *)sizeClass {
return [_sizeClassVariable signal];
}
- (bool)isSplitView {
if (iosMajorVersion() < 9 || [UIDevice currentDevice].userInterfaceIdiom != UIUserInterfaceIdiomPad)
return false;
if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact)
return true;
if (fabs(self.view.frame.size.width - [UIScreen mainScreen].bounds.size.width) > FLT_EPSILON)
return true;
return false;
}
- (CGRect)applicationBounds {
CGSize screenSize = TGScreenSize();
CGFloat min = MIN(screenSize.width, screenSize.height);
CGFloat max = MAX(screenSize.width, screenSize.height);
CGSize size = CGSizeZero;
CGSize (^sizeByDeviceOrientation)(void) = ^CGSize {
if (UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation))
return CGSizeMake(min, max);
else
return CGSizeMake(max, min);
};
if (![self isSplitView])
size = sizeByDeviceOrientation();
else
size = self.view.frame.size;
return (CGRect){ CGPointZero, size };
}
- (UIUserInterfaceSizeClass)currentSizeClass {
return _currentSizeClass;
}
- (bool)isRTL {
static bool value = false;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (iosMajorVersion() >= 9) {
value = [UIView userInterfaceLayoutDirectionForSemanticContentAttribute:[self.view semanticContentAttribute]] == UIUserInterfaceLayoutDirectionRightToLeft;
}
});
return value;
}
@end