diff options
author | Jay Freeman (saurik) <saurik@saurik.com> | 2014-05-12 22:37:40 -0700 |
---|---|---|
committer | Jay Freeman (saurik) <saurik@saurik.com> | 2014-05-12 22:37:40 -0700 |
commit | 5fe2bcc666ee632689fded66cca7dd523d3a2728 (patch) | |
tree | 74488b5ba23d80a7b5afabcff7ace3e82b170fe1 | |
parent | 93d811a2abe6e53522cb696d33717cadcefd3f69 (diff) |
Generalize TabBarController transients to CyteKit.
-rw-r--r-- | CyteKit/TabBarController.h | 45 | ||||
-rw-r--r-- | CyteKit/TabBarController.mm | 117 | ||||
-rw-r--r-- | MobileCydia.mm | 98 |
3 files changed, 167 insertions, 93 deletions
diff --git a/CyteKit/TabBarController.h b/CyteKit/TabBarController.h new file mode 100644 index 0000000..bd5fbb9 --- /dev/null +++ b/CyteKit/TabBarController.h @@ -0,0 +1,45 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2013 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cydia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cydia is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cydia. If not, see <http://www.gnu.org/licenses/>. +**/ +/* }}} */ + +#ifndef CyteKit_TabBarController_H +#define CyteKit_TabBarController_H + +#include <CyteKit/UCPlatform.h> +#include <CyteKit/ViewController.h> + +#include <UIKit/UIKit.h> + +#include <Menes/ObjectHandle.h> + +@interface UITabBarController (Cydia) +@end + +@interface CyteTabBarController : UITabBarController { + _transient UIViewController *transient_; + _H<UIViewController> remembered_; +} + +- (UIViewController *) unselectedViewController; +- (void) setUnselectedViewController:(UIViewController *)transient; + +@end + +#endif//CyteKit_TabBarController_H diff --git a/CyteKit/TabBarController.mm b/CyteKit/TabBarController.mm new file mode 100644 index 0000000..5f94e71 --- /dev/null +++ b/CyteKit/TabBarController.mm @@ -0,0 +1,117 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2013 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cydia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cydia is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cydia. If not, see <http://www.gnu.org/licenses/>. +**/ +/* }}} */ + +#include "CyteKit/TabBarController.h" + +#include "iPhonePrivate.h" + +@implementation UITabBarController (Cydia) + +@end + +@implementation CyteTabBarController + +- (void) didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + + // presenting a UINavigationController on 2.x does not update its transitionView + // it thereby will not allow its topViewController to be unloaded by memory pressure + if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_3_0) { + UIViewController *selected([self selectedViewController]); + for (UINavigationController *controller in [self viewControllers]) + if (controller != selected) + if (UIViewController *top = [controller topViewController]) + [top unloadView]; + } +} + +- (void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { + if ([self unselectedViewController]) + [self setUnselectedViewController:nil]; + + // presenting a UINavigationController on 2.x does not update its transitionView + // if this view was unloaded, the tranitionView may currently be presenting nothing + if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_3_0) { + UINavigationController *navigation((UINavigationController *) viewController); + [navigation pushViewController:[[[UIViewController alloc] init] autorelease] animated:NO]; + [navigation popViewControllerAnimated:NO]; + } +} + +- (void) dismissModalViewControllerAnimated:(BOOL)animated { + if ([self modalViewController] == nil && [self unselectedViewController] != nil) + [self setUnselectedViewController:nil]; + else + [super dismissModalViewControllerAnimated:YES]; +} + +- (void) setUnselectedViewController:(UIViewController *)transient { + if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_3_0) { + if (transient != nil) { + [[[self viewControllers] objectAtIndex:0] pushViewController:transient animated:YES]; + [self setSelectedIndex:0]; + } return; + } + + NSMutableArray *controllers = [[[self viewControllers] mutableCopy] autorelease]; + if (transient != nil) { + UINavigationController *navigation([[[UINavigationController alloc] init] autorelease]); + [navigation setViewControllers:[NSArray arrayWithObject:transient]]; + transient = navigation; + + if (transient_ == nil) + remembered_ = [controllers objectAtIndex:0]; + transient_ = transient; + [transient_ setTabBarItem:[remembered_ tabBarItem]]; + [controllers replaceObjectAtIndex:0 withObject:transient_]; + [self setSelectedIndex:0]; + [self setViewControllers:controllers]; + [self concealTabBarSelection]; + } else if (remembered_ != nil) { + [remembered_ setTabBarItem:[transient_ tabBarItem]]; + transient_ = transient; + [controllers replaceObjectAtIndex:0 withObject:remembered_]; + remembered_ = nil; + [self setViewControllers:controllers]; + [self revealTabBarSelection]; + } +} + +- (UIViewController *) unselectedViewController { + return transient_; +} + +- (void) unloadData { + [super unloadData]; + + for (UINavigationController *controller in [self viewControllers]) + [controller unloadData]; + + if (UIViewController *selected = [self selectedViewController]) + [selected reloadData]; + + if (UIViewController *unselected = [self unselectedViewController]) { + [unselected unloadData]; + [unselected reloadData]; + } +} + +@end diff --git a/MobileCydia.mm b/MobileCydia.mm index f5aaaf8..d959185 100644 --- a/MobileCydia.mm +++ b/MobileCydia.mm @@ -112,6 +112,7 @@ extern "C" { #include "CyteKit/IndirectDelegate.h" #include "CyteKit/PerlCompatibleRegEx.hpp" #include "CyteKit/TableViewCell.h" +#include "CyteKit/TabBarController.h" #include "CyteKit/WebScriptObject-Cyte.h" #include "CyteKit/WebViewController.h" #include "CyteKit/WebViewTableViewCell.h" @@ -6827,7 +6828,7 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi /* }}} */ /* Cydia Tab Bar Controller {{{ */ -@interface CYTabBarController : UITabBarController < +@interface CydiaTabBarController : CyteTabBarController < UITabBarControllerDelegate, ProgressDelegate > { @@ -6838,9 +6839,6 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi bool updating_; // XXX: ok, "updatedelegate_"?... _transient NSObject<CydiaDelegate> *updatedelegate_; - - _H<UIViewController> remembered_; - _transient UIViewController *transient_; } - (NSArray *) navigationURLCollection; @@ -6848,74 +6846,10 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi - (void) beginUpdate; - (void) raiseBar:(BOOL)animated; - (BOOL) updating; -- (void) unloadData; @end -@implementation CYTabBarController - -- (void) didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - - // presenting a UINavigationController on 2.x does not update its transitionView - // it thereby will not allow its topViewController to be unloaded by memory pressure - if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_3_0) { - UIViewController *selected([self selectedViewController]); - for (UINavigationController *controller in [self viewControllers]) - if (controller != selected) - if (UIViewController *top = [controller topViewController]) - [top unloadView]; - } -} - -- (void) setUnselectedViewController:(UIViewController *)transient { - if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_3_0) { - if (transient != nil) { - [[[self viewControllers] objectAtIndex:0] pushViewController:transient animated:YES]; - [self setSelectedIndex:0]; - } return; - } - - NSMutableArray *controllers = [[[self viewControllers] mutableCopy] autorelease]; - if (transient != nil) { - UINavigationController *navigation([[[UINavigationController alloc] init] autorelease]); - [navigation setViewControllers:[NSArray arrayWithObject:transient]]; - transient = navigation; - - if (transient_ == nil) - remembered_ = [controllers objectAtIndex:0]; - transient_ = transient; - [transient_ setTabBarItem:[remembered_ tabBarItem]]; - [controllers replaceObjectAtIndex:0 withObject:transient_]; - [self setSelectedIndex:0]; - [self setViewControllers:controllers]; - [self concealTabBarSelection]; - } else if (remembered_ != nil) { - [remembered_ setTabBarItem:[transient_ tabBarItem]]; - transient_ = transient; - [controllers replaceObjectAtIndex:0 withObject:remembered_]; - remembered_ = nil; - [self setViewControllers:controllers]; - [self revealTabBarSelection]; - } -} - -- (UIViewController *) unselectedViewController { - return transient_; -} - -- (void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { - if ([self unselectedViewController]) - [self setUnselectedViewController:nil]; - - // presenting a UINavigationController on 2.x does not update its transitionView - // if this view was unloaded, the tranitionView may currently be presenting nothing - if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_3_0) { - UINavigationController *navigation((UINavigationController *) viewController); - [navigation pushViewController:[[[UIViewController alloc] init] autorelease] animated:NO]; - [navigation popViewControllerAnimated:NO]; - } -} +@implementation CydiaTabBarController - (NSArray *) navigationURLCollection { NSMutableArray *items([NSMutableArray array]); @@ -6930,28 +6864,6 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi return items; } -- (void) dismissModalViewControllerAnimated:(BOOL)animated { - if ([self modalViewController] == nil && [self unselectedViewController] != nil) - [self setUnselectedViewController:nil]; - else - [super dismissModalViewControllerAnimated:YES]; -} - -- (void) unloadData { - [super unloadData]; - - for (UINavigationController *controller in [self viewControllers]) - [controller unloadData]; - - if (UIViewController *selected = [self selectedViewController]) - [selected reloadData]; - - if (UIViewController *unselected = [self unselectedViewController]) { - [unselected unloadData]; - [unselected reloadData]; - } -} - - (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; @@ -9111,7 +9023,7 @@ if (kCFCoreFoundationVersionNumber < 800) { UITabBarControllerDelegate > { _H<UIWindow> window_; - _H<CYTabBarController> tabbar_; + _H<CydiaTabBarController> tabbar_; _H<CydiaLoadingViewController> emulated_; _H<NSMutableArray> essential_; @@ -9912,7 +9824,7 @@ if (kCFCoreFoundationVersionNumber < 800) { } - (void) setupViewControllers { - tabbar_ = [[[CYTabBarController alloc] initWithDatabase:database_] autorelease]; + tabbar_ = [[[CydiaTabBarController alloc] initWithDatabase:database_] autorelease]; NSMutableArray *items; if (kCFCoreFoundationVersionNumber < 800) { |