// // HighscoreListController.m // Cart Collect // // Created by iD Student Account on 7/20/11. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import "HighscoreListController.h" #import "Highscore.h" #import "RootViewController.h" #import "cocoslive.h" #import #import "Cart_CollectAppDelegate.h" @implementation HighscoreListController #pragma mark - #pragma mark Initialization - (id)initWithStyle:(UITableViewStyle)style { // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. self = [super initWithStyle:style]; if (self) { NSMutableArray* highscores = [NSMutableArray arrayWithCapacity:15]; const char* sqlQuery = "SELECT * FROM highscores ORDER BY score DESC LIMIT 15"; sqlite3_stmt* compiled_statement; if (sqlite3_prepare_v2([Cart_CollectAppDelegate database], sqlQuery, -1, &compiled_statement, NULL) == SQLITE_OK) { while (sqlite3_step(compiled_statement) == SQLITE_ROW) { NSString* name = [NSString stringWithUTF8String:(char*)sqlite3_column_text(compiled_statement, 1)]; int score = sqlite3_column_int(compiled_statement, 2); NSDate* date = nil; char* dateStr = (char*)sqlite3_column_text(compiled_statement, 3); if (dateStr != NULL) { NSString* theDate = [NSString stringWithUTF8String:dateStr]; NSDateComponents* comps = [[NSDateComponents alloc] init]; [comps setYear:[[theDate substringToIndex:4] intValue]]; [comps setMonth:[[theDate substringWithRange:NSMakeRange(5, 2)] intValue]]; [comps setDay:[[theDate substringWithRange:NSMakeRange(8, 2)] intValue]]; [comps setHour:[[theDate substringWithRange:NSMakeRange(11, 2)] intValue]]; [comps setMinute:[[theDate substringWithRange:NSMakeRange(14, 2)] intValue]]; [comps setSecond:[[theDate substringWithRange:NSMakeRange(17, 2)] intValue]]; date = [[NSCalendar currentCalendar] dateFromComponents:comps]; date = [date dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT]]; [comps release]; } Highscore* highscore = [[Highscore alloc] initWithName:name score:score date:date]; [highscores addObject:highscore]; [highscore release]; } } localHighscores = [highscores copy]; navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; myNavigationItem = [[UINavigationItem alloc] initWithTitle:@"Highscores"]; UIBarButtonItem* barButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(back)]; myNavigationItem.leftBarButtonItem = barButton; [barButton release]; UISegmentedControl* segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Local", @"Global", nil]]; segmentedControl.selectedSegmentIndex = 0; segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; [segmentedControl addTarget:self action:@selector(switchLists:) forControlEvents:UIControlEventValueChanged]; UIBarButtonItem* barButton2 = [[UIBarButtonItem alloc] initWithCustomView:segmentedControl]; [segmentedControl release]; myNavigationItem.rightBarButtonItem = barButton2; [barButton2 release]; [navigationBar pushNavigationItem:myNavigationItem animated:NO]; showGlobal = NO; loadingGlobal = NO; tableView = [(UITableView*)self.view retain]; UIView* parentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; [tableView setFrame:CGRectMake(0, 44, 320, 480-44)]; [parentView addSubview:navigationBar]; [parentView addSubview:tableView]; self.view = parentView; [parentView release]; } return self; } #pragma mark - #pragma mark View lifecycle /* - (void)viewDidLoad { [super viewDidLoad]; // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem; } */ /* - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } */ /* - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; } */ /* - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; } */ /* - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; } */ /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations. return YES; } */ #pragma mark - #pragma mark Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. if (showGlobal) { return [globalHighscores count]; } else { return [localHighscores count]; } } // Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString* cellIdentifier; Highscore* highscore; // Configure the cell... if (showGlobal) { cellIdentifier = [NSString stringWithFormat:@"Global %d", [indexPath row]]; highscore = [globalHighscores objectAtIndex:[indexPath row]]; } else { cellIdentifier = [NSString stringWithFormat:@"Local %d", [indexPath row]]; highscore = [localHighscores objectAtIndex:[indexPath row]]; } UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier] autorelease]; } cell.textLabel.text = highscore.name; if (highscore.date != nil) { NSDate* todayDate = [NSDate date]; double ti = [highscore.date timeIntervalSinceDate:todayDate]; ti = ti * -1; if (ti < 1) { cell.detailTextLabel.text = @"What is this I don't even"; } else if (ti < 60) { cell.detailTextLabel.text = @"Less than a minute ago"; } else if (ti < 3600) { int diff = round(ti / 60); cell.detailTextLabel.text = [NSString stringWithFormat:@"%d minutes ago", diff]; } else if (ti < 86400) { int diff = round(ti / 60 / 60); cell.detailTextLabel.text = [NSString stringWithFormat:@"%d hours ago", diff]; } else { NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setTimeStyle:NSDateFormatterNoStyle]; [dateFormatter setDateStyle:NSDateFormatterLongStyle]; cell.detailTextLabel.text = [dateFormatter stringFromDate:highscore.date]; [dateFormatter release]; } } UILabel* scoreLabel = [[UILabel alloc] init]; scoreLabel.text = [NSString stringWithFormat:@"%d", highscore.score]; CGSize labelSize = [scoreLabel.text sizeWithFont:scoreLabel.font constrainedToSize:CGSizeMake(160, 44) lineBreakMode:UILineBreakModeClip]; scoreLabel.frame = CGRectMake(320-10-labelSize.width, 22-labelSize.height/2, labelSize.width, labelSize.height); [cell addSubview:scoreLabel]; [scoreLabel release]; cell.selectionStyle = UITableViewCellSelectionStyleNone; return cell; } /* // Override to support conditional editing of the table view. - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the specified item to be editable. return YES; } */ /* // Override to support editing the table view. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { // Delete the row from the data source. [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; } else if (editingStyle == UITableViewCellEditingStyleInsert) { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. } } */ /* // Override to support rearranging the table view. - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { } */ /* // Override to support conditional rearranging of the table view. - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the item to be re-orderable. return YES; } */ #pragma mark - #pragma mark Table view delegate - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Navigation logic may go here. Create and push another view controller. /* <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil]; // ... // Pass the selected object to the new view controller. [self.navigationController pushViewController:detailViewController animated:YES]; [detailViewController release]; */ } #pragma mark - #pragma mark Memory management - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Relinquish ownership any cached data, images, etc. that aren't in use. } - (void)viewDidUnload { // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand. // For example: self.myOutlet = nil; } - (void)dealloc { [super dealloc]; } - (void)back { Cart_CollectAppDelegate* appDelegate = ((Cart_CollectAppDelegate*) [[UIApplication sharedApplication] delegate]); RootViewController* viewController = [appDelegate viewController]; [[appDelegate window] setRootViewController:nil]; [[appDelegate window] addSubview:viewController.view]; } - (void)switchLists:(id)sender { if ([(UISegmentedControl*)sender selectedSegmentIndex] == 0) { if (loadingGlobal) { [loadingView removeFromSuperview]; [self.view addSubview:tableView]; } showGlobal = NO; [tableView reloadData]; } else { if (globalHighscores == nil) { loadingGlobal = YES; loadingView = [[UIView alloc] initWithFrame:CGRectMake(0, 44, 320, 480-44)]; activity = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(150, 228-44, 20, 20)]; activity.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; statusText = [[UILabel alloc] initWithFrame:CGRectMake(0, 256-44, 320, 21)]; statusText.text = @"Downloading highscores..."; statusText.textAlignment = UITextAlignmentCenter; [loadingView addSubview:activity]; [loadingView addSubview:statusText]; [loadingView setBackgroundColor:[UIColor whiteColor]]; [activity startAnimating]; [tableView removeFromSuperview]; [self.view addSubview:loadingView]; CLScoreServerRequest* request = [[CLScoreServerRequest alloc] initWithGameName:@"Cart Collect" delegate:self]; tQueryFlags flags = kQueryFlagIgnore; [request requestScores:kQueryAllTime limit:15 offset:0 flags:flags category:@"Classic"]; [request release]; } else { showGlobal = YES; [tableView reloadData]; } } } - (void)scoreRequestOk:(id)sender { NSArray* highscores = [sender parseScores]; NSMutableArray* highscoreTemp = [[NSMutableArray alloc] init]; for (NSDictionary* data in highscores) { NSString* name = [data objectForKey:@"cc_playername"]; int score = [[data objectForKey:@"cc_score"] intValue]; NSDate* date = [NSDate dateWithTimeIntervalSince1970:[[data objectForKey:@"cc_when"] intValue]]; Highscore* highscore = [[Highscore alloc] initWithName:name score:score date:date]; [highscoreTemp addObject:highscore]; [highscore release]; } globalHighscores = [highscoreTemp copy]; [highscoreTemp release]; loadingGlobal = NO; [loadingView removeFromSuperview]; [self.view addSubview:tableView]; showGlobal = YES; [tableView reloadData]; } - (void)scoreRequestFail:(id)sender { [activity stopAnimating]; [statusText setText:@"Unable to download highscores."]; } @end