--- 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];
}