summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Freeman (saurik) <saurik@saurik.com>2014-05-12 22:37:40 -0700
committerJay Freeman (saurik) <saurik@saurik.com>2014-05-12 22:37:40 -0700
commit5fe2bcc666ee632689fded66cca7dd523d3a2728 (patch)
tree74488b5ba23d80a7b5afabcff7ace3e82b170fe1
parent93d811a2abe6e53522cb696d33717cadcefd3f69 (diff)
Generalize TabBarController transients to CyteKit.
-rw-r--r--CyteKit/TabBarController.h45
-rw-r--r--CyteKit/TabBarController.mm117
-rw-r--r--MobileCydia.mm98
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) {