# HG changeset patch # User koda # Date 1285537683 -7200 # Node ID dd47efbdec46d5e2a36b1e225e6aaa5d0deaf30b # Parent 1429c303858d60858e9e1126033ba5df54283197 move all preview drawing code into its own class (for a simplified and more readable MapConfigViewController) diff -r 1429c303858d -r dd47efbdec46 project_files/HedgewarsMobile/Classes/GameSetup.m --- a/project_files/HedgewarsMobile/Classes/GameSetup.m Sun Sep 26 16:28:04 2010 -0400 +++ b/project_files/HedgewarsMobile/Classes/GameSetup.m Sun Sep 26 23:48:03 2010 +0200 @@ -337,6 +337,11 @@ if ([staticMap length] != 0) [self sendToEngine:staticMap]; + // lua script (if set) + NSString *script = [self.gameConfig objectForKey:@"script_command"]; + if ([script length] != 0) + [self sendToEngine:script]; + // theme info [self sendToEngine:[self.gameConfig objectForKey:@"theme_command"]]; diff -r 1429c303858d -r dd47efbdec46 project_files/HedgewarsMobile/Classes/MapConfigViewController.h --- a/project_files/HedgewarsMobile/Classes/MapConfigViewController.h Sun Sep 26 16:28:04 2010 -0400 +++ b/project_files/HedgewarsMobile/Classes/MapConfigViewController.h Sun Sep 26 23:48:03 2010 +0200 @@ -20,7 +20,7 @@ #import -#import "SDL_net.h" +#import "MapPreviewButtonView.h" @protocol MapConfigDelegate @@ -29,10 +29,9 @@ @end -@interface MapConfigViewController : UIViewController { +@interface MapConfigViewController : UIViewController { id delegate; - TCPsocket sd, csd; NSInteger oldValue; //slider NSInteger oldPage; //segmented control BOOL busy; @@ -47,7 +46,7 @@ NSString *staticMapCommand; // various widgets in the view - UIButton *previewButton; + MapPreviewButtonView *previewButton; UITableView *tableView; UILabel *maxLabel; UILabel *sizeLabel; @@ -62,8 +61,8 @@ @property (nonatomic,retain) id delegate; -@property (nonatomic) NSInteger maxHogs; -@property (nonatomic) BOOL busy; +@property (nonatomic,assign) NSInteger maxHogs; +@property (nonatomic,assign) BOOL busy; @property (nonatomic,retain) NSString *seedCommand; @property (nonatomic,retain) NSString *templateFilterCommand; @property (nonatomic,retain) NSString *mapGenCommand; @@ -71,7 +70,7 @@ @property (nonatomic,retain) NSString *themeCommand; @property (nonatomic,retain) NSString *staticMapCommand; -@property (nonatomic,retain) IBOutlet UIButton *previewButton; +@property (nonatomic,retain) IBOutlet MapPreviewButtonView *previewButton; @property (nonatomic,retain) IBOutlet UITableView *tableView; @property (nonatomic,retain) IBOutlet UILabel *maxLabel; @property (nonatomic,retain) IBOutlet UILabel *sizeLabel; @@ -92,10 +91,6 @@ -(void) turnOnWidgets; -(void) turnOffWidgets; -(void) setLabelText:(NSString *)str; --(void) setButtonImage:(UIImage *)img; -(void) updatePreview; --(void) updatePreviewWithMap:(NSInteger) index; - --(const uint8_t *)engineProtocol:(NSInteger) port; @end diff -r 1429c303858d -r dd47efbdec46 project_files/HedgewarsMobile/Classes/MapConfigViewController.m --- a/project_files/HedgewarsMobile/Classes/MapConfigViewController.m Sun Sep 26 16:28:04 2010 -0400 +++ b/project_files/HedgewarsMobile/Classes/MapConfigViewController.m Sun Sep 26 23:48:03 2010 +0200 @@ -23,10 +23,7 @@ #import "PascalImports.h" #import "CommodityFunctions.h" #import "UIImageExtra.h" -#import "SDL_net.h" -#import -#define INDICATOR_TAG 7654 @implementation MapConfigViewController @synthesize previewButton, maxHogs, seedCommand, templateFilterCommand, mapGenCommand, mazeSizeCommand, themeCommand, staticMapCommand, @@ -37,130 +34,6 @@ return rotationManager(interfaceOrientation); } -#pragma mark - -#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); -} - --(const uint8_t *)engineProtocol:(NSInteger) port { - 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) { - 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)); - - SDLNet_TCP_Close(csd); - serverQuit = YES; - } - } - - SDLNet_TCP_Close(sd); - SDLNet_Quit(); - return map; -} - --(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]; - uint8_t mapExp[128*32*8]; - - // draw the buffer (1 pixel per component, 0= transparent 1= color) - int k = 0; - for (int i = 0; i < 32*128; i++) { - unsigned char byte = map[i]; - for (int j = 0; j < 8; j++) { - // select the color based on the leftmost bit - if ((byte & 0x80) != 0) - mapExp[k] = 100; - else - mapExp[k] = 255; - // shift to next bit - byte <<= 1; - k++; - } - } - 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]; - CGImageRelease(previewCGImage); - previewCGImage = nil; - - // set the preview image (autoreleased) in the button and the maxhog label on the main thread to prevent a leak - [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); - - CGContextSetRGBFillColor(context, 0.5, 0.5, 0.7, 1.0); - CGContextFillRect(context,CGRectMake(xc,yc,1,1)); - - UIGraphicsPopContext(); - UIImage *previewImage = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - */ -} - -(IBAction) mapButtonPressed { playSound(@"clickSound"); [self updatePreview]; @@ -176,77 +49,26 @@ NSString *seed = (NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid); CFRelease(uuid); NSString *seedCmd = [[NSString alloc] initWithFormat:@"eseed {%@}", seed]; - [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"]) { - busy = NO; - [self.previewButton setTitle:NSLocalizedString(@"Preview not available",@"") forState:UIControlStateNormal]; - } 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] - 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]; - } - + // prevent other events and add an activity while the preview is beign generated + [self turnOffWidgets]; + [self.previewButton updatePreviewWithSeed:seed]; theIndex = [NSIndexPath indexPathForRow:(random()%[self.themeArray count]) inSection:0]; } else { theIndex = [NSIndexPath indexPathForRow:(random()%[self.mapArray count]) inSection:0]; + // the preview for static maps is loaded in didSelectRowAtIndexPath } - [self.tableView reloadData]; + [seed release]; + + // perform as if user clicked on an entry [self tableView:self.tableView didSelectRowAtIndexPath:theIndex]; [self.tableView scrollToRowAtIndexPath:theIndex atScrollPosition:UITableViewScrollPositionNone animated:YES]; } -// instead of drawing a random map we load an image; this function is called by didSelectRowAtIndexPath only --(void) updatePreviewWithMap:(NSInteger) index { - // change the preview button - NSString *fileImage = [[NSString alloc] initWithFormat:@"%@/%@/preview.png", MAPS_DIRECTORY(),[self.mapArray objectAtIndex:index]]; - UIImage *image = [[UIImage alloc] initWithContentsOfFile:fileImage]; - [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]]; - NSString *contents = [[NSString alloc] initWithContentsOfFile:fileCfg encoding:NSUTF8StringEncoding error:NULL]; - [fileCfg release]; - NSArray *split = [contents componentsSeparatedByString:@"\n"]; - [contents release]; - - // 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; - // 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]; - NSString *max = [[NSString alloc] initWithFormat:@"%d",maxHogs]; - self.maxLabel.text = max; - [max release]; -} - -(void) turnOffWidgets { busy = YES; self.previewButton.alpha = 0.5f; @@ -262,35 +84,21 @@ 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.maxHogs = [str intValue]; self.maxLabel.text = str; } --(void) setButtonImage:(UIImage *)img { - [self.previewButton setBackgroundImage:img forState:UIControlStateNormal]; -} - --(void) restoreBackgroundImage { - // white rounded rectangle as background image for previewButton - 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(); - [self.previewButton setBackgroundImage:[bkgImg makeRoundCornersOfSize:CGSizeMake(12, 12)] forState:UIControlStateNormal]; +-(NSDictionary *)getDataForEngine { + NSDictionary *dictForEngine = [NSDictionary dictionaryWithObjectsAndKeys: + self.seedCommand,@"seedCommand", + self.templateFilterCommand,@"templateFilterCommand", + self.mapGenCommand,@"mapGenCommand", + self.mazeSizeCommand,@"mazeSizeCommand", + nil]; + return dictForEngine; } #pragma mark - @@ -340,6 +148,28 @@ return cell; } +// this set details for a static map (called by didSelectRowAtIndexPath) +-(void) setDetailsForStaticMap:(NSInteger) index { + // update label + maxHogs = 18; + NSString *fileCfg = [[NSString alloc] initWithFormat:@"%@/%@/map.cfg", MAPS_DIRECTORY(),[self.mapArray objectAtIndex:index]]; + NSString *contents = [[NSString alloc] initWithContentsOfFile:fileCfg encoding:NSUTF8StringEncoding error:NULL]; + [fileCfg release]; + NSArray *split = [contents componentsSeparatedByString:@"\n"]; + [contents release]; + + // 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; + // 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]; + NSString *max = [[NSString alloc] initWithFormat:@"%d",maxHogs]; + self.maxLabel.text = max; + [max release]; +} #pragma mark - #pragma mark Table view delegate @@ -348,12 +178,14 @@ int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1; if (newRow != oldRow) { + [self.tableView reloadData]; if (self.segmentedControl.selectedSegmentIndex != 1) { - NSString *theme = [self.themeArray objectAtIndex:newRow]; - self.themeCommand = [NSString stringWithFormat:@"etheme %@", theme]; + // just change the theme, don't update preview + self.themeCommand = [NSString stringWithFormat:@"etheme %@", [self.themeArray objectAtIndex:newRow]]; } else { - // theme and map are set in the function below - [self updatePreviewWithMap:newRow]; + NSString *fileImage = [NSString stringWithFormat:@"%@/%@/preview.png",MAPS_DIRECTORY(),[self.mapArray objectAtIndex:newRow]]; + [self.previewButton updatePreviewWithFile:fileImage]; + [self setDetailsForStaticMap:newRow]; } UITableViewCell *newCell = [aTableView cellForRowAtIndexPath:indexPath]; @@ -456,7 +288,6 @@ } // 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; @@ -477,7 +308,6 @@ staticmap = @"map Bamboo"; self.slider.enabled = NO; self.sizeLabel.text = NSLocalizedString(@"No filter",@""); - [self restoreBackgroundImage]; break; case 2: // Maze @@ -539,11 +369,6 @@ [array release]; self.mapArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:MAPS_DIRECTORY() error:NULL]; - busy = NO; - - // draw a white background - [self restoreBackgroundImage]; - // initialize some "default" values self.sizeLabel.text = NSLocalizedString(@"All",@""); self.slider.value = 0.05f; @@ -564,7 +389,8 @@ oldValue = 5; oldPage = 0; - + busy = NO; + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { [self.tableView setBackgroundView:nil]; self.view.backgroundColor = [UIColor clearColor]; @@ -575,8 +401,8 @@ } -(void) viewDidAppear:(BOOL) animated { + [self updatePreview]; [super viewDidAppear:animated]; - [self updatePreview]; } #pragma mark - @@ -589,7 +415,6 @@ #pragma mark - -(void) didReceiveMemoryWarning { [super didReceiveMemoryWarning]; - //[previewButton setImage:nil forState:UIControlStateNormal]; MSG_MEMCLEAN(); } @@ -643,5 +468,4 @@ [super dealloc]; } - @end diff -r 1429c303858d -r dd47efbdec46 project_files/HedgewarsMobile/Classes/MapPreviewButtonView.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/MapPreviewButtonView.h Sun Sep 26 23:48:03 2010 +0200 @@ -0,0 +1,49 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2009-2010 Vittorio Giovara + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 26/09/2010. + */ + + +#import +#import "SDL_net.h" + +@protocol MapPreviewViewDelegate + +-(void) turnOnWidgets; +-(void) setLabelText:(NSString *)string; +-(NSDictionary *)getDataForEngine; + +@end + +@interface MapPreviewButtonView : UIButton { + id delegate; + TCPsocket sd, csd; + NSInteger maxHogs; +} + +@property (nonatomic,assign) id delegate; + + +-(void) setBackgroundImageRounded:(UIImage *)image forState:(UIControlState)state; +-(void) setImageRounded:(UIImage *)image forState:(UIControlState)state; +-(void) setImageRoundedForNormalState:(UIImage *)image; +-(void) updatePreviewWithSeed:(NSString *)seed; +-(void) updatePreviewWithFile:(NSString *)filePath; +-(NSDictionary *)getDataForEngine; + +@end diff -r 1429c303858d -r dd47efbdec46 project_files/HedgewarsMobile/Classes/MapPreviewButtonView.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/MapPreviewButtonView.m Sun Sep 26 23:48:03 2010 +0200 @@ -0,0 +1,246 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2009-2010 Vittorio Giovara + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 26/09/2010. + */ + + +#import "MapPreviewButtonView.h" +#import "MapConfigViewController.h" +#import "UIImageExtra.h" +#import + +#define INDICATOR_TAG 7654 + +@implementation MapPreviewButtonView +@synthesize delegate; + +-(id) initWithFrame:(CGRect)frame { + if ((self = [super initWithFrame:frame])) { + delegate = nil; + [self setBackgroundImageRounded:[UIImage whiteImage:frame.size] forState:UIControlStateNormal]; + } + return self; +} + +-(id) initWithCoder:(NSCoder *)aDecoder { + if ((self = [super initWithCoder:aDecoder])) { + delegate = nil; + [self setBackgroundImageRounded:[UIImage whiteImage:self.frame.size] forState:UIControlStateNormal]; + } + return self; +} + +-(void) dealloc { + self.delegate = nil; + [super dealloc]; +} + +#pragma mark - +#pragma mark image wrappers +-(void) setBackgroundImageRounded:(UIImage *)image forState:(UIControlState)state { + [self setBackgroundImage:[image makeRoundCornersOfSize:CGSizeMake(12, 12)] forState:UIControlStateNormal]; +} + +-(void) setImageRounded:(UIImage *)image forState:(UIControlState)state { + [self setImage:[image makeRoundCornersOfSize:CGSizeMake(12, 12)] forState:UIControlStateNormal]; +} + +-(void) setImageRoundedForNormalState:(UIImage *)image { + [self setImageRounded:image forState:UIControlStateNormal]; +} + +#pragma mark - +#pragma mark preview +-(int) sendToEngine:(NSString *)string { + unsigned char length = [string length]; + + SDLNet_TCP_Send(csd, &length, 1); + return SDLNet_TCP_Send(csd, [string UTF8String], length); +} + +-(const uint8_t *)engineProtocol { + IPaddress ip; + BOOL serverQuit = NO; + static uint8_t map[128*32]; + int port = randomPort(); + + 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) { + DLog(@"Client found"); + + NSDictionary *dictForEngine = [self getDataForEngine]; + [self sendToEngine:[dictForEngine objectForKey:@"seedCommand"]]; + [self sendToEngine:[dictForEngine objectForKey:@"templateFilterCommand"]]; + [self sendToEngine:[dictForEngine objectForKey:@"mapGenCommand"]]; + [self sendToEngine:[dictForEngine objectForKey:@"mazeSizeCommand"]]; + [self sendToEngine:@"!"]; + + memset(map, 0, 128*32); + SDLNet_TCP_Recv(csd, map, 128*32); + SDLNet_TCP_Recv(csd, &maxHogs, sizeof(uint8_t)); + + SDLNet_TCP_Close(csd); + serverQuit = YES; + } + } + + SDLNet_TCP_Close(sd); + SDLNet_Quit(); + return map; +} + +-(void) drawingThread { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + const uint8_t *map = [self engineProtocol]; + uint8_t mapExp[128*32*8]; + + // draw the buffer (1 pixel per component, 0= transparent 1= color) + int k = 0; + for (int i = 0; i < 32*128; i++) { + unsigned char byte = map[i]; + for (int j = 0; j < 8; j++) { + // select the color based on the leftmost bit + if ((byte & 0x80) != 0) + mapExp[k] = 100; + else + mapExp[k] = 255; + // shift to next bit + byte <<= 1; + k++; + } + } + 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]; + CGImageRelease(previewCGImage); + previewCGImage = nil; + + // all these are performed on the main thread to prevent a leak + [self performSelectorOnMainThread:@selector(setImageRoundedForNormalState:) + withObject:previewImage + waitUntilDone:NO]; + [previewImage release]; + [self performSelectorOnMainThread:@selector(setLabelText:) + withObject:[NSString stringWithFormat:@"%d", maxHogs] + waitUntilDone:NO]; + [self performSelectorOnMainThread:@selector(turnOnWidgets) + withObject:nil + waitUntilDone:NO]; + [self performSelectorOnMainThread:@selector(removeIndicator) + withObject:nil + waitUntilDone:NO]; + + [pool release]; + + /* + // http://developer.apple.com/mac/library/qa/qa2001/qa1037.html + 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(); + */ +} + +-(void) updatePreviewWithSeed:(NSString *)seed { + // remove the current preview and title + [self setImage:nil forState:UIControlStateNormal]; + [self 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"]) { + //self.delegate.busy = NO; + [self setTitle:NSLocalizedString(@"Preview not available",@"") forState:UIControlStateNormal]; + } else { + // add a very nice spinning wheel + UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] + initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; + indicator.center = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2); + indicator.tag = INDICATOR_TAG; + [indicator startAnimating]; + [self 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]; + } +} + +-(void) updatePreviewWithFile:(NSString *)filePath { + UIImage *image = [[UIImage alloc] initWithContentsOfFile:filePath]; + [self setImageRounded:image forState:UIControlStateNormal]; + [image release]; +} + +-(void) removeIndicator { + UIActivityIndicatorView *indicator = (UIActivityIndicatorView *)[self viewWithTag:INDICATOR_TAG]; + if (indicator) { + [indicator stopAnimating]; + [indicator removeFromSuperview]; + } +} + +#pragma mark - +#pragma mark delegate +-(void) turnOnWidgets { + [self.delegate turnOnWidgets]; +} + +-(void) setLabelText:(NSString *)string { + [self.delegate setLabelText:string]; +} + +-(NSDictionary *)getDataForEngine { + return [self.delegate getDataForEngine]; +} + +@end diff -r 1429c303858d -r dd47efbdec46 project_files/HedgewarsMobile/Classes/SDL_uikitappdelegate.h --- a/project_files/HedgewarsMobile/Classes/SDL_uikitappdelegate.h Sun Sep 26 16:28:04 2010 -0400 +++ b/project_files/HedgewarsMobile/Classes/SDL_uikitappdelegate.h Sun Sep 26 23:48:03 2010 +0200 @@ -35,7 +35,7 @@ +(SDLUIKitDelegate *)sharedAppDelegate; -(void) startSDLgame:(NSDictionary *)gameDictionary; --(void) displayOverlayLater; +-(void) displayOverlayLater:(NSNumber *)isNetGame ; @end diff -r 1429c303858d -r dd47efbdec46 project_files/HedgewarsMobile/Classes/UIImageExtra.h --- a/project_files/HedgewarsMobile/Classes/UIImageExtra.h Sun Sep 26 16:28:04 2010 -0400 +++ b/project_files/HedgewarsMobile/Classes/UIImageExtra.h Sun Sep 26 23:48:03 2010 +0200 @@ -33,5 +33,6 @@ -(UIImage *)convertToNegative; -(UIImage *)maskImageWith:(UIImage *)maskImage; -(UIImage *)makeRoundCornersOfSize:(CGSize) sizewh; ++(UIImage *)whiteImage:(CGSize) ofSize; @end diff -r 1429c303858d -r dd47efbdec46 project_files/HedgewarsMobile/Classes/UIImageExtra.m --- a/project_files/HedgewarsMobile/Classes/UIImageExtra.m Sun Sep 26 16:28:04 2010 -0400 +++ b/project_files/HedgewarsMobile/Classes/UIImageExtra.m Sun Sep 26 23:48:03 2010 +0200 @@ -220,4 +220,19 @@ return result; } ++(UIImage *)whiteImage:(CGSize) ofSize { + // white rounded rectangle as background image for previewButton + UIGraphicsBeginImageContext(ofSize); + CGContextRef context = UIGraphicsGetCurrentContext(); + UIGraphicsPushContext(context); + + CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0); + CGContextFillRect(context,CGRectMake(0,0,ofSize.width,ofSize.height)); + + UIGraphicsPopContext(); + UIImage *bkgImg = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return bkgImg; +} + @end diff -r 1429c303858d -r dd47efbdec46 project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj --- a/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Sun Sep 26 16:28:04 2010 -0400 +++ b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Sun Sep 26 23:48:03 2010 +0200 @@ -138,6 +138,7 @@ 6199E86D12464A8E00DADF8C /* surpise.png in Resources */ = {isa = PBXBuildFile; fileRef = 6199E86C12464A8E00DADF8C /* surpise.png */; }; 619C5ACF124F7DE200D041AE /* libLua.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 619C5ACE124F7DDF00D041AE /* libLua.a */; }; 619C5AF4124F7E3100D041AE /* LuaPas.pas in Sources */ = {isa = PBXBuildFile; fileRef = 619C5AF3124F7E3100D041AE /* LuaPas.pas */; }; + 619C5BA2124FA59000D041AE /* MapPreviewButtonView.m in Sources */ = {isa = PBXBuildFile; fileRef = 619C5BA1124FA59000D041AE /* MapPreviewButtonView.m */; }; 61A1188511683A8C00359010 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61A117FE1168322700359010 /* CoreGraphics.framework */; settings = {ATTRIBUTES = (Required, ); }; }; 61A118D311683CD100359010 /* HedgewarsTitle.png in Resources */ = {isa = PBXBuildFile; fileRef = 611FD9CB1155A28C00C2203D /* HedgewarsTitle.png */; }; 61B3D71C11EA6F2700EC7420 /* uKeys.pas in Sources */ = {isa = PBXBuildFile; fileRef = 617987FE114AA34C00BA94A9 /* uKeys.pas */; }; @@ -687,21 +688,21 @@ isa = PBXContainerItemProxy; containerPortal = 619C5AC0124F7DDF00D041AE /* Lua.xcodeproj */; proxyType = 2; - remoteGlobalIDString = 1D6058910D05DD3D006BFB54 /* Lua.app */; + remoteGlobalIDString = 1D6058910D05DD3D006BFB54; remoteInfo = "Test Lua"; }; 619C5ACB124F7DDF00D041AE /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 619C5AC0124F7DDF00D041AE /* Lua.xcodeproj */; proxyType = 2; - remoteGlobalIDString = 506EE05E10304ED200A389B3 /* libcocos2d libraries.a */; + remoteGlobalIDString = 506EE05E10304ED200A389B3; remoteInfo = "cocos2d libraries"; }; 619C5ACD124F7DDF00D041AE /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 619C5AC0124F7DDF00D041AE /* Lua.xcodeproj */; proxyType = 2; - remoteGlobalIDString = E14CF7C110ABC177005470B6 /* libLua.a */; + remoteGlobalIDString = E14CF7C110ABC177005470B6; remoteInfo = Lua; }; 928301590F10E41300CC5A3C /* PBXContainerItemProxy */ = { @@ -878,6 +879,8 @@ 619C09E911E8B8D600F1DF16 /* title_small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = title_small.png; path = "Resources/Frontend-iPhone/title_small.png"; sourceTree = ""; }; 619C5AC0124F7DDF00D041AE /* Lua.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Lua.xcodeproj; path = ../../../Library/Lua/Lua.xcodeproj; sourceTree = SOURCE_ROOT; }; 619C5AF3124F7E3100D041AE /* LuaPas.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = LuaPas.pas; path = ../../hedgewars/LuaPas.pas; sourceTree = SOURCE_ROOT; }; + 619C5BA0124FA59000D041AE /* MapPreviewButtonView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MapPreviewButtonView.h; path = Classes/MapPreviewButtonView.h; sourceTree = ""; }; + 619C5BA1124FA59000D041AE /* MapPreviewButtonView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MapPreviewButtonView.m; path = Classes/MapPreviewButtonView.m; sourceTree = ""; }; 61A117FE1168322700359010 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 61C079E211F35A300072BF46 /* EditableCellView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditableCellView.h; sourceTree = ""; }; 61C079E311F35A300072BF46 /* EditableCellView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EditableCellView.m; sourceTree = ""; }; @@ -1013,6 +1016,8 @@ 6165922D11CA9BD500D6E256 /* UIImageExtra.m */, 611D9B10124949D000008271 /* NSStringExtra.h */, 611D9B11124949D000008271 /* NSStringExtra.m */, + 619C5BA0124FA59000D041AE /* MapPreviewButtonView.h */, + 619C5BA1124FA59000D041AE /* MapPreviewButtonView.m */, ); name = "Other Sources"; sourceTree = ""; @@ -2251,6 +2256,7 @@ 611D9B12124949D000008271 /* NSStringExtra.m in Sources */, 611D9BFB12497E9800008271 /* SavedGamesViewController.m in Sources */, 619C5AF4124F7E3100D041AE /* LuaPas.pas in Sources */, + 619C5BA2124FA59000D041AE /* MapPreviewButtonView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff -r 1429c303858d -r dd47efbdec46 project_files/HedgewarsMobile/Resources/MapConfigViewController-iPad.xib --- a/project_files/HedgewarsMobile/Resources/MapConfigViewController-iPad.xib Sun Sep 26 16:28:04 2010 -0400 +++ b/project_files/HedgewarsMobile/Resources/MapConfigViewController-iPad.xib Sun Sep 26 23:48:03 2010 +0200 @@ -565,6 +565,14 @@ 113 + + + delegate + + + + 114 + @@ -743,13 +751,14 @@ 79.IBPluginDependency 8.IBPluginDependency 80.IBPluginDependency + 9.CustomClassName 9.IBPluginDependency YES MapConfigViewController UIResponder - {{288, 290}, {1024, 768}} + {{205, 295}, {1024, 768}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -770,6 +779,7 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + MapPreviewButtonView com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -789,7 +799,7 @@ - 113 + 114 @@ -866,7 +876,7 @@ YES id UILabel - UIButton + MapPreviewButtonView UISegmentedControl UILabel UISlider @@ -897,7 +907,7 @@ previewButton - UIButton + MapPreviewButtonView segmentedControl @@ -922,6 +932,25 @@ Classes/MapConfigViewController.h + + MapPreviewButtonView + UIButton + + delegate + id + + + delegate + + delegate + id + + + + IBProjectSource + Classes/MapPreviewButtonView.h + + YES diff -r 1429c303858d -r dd47efbdec46 project_files/HedgewarsMobile/Resources/MapConfigViewController-iPhone.xib --- a/project_files/HedgewarsMobile/Resources/MapConfigViewController-iPhone.xib Sun Sep 26 16:28:04 2010 -0400 +++ b/project_files/HedgewarsMobile/Resources/MapConfigViewController-iPhone.xib Sun Sep 26 23:48:03 2010 +0200 @@ -302,6 +302,14 @@ 33 + + + delegate + + + + 34 + @@ -383,6 +391,7 @@ 25.IBPluginDependency 7.IBPluginDependency 8.IBPluginDependency + 9.CustomClassName 9.IBPluginDependency @@ -396,6 +405,7 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + MapPreviewButtonView com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -415,7 +425,7 @@ - 33 + 34 @@ -492,7 +502,7 @@ YES id UILabel - UIButton + MapPreviewButtonView UISegmentedControl UILabel UISlider @@ -523,7 +533,7 @@ previewButton - UIButton + MapPreviewButtonView segmentedControl @@ -548,6 +558,25 @@ Classes/MapConfigViewController.h + + MapPreviewButtonView + UIButton + + delegate + id + + + delegate + + delegate + id + + + + IBProjectSource + Classes/MapPreviewButtonView.h + + YES