project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m
changeset 3547 02875b1145b7
parent 3546 ccf4854df294
child 3574 78fc6e61570b
--- a/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m	Wed Jun 23 21:49:19 2010 +0200
+++ b/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m	Wed Jun 23 22:03:56 2010 +0200
@@ -0,0 +1,398 @@
+//
+//  SettingsViewController.m
+//  hwengine
+//
+//  Created by Vittorio on 08/01/10.
+//  Copyright 2010 __MyCompanyName__. All rights reserved.
+//
+
+#import "GeneralSettingsViewController.h"
+#import "CommodityFunctions.h"
+
+@implementation GeneralSettingsViewController
+@synthesize settingsDictionary, textFieldBeingEdited, musicSwitch, soundSwitch, altDamageSwitch;
+
+
+-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
+    return rotationManager(interfaceOrientation);
+}
+
+
+#pragma mark -
+#pragma mark textfield methods
+// return to previous table
+-(void) cancel:(id) sender {
+    if (textFieldBeingEdited != nil)
+        [self.textFieldBeingEdited resignFirstResponder];
+}
+
+// set the new value
+-(BOOL) save:(id) sender {
+    if (textFieldBeingEdited != nil) {
+        if (textFieldBeingEdited.tag == 0) {
+            [self.settingsDictionary setObject:textFieldBeingEdited.text forKey:@"username"];
+        } else {
+            [self.settingsDictionary setObject:textFieldBeingEdited.text forKey:@"password"];
+        }
+        
+        isWriteNeeded = YES;
+        [self.textFieldBeingEdited resignFirstResponder];
+        return YES;
+    }
+    return NO;
+}
+
+// the textfield is being modified, update the navigation controller
+-(void) textFieldDidBeginEditing:(UITextField *)aTextField{   
+    self.textFieldBeingEdited = aTextField;
+    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel",@"from the settings table")
+                                                                     style:UIBarButtonItemStylePlain
+                                                                    target:self
+                                                                    action:@selector(cancel:)];
+    self.navigationItem.leftBarButtonItem = cancelButton;
+    [cancelButton release];
+    
+    UIBarButtonItem *saveButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Save",@"from the settings table")
+                                                                     style:UIBarButtonItemStyleDone
+                                                                    target:self
+                                                                    action:@selector(save:)];
+    self.navigationItem.rightBarButtonItem = saveButton;
+    [saveButton release];
+}
+
+// the textfield has been modified, check for empty strings and restore original navigation bar
+-(void) textFieldDidEndEditing:(UITextField *)aTextField{
+    self.textFieldBeingEdited = nil;
+    self.navigationItem.rightBarButtonItem = self.navigationItem.backBarButtonItem;
+    self.navigationItem.leftBarButtonItem = nil;
+}
+
+// limit the size of the field to 64 characters like in original frontend
+-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
+    int limit = 64;
+    return !([textField.text length] > limit && [string length] > range.length);
+}
+
+
+#pragma mark -
+#pragma mark View Lifecycle
+-(void) viewDidLoad {
+    [super viewDidLoad];
+    self.musicSwitch = [[UISwitch alloc] init];
+    self.soundSwitch = [[UISwitch alloc] init];
+    self.altDamageSwitch = [[UISwitch alloc] init];
+    [self.soundSwitch addTarget:self action:@selector(alsoTurnOffMusic:) forControlEvents:UIControlEventValueChanged];
+    [self.musicSwitch addTarget:self action:@selector(dontTurnOnMusic:) forControlEvents:UIControlEventValueChanged];
+    [self.altDamageSwitch addTarget:self action:@selector(justUpdateDictionary:) forControlEvents:UIControlEventValueChanged];
+    
+    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:SETTINGS_FILE()];
+    self.settingsDictionary = dictionary;
+    [dictionary release];
+}
+
+-(void) viewWillAppear:(BOOL)animated {
+    [self.tableView setContentOffset:CGPointMake(0,0) animated:NO];
+    isWriteNeeded = NO;
+    
+    musicSwitch.on = [[settingsDictionary objectForKey:@"music"] boolValue];
+    soundSwitch.on = [[settingsDictionary objectForKey:@"sound"] boolValue];
+    altDamageSwitch.on = [[settingsDictionary objectForKey:@"alternate"] boolValue];
+    
+    [super viewWillAppear:animated];
+}
+
+-(void) viewWillDisappear:(BOOL)animated {
+    [super viewWillDisappear:animated];
+    
+    if (isWriteNeeded) {
+        NSLog(@"writing preferences to file");
+        [self.settingsDictionary writeToFile:SETTINGS_FILE() atomically:YES];
+        isWriteNeeded = NO;
+    }
+}
+
+#pragma mark -
+// if the sound system is off, turn off also the background music 
+-(void) alsoTurnOffMusic:(id) sender {
+    [self.settingsDictionary setObject:[NSNumber numberWithBool:soundSwitch.on] forKey:@"sound"];
+    if (YES == self.musicSwitch.on) {
+        [musicSwitch setOn:NO animated:YES];
+        [self.settingsDictionary setObject:[NSNumber numberWithBool:musicSwitch.on] forKey:@"music"];
+    }
+    isWriteNeeded = YES;
+}
+
+// if the sound system is off, don't enable background music 
+-(void) dontTurnOnMusic:(id) sender {
+    if (NO == self.soundSwitch.on) {
+        [musicSwitch setOn:NO animated:YES];
+    } else {
+        [self.settingsDictionary setObject:[NSNumber numberWithBool:musicSwitch.on] forKey:@"music"];
+        isWriteNeeded = YES;
+    }
+}
+
+-(void) justUpdateDictionary:(id) sender {
+    UISwitch *theSwitch = (UISwitch *)sender;
+    [self.settingsDictionary setObject:[NSNumber numberWithBool:theSwitch.on] forKey:@"alternate"];
+    isWriteNeeded = YES;
+}
+
+/*
+#pragma mark -
+#pragma mark UIActionSheet Methods
+-(IBAction) deleteData: (id)sender {
+    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"Are you reeeeeally sure?", @"")
+                                 delegate:self
+                            cancelButtonTitle:NSLocalizedString(@"Well, maybe not...", @"")
+                           destructiveButtonTitle:NSLocalizedString(@"As sure as I can be!", @"")
+                            otherButtonTitles:nil];
+    [actionSheet showInView:self.view];
+    [actionSheet release];
+}
+
+-(void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger) buttonIndex {
+    if ([actionSheet cancelButtonIndex] != buttonIndex) {
+        // get the documents dirctory
+        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
+        NSString *documentsDirectory = [paths objectAtIndex:0];
+        
+        // get the content of the directory
+        NSFileManager *fm = [NSFileManager defaultManager];
+        NSArray *dirContent = [fm directoryContentsAtPath:documentsDirectory];
+        NSError *error;
+        
+        // delete data
+        for (NSString *fileName in dirContent) {
+            [fm removeItemAtPath:[documentsDirectory stringByAppendingPathComponent:fileName] error:&error];
+        }
+        
+        // force resetting
+        UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Hit Home Button to Exit", @"")
+                                  message:NSLocalizedString(@"\nEverything is gone!\nNow you need to restart the game...", @"")
+                                 delegate:self
+                            cancelButtonTitle:nil
+                            otherButtonTitles:nil];
+        [anAlert show];
+        [anAlert release];
+    }
+}
+*/
+
+#pragma mark -
+#pragma mark TableView Methods
+-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
+    return 3;
+}
+
+-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    switch (section) {
+        case kNetworkFields:
+            return 2;
+            break;
+        case kAudioFields:
+            return 2;
+            break;
+        case kOtherFields:
+            return 1;
+            break;
+        default:
+            break;
+    }
+    return 0;
+}
+
+-(UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    static NSString *cellIdentifier = @"systemSettingsCell";
+    NSInteger row = [indexPath row];
+    NSInteger section = [indexPath section];
+    
+    UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:cellIdentifier];
+    if (nil == cell) {
+        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
+        if (section == kNetworkFields) {
+            UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(-15, 10, 100, 25)];
+            label.textAlignment = UITextAlignmentRight;
+            label.backgroundColor = [UIColor clearColor];
+            label.font = [UIFont boldSystemFontOfSize:[UIFont systemFontSize] + 2];
+            if (row == 0) 
+                label.text = NSLocalizedString(@"Nickname","from the settings table");
+            else 
+                label.text = NSLocalizedString(@"Password","from the settings table");
+            [cell.contentView addSubview:label];
+            [label release];
+            
+            UITextField *aTextField = [[UITextField alloc] initWithFrame:
+                                       CGRectMake(110, 12, (cell.frame.size.width + cell.frame.size.width/3) - 90, 25)];
+            aTextField.clearsOnBeginEditing = NO;
+            aTextField.returnKeyType = UIReturnKeyDone;
+            aTextField.adjustsFontSizeToFitWidth = YES;
+            aTextField.delegate = self;
+            aTextField.tag = row;
+            aTextField.clearButtonMode = UITextFieldViewModeWhileEditing;
+            [aTextField addTarget:self action:@selector(save:) forControlEvents:UIControlEventEditingDidEndOnExit];
+            [cell.contentView addSubview:aTextField];
+            [aTextField release];
+        }
+    }
+    
+    cell.accessoryType = UITableViewCellAccessoryNone;
+    cell.selectionStyle = UITableViewCellSelectionStyleNone;
+    cell.imageView.image = nil;
+    
+    UITextField *aTextField;
+    switch (section) {
+        case kNetworkFields:
+            for (UIView *oneView in cell.contentView.subviews) 
+                if ([oneView isMemberOfClass:[UITextField class]]) 
+                    aTextField = (UITextField *)oneView;
+
+            switch (row) {
+                case 0:                    
+                    aTextField.placeholder = NSLocalizedString(@"Insert your username (if you have one)",@"");
+                    aTextField.text = [self.settingsDictionary objectForKey:@"username"];
+                    break;
+                case 1:                    
+                    aTextField.placeholder = NSLocalizedString(@"Insert your password",@"");
+                    aTextField.text = [self.settingsDictionary objectForKey:@"password"];
+                    aTextField.secureTextEntry = YES;
+                    break;
+                default:
+                    break;
+            }
+            break;
+            
+        case kAudioFields:
+            switch (row) {
+                case 0:
+                    cell.textLabel.text = NSLocalizedString(@"Sound", @"");
+                    cell.accessoryView = soundSwitch;
+                    break;
+                case 1:
+                    cell.textLabel.text = NSLocalizedString(@"Music", @"");
+                    cell.accessoryView = musicSwitch;
+                    break;
+                default:
+                    break;
+            }
+            break;
+            
+        case kOtherFields:
+            cell.selectionStyle = UITableViewCellSelectionStyleNone;
+            cell.textLabel.text = NSLocalizedString(@"Alternate Damage", @"");
+            cell.accessoryView = altDamageSwitch;
+            break;
+        default:
+            break;
+    }
+    return cell;
+}
+
+-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
+    NSString *sectionTitle = nil;
+    switch (section) {
+        case kNetworkFields:
+            sectionTitle = NSLocalizedString(@"Network Configuration", @"");
+            break;
+        case kAudioFields:
+            sectionTitle = NSLocalizedString(@"Audio Preferences", @"");
+            break;
+        case kOtherFields:
+            sectionTitle = NSLocalizedString(@"Other Settings", @"");
+            break;
+        default:
+            NSLog(@"Nope");
+            break;
+    }
+    return sectionTitle;
+}
+
+/*
+-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
+    UIView *containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 50)] autorelease];
+    UILabel *headerLabel = [[[UILabel alloc] initWithFrame:CGRectMake(10, 20, 300, 40)] autorelease];
+    headerLabel.textColor = [UIColor lightGrayColor];
+    headerLabel.shadowColor = [UIColor blackColor];
+    headerLabel.shadowOffset = CGSizeMake(0, 1);
+    headerLabel.font = [UIFont boldSystemFontOfSize:20];
+    headerLabel.backgroundColor = [UIColor clearColor];
+
+    switch (section) {
+        case kNetworkFields:
+            headerLabel.text = NSLocalizedString(@"Network Configuration", @"");
+            break;
+        case kAudioFields:
+            headerLabel.text = NSLocalizedString(@"Audio Preferences", @"");
+            break;
+        case kOtherFields:
+            headerLabel.text = NSLocalizedString(@"Other Settings", @"");
+            break;
+        default:
+            NSLog(@"Warning: unset case value in titleForHeaderInSection!");
+            headerLabel.text = @"!";
+            break;
+    }
+    
+    [containerView addSubview:headerLabel];
+    return containerView;
+}
+
+-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+    if (kAudioFields == [indexPath section] && 2 == [indexPath row])
+        return volumeCell.frame.size.height;
+    else
+        return table.rowHeight;
+}
+
+-(CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
+    return 57.0;
+}
+*/
+
+
+#pragma mark -
+#pragma mark Table view delegate
+-(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+    UITableViewCell *cell;
+    if (kNetworkFields == [indexPath section]) {
+        cell = [aTableView cellForRowAtIndexPath:indexPath];
+        for (UIView *oneView in cell.contentView.subviews) {
+            if ([oneView isMemberOfClass:[UITextField class]]) {
+                textFieldBeingEdited = (UITextField *)oneView;
+                [textFieldBeingEdited becomeFirstResponder];
+            }
+        }
+        [aTableView deselectRowAtIndexPath:indexPath animated:NO];
+    }
+}
+
+
+#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 {
+    self.settingsDictionary = nil;
+    self.textFieldBeingEdited = nil;
+    self.musicSwitch = nil;
+    self.soundSwitch = nil;
+    self.altDamageSwitch = nil;
+    [super viewDidUnload];
+    MSG_DIDUNLOAD();
+}
+
+-(void) dealloc {
+    [settingsDictionary release];
+    [textFieldBeingEdited release];
+    [musicSwitch release];
+    [soundSwitch release];
+    [altDamageSwitch release];
+    [super dealloc];
+}
+
+
+@end