//
// 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 "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) {
localHighscores = [[Highscore localHighscoreListForGameMode:@"Collect"] retain];
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];
[navigationBar pushNavigationItem:myNavigationItem animated:NO];
areaControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Local", @"Global", nil]];
areaControl.selectedSegmentIndex = 0;
areaControl.segmentedControlStyle = UISegmentedControlStyleBar;
[areaControl addTarget:self action:@selector(switchLists:) forControlEvents:UIControlEventValueChanged];
UIBarButtonItem* barButton2 = [[UIBarButtonItem alloc] initWithCustomView:areaControl];
UIBarButtonItem* btnSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
modeControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Collect", @"Jump", nil]];
modeControl.selectedSegmentIndex = 0;
modeControl.segmentedControlStyle = UISegmentedControlStyleBar;
[modeControl addTarget:self action:@selector(switchGameMode:) forControlEvents:UIControlEventValueChanged];
UIBarButtonItem* barButton3 = [[UIBarButtonItem alloc] initWithCustomView:modeControl];
toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 480-44, 320, 44)];
[toolbar setItems:[NSArray arrayWithObjects:barButton3, btnSpace, barButton2, nil] animated:NO];
[barButton2 release];
[btnSpace release];
[barButton3 release];
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-44)];
[parentView addSubview:navigationBar];
[parentView addSubview:tableView];
[parentView addSubview:toolbar];
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 %d", modeControl.selectedSegmentIndex, [indexPath row]];
highscore = [globalHighscores objectAtIndex:[indexPath row]];
} else {
cellIdentifier = [NSString stringWithFormat:@"Local-%d %d", modeControl.selectedSegmentIndex, [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-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;
if (modeControl.selectedSegmentIndex == 0)
{
[request requestScores:kQueryAllTime limit:15 offset:0 flags:flags category:@"Classic"];
} else {
[request requestScores:kQueryAllTime limit:15 offset:0 flags:flags category:@"Jump"];
}
[request release];
} else {
showGlobal = YES;
[tableView reloadData];
}
}
}
- (void)switchGameMode:(id)sender
{
[localHighscores release];
if ([(UISegmentedControl*)sender selectedSegmentIndex] == 0)
{
localHighscores = [[Highscore localHighscoreListForGameMode:@"Collect"] retain];
} else {
localHighscores = [[Highscore localHighscoreListForGameMode:@"Jump"] retain];
}
[globalHighscores release];
globalHighscores = nil;
[self switchLists:areaControl];
}
- (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