project_files/HedgewarsMobile/Classes/MapConfigViewController.m
changeset 3697 d5b30d6373fc
parent 3670 4c673e57f0d7
child 3703 12d17c6e8855
--- a/project_files/HedgewarsMobile/Classes/MapConfigViewController.m	Sat Jul 31 10:52:43 2010 +0200
+++ b/project_files/HedgewarsMobile/Classes/MapConfigViewController.m	Sat Jul 31 11:24:53 2010 +0200
@@ -28,7 +28,7 @@
 #pragma mark Preview Handling
 -(int) sendToEngine: (NSString *)string {
     unsigned char length = [string length];
-    
+
     SDLNet_TCP_Send(csd, &length , 1);
     return SDLNet_TCP_Send(csd, [string UTF8String], length);
 }
@@ -37,43 +37,43 @@
     IPaddress ip;
     BOOL serverQuit = NO;
     static uint8_t map[128*32];
-    
+
     if (SDLNet_Init() < 0) {
         DLog(@"SDLNet_Init: %s", SDLNet_GetError());
         serverQuit = YES;
     }
-    
+
     // Resolving the host using NULL make network interface to listen
     if (SDLNet_ResolveHost(&ip, NULL, port) < 0) {
         DLog(@"SDLNet_ResolveHost: %s\n", SDLNet_GetError());
         serverQuit = YES;
     }
-    
+
     // Open a connection with the IP provided (listen on the host's port)
     if (!(sd = SDLNet_TCP_Open(&ip))) {
         DLog(@"SDLNet_TCP_Open: %s %\n", SDLNet_GetError(), port);
         serverQuit = YES;
     }
-    
+
     // launch the preview here so that we're sure the tcp channel is open
     pthread_t thread_id;
     pthread_create(&thread_id, NULL, (void *)GenLandPreview, (void *)port);
     pthread_detach(thread_id);
-    
+
     DLog(@"Waiting for a client on port %d", port);
     while (!serverQuit) {
         /* This check the sd if there is a pending connection.
          * If there is one, accept that, and open a new socket for communicating */
         csd = SDLNet_TCP_Accept(sd);
-        if (NULL != csd) {          
+        if (NULL != csd) {
             DLog(@"Client found");
-            
+
             [self sendToEngine:self.seedCommand];
             [self sendToEngine:self.templateFilterCommand];
             [self sendToEngine:self.mapGenCommand];
             [self sendToEngine:self.mazeSizeCommand];
             [self sendToEngine:@"!"];
-                
+
             memset(map, 0, 128*32);
             SDLNet_TCP_Recv(csd, map, 128*32);
             SDLNet_TCP_Recv(csd, &maxHogs, sizeof(uint8_t));
@@ -82,7 +82,7 @@
             serverQuit = YES;
         }
     }
-    
+
     SDLNet_TCP_Close(sd);
     SDLNet_Quit();
     return map;
@@ -90,7 +90,7 @@
 
 -(void) drawingThread {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    
+
     // select the port for IPC and launch the preview generation through engineProtocol:
     int port = randomPort();
     const uint8_t *map = [self engineProtocol:port];
@@ -114,7 +114,7 @@
     CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceGray();
     CGContextRef bitmapImage = CGBitmapContextCreate(mapExp, 256, 128, 8, 256, colorspace, kCGImageAlphaNone);
     CGColorSpaceRelease(colorspace);
-    
+
     CGImageRef previewCGImage = CGBitmapContextCreateImage(bitmapImage);
     CGContextRelease(bitmapImage);
     UIImage *previewImage = [[UIImage alloc] initWithCGImage:previewCGImage];
@@ -125,23 +125,23 @@
     [self performSelectorOnMainThread:@selector(setButtonImage:) withObject:[previewImage makeRoundCornersOfSize:CGSizeMake(12, 12)] waitUntilDone:NO];
     [previewImage release];
     [self performSelectorOnMainThread:@selector(setLabelText:) withObject:[NSString stringWithFormat:@"%d", maxHogs] waitUntilDone:NO];
-    
+
     // restore functionality of button and remove the spinning wheel on the main thread to prevent a leak
     [self performSelectorOnMainThread:@selector(turnOnWidgets) withObject:nil waitUntilDone:NO];
-    
+
     [pool release];
     //Invoking this method should be avoided as it does not give your thread a chance to clean up any resources it allocated during its execution.
     //[NSThread exit];
 
     /*
     // http://developer.apple.com/mac/library/qa/qa2001/qa1037.html
-    UIGraphicsBeginImageContext(CGSizeMake(256,128));      
-    CGContextRef context = UIGraphicsGetCurrentContext();       
-    UIGraphicsPushContext(context);  
+    UIGraphicsBeginImageContext(CGSizeMake(256,128));
+    CGContextRef context = UIGraphicsGetCurrentContext();
+    UIGraphicsPushContext(context);
 
     CGContextSetRGBFillColor(context, 0.5, 0.5, 0.7, 1.0);
     CGContextFillRect(context,CGRectMake(xc,yc,1,1));
-    
+
     UIGraphicsPopContext();
     UIImage *previewImage = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();
@@ -152,7 +152,7 @@
     // don't generate a new preview while it's already generating one
     if (busy)
         return;
-    
+
     // generate a seed
     CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
     NSString *seed = (NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid);
@@ -161,13 +161,13 @@
     [seed release];
     self.seedCommand = seedCmd;
     [seedCmd release];
-    
+
     NSIndexPath *theIndex;
     if (segmentedControl.selectedSegmentIndex != 1) {
         // remove the current preview and title
         [self.previewButton setImage:nil forState:UIControlStateNormal];
         [self.previewButton setTitle:nil forState:UIControlStateNormal];
-        
+
         // don't display preview on slower device, too slow and memory hog
         NSString *modelId = modelType();
         if ([modelId hasPrefix:@"iPhone1"] || [modelId hasPrefix:@"iPod1,1"] || [modelId hasPrefix:@"iPod2,1"]) {
@@ -176,20 +176,20 @@
         } else {
             // prevent other events and add an activity while the preview is beign generated
             [self turnOffWidgets];
-            
+
             // add a very nice spinning wheel
-            UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] 
+            UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc]
                                                   initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
             indicator.center = CGPointMake(previewButton.bounds.size.width / 2, previewButton.bounds.size.height / 2);
             indicator.tag = INDICATOR_TAG;
             [indicator startAnimating];
             [self.previewButton addSubview:indicator];
             [indicator release];
-            
+
             // let's draw in a separate thread so the gui can work; at the end it restore other widgets
             [NSThread detachNewThreadSelector:@selector(drawingThread) toTarget:self withObject:nil];
         }
-        
+
         theIndex = [NSIndexPath indexPathForRow:(random()%[self.themeArray count]) inSection:0];
     } else {
         theIndex = [NSIndexPath indexPathForRow:(random()%[self.mapArray count]) inSection:0];
@@ -207,7 +207,7 @@
     [fileImage release];
     [self.previewButton setImage:[image makeRoundCornersOfSize:CGSizeMake(12, 12)] forState:UIControlStateNormal];
     [image release];
-    
+
     // update label
     maxHogs = 18;
     NSString *fileCfg = [[NSString alloc] initWithFormat:@"%@/%@/map.cfg", MAPS_DIRECTORY(),[self.mapArray objectAtIndex:index]];
@@ -219,8 +219,8 @@
     // set the theme and map here
     self.themeCommand = [NSString stringWithFormat:@"etheme %@", [split objectAtIndex:0]];
     self.staticMapCommand = [NSString stringWithFormat:@"emap %@", [self.mapArray objectAtIndex:index]];
-    
-    // if the number is not set we keep 18 standard; 
+
+    // if the number is not set we keep 18 standard;
     // sometimes it's not set but there are trailing characters, we get around them with the second equation
     if ([split count] > 1 && [[split objectAtIndex:1] intValue] > 0)
         maxHogs = [[split objectAtIndex:1] intValue];
@@ -244,14 +244,14 @@
     self.segmentedControl.enabled = YES;
     self.slider.enabled = YES;
     busy = NO;
-    
+
     UIActivityIndicatorView *indicator = (UIActivityIndicatorView *)[self.previewButton viewWithTag:INDICATOR_TAG];
     if (indicator) {
         [indicator stopAnimating];
         [indicator removeFromSuperview];
     }
 }
- 
+
 -(void) setLabelText:(NSString *)str {
     self.maxLabel.text = str;
 }
@@ -262,13 +262,13 @@
 
 -(void) restoreBackgroundImage {
     // white rounded rectangle as background image for previewButton
-    UIGraphicsBeginImageContext(CGSizeMake(256,128));      
-    CGContextRef context = UIGraphicsGetCurrentContext();       
-    UIGraphicsPushContext(context);  
+    UIGraphicsBeginImageContext(CGSizeMake(256,128));
+    CGContextRef context = UIGraphicsGetCurrentContext();
+    UIGraphicsPushContext(context);
 
     CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
     CGContextFillRect(context,CGRectMake(0,0,256,128));
-    
+
     UIGraphicsPopContext();
     UIImage *bkgImg = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();
@@ -291,15 +291,15 @@
 -(UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     static NSString *CellIdentifier = @"Cell";
     NSInteger row = [indexPath row];
-    
+
     UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier];
-    if (cell == nil) 
+    if (cell == nil)
         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
-    
+
     if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
         cell.textLabel.textColor = [UIColor colorWithRed:(CGFloat)0xFE/255 green:(CGFloat)0xCB/255 blue:0 alpha:1 ];
     }
-    
+
     if (self.segmentedControl.selectedSegmentIndex != 1) {
         // the % prevents a strange bug that occurs sporadically
         NSString *themeName = [self.themeArray objectAtIndex:row % [self.themeArray count]];
@@ -311,8 +311,8 @@
         cell.textLabel.text = [self.mapArray objectAtIndex:row];
         cell.imageView.image = nil;
     }
-    
-    if (row == [self.lastIndexPath row]) 
+
+    if (row == [self.lastIndexPath row])
         cell.accessoryType = UITableViewCellAccessoryCheckmark;
     else
         cell.accessoryType = UITableViewCellAccessoryNone;
@@ -326,17 +326,17 @@
 -(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     int newRow = [indexPath row];
     int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;
-    
+
     if (newRow != oldRow) {
         if (self.segmentedControl.selectedSegmentIndex != 1) {
-            NSString *theme = [self.themeArray objectAtIndex:newRow];                
+            NSString *theme = [self.themeArray objectAtIndex:newRow];
             self.themeCommand = [NSString stringWithFormat:@"etheme %@", theme];
         } else {
             // theme and map are set in the function below
             [self updatePreviewWithMap:newRow];
         }
-        
-        UITableViewCell *newCell = [aTableView cellForRowAtIndexPath:indexPath]; 
+
+        UITableViewCell *newCell = [aTableView cellForRowAtIndexPath:indexPath];
         newCell.accessoryType = UITableViewCellAccessoryCheckmark;
         UITableViewCell *oldCell = [aTableView cellForRowAtIndexPath:self.lastIndexPath];
         oldCell.accessoryType = UITableViewCellAccessoryNone;
@@ -355,7 +355,7 @@
     NSString *labelText;
     NSString *templateCommand;
     NSString *mazeCommand;
-    
+
     switch ((int)(self.slider.value*100)) {
         case 0:
             if (self.segmentedControl.selectedSegmentIndex == 0) {
@@ -417,7 +417,7 @@
             mazeCommand = nil;
             break;
     }
-    
+
     self.sizeLabel.text = labelText;
     self.templateFilterCommand = templateCommand;
     self.mazeSizeCommand = mazeCommand;
@@ -432,13 +432,13 @@
     }
 }
 
-// perform actions based on the activated section, then call updatePreview to visually update the selection 
+// perform actions based on the activated section, then call updatePreview to visually update the selection
 // updatePreview will call didSelectRowAtIndexPath which will call the right update routine)
 // and if necessary update the table with a slide animation
 -(IBAction) segmentedControlChanged:(id) sender {
     NSString *mapgen, *staticmap;
     NSInteger newPage = self.segmentedControl.selectedSegmentIndex;
-    
+
     switch (newPage) {
         case 0: // Random
             mapgen = @"e$mapgen 0";
@@ -446,7 +446,7 @@
             [self sliderChanged:nil];
             self.slider.enabled = YES;
             break;
-            
+
         case 1: // Map
             mapgen = @"e$mapgen 0";
             // dummy value, everything is set by -updatePreview -> -didSelectRowAtIndexPath -> -updatePreviewWithMap
@@ -455,14 +455,14 @@
             self.sizeLabel.text = @".";
             [self restoreBackgroundImage];
             break;
-            
+
         case 2: // Maze
             mapgen = @"e$mapgen 1";
             staticmap = @"";
             [self sliderChanged:nil];
             self.slider.enabled = YES;
             break;
-        
+
         default:
             mapgen = nil;
             staticmap = nil;
@@ -471,7 +471,7 @@
     self.mapGenCommand = mapgen;
     self.staticMapCommand = staticmap;
     [self updatePreview];
-    
+
     // nice animation for updating the table when appropriate (on iphone)
     if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
         if (((oldPage == 0 || oldPage == 2) && newPage == 1) ||
@@ -487,7 +487,7 @@
 // update data when table is not visible and then show it
 -(void) moveTable {
     [self.tableView reloadData];
-    
+
     [UIView beginAnimations:@"moving in table" context:NULL];
     self.tableView.frame = CGRectMake(295, 0, 185, 276);
     [UIView commitAnimations];
@@ -497,15 +497,15 @@
 #pragma mark view management
 -(void) viewDidLoad {
     [super viewDidLoad];
-    
+
     srandom(time(NULL));
-    
+
     CGSize screenSize = [[UIScreen mainScreen] bounds].size;
     self.view.frame = CGRectMake(0, 0, screenSize.height, screenSize.width - 44);
 
     // themes.cfg contains all the user-selectable themes
     NSString *string = [[NSString alloc] initWithContentsOfFile:[THEMES_DIRECTORY() stringByAppendingString:@"/themes.cfg"]
-                                                       encoding:NSUTF8StringEncoding 
+                                                       encoding:NSUTF8StringEncoding
                                                           error:NULL];
     NSMutableArray *array = [[NSMutableArray alloc] initWithArray:[string componentsSeparatedByString:@"\n"]];
     [string release];
@@ -517,14 +517,14 @@
 
     self.tableView.rowHeight = 42;
     busy = NO;
-    
+
     // draw a white background
     [self restoreBackgroundImage];
-    
+
     // initialize some "default" values
     self.sizeLabel.text = NSLocalizedString(@"All",@"");
     self.slider.value = 0.05f;
-    
+
     // on slower device we show directly the static map
     NSString *modelId = modelType();
     if ([modelId hasPrefix:@"iPhone1"] || [modelId hasPrefix:@"iPod1,1"] || [modelId hasPrefix:@"iPod2,1"])
@@ -536,9 +536,9 @@
     self.mazeSizeCommand = @"e$maze_size 0";
     self.mapGenCommand = @"e$mapgen 0";
     self.staticMapCommand = @"";
-    
+
     self.lastIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];
-    
+
     oldValue = 5;
     oldPage = 0;
 }
@@ -562,18 +562,18 @@
     self.mazeSizeCommand = nil;
     self.themeCommand = nil;
     self.staticMapCommand = nil;
-    
+
     self.previewButton = nil;
     self.tableView = nil;
     self.maxLabel = nil;
     self.sizeLabel = nil;
     self.segmentedControl = nil;
     self.slider = nil;
-    
+
     self.lastIndexPath = nil;
     self.themeArray = nil;
     self.mapArray = nil;
-    
+
     MSG_DIDUNLOAD();
     [super viewDidUnload];
 }
@@ -585,18 +585,18 @@
     [mazeSizeCommand release];
     [themeCommand release];
     [staticMapCommand release];
-    
+
     [previewButton release];
     [tableView release];
     [maxLabel release];
     [sizeLabel release];
     [segmentedControl release];
     [slider release];
-    
+
     [lastIndexPath release];
     [themeArray release];
     [mapArray release];
-    
+
     [super dealloc];
 }