diff options
Diffstat (limited to 'Classes/HighscoreListController.m')
| -rwxr-xr-x | Classes/HighscoreListController.m | 371 |
1 files changed, 371 insertions, 0 deletions
| 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 @@ | |||
| 1 | // | ||
| 2 | // HighscoreListController.m | ||
| 3 | // Cart Collect | ||
| 4 | // | ||
| 5 | // Created by iD Student Account on 7/20/11. | ||
| 6 | // Copyright 2011 __MyCompanyName__. All rights reserved. | ||
| 7 | // | ||
| 8 | |||
| 9 | #import "HighscoreListController.h" | ||
| 10 | |||
| 11 | |||
| 12 | @implementation HighscoreListController | ||
| 13 | |||
| 14 | |||
| 15 | #pragma mark - | ||
| 16 | #pragma mark Initialization | ||
| 17 | |||
| 18 | - (id)initWithStyle:(UITableViewStyle)style { | ||
| 19 | // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. | ||
| 20 | self = [super initWithStyle:style]; | ||
| 21 | if (self) { | ||
| 22 | NSMutableArray* highscores = [NSMutableArray arrayWithCapacity:15]; | ||
| 23 | const char* sqlQuery = "SELECT * FROM highscores ORDER BY score DESC LIMIT 15"; | ||
| 24 | sqlite3_stmt* compiled_statement; | ||
| 25 | |||
| 26 | if (sqlite3_prepare_v2([Cart_CollectAppDelegate database], sqlQuery, -1, &compiled_statement, NULL) == SQLITE_OK) | ||
| 27 | { | ||
| 28 | while (sqlite3_step(compiled_statement) == SQLITE_ROW) | ||
| 29 | { | ||
| 30 | NSString* name = [NSString stringWithUTF8String:(char*)sqlite3_column_text(compiled_statement, 1)]; | ||
| 31 | int score = sqlite3_column_int(compiled_statement, 2); | ||
| 32 | |||
| 33 | NSDate* date = nil; | ||
| 34 | char* dateStr = (char*)sqlite3_column_text(compiled_statement, 3); | ||
| 35 | if (dateStr != NULL) | ||
| 36 | { | ||
| 37 | NSString* theDate = [NSString stringWithUTF8String:dateStr]; | ||
| 38 | NSDateComponents* comps = [[NSDateComponents alloc] init]; | ||
| 39 | [comps setYear:[[theDate substringToIndex:4] intValue]]; | ||
| 40 | [comps setMonth:[[theDate substringWithRange:NSMakeRange(5, 2)] intValue]]; | ||
| 41 | [comps setDay:[[theDate substringWithRange:NSMakeRange(8, 2)] intValue]]; | ||
| 42 | [comps setHour:[[theDate substringWithRange:NSMakeRange(11, 2)] intValue]]; | ||
| 43 | [comps setMinute:[[theDate substringWithRange:NSMakeRange(14, 2)] intValue]]; | ||
| 44 | [comps setSecond:[[theDate substringWithRange:NSMakeRange(17, 2)] intValue]]; | ||
| 45 | date = [[NSCalendar currentCalendar] dateFromComponents:comps]; | ||
| 46 | date = [date dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT]]; | ||
| 47 | [comps release]; | ||
| 48 | } | ||
| 49 | |||
| 50 | Highscore* highscore = [[Highscore alloc] initWithName:name score:score date:date]; | ||
| 51 | [highscores addObject:highscore]; | ||
| 52 | [highscore release]; | ||
| 53 | } | ||
| 54 | } | ||
| 55 | |||
| 56 | localHighscores = [highscores copy]; | ||
| 57 | |||
| 58 | navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; | ||
| 59 | myNavigationItem = [[UINavigationItem alloc] initWithTitle:@"Highscores"]; | ||
| 60 | UIBarButtonItem* barButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(back)]; | ||
| 61 | myNavigationItem.leftBarButtonItem = barButton; | ||
| 62 | [barButton release]; | ||
| 63 | |||
| 64 | UISegmentedControl* segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Local", @"Global", nil]]; | ||
| 65 | segmentedControl.selectedSegmentIndex = 0; | ||
| 66 | segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; | ||
| 67 | [segmentedControl addTarget:self action:@selector(switchLists:) forControlEvents:UIControlEventValueChanged]; | ||
| 68 | UIBarButtonItem* barButton2 = [[UIBarButtonItem alloc] initWithCustomView:segmentedControl]; | ||
| 69 | [segmentedControl release]; | ||
| 70 | myNavigationItem.rightBarButtonItem = barButton2; | ||
| 71 | [barButton2 release]; | ||
| 72 | |||
| 73 | [navigationBar pushNavigationItem:myNavigationItem animated:NO]; | ||
| 74 | |||
| 75 | showGlobal = NO; | ||
| 76 | loadingGlobal = NO; | ||
| 77 | |||
| 78 | tableView = [(UITableView*)self.view retain]; | ||
| 79 | UIView* parentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; | ||
| 80 | [tableView setFrame:CGRectMake(0, 44, 320, 480-44)]; | ||
| 81 | [parentView addSubview:navigationBar]; | ||
| 82 | [parentView addSubview:tableView]; | ||
| 83 | self.view = parentView; | ||
| 84 | [parentView release]; | ||
| 85 | } | ||
| 86 | return self; | ||
| 87 | } | ||
| 88 | |||
| 89 | |||
| 90 | #pragma mark - | ||
| 91 | #pragma mark View lifecycle | ||
| 92 | |||
| 93 | /* | ||
| 94 | - (void)viewDidLoad { | ||
| 95 | [super viewDidLoad]; | ||
| 96 | |||
| 97 | // Uncomment the following line to display an Edit button in the navigation bar for this view controller. | ||
| 98 | // self.navigationItem.rightBarButtonItem = self.editButtonItem; | ||
| 99 | } | ||
| 100 | */ | ||
| 101 | |||
| 102 | /* | ||
| 103 | - (void)viewWillAppear:(BOOL)animated { | ||
| 104 | [super viewWillAppear:animated]; | ||
| 105 | } | ||
| 106 | */ | ||
| 107 | /* | ||
| 108 | - (void)viewDidAppear:(BOOL)animated { | ||
| 109 | [super viewDidAppear:animated]; | ||
| 110 | } | ||
| 111 | */ | ||
| 112 | /* | ||
| 113 | - (void)viewWillDisappear:(BOOL)animated { | ||
| 114 | [super viewWillDisappear:animated]; | ||
| 115 | } | ||
| 116 | */ | ||
| 117 | /* | ||
| 118 | - (void)viewDidDisappear:(BOOL)animated { | ||
| 119 | [super viewDidDisappear:animated]; | ||
| 120 | } | ||
| 121 | */ | ||
| 122 | /* | ||
| 123 | // Override to allow orientations other than the default portrait orientation. | ||
| 124 | - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { | ||
| 125 | // Return YES for supported orientations. | ||
| 126 | return YES; | ||
| 127 | } | ||
| 128 | */ | ||
| 129 | |||
| 130 | |||
| 131 | #pragma mark - | ||
| 132 | #pragma mark Table view data source | ||
| 133 | |||
| 134 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { | ||
| 135 | // Return the number of sections. | ||
| 136 | return 1; | ||
| 137 | } | ||
| 138 | |||
| 139 | |||
| 140 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { | ||
| 141 | // Return the number of rows in the section. | ||
| 142 | if (showGlobal) | ||
| 143 | { | ||
| 144 | return [globalHighscores count]; | ||
| 145 | } else { | ||
| 146 | return [localHighscores count]; | ||
| 147 | } | ||
| 148 | } | ||
| 149 | |||
| 150 | |||
| 151 | // Customize the appearance of table view cells. | ||
| 152 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath | ||
| 153 | { | ||
| 154 | NSString* cellIdentifier; | ||
| 155 | Highscore* highscore; | ||
| 156 | |||
| 157 | // Configure the cell... | ||
| 158 | if (showGlobal) | ||
| 159 | { | ||
| 160 | cellIdentifier = [NSString stringWithFormat:@"Global %d", [indexPath row]]; | ||
| 161 | highscore = [globalHighscores objectAtIndex:[indexPath row]]; | ||
| 162 | } else { | ||
| 163 | cellIdentifier = [NSString stringWithFormat:@"Local %d", [indexPath row]]; | ||
| 164 | highscore = [localHighscores objectAtIndex:[indexPath row]]; | ||
| 165 | } | ||
| 166 | |||
| 167 | UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; | ||
| 168 | if (cell == nil) { | ||
| 169 | cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier] autorelease]; | ||
| 170 | } | ||
| 171 | |||
| 172 | cell.textLabel.text = highscore.name; | ||
| 173 | |||
| 174 | if (highscore.date != nil) | ||
| 175 | { | ||
| 176 | NSDate* todayDate = [NSDate date]; | ||
| 177 | double ti = [highscore.date timeIntervalSinceDate:todayDate]; | ||
| 178 | ti = ti * -1; | ||
| 179 | |||
| 180 | if (ti < 1) | ||
| 181 | { | ||
| 182 | cell.detailTextLabel.text = @"What is this I don't even"; | ||
| 183 | } else if (ti < 60) | ||
| 184 | { | ||
| 185 | cell.detailTextLabel.text = @"Less than a minute ago"; | ||
| 186 | } else if (ti < 3600) | ||
| 187 | { | ||
| 188 | int diff = round(ti / 60); | ||
| 189 | cell.detailTextLabel.text = [NSString stringWithFormat:@"%d minutes ago", diff]; | ||
| 190 | } else if (ti < 86400) | ||
| 191 | { | ||
| 192 | int diff = round(ti / 60 / 60); | ||
| 193 | cell.detailTextLabel.text = [NSString stringWithFormat:@"%d hours ago", diff]; | ||
| 194 | } else { | ||
| 195 | NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; | ||
| 196 | [dateFormatter setTimeStyle:NSDateFormatterNoStyle]; | ||
| 197 | [dateFormatter setDateStyle:NSDateFormatterLongStyle]; | ||
| 198 | cell.detailTextLabel.text = [dateFormatter stringFromDate:highscore.date]; | ||
| 199 | [dateFormatter release]; | ||
| 200 | } | ||
| 201 | } | ||
| 202 | |||
| 203 | UILabel* scoreLabel = [[UILabel alloc] init]; | ||
| 204 | scoreLabel.text = [NSString stringWithFormat:@"%d", highscore.score]; | ||
| 205 | CGSize labelSize = [scoreLabel.text sizeWithFont:scoreLabel.font constrainedToSize:CGSizeMake(160, 44) lineBreakMode:UILineBreakModeClip]; | ||
| 206 | scoreLabel.frame = CGRectMake(320-10-labelSize.width, 22-labelSize.height/2, labelSize.width, labelSize.height); | ||
| 207 | [cell addSubview:scoreLabel]; | ||
| 208 | [scoreLabel release]; | ||
| 209 | |||
| 210 | cell.selectionStyle = UITableViewCellSelectionStyleNone; | ||
| 211 | |||
| 212 | return cell; | ||
| 213 | } | ||
| 214 | |||
| 215 | |||
| 216 | /* | ||
| 217 | // Override to support conditional editing of the table view. | ||
| 218 | - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { | ||
| 219 | // Return NO if you do not want the specified item to be editable. | ||
| 220 | return YES; | ||
| 221 | } | ||
| 222 | */ | ||
| 223 | |||
| 224 | |||
| 225 | /* | ||
| 226 | // Override to support editing the table view. | ||
| 227 | - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { | ||
| 228 | |||
| 229 | if (editingStyle == UITableViewCellEditingStyleDelete) { | ||
| 230 | // Delete the row from the data source. | ||
| 231 | [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; | ||
| 232 | } | ||
| 233 | else if (editingStyle == UITableViewCellEditingStyleInsert) { | ||
| 234 | // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. | ||
| 235 | } | ||
| 236 | } | ||
| 237 | */ | ||
| 238 | |||
| 239 | |||
| 240 | /* | ||
| 241 | // Override to support rearranging the table view. | ||
| 242 | - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { | ||
| 243 | } | ||
| 244 | */ | ||
| 245 | |||
| 246 | |||
| 247 | /* | ||
| 248 | // Override to support conditional rearranging of the table view. | ||
| 249 | - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { | ||
| 250 | // Return NO if you do not want the item to be re-orderable. | ||
| 251 | return YES; | ||
| 252 | } | ||
| 253 | */ | ||
| 254 | |||
| 255 | |||
| 256 | #pragma mark - | ||
| 257 | #pragma mark Table view delegate | ||
| 258 | |||
| 259 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { | ||
| 260 | // Navigation logic may go here. Create and push another view controller. | ||
| 261 | /* | ||
| 262 | <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil]; | ||
| 263 | // ... | ||
| 264 | // Pass the selected object to the new view controller. | ||
| 265 | [self.navigationController pushViewController:detailViewController animated:YES]; | ||
| 266 | [detailViewController release]; | ||
| 267 | */ | ||
| 268 | } | ||
| 269 | |||
| 270 | |||
| 271 | #pragma mark - | ||
| 272 | #pragma mark Memory management | ||
| 273 | |||
| 274 | - (void)didReceiveMemoryWarning { | ||
| 275 | // Releases the view if it doesn't have a superview. | ||
| 276 | [super didReceiveMemoryWarning]; | ||
| 277 | |||
| 278 | // Relinquish ownership any cached data, images, etc. that aren't in use. | ||
| 279 | } | ||
| 280 | |||
| 281 | - (void)viewDidUnload { | ||
| 282 | // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand. | ||
| 283 | // For example: self.myOutlet = nil; | ||
| 284 | } | ||
| 285 | |||
| 286 | |||
| 287 | - (void)dealloc { | ||
| 288 | [super dealloc]; | ||
| 289 | } | ||
| 290 | |||
| 291 | - (void)back | ||
| 292 | { | ||
| 293 | RootViewController* viewController = [[[UIApplication sharedApplication] delegate] viewController]; | ||
| 294 | [[[[UIApplication sharedApplication] delegate] window] setRootViewController:viewController]; | ||
| 295 | } | ||
| 296 | |||
| 297 | - (void)switchLists:(id)sender | ||
| 298 | { | ||
| 299 | if ([(UISegmentedControl*)sender selectedSegmentIndex] == 0) | ||
| 300 | { | ||
| 301 | if (loadingGlobal) | ||
| 302 | { | ||
| 303 | [loadingView removeFromSuperview]; | ||
| 304 | [self.view addSubview:tableView]; | ||
| 305 | } | ||
| 306 | |||
| 307 | showGlobal = NO; | ||
| 308 | [tableView reloadData]; | ||
| 309 | } else { | ||
| 310 | if (globalHighscores == nil) | ||
| 311 | { | ||
| 312 | loadingGlobal = YES; | ||
| 313 | |||
| 314 | loadingView = [[UIView alloc] initWithFrame:CGRectMake(0, 44, 320, 480-44)]; | ||
| 315 | activity = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(150, 228-44, 20, 20)]; | ||
| 316 | activity.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; | ||
| 317 | statusText = [[UILabel alloc] initWithFrame:CGRectMake(0, 256-44, 320, 21)]; | ||
| 318 | statusText.text = @"Downloading highscores..."; | ||
| 319 | statusText.textAlignment = UITextAlignmentCenter; | ||
| 320 | |||
| 321 | [loadingView addSubview:activity]; | ||
| 322 | [loadingView addSubview:statusText]; | ||
| 323 | [loadingView setBackgroundColor:[UIColor whiteColor]]; | ||
| 324 | [activity startAnimating]; | ||
| 325 | [tableView removeFromSuperview]; | ||
| 326 | [self.view addSubview:loadingView]; | ||
| 327 | |||
| 328 | CLScoreServerRequest* request = [[CLScoreServerRequest alloc] initWithGameName:@"Cart Collect" delegate:self]; | ||
| 329 | tQueryFlags flags = kQueryFlagIgnore; | ||
| 330 | [request requestScores:kQueryAllTime limit:15 offset:0 flags:flags category:@"Classic"]; | ||
| 331 | [request release]; | ||
| 332 | } else { | ||
| 333 | showGlobal = YES; | ||
| 334 | [tableView reloadData]; | ||
| 335 | } | ||
| 336 | } | ||
| 337 | } | ||
| 338 | |||
| 339 | - (void)scoreRequestOk:(id)sender | ||
| 340 | { | ||
| 341 | NSArray* highscores = [sender parseScores]; | ||
| 342 | NSMutableArray* highscoreTemp = [[NSMutableArray alloc] init]; | ||
| 343 | |||
| 344 | for (NSDictionary* data in highscores) | ||
| 345 | { | ||
| 346 | NSString* name = [data objectForKey:@"cc_playername"]; | ||
| 347 | int score = [[data objectForKey:@"cc_score"] intValue]; | ||
| 348 | NSDate* date = [NSDate dateWithTimeIntervalSince1970:[[data objectForKey:@"cc_when"] intValue]]; | ||
| 349 | Highscore* highscore = [[Highscore alloc] initWithName:name score:score date:date]; | ||
| 350 | [highscoreTemp addObject:highscore]; | ||
| 351 | [highscore release]; | ||
| 352 | } | ||
| 353 | |||
| 354 | globalHighscores = [highscoreTemp copy]; | ||
| 355 | [highscoreTemp release]; | ||
| 356 | |||
| 357 | loadingGlobal = NO; | ||
| 358 | [loadingView removeFromSuperview]; | ||
| 359 | [self.view addSubview:tableView]; | ||
| 360 | showGlobal = YES; | ||
| 361 | [tableView reloadData]; | ||
| 362 | } | ||
| 363 | |||
| 364 | - (void)scoreRequestFail:(id)sender | ||
| 365 | { | ||
| 366 | [activity stopAnimating]; | ||
| 367 | [statusText setText:@"Unable to download highscores."]; | ||
| 368 | } | ||
| 369 | |||
| 370 | @end | ||
| 371 | |||
