wolf3d-ios/wolf3d/code/iphone/EpisodeViewController.m

355 lines
10 KiB
Objective-C

/*
Copyright (C) 2011 id Software LLC, a ZeniMax Media company.
This file is part of the WOLF3D iOS v2.1 GPL Source Code.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#import "EpisodeViewController.h"
#import "LevelSelectViewController.h"
#import "wolfiphone.h"
#define TOTAL_EPISODES 10
static const char * const EpisodeNames[TOTAL_EPISODES][2] = {
{ "Episode 1", "Escape from Wolfenstein" },
{ "Episode 2", "Operation: Eisenfaust" },
{ "Episode 3", "Die, Fuhrer, Die!" },
{ "Episode 4", "A Dark Secret" },
{ "Episode 5", "Trail of the Madman" },
{ "Episode 6", "Confrontation" },
{ "Spear of Destiny", "Tunnels" },
{ "Spear of Destiny", "Dungeons" },
{ "Spear of Destiny", "Castle" },
{ "Spear of Destiny", "Ramparts" }
};
// A class extension to declare private methods
@interface EpisodeViewController (PrivateMethods)
- (void)startLevelSelect;
- (void)setCellSelected:(BOOL)selected atIndexPath:(NSIndexPath*)indexPath;
- (void)setCellSelected:(BOOL)selected cell:(UITableViewCell*)cell;
- (void)handleSelectionAtIndexPath:(NSIndexPath*)indexPath;
- (void)scrollToRow:(int)row;
@end
@interface EpisodeViewController ()
@property (nonatomic, retain) UITableView *episodeList;
@end
@implementation EpisodeViewController
@synthesize episodeList;
@synthesize episodeCell;
// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
/*
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization.
}
return self;
}
*/
/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
// TODO: Select the current episode. Haven't yet figured out a good way to get the table
// view to load with a default row selected, so for now always select episode 1.
int initialEpisode = 0;
NSIndexPath *initialPath = [NSIndexPath indexPathForRow:initialEpisode inSection:0];
[self.episodeList selectRowAtIndexPath:initialPath animated:YES scrollPosition:UITableViewScrollPositionNone];
[self handleSelectionAtIndexPath:initialPath];
}
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations.
return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc. that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
[self.episodeList release];
self.episodeList = nil;
}
- (void)dealloc {
[super dealloc];
}
// Sets the current episode with the sender's tag. IF the user selects a platinum episode but
// only has the lite version of the app, prompt him to buy the platinum version.
- (IBAction)setEpisode:(id)sender {
NSInteger requestedEpisode = [sender tag];
if ( SysIPhoneGetContentVersion() == CONTENT_PLATINUM || requestedEpisode == 0 ) {
Cvar_SetValue( episode->name, [sender tag] );
[self startLevelSelect];
} else {
// Prompt user to buy platinum version
iphonePromptToBuyPlatinum();
}
}
- (IBAction)back:(id)sender {
[self.navigationController popViewControllerAnimated:YES];
}
- (IBAction)next:(id)sender {
LevelSelectViewController *lsc = [[LevelSelectViewController alloc] initWithNibName:@"LevelSelectView" bundle:nil];
[self.navigationController pushViewController:lsc animated:YES];
[lsc release];
}
- (IBAction)pageDown:(id)sender {
// If the user taps the page down button, we want to scroll the table view so that the first
// non-visible row becomes visible. To do this, we can get the array of visible index paths,
// find the maximum row within the array, and scroll to the row just after that.
NSArray* visibleIndexPaths = [self.episodeList indexPathsForVisibleRows];
int maxRow = 0;
for ( NSIndexPath* path in visibleIndexPaths ) {
maxRow = maxRow < path.row ? path.row: maxRow;
}
const int rowToMakeVisible = maxRow + 1;
[self scrollToRow:rowToMakeVisible];
}
- (IBAction)pageUp:(id)sender {
// If the user taps the page up button, we want to scroll the table view so that the first
// non-visible row becomes visible. To do this, we can get the array of visible index paths,
// find the minimum row within the array, and scroll to the row just before that.
NSArray* visibleIndexPaths = [self.episodeList indexPathsForVisibleRows];
int minRow = TOTAL_EPISODES - 1;
for ( NSIndexPath* path in visibleIndexPaths ) {
minRow = minRow < path.row ? minRow: path.row;
}
const int rowToMakeVisible = minRow - 1;
[self scrollToRow:rowToMakeVisible];
}
- (void)scrollToRow:(int)row {
const int clampedRowMax = row < TOTAL_EPISODES? row: TOTAL_EPISODES-1;
const int clampedRow = clampedRowMax < 0? 0: clampedRowMax;
NSIndexPath* pathToMakeVisible = [NSIndexPath indexPathForRow:clampedRow inSection:0];
[self.episodeList scrollToRowAtIndexPath:pathToMakeVisible atScrollPosition:UITableViewScrollPositionNone animated:YES];
}
- (void)startLevelSelect {
}
/*
========================
UITableView interface
========================
*/
- (void)handleSelectionAtIndexPath:(NSIndexPath*)indexPath {
// Prompt for In-App Purchase when the user selects a level that is not currently available.
if ( SysIPhoneGetContentVersion() == CONTENT_LITE ) {
if ( indexPath.row > 0 ) {
iphonePromptToBuyPlatinum();
return;
}
}
Cvar_SetValue( episode->name, indexPath.row );
[self setCellSelected:YES atIndexPath:indexPath];
/*
int episodeIndex = episode->value;
int levelIndex = indexPath.row;
realEpisode = episodeIndex;
realMap = levelIndex;
if ( episodeIndex >= NUM_ORIGINAL_EPISODES ) {
switch (episodeIndex)
{
case 6:
if (levelIndex == 5) {
realEpisode = 7;
realMap = 8;
}
break;
case 7:
realEpisode = 6;
realMap += 5;
break;
case 8:
realEpisode = 7;
if (levelIndex == 6)
realMap = 9;
break;
case 9:
if ( levelIndex == 0) { realEpisode = 7; realMap = 6; }
if ( levelIndex == 1) { realEpisode = 7; realMap = 7; }
if ( levelIndex == 2) { realEpisode = 8; realMap = 0; }
break;
default:
break;
}
}
*/
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return TOTAL_EPISODES;
}
static CGRect maximumNameLabelFrame = { { 0.0, 0.0 }, { 0.0, 0.0 } };
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = (UITableViewCell*)[self.episodeList dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
//cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
[[NSBundle mainBundle] loadNibNamed:@"EpisodeCell" owner:self options:nil];
if ( episodeCell == nil ) {
// Couldn't create from nib file, load a default cell.
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
} else {
cell = episodeCell;
self.episodeCell = nil;
// Save the good label size here before it gets modified by the code below.
UILabel *episodeNameLabel;
episodeNameLabel = (UILabel *)[cell viewWithTag:2];
maximumNameLabelFrame = episodeNameLabel.frame;
}
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
BOOL isCellSelected = ( episode->value == indexPath.row)? YES: NO;
[self setCellSelected:isCellSelected cell:cell];
UILabel *episodeNumberLabel;
episodeNumberLabel = (UILabel *)[cell viewWithTag:1];
episodeNumberLabel.text = [NSString stringWithCString:EpisodeNames[indexPath.row][0] encoding:NSASCIIStringEncoding];
UILabel *episodeNameLabel;
episodeNameLabel = (UILabel *)[cell viewWithTag:2];
NSString* episodeNameText = [NSString stringWithCString:EpisodeNames[indexPath.row][1] encoding:NSASCIIStringEncoding];
CGSize expectedLabelSize = [episodeNameText sizeWithFont:episodeNameLabel.font
constrainedToSize:maximumNameLabelFrame.size
lineBreakMode:episodeNameLabel.lineBreakMode];
//adjust the label the the new height.
CGRect newFrame = maximumNameLabelFrame;
newFrame.size.height = expectedLabelSize.height;
episodeNameLabel.frame = newFrame;
episodeNameLabel.text = episodeNameText;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[self handleSelectionAtIndexPath:indexPath];
}
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
[self setCellSelected:NO atIndexPath:indexPath];
}
- (void)setCellSelected:(BOOL)selected atIndexPath:(NSIndexPath*)indexPath {
// Get the cell that was selected.
UITableViewCell * cell = [episodeList cellForRowAtIndexPath:indexPath];
[self setCellSelected:selected cell:cell];
}
- (void)setCellSelected:(BOOL)selected cell:(UITableViewCell*)cell {
// Get the "selected" image
UIView * selectionFrame = [cell viewWithTag:3];
// Show the selected image
selectionFrame.hidden = !selected;
}
@end