]> git.saurik.com Git - cydia.git/commitdiff
Merge commit :(. Bring in my work on URLs and UITabBarController into one functioning...
authorGrant Paul <chpwn@chpwn.com>
Sun, 23 Jan 2011 00:10:09 +0000 (16:10 -0800)
committerGrant Paul <chpwn@chpwn.com>
Sun, 23 Jan 2011 00:10:09 +0000 (16:10 -0800)
 - Queueing badges and controllers work.
 - As far as I can tell, no broken URLs on Cydia pages.
   - There might still be one the website, but that's not under my control.
 - Lazy loads tabs again, but also doesn't reload the home page when switching back to it (yay!).
 - Adds "Show Pacakge Settings" duplicated text as a section header on the PackageSettingsController, for asthetic reasons.
 - Popups are *still* broken, and I still don't know why.

1  2 
MobileCydia.app/package.js
MobileCydia.mm

index 2eaeb4a685a4ec4ecec19353f23cf74d618b9dce,2eaeb4a685a4ec4ecec19353f23cf74d618b9dce..0e2566bd0e8faf9b81a1df4a69015bec451d2257
@@@ -224,7 -224,7 +224,7 @@@ $(function () 
          $(".installed").addClass("deleted");
      else {
          $("#installed").html($.xml(installed));
--        $("#files-href").href("cydia://files/" + idc);
++        $("#files-href").href("cydia://package/" + idc + "/files");
      }
  
      space("#id", $.xml(id), 220);
diff --combined MobileCydia.mm
index 71f000643fdc2243e4c9c88fc16a8f0bc82c5d1c,2b644405b9e43b1fa576489c67d9b9c05ad46b2c..1b0e37d8173e75f90b474e0e30b3d0c7ebf9e551
@@@ -1179,12 -1179,12 +1179,12 @@@ bool isSectionVisible(NSString *section
  - (void) setConfigurationData:(NSString *)data;
  @end
  
 -@class PackageController;
 +@class CYPackageController;
  
  @protocol CydiaDelegate
  - (void) retainNetworkActivityIndicator;
  - (void) releaseNetworkActivityIndicator;
 -- (void) setPackageController:(PackageController *)view;
 +- (void) setPackageController:(CYPackageController *)view;
  - (void) clearPackage:(Package *)package;
  - (void) installPackage:(Package *)package;
  - (void) installPackages:(NSArray *)packages;
  - (UIProgressHUD *) addProgressHUD;
  - (void) removeProgressHUD:(UIProgressHUD *)hud;
  - (CYViewController *) pageForPackage:(NSString *)name;
 -- (PackageController *) packageController;
  - (void) showActionSheet:(UIActionSheet *)sheet fromItem:(UIBarButtonItem *)item;
  @end
  
@@@ -4046,6 -4047,7 +4046,7 @@@ bool DepSubstrate(const pkgCache::VerIt
  
  @end
  /* }}} */
+ /* Emulated Loading Controller {{{ */
  @interface CYEmulatedLoadingController : UIViewController {
      CYLoadingIndicator *indicator_;
      UITabBar *tabbar_;
  }
  
  @end
+ /* }}} */
  
  /* Cydia Browser Controller {{{ */
  @interface CYBrowserController : BrowserController {
  @end
  /* }}} */
  /* Package Controller {{{ */
 -@interface PackageController : CYBrowserController <
 +@interface CYPackageController : CYBrowserController <
      UIActionSheetDelegate
  > {
      _transient Database *database_;
  
  @end
  
 -@implementation PackageController
 +@implementation CYPackageController
  
  - (void) dealloc {
      if (package_ != nil)
  }
  
  - (void) didSelectPackage:(Package *)package {
 -    PackageController *view([delegate_ packageController]);
 +    CYPackageController *view([[[CYPackageController alloc] initWithDatabase:database_] autorelease]);
      [view setPackage:package];
      [view setDelegate:delegate_];
      [[self navigationController] pushViewController:view animated:YES];
  @end
  /* }}} */
  /* Source Table {{{ */
- @interface CYSourcesController : CYViewController <
+ @interface SourcesController : CYViewController <
      UITableViewDataSource,
      UITableViewDelegate
  > {
  
  @end
  
- @implementation CYSourcesController
+ @implementation SourcesController
  
  - (void) _releaseConnection:(NSURLConnection *)connection {
      if (connection != nil) {
  }
  
  - (void) showAddSourcePrompt {
-     /*[book_ pushPage:[[[AddCYSourcesController alloc]
-         initWithBook:book_
-         database:database_
-     ] autorelease]];*/
      UIAlertView *alert = [[[UIAlertView alloc]
          initWithTitle:UCLocalize("ENTER_APT_URL")
          message:nil
  /* }}} */
  
  /* Installed Controller {{{ */
- @interface CYInstalledController : FilteredPackageController {
+ @interface InstalledController : FilteredPackageController {
      BOOL expert_;
  }
  
  
  @end
  
- @implementation CYInstalledController
+ @implementation InstalledController
  
  - (void) dealloc {
      [super dealloc];
      [packages_ setDelegate:delegate];
  }
  
 +@end
 +/* }}} */
 +/* Section Controller {{{ */
 +@interface CYSectionController : FilteredPackageController {
 +}
 +
 +- (id) initWithDatabase:(Database *)database section:(NSString *)section;
 +
 +@end
 +
 +@implementation CYSectionController
 +
 +- (void) dealloc {
 +    [super dealloc];
 +}
 +
 +- (id) initWithDatabase:(Database *)database section:(NSString *)name {
 +    NSString *title;
 +
 +    if (name == nil) {
 +        title = UCLocalize("ALL_PACKAGES");
 +    } else if (![name isEqual:@""]) {
 +        title = [[NSBundle mainBundle] localizedStringForKey:Simplify(name) value:nil table:@"Sections"];
 +    } else {
 +        title = UCLocalize("NO_SECTION");
 +    }
 +
 +    if ((self = [super initWithDatabase:database title:title filter:@selector(isVisibleInSection:) with:name]) != nil) {
 +    } return self;
 +}
 +
 +- (void) reloadData {
 +    [packages_ reloadData];
 +}
 +
 +- (void) setDelegate:(id)delegate {
 +    [super setDelegate:delegate];
 +    [packages_ setDelegate:delegate];
 +}
 +
  @end
  /* }}} */
  
  /* Home Controller {{{ */
- @interface CYHomeController : CYBrowserController {
+ @interface HomeController : CYBrowserController {
  }
--
  @end
  
- @implementation CYHomeController
+ @implementation HomeController
  
  + (BOOL)shouldHideNavigationBar {
      return NO;
  @end
  /* }}} */
  /* Manage Controller {{{ */
- @interface CYManageController : CYBrowserController {
+ @interface ManageController : CYBrowserController {
  }
  
  - (void) queueStatusDidChange;
  @end
  
- @implementation CYManageController
+ @implementation ManageController
  
  - (id) init {
      if ((self = [super init]) != nil) {
  
  @implementation CYTabBarController
  
 -/* XXX: some logic should probably go here related to
 -freeing the view controllers on tab change */
 -
  - (void) reloadData {
      size_t count([[self viewControllers] count]);
      for (size_t i(0); i != count; ++i) {
  @end
  /* }}} */
  
+ /* Section Controller {{{ */
+ @interface SectionController : FilteredPackageController {
+ }
+ - (id) initWithDatabase:(Database *)database section:(NSString *)section;
+ @end
+ @implementation SectionController
+ - (void) dealloc {
+     [super dealloc];
+ }
+ - (id) initWithDatabase:(Database *)database section:(NSString *)name {
+     NSString *title;
+     if (name == nil) {
+         title = UCLocalize("ALL_PACKAGES");
+     } else if (![name isEqual:@""]) {
+         title = [[NSBundle mainBundle] localizedStringForKey:Simplify(name) value:nil table:@"Sections"];
+     } else {
+         title = UCLocalize("NO_SECTION");
+     }
+     if ((self = [super initWithDatabase:database title:title filter:@selector(isVisibleInSection:) with:name]) != nil) {
+     } return self;
+ }
+ - (void) reloadData {
+     [packages_ reloadData];
+ }
+ - (void) setDelegate:(id)delegate {
+     [super setDelegate:delegate];
+     [packages_ setDelegate:delegate];
+ }
+ @end
+ /* }}} */
  /* Sections Controller {{{ */
- @interface CYSectionsController : CYViewController <
+ @interface SectionsController : CYViewController <
      UITableViewDataSource,
      UITableViewDelegate
  > {
  
  @end
  
- @implementation CYSectionsController
+ @implementation SectionsController
  
  - (void) dealloc {
      [list_ setDataSource:nil];
  
      Section *section = [self sectionAtIndexPath:indexPath];
  
-     CYSectionController *controller = [[[CYSectionController alloc]
+     SectionController *controller = [[[SectionController alloc]
          initWithDatabase:database_
          section:[section name]
      ] autorelease];
      [[self navigationController] pushViewController:controller animated:YES];
  }
  
 -- (NSString *) title { return UCLocalize("SECTIONS"); }
 -
  - (id) initWithDatabase:(Database *)database {
      if ((self = [super init]) != nil) {
          database_ = database;
  
  @end
  /* }}} */
  /* Changes Controller {{{ */
- @interface CYChangesController : CYViewController <
+ @interface ChangesController : CYViewController <
      UITableViewDataSource,
      UITableViewDelegate
  > {
  
  @end
  
- @implementation CYChangesController
+ @implementation ChangesController
  
  - (void) dealloc {
      [list_ setDelegate:nil];
  
  - (NSIndexPath *) tableView:(UITableView *)table willSelectRowAtIndexPath:(NSIndexPath *)path {
      Package *package([self packageAtIndexPath:path]);
 -    PackageController *view([delegate_ packageController]);
 +    CYPackageController *view([[[CYPackageController alloc] initWithDatabase:database_] autorelease]);
      [view setDelegate:delegate_];
      [view setPackage:package];
      [[self navigationController] pushViewController:view animated:YES];
                  name = (NSString *) CFDateFormatterCreateStringWithDate(NULL, formatter, (CFDateRef) [NSDate dateWithTimeIntervalSince1970:seen]);
                  [name autorelease];
  
-                 _profile(CYChangesController$reloadData$Allocate)
+                 _profile(ChangesController$reloadData$Allocate)
                      name = [NSString stringWithFormat:UCLocalize("NEW_AT"), name];
                      section = [[[Section alloc] initWithName:name row:offset localize:NO] autorelease];
                      [sections_ addObject:section];
  @end
  /* }}} */
  /* Search Controller {{{ */
- @interface CYSearchController : FilteredPackageController <
+ @interface SearchController : FilteredPackageController <
      UISearchBarDelegate
  > {
      UISearchBar *search_;
  }
  
- - (void) setSearchTerm:(NSString *)searchTerm;
  - (id) initWithDatabase:(Database *)database;
+ - (void) setSearchTerm:(NSString *)term;
  - (void) reloadData;
  
  @end
  
- @implementation CYSearchController
+ @implementation SearchController
  
  - (void) dealloc {
      [search_ release];
      [super dealloc];
  }
  
 +- (void) setSearchTerm:(NSString *)searchTerm {
 +    [search_ setText:searchTerm];
 +}
 +
  - (void) searchBarSearchButtonClicked:(UISearchBar *)searchBar {
      [packages_ setObject:[search_ text] forFilter:@selector(isUnfilteredAndSearchedForBy:)];
      [search_ resignFirstResponder];
      [self reloadData];
  }
  
 -- (void) setSearchTerm:(NSString *)term {
 -    [search_ setText:term];
 -}
 -
--- (NSString *) title { return nil; }
--
  - (id) initWithDatabase:(Database *)database {
      return [super initWithDatabase:database title:UCLocalize("SEARCH") filter:@selector(isUnfilteredAndSearchedForBy:) with:nil];
  }
  }
  
  - (void) reloadData {
-     _profile(CYSearchController$reloadData)
+     _profile(SearchController$reloadData)
          [packages_ reloadData];
      _end
      PrintTimes();
  @end
  /* }}} */
  /* Settings Controller {{{ */
- @interface CYPackageSettingsController : CYViewController <
+ @interface PackageSettingsController : CYViewController <
      UITableViewDataSource,
      UITableViewDelegate
  > {
  
  @end
  
- @implementation CYPackageSettingsController
+ @implementation PackageSettingsController
  
  - (void) dealloc {
      [name_ release];
      return 2;
  }
  
 +- (NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
 +    return UCLocalize("CHANGE_PACKAGE_SETTINGS");
 +}
 +
  - (NSString *) tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
      return UCLocalize("SHOW_ALL_CHANGES_EX");
  }
          ignoredSwitch_ = [[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 50, 20)];
          [ignoredSwitch_ setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
          [ignoredSwitch_ addTarget:self action:@selector(onIgnored:) forEvents:UIControlEventValueChanged];
 +        // Disable this switch, since it only reflects (not modifies) the ignored state.
 +        [ignoredSwitch_ setUserInteractionEnabled:NO];
  
          subscribedCell_ = [[UITableViewCell alloc] init];
          [subscribedCell_ setText:UCLocalize("SHOW_ALL_CHANGES")];
  @end
  /* }}} */
  
- typedef enum {
-     kCydiaTag,
-     kSectionsTag,
-     kChangesTag,
-     kManageTag,
-     kInstalledTag,
-     kSourcesTag,
-     kSearchTag
- } CYTabTag;
  @interface Cydia : UIApplication <
      ConfirmationControllerDelegate,
      ProgressControllerDelegate,
      unsigned locked_;
      unsigned activity_;
  
-     id queueDelegate_;
      CYStashController *stash_;
  
      bool loaded_;
  - (void) setPage:(CYViewController *)page;
  - (void) loadData;
  
- // XXX: I hate prototypes
- - (id) queueBadgeController;
  @end
  
  @implementation Cydia
      }
  }
  
+ // Navigation controller for the queuing badge.
+ - (CYNavigationController *) queueNavigationController {
+     NSArray *controllers = [tabbar_ viewControllers];
+     return [controllers objectAtIndex:3];
+ }
  - (void) _updateData {
      [self _saveConfig];
  
 -    for (CYNavigationController *controller in [tabbar_ viewControllers])
 -        [controller reloadData];
 +    [tabbar_ reloadData];
  
-     [queueDelegate_ queueStatusDidChange];
-     [[[self queueBadgeController] tabBarItem] setBadgeValue:(Queuing_ ? UCLocalize("Q_D") : nil)];
- }
+     CYNavigationController *navigation = [self queueNavigationController];
 -    id queuedelegate = nil;
  
- - (int)indexOfTabWithTag:(int)tag {
-     int i = 0;
-     for (UINavigationController *controller in [tabbar_ viewControllers]) {
-         if ([[controller tabBarItem] tag] == tag)
-             return i;
-         i += 1;
-     }
++    id queuedelegate = nil;
+     if ([[navigation viewControllers] count] > 0)
+         queuedelegate = [[navigation viewControllers] objectAtIndex:0];
  
-     return -1;
+     [queuedelegate queueStatusDidChange];
+     [[navigation tabBarItem] setBadgeValue:(Queuing_ ? UCLocalize("Q_D") : nil)];
  }
  
  - (void) _refreshIfPossible {
  
      NSLog(@"changes:#%u", changes);
  
-     UITabBarItem *changesItem = [[[tabbar_ viewControllers] objectAtIndex:[self indexOfTabWithTag:kChangesTag]] tabBarItem];
+     UITabBarItem *changesItem = [[[tabbar_ viewControllers] objectAtIndex:2] tabBarItem];
      if (changes != 0) {
          _trace();
          NSString *badge([[NSNumber numberWithInt:changes] stringValue]);
  
      CYNavigationController *navController = (CYNavigationController *) [tabbar_ selectedViewController];
      [navController setViewControllers:[NSArray arrayWithObject:page]];
-     NSLog(@"page: %@ nav: %@", page, navController);
+     for (CYNavigationController *page in [tabbar_ viewControllers])
+         if (page != navController)
+             [page setViewControllers:nil];
+ }
+ - (void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
+     CYNavigationController *controller = (CYNavigationController *) viewController;
+     if ([[controller viewControllers] count] == 0) {
+         int index = [tabbar_ selectedIndex];
+         CYViewController *root = nil;
+         if (index == 0)
+             root = [[[HomeController alloc] init] autorelease];
+         else if (index == 1)
+             root = [[[SectionsController alloc] initWithDatabase:database_] autorelease];
+         else if (index == 2)
+             root = [[[ChangesController alloc] initWithDatabase:database_ delegate:self] autorelease];
+         if (IsWildcat_) {
+             if (index == 3)
+                 root = [[[InstalledController alloc] initWithDatabase:database_] autorelease];
+             else if (index == 4)
+                 root = [[[SourcesController alloc] initWithDatabase:database_] autorelease];
+             else if (index == 5)
+                 root = [[[SearchController alloc] initWithDatabase:database_] autorelease];
+         } else {
+             if (index == 3)
+                 root = [[[ManageController alloc] init] autorelease];
+             else if (index == 4)
+                 root = [[[SearchController alloc] initWithDatabase:database_] autorelease];
+         }
+         [root setDelegate:self];
+         if (root != nil)
+             [controller setViewControllers:[NSArray arrayWithObject:root]];
+     }
  }
  
  - (void) showSettings {
          [self setNetworkActivityIndicatorVisible:NO];
  }
  
 -- (void) setPackageController:(PackageController *)view {
 +- (void) setPackageController:(CYPackageController *)view {
      WebThreadLock();
      [view setPackage:nil];
      WebThreadUnlock();
  }
  
- // Returns the navigation controller for the queuing badge.
- - (id) queueBadgeController {
-     int index = [self indexOfTabWithTag:kManageTag];
-     if (index == -1)
-         index = [self indexOfTabWithTag:kInstalledTag];
 -- (PackageController *) _packageController {
 -    return [[[PackageController alloc] initWithDatabase:database_] autorelease];
 -}
--
-     return [[tabbar_ viewControllers] objectAtIndex:index];
 -- (PackageController *) packageController {
 -    return [self _packageController];
--}
--
  - (void) cancelAndClear:(bool)clear {
      @synchronized (self) {
          if (clear) {
  
  - (CYViewController *) pageForPackage:(NSString *)name {
      if (Package *package = [database_ packageWithName:name]) {
 -        PackageController *view([self packageController]);
 +        CYPackageController *view = [[[CYPackageController alloc] initWithDatabase:database_] autorelease];
          [view setPackage:package];
          return view;
      } else {
          NSURL *url([NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"unknown" ofType:@"html"]]);
          url = [NSURL URLWithString:[[url absoluteString] stringByAppendingString:[NSString stringWithFormat:@"?%@", name]]];
 -        CYBrowserController *controller = [[[CYBrowserController alloc] init] autorelease];
 -        [controller loadURL:url];
 -        return controller;
 +        CYBrowserController *browser = [[[CYBrowserController alloc] init] autorelease];
 +        [browser loadURL:url];
 +        return browser;
      }
  }
  
          }
  
          if ([base isEqualToString:@"sources"]) {
-             CYSourcesController *source = [[[CYSourcesController alloc] initWithDatabase:database_] autorelease];
+             SourcesController *source = [[[SourcesController alloc] initWithDatabase:database_] autorelease];
              return source;
          }
  
          if ([base isEqualToString:@"home"]) {
-             CYHomeController *home = [[[CYHomeController alloc] init] autorelease];
+             HomeController *home = [[[HomeController alloc] init] autorelease];
              return home;
          }
  
          if ([base isEqualToString:@"sections"]) {
-             CYSectionsController *sections = [[[CYSectionsController alloc] initWithDatabase:database_] autorelease];
+             SectionsController *sections = [[[SectionsController alloc] initWithDatabase:database_] autorelease];
              return sections;
          }
  
          if ([base isEqualToString:@"search"]) {
-             CYSearchController *search = [[[CYSearchController alloc] initWithDatabase:database_] autorelease];
+             SearchController *search = [[[SearchController alloc] initWithDatabase:database_] autorelease];
              return search;
          }
  
          if ([base isEqualToString:@"changes"]) {
-             CYChangesController *changes = [[[CYChangesController alloc] initWithDatabase:database_ delegate:self] autorelease];
+             ChangesController *changes = [[[ChangesController alloc] initWithDatabase:database_ delegate:self] autorelease];
              return changes;
          }
  
          if ([base isEqualToString:@"installed"]) {
-             CYInstalledController *installed = [[[CYInstalledController alloc] initWithDatabase:database_] autorelease];
+             InstalledController *installed = [[[InstalledController alloc] initWithDatabase:database_] autorelease];
              return installed;
          }
      } else if ([components count] == 2) {
          }
  
          if ([base isEqualToString:@"search"]) {
-             CYSearchController *search = [[[CYSearchController alloc] initWithDatabase:database_] autorelease];
+             SearchController *search = [[[SearchController alloc] initWithDatabase:database_] autorelease];
              [search setSearchTerm:argument];
              return search;
          }
          if ([base isEqualToString:@"sections"]) {
              if ([argument isEqualToString:@"all"])
                  argument = nil;
-             CYSectionController *section = [[[CYSectionController alloc] initWithDatabase:database_ section:argument] autorelease];
+             SectionController *section = [[[SectionController alloc] initWithDatabase:database_ section:argument] autorelease];
              [section setDelegate:self];
              return section;
          }
  
          if ([base isEqualToString:@"sources"]) {
              if ([argument isEqualToString:@"add"]) {
-                 CYSourcesController *source = [[[CYSourcesController alloc] initWithDatabase:database_] autorelease];
+                 SourcesController *source = [[[SourcesController alloc] initWithDatabase:database_] autorelease];
                  [source showAddSourcePrompt];
                  return source;
              } else {
  
          if ([base isEqualToString:@"package"]) {
              if ([arg2 isEqualToString:@"settings"]) {
-                 return [[[CYPackageSettingsController alloc] initWithDatabase:database_ package:arg1] autorelease];
+                 return [[[PackageSettingsController alloc] initWithDatabase:database_ package:arg1] autorelease];
              } else if ([arg2 isEqualToString:@"signature"]) {
                  return [[[SignatureController alloc] initWithDatabase:database_ package:arg1] autorelease];
              } else if ([arg2 isEqualToString:@"files"]) {
  }
  
  - (BOOL) openCydiaURL:(NSURL *)url {
 -    CYViewController *page = nil;
 +    CYViewController *page([self pageForURL:url]);
  
 -    if ((page = [self pageForURL:url]))
 +    if (page != nil)
          [self setPage:page];
  
 -    return !!page;
 +    return page != nil;
  }
  
  - (void) applicationOpenURL:(NSURL *)url {
      [tabbar_ setDelegate:self];
  
      NSMutableArray *items([NSMutableArray arrayWithObjects:
-         [[[UITabBarItem alloc] initWithTitle:@"Cydia" image:[UIImage applicationImageNamed:@"home.png"] tag:kCydiaTag] autorelease],
-         [[[UITabBarItem alloc] initWithTitle:UCLocalize("SECTIONS") image:[UIImage applicationImageNamed:@"install.png"] tag:kSectionsTag] autorelease],
-         [[[UITabBarItem alloc] initWithTitle:UCLocalize("CHANGES") image:[UIImage applicationImageNamed:@"changes.png"] tag:kChangesTag] autorelease],
-         [[[UITabBarItem alloc] initWithTitle:UCLocalize("SEARCH") image:[UIImage applicationImageNamed:@"search.png"] tag:kSearchTag] autorelease],
-     nil]);
-     NSMutableArray *pages([NSMutableArray arrayWithObjects:
-         [[[CYHomeController alloc] init] autorelease],
-         [[[CYSectionsController alloc] initWithDatabase:database_] autorelease],
-         [[[CYChangesController alloc] initWithDatabase:database_ delegate:self] autorelease],
-         [[[CYSearchController alloc] initWithDatabase:database_] autorelease],
+         [[[UITabBarItem alloc] initWithTitle:@"Cydia" image:[UIImage applicationImageNamed:@"home.png"] tag:0] autorelease],
+         [[[UITabBarItem alloc] initWithTitle:UCLocalize("SECTIONS") image:[UIImage applicationImageNamed:@"install.png"] tag:0] autorelease],
+         [[[UITabBarItem alloc] initWithTitle:UCLocalize("CHANGES") image:[UIImage applicationImageNamed:@"changes.png"] tag:0] autorelease],
+         [[[UITabBarItem alloc] initWithTitle:UCLocalize("SEARCH") image:[UIImage applicationImageNamed:@"search.png"] tag:0] autorelease],
      nil]);
  
      if (IsWildcat_) {
-         [items insertObject:[[[UITabBarItem alloc] initWithTitle:UCLocalize("SOURCES") image:[UIImage applicationImageNamed:@"source.png"] tag:kSourcesTag] autorelease] atIndex:3];
-         [items insertObject:[[[UITabBarItem alloc] initWithTitle:UCLocalize("INSTALLED") image:[UIImage applicationImageNamed:@"manage.png"] tag:kInstalledTag] autorelease] atIndex:3];
-         [pages insertObject:[[[CYSourcesController alloc] initWithDatabase:database_] autorelease] atIndex:3];
-         [pages insertObject:[[[CYInstalledController alloc] initWithDatabase:database_] autorelease] atIndex:3];
-         queueDelegate_ = [pages objectAtIndex:3];
+         [items insertObject:[[[UITabBarItem alloc] initWithTitle:UCLocalize("SOURCES") image:[UIImage applicationImageNamed:@"source.png"] tag:0] autorelease] atIndex:3];
+         [items insertObject:[[[UITabBarItem alloc] initWithTitle:UCLocalize("INSTALLED") image:[UIImage applicationImageNamed:@"manage.png"] tag:0] autorelease] atIndex:3];
      } else {
-         [items insertObject:[[[UITabBarItem alloc] initWithTitle:UCLocalize("MANAGE") image:[UIImage applicationImageNamed:@"manage.png"] tag:kManageTag] autorelease] atIndex:3];
-         [pages insertObject:[[[CYManageController alloc] init] autorelease] atIndex:3];
-         queueDelegate_ = [pages objectAtIndex:3];
+         [items insertObject:[[[UITabBarItem alloc] initWithTitle:UCLocalize("MANAGE") image:[UIImage applicationImageNamed:@"manage.png"] tag:0] autorelease] atIndex:3];
      }
  
      NSMutableArray *controllers([NSMutableArray array]);
-     for (unsigned int i = 0; i < [pages count]; i++) {
-         UITabBarItem *item = [items objectAtIndex:i];
-         CYViewController *page = [pages objectAtIndex:i];
-         [page setDelegate:self];
--
+     for (UITabBarItem *item in items) {
          CYNavigationController *controller([[[CYNavigationController alloc] initWithDatabase:database_] autorelease]);
-         [controller setViewControllers:[NSArray arrayWithObject:page]];
          [controller setTabBarItem:item];
          [controllers addObject:controller];
      }
--
      [tabbar_ setViewControllers:controllers];
++
      [tabbar_ setUpdateDelegate:self];
      [window_ addSubview:[tabbar_ view]];
 -
  }
  
  - (void)showEmulatedLoadingControllerInView:(UIView *)view {
@@@ -9063,6 -9068,7 +9094,7 @@@ _trace()
  
      database_ = [Database sharedInstance];
  
+     [window_ setUserInteractionEnabled:NO];
      [self showEmulatedLoadingControllerInView:window_];
  
      [self performSelector:@selector(loadData) withObject:nil afterDelay:0];
@@@ -9076,18 -9082,18 +9108,18 @@@ _trace()
          return;
      }
  
-     [window_ setUserInteractionEnabled:NO];
      [self reloadData];
      PrintTimes();
-     [window_ setUserInteractionEnabled:YES];
  
      [self setupViewControllers];
-     [tabbar_ setSelectedIndex:0];
      [self showEmulatedLoadingControllerInView:nil];
-     // XXX: does this actually slow anything down?
-     [[tabbar_ view] setBackgroundColor:[UIColor clearColor]];
+     [window_ setUserInteractionEnabled:YES];
+     // Show the home page.
+     CYNavigationController *navigation = [[tabbar_ viewControllers] objectAtIndex:0];
+     [navigation setViewControllers:[NSArray arrayWithObject:[[[HomeController alloc] init] autorelease]]];
  
-     // Show the initial page
+     // (Try to) show the startup URL.
      if (starturl_ != nil) {
          [self openCydiaURL:starturl_];
          [starturl_ release];