diff -r 2378ada8a6ee -r a44406f4369b project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m --- a/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m Tue Jul 20 23:30:54 2010 +0200 +++ b/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m Thu Jul 22 03:08:17 2010 +0200 @@ -8,10 +8,9 @@ #import "GeneralSettingsViewController.h" #import "CommodityFunctions.h" -#import "EditableCellView.h" @implementation GeneralSettingsViewController -@synthesize settingsDictionary, textFieldBeingEdited, musicSwitch, soundSwitch, altDamageSwitch; +@synthesize settingsDictionary; -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { @@ -19,65 +18,9 @@ } #pragma mark - -#pragma mark textfield methods -// return to previous table --(void) cancel:(id) sender { - if (textFieldBeingEdited != nil) - [self.textFieldBeingEdited resignFirstResponder]; -} - -// set the new value --(void) 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"]; - - [self.textFieldBeingEdited resignFirstResponder]; - } -} - -// 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 { - return !([textField.text length] > MAX_STRING_LENGTH && [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; @@ -87,10 +30,6 @@ -(void) viewWillAppear:(BOOL)animated { [self.tableView setContentOffset:CGPointMake(0,0) animated:NO]; - musicSwitch.on = [[settingsDictionary objectForKey:@"music"] boolValue]; - soundSwitch.on = [[settingsDictionary objectForKey:@"sound"] boolValue]; - altDamageSwitch.on = [[settingsDictionary objectForKey:@"alternate"] boolValue]; - [super viewWillAppear:animated]; } @@ -100,26 +39,41 @@ } #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"]; +-(void) switchValueChanged:(id) sender { + UISwitch *theSwitch = (UISwitch *)sender; + UISwitch *theOtherSwitch = nil; + + switch (theSwitch.tag) { + case 10: //soundSwitch + // this turn off also the switch below + [self.settingsDictionary setObject:[NSNumber numberWithBool:theSwitch.on] forKey:@"sound"]; + [self.settingsDictionary setObject:[NSNumber numberWithBool:NO] forKey:@"music"]; + theOtherSwitch = (UISwitch *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:1]].accessoryView; + [theOtherSwitch setOn:NO animated:YES]; + break; + case 20: //musicSwitch + // if switch above is off, never turn on + if (NO == [[self.settingsDictionary objectForKey:@"sound"] boolValue]) { + [self.settingsDictionary setObject:[NSNumber numberWithBool:NO] forKey:@"music"]; + theOtherSwitch = (UISwitch *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:1]].accessoryView; + [theOtherSwitch setOn:NO animated:YES]; + } else + [self.settingsDictionary setObject:[NSNumber numberWithBool:theSwitch.on] forKey:@"music"]; + break; + case 30: //alternateSwitch + [self.settingsDictionary setObject:[NSNumber numberWithBool:theSwitch.on] forKey:@"alternate"]; + break; + default: + DLog(@"Wrong tag"); + break; } } -// 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]; +-(void) saveTextFieldValue:(NSString *)textString withTag:(NSInteger) tagValue { + if (tagValue == 40) + [self.settingsDictionary setObject:textString forKey:@"username"]; else - [self.settingsDictionary setObject:[NSNumber numberWithBool:musicSwitch.on] forKey:@"music"]; -} - --(void) justUpdateDictionary:(id) sender { - UISwitch *theSwitch = (UISwitch *)sender; - [self.settingsDictionary setObject:[NSNumber numberWithBool:theSwitch.on] forKey:@"alternate"]; + [self.settingsDictionary setObject:textString forKey:@"password"]; } #pragma mark - @@ -145,99 +99,6 @@ 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]; - UITextField *aTextField; - switch (section) { - case 0: - if (nil == cell) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease]; - if (section == 0) { - UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(-9, 10, 100, [UIFont labelFontSize] + 4)]; - label.textAlignment = UITextAlignmentRight; - label.backgroundColor = [UIColor clearColor]; - label.font = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]]; - 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, 10, (cell.frame.size.width + cell.frame.size.width/3) - 90, [UIFont labelFontSize] + 4)]; - 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]; - } - } - 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"]; - aTextField.secureTextEntry = NO; - break; - case 1: - aTextField.placeholder = NSLocalizedString(@"Insert your password",@""); - aTextField.text = [self.settingsDictionary objectForKey:@"password"]; - aTextField.secureTextEntry = YES; - break; - default: - break; - } - break; - - cell.accessoryView = nil; - case 1: - if (nil == cell) - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease]; - - 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 2: - if (nil == cell) - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease]; - - cell.textLabel.text = NSLocalizedString(@"Alternate Damage", @""); - cell.accessoryView = altDamageSwitch; - break; - default: - break; - } - - cell.accessoryType = UITableViewCellAccessoryNone; - cell.selectionStyle = UITableViewCellSelectionStyleNone; - cell.imageView.image = nil; - - return cell; -} - -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { NSString *sectionTitle = nil; switch (section) { @@ -257,6 +118,75 @@ return sectionTitle; } +-(UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *cellIdentifier0 = @"Cell0"; + static NSString *cellIdentifier1 = @"Cell1"; + NSInteger row = [indexPath row]; + NSInteger section = [indexPath section]; + + UITableViewCell *cell = nil; + EditableCellView *editableCell = nil; + if (section == 0) { + editableCell = (EditableCellView *)[aTableView dequeueReusableCellWithIdentifier:cellIdentifier0]; + if (nil == editableCell) { + editableCell = [[[EditableCellView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier0] autorelease]; + editableCell.minimumCharacters = 0; + editableCell.delegate = self; + editableCell.textField.font = [UIFont systemFontOfSize:[UIFont systemFontSize]]; + editableCell.textField.textColor = [UIColor lightGrayColor]; + } + + if (row == 0) { + editableCell.titleLabel.text = NSLocalizedString(@"Nickname","from the settings table"); + editableCell.textField.placeholder = NSLocalizedString(@"Insert your username (if you have one)",@""); + editableCell.textField.text = [self.settingsDictionary objectForKey:@"username"]; + editableCell.textField.secureTextEntry = NO; + editableCell.tag = 40; + } else { + editableCell.titleLabel.text = NSLocalizedString(@"Password","from the settings table"); + editableCell.textField.placeholder = NSLocalizedString(@"Insert your password",@""); + editableCell.textField.text = [self.settingsDictionary objectForKey:@"password"]; + editableCell.textField.secureTextEntry = YES; + editableCell.tag = 50; + } + + editableCell.accessoryView = nil; + cell = editableCell; + } else { + cell = [aTableView dequeueReusableCellWithIdentifier:cellIdentifier1]; + if (nil == cell) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier1] autorelease]; + UISwitch *theSwitch = [[UISwitch alloc] init]; + [theSwitch addTarget:self action:@selector(switchValueChanged:) forControlEvents:UIControlEventValueChanged]; + cell.accessoryView = theSwitch; + [theSwitch release]; + } + + UISwitch *switchContent = (UISwitch *)cell.accessoryView; + if (section == 1) { + if (row == 0) { + cell.textLabel.text = NSLocalizedString(@"Sound", @""); + switchContent.on = [[self.settingsDictionary objectForKey:@"sound"] boolValue]; + switchContent.tag = 10; + } else { + cell.textLabel.text = NSLocalizedString(@"Music", @""); + switchContent.on = [[self.settingsDictionary objectForKey:@"music"] boolValue]; + switchContent.tag = 20; + } + } else { + cell.textLabel.text = NSLocalizedString(@"Alternate Damage", @""); + switchContent.on = [[self.settingsDictionary objectForKey:@"alternate"] boolValue]; + switchContent.tag = 30; + } + } + + cell.accessoryType = UITableViewCellAccessoryNone; + cell.selectionStyle = UITableViewCellSelectionStyleNone; + cell.imageView.image = nil; + + return cell; +} + /* -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 50)] autorelease]; @@ -299,24 +229,15 @@ } */ -/* - causes segfault if pressing twice cancel #pragma mark - #pragma mark Table view delegate -(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell; if (0 == [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]; + EditableCellView *cell = (EditableCellView *)[aTableView cellForRowAtIndexPath:indexPath]; + [cell replyKeyboard]; } } -*/ + #pragma mark - #pragma mark Memory management @@ -326,22 +247,13 @@ -(void) viewDidUnload { self.settingsDictionary = nil; - self.textFieldBeingEdited = nil; - self.musicSwitch = nil; - self.soundSwitch = nil; - self.altDamageSwitch = nil; + MSG_DIDUNLOAD(); [super viewDidUnload]; - MSG_DIDUNLOAD(); } -(void) dealloc { [settingsDictionary release]; - [textFieldBeingEdited release]; - [musicSwitch release]; - [soundSwitch release]; - [altDamageSwitch release]; [super dealloc]; } - @end