0,0 → 1,454 |
// /////////////////////////////////////////////////////////////////////////////// |
// Copyright (C) 2010, Frank Blumenberg |
// |
// See License.txt for complete licensing and attribution information. |
// Permission is hereby granted, free of charge, to any person obtaining a copy |
// of this software and associated documentation files (the "Software"), to deal |
// in the Software without restriction, including without limitation the rights |
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
// copies of the Software, and to permit persons to whom the Software is |
// furnished to do so, subject to the following conditions: |
// |
// The above copyright notice and this permission notice shall be included in all |
// copies or substantial portions of the Software. |
// |
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
// THE SOFTWARE. |
// |
// /////////////////////////////////////////////////////////////////////////////// |
|
#import "SettingsSelectionViewController.h" |
#import "SettingViewController.h" |
#import "MKConnectionController.h" |
#import "NSData+MKCommandEncode.h" |
#import "NSData+MKPayloadEncode.h" |
#import "MKDatatypes.h" |
#import "MKDataConstants.h" |
#import "InAppSettings.h" |
#import "MixerViewController.h" |
#import "ChannelsViewController.h" |
#import "EngineTestViewController.h" |
|
static NSUInteger kNumberOfPages = 5; |
|
@interface SettingsSelectionViewController (Private) |
|
@end |
|
// /////////////////////////////////////////////////////////////////////////////// |
|
@implementation SettingsSelectionViewController |
|
@synthesize settings=_settings; |
|
// /////////////////////////////////////////////////////////////////////////////// |
#pragma mark - |
#pragma mark View lifecycle |
|
|
- (id)init { |
|
if ((self = [super initWithStyle:UITableViewStyleGrouped])) { |
self.title = NSLocalizedString(@"Settings",@"Settings controller title"); |
self.hidesBottomBarWhenPushed=NO; |
} |
|
return self; |
} |
|
- (void)viewDidLoad { |
[super viewDidLoad]; |
|
NSNotificationCenter * nc = [NSNotificationCenter defaultCenter]; |
[nc addObserver:self |
selector:@selector(readSettingNotification:) |
name:MKReadSettingNotification |
object:nil]; |
|
[nc addObserver:self |
selector:@selector(changeSettingNotification:) |
name:MKChangeSettingNotification |
object:nil]; |
|
|
[self.tableView setAllowsSelectionDuringEditing:YES]; |
|
} |
|
#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 { |
NSNotificationCenter * nc = [NSNotificationCenter defaultCenter]; |
[nc removeObserver:self]; |
|
self.settings=nil; |
[_settings release]; |
} |
|
|
- (void)dealloc { |
[super dealloc]; |
[_settings release]; |
} |
|
// //////////////////////////////////////////////////////////////////////////////////////////// |
#pragma mark - |
- (void) viewWillAppear:(BOOL)animated { |
[self.navigationController setToolbarHidden:NO animated:NO]; |
[[MKConnectionController sharedMKConnectionController] activateFlightCtrl]; |
} |
|
- (void) viewDidAppear:(BOOL)animated { |
[self cancelEditActiveSetting:self]; |
[self reloadAllSettings]; |
|
UIBarButtonItem* actionButton; |
|
actionButton = [[[UIBarButtonItem alloc] |
initWithTitle:@"Change Active" |
style:UIBarButtonItemStyleBordered|UIBarButtonItemStyleDone |
target:self |
action:@selector(saveActiveSetting:)] autorelease]; |
|
|
[self setToolbarItems:[NSArray arrayWithObject:actionButton] animated:YES]; |
//[actionButton release]; |
} |
|
// //////////////////////////////////////////////////////////////////////////////////////////// |
#pragma mark - |
|
- (IBAction) reloadAllSettings { |
|
NSMutableArray * settings = [[NSMutableArray alloc] init]; |
for (unsigned i = 0; i < kNumberOfPages; i++) { |
[settings addObject:[NSNull null]]; |
} |
self.settings = settings; |
[settings release]; |
|
activeSetting=0xFF; |
[self requestSettingForIndex:0xFF]; |
|
} |
|
|
// theIndex 1-5 or 0xFF |
- (void) requestSettingForIndex:(NSInteger)theIndex { |
MKConnectionController * cCtrl = [MKConnectionController sharedMKConnectionController]; |
uint8_t index = theIndex; |
|
NSData * data = [NSData dataWithCommand:MKCommandReadSettingsRequest |
forAddress:MKAddressFC |
payloadWithBytes:&index |
length:1]; |
|
[cCtrl sendRequest:data]; |
} |
|
|
- (void) readSettingNotification:(NSNotification *)aNotification { |
|
NSDictionary* d=[aNotification userInfo]; |
|
NSInteger index = [[d objectForKey:kMKDataKeyIndex] integerValue]-1; |
|
if (activeSetting==0xFF) { |
activeSetting=index; |
} |
|
[self.settings replaceObjectAtIndex:index withObject:d]; |
|
for (int i=0; i<kNumberOfPages; i++) { |
if ([self.settings objectAtIndex:i] == [NSNull null]) { |
[self requestSettingForIndex:i+1]; |
break; |
} |
} |
[self.tableView reloadData]; |
} |
|
|
////////////////////////////////////////////////////////////////////////////////////////////// |
#pragma mark - |
#pragma mark Table view data source |
|
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { |
return self.tableView.editing?1:2; |
} |
|
|
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { |
if(section==0) |
return [self.settings count]; |
|
return 3; |
} |
|
////////////////////////////////////////////////////////////////////////////////////////////// |
|
- (UITableViewCell *) cellForSetting: (UITableView *) tableView indexPath: (NSIndexPath *) indexPath { |
static NSString *CellIdentifier = @"SettingsSelectionCell"; |
|
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; |
if (cell == nil) { |
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; |
} |
|
NSUInteger row = [indexPath row]; |
NSDictionary* setting=[self.settings objectAtIndex:row]; |
|
if ((NSNull *)setting == [NSNull null]) { |
cell.textLabel.text = [NSString stringWithFormat:NSLocalizedString(@"Setting #%d",@"Setting i"), row]; |
|
UIActivityIndicatorView *activityView = |
[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; |
[activityView startAnimating]; |
[cell setAccessoryView:activityView]; |
[activityView release]; |
} |
else { |
|
cell.textLabel.text = [setting objectForKey:kKeyName]; |
cell.accessoryView = nil; |
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; |
} |
|
|
int currActiveSetting= self.tableView.editing? newActiveSetting:activeSetting; |
|
if( row == currActiveSetting ){ |
UIImage *image = [UIImage imageNamed:@"star.png"]; |
cell.imageView.image = image; |
} |
else { |
cell.imageView.image = nil; |
} |
|
|
return cell; |
|
} |
|
////////////////////////////////////////////////////////////////////////////////////////////// |
|
- (UITableViewCell *) cellForExtra: (UITableView *) tableView indexPath: (NSIndexPath *) indexPath { |
static NSString *CellIdentifier = @"SettingsMixerCell"; |
|
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; |
if (cell == nil) { |
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; |
} |
|
switch (indexPath.row) { |
case 0: |
cell.textLabel.text = NSLocalizedString(@"Mixer",@"Mixer cell"); |
break; |
case 1: |
cell.textLabel.text = NSLocalizedString(@"Motor test",@"Motor test cell"); |
break; |
case 2: |
cell.textLabel.text = NSLocalizedString(@"Channels",@"Channels cell"); |
break; |
} |
cell.accessoryView = nil; |
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; |
cell.imageView.image = nil; |
|
|
return cell; |
|
} |
|
////////////////////////////////////////////////////////////////////////////////////////////// |
|
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { |
|
if(indexPath.section==0) |
return [self cellForSetting: tableView indexPath: indexPath]; |
|
return [self cellForExtra: tableView indexPath: indexPath]; |
} |
|
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { |
return UITableViewCellEditingStyleNone; |
} |
|
- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath |
{ |
return NO; |
} |
|
// Override to support conditional editing of the table view. |
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { |
return indexPath.section==0; |
} |
|
|
/* |
// 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:YES]; |
} |
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; |
} |
*/ |
|
- (void) changeSettingNotification:(NSNotification *)aNotification { |
|
NSDictionary* d=[aNotification userInfo]; |
|
NSInteger index = [[d objectForKey:kMKDataKeyIndex] integerValue]-1; |
|
activeSetting=index; |
|
[self cancelEditActiveSetting:self]; |
} |
|
- (void)saveActiveSetting:(id)sender |
{ |
MKConnectionController * cCtrl = [MKConnectionController sharedMKConnectionController]; |
uint8_t index = newActiveSetting+1; |
|
NSData * data = [NSData dataWithCommand:MKCommandChangeSettingsRequest |
forAddress:MKAddressFC |
payloadWithBytes:&index |
length:1]; |
|
[cCtrl sendRequest:data]; |
} |
|
- (void)editActiveSetting:(id)sender |
{ |
[self.navigationController setToolbarHidden:NO animated:YES]; |
|
UIBarButtonItem *cancelButton = [[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel |
target:self |
action:@selector(cancelEditActiveSetting:)]autorelease]; |
|
[self.navigationItem setRightBarButtonItem:cancelButton animated:NO]; |
|
newActiveSetting = activeSetting; |
|
[self.tableView setEditing:YES animated:YES]; |
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationFade]; |
} |
|
- (void)cancelEditActiveSetting:(id)sender |
{ |
[self.navigationController setToolbarHidden:YES animated:YES]; |
|
UIBarButtonItem *editButton = [[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemEdit |
target:self |
action:@selector(editActiveSetting:)]autorelease]; |
|
[self.navigationItem setRightBarButtonItem:editButton animated:NO]; |
[self.tableView setEditing:NO animated:YES]; |
|
//[self.tableView insertSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:YES]; |
|
[self.tableView reloadData]; |
} |
|
|
#pragma mark - |
#pragma mark Table view delegate |
|
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { |
if( self.tableView.editing && indexPath.section!=0 ) |
return nil; |
return indexPath; |
} |
|
|
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { |
|
[tableView deselectRowAtIndexPath:indexPath animated:YES]; |
|
NSUInteger row = [indexPath row]; |
|
if (self.tableView.editing ) { |
|
if(indexPath.section==0 && newActiveSetting != row) { |
NSArray *row0 = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:newActiveSetting inSection:0]]; |
newActiveSetting = row; |
NSArray *row1 = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:newActiveSetting inSection:0]]; |
|
[self.tableView beginUpdates]; |
[self.tableView reloadRowsAtIndexPaths:row0 withRowAnimation:UITableViewRowAnimationFade]; |
[self.tableView reloadRowsAtIndexPaths:row1 withRowAnimation:UITableViewRowAnimationFade]; |
[self.tableView endUpdates]; |
} |
} |
else { |
if( indexPath.section==0 ) { |
NSMutableDictionary* setting=[self.settings objectAtIndex:row]; |
SettingViewController* settingView = [[SettingViewController alloc] initWithSettingDatasource:setting]; |
|
[self.navigationController setToolbarHidden:NO animated:NO]; |
|
[self.navigationController pushViewController:settingView animated:YES]; |
[settingView release]; |
} |
else { |
MixerViewController* extraView=nil; |
|
switch (indexPath.row) { |
case 0: |
extraView = [[MixerViewController alloc] initWithStyle:UITableViewStylePlain]; |
break; |
case 1: |
extraView = [[EngineTestViewController alloc] initWithStyle:UITableViewStyleGrouped]; |
break; |
case 2: |
extraView = [[ChannelsViewController alloc] initWithStyle:UITableViewStylePlain]; |
break; |
} |
|
[self.navigationController setToolbarHidden:NO animated:NO]; |
|
[self.navigationController pushViewController:extraView animated:YES]; |
[extraView release]; |
} |
} |
} |
|
|
|
|
@end |
|