From 9cd57b731ab1c666d4a1cb725538fdc137763d12 Mon Sep 17 00:00:00 2001 From: Starla Insigna Date: Sat, 30 Jul 2011 11:19:14 -0400 Subject: Initial commit (version 0.2.1) --- Classes/HighscoreListController.m | 371 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 371 insertions(+) create mode 100755 Classes/HighscoreListController.m (limited to 'Classes/HighscoreListController.m') diff --git a/Classes/HighscoreListController.m b/Classes/HighscoreListController.m new file mode 100755 index 0000000..9980727 --- /dev/null +++ b/Classes/HighscoreListController.m @@ -0,0 +1,371 @@ +// +// HighscoreListController.m +// Cart Collect +// +// Created by iD Student Account on 7/20/11. +// Copyright 2011 __MyCompanyName__. All rights reserved. +// + +#import "HighscoreListController.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 +{ + RootViewController* viewController = [[[UIApplication sharedApplication] delegate] viewController]; + [[[[UIApplication sharedApplication] delegate] window] setRootViewController:viewController]; +} + +- (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 + -- cgit 1.4.1