diff -r fcbdee9cdd74 -r b894922d58cc project_files/HedgewarsMobile/Classes/GameConfigViewController.m --- a/project_files/HedgewarsMobile/Classes/GameConfigViewController.m Tue Sep 08 19:20:58 2015 +0300 +++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController.m Mon Nov 16 22:57:24 2015 +0300 @@ -22,16 +22,25 @@ #import "TeamConfigViewController.h" #import "SchemeWeaponConfigViewController.h" #import "GameInterfaceBridge.h" +#import "HelpPageLobbyViewController.h" +@interface GameConfigViewController () +@property (nonatomic, retain) IBOutlet UISegmentedControl *tabsSegmentedControl; //iPhone only + +@property (nonatomic, retain) IBOutlet UIBarButtonItem *backButton; //iPhone only +@property (nonatomic, retain) IBOutlet UIBarButtonItem *startButton; //iPhone only +@end @implementation GameConfigViewController -@synthesize imgContainer, titleImage, sliderBackground, //helpPage, +@synthesize imgContainer, titleImage, sliderBackground, helpPage, mapConfigViewController, teamConfigViewController, schemeWeaponConfigViewController; -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return rotationManager(interfaceOrientation); } +#pragma mark - Buttons + -(IBAction) buttonPressed:(id) sender { UIButton *theButton = (UIButton *)sender; @@ -47,7 +56,7 @@ [alert release]; } else { [[AudioManagerController mainManager] playBackSound]; - [[self parentViewController] dismissModalViewControllerAnimated:YES]; + [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil]; } break; case 1: @@ -55,26 +64,20 @@ if ([self isEverythingSet] == NO) return; theButton.enabled = NO; - for (UIView *oneView in self.imgContainer.subviews) { - if ([oneView isMemberOfClass:[UIImageView class]]) { - UIImageView *anImageView = (UIImageView *)oneView; - [anImageView removeFromSuperview]; - } - } + [self clearImgContainer]; [self startGame:theButton]; break; case 2: [[AudioManagerController mainManager] playClickSound]; - /* if (self.helpPage == nil) self.helpPage = [[HelpPageLobbyViewController alloc] initWithNibName:@"HelpPageLobbyViewController-iPad" bundle:nil]; self.helpPage.view.alpha = 0; + self.helpPage.view.frame = self.view.frame; [self.view addSubview:self.helpPage.view]; - [UIView beginAnimations:@"helplobby" context:NULL]; - self.helpPage.view.alpha = 1; - [UIView commitAnimations]; - */ + [UIView animateWithDuration:0.5 animations:^{ + self.helpPage.view.alpha = 1; + }]; break; default: DLog(@"Nope"); @@ -82,6 +85,17 @@ } } +#pragma mark - Tabs Segmented Control + +- (void)localizeTabsSegmentedControl +{ + for (NSUInteger i = 0; i < self.tabsSegmentedControl.numberOfSegments; i++) + { + NSString *oldTitle = [self.tabsSegmentedControl titleForSegmentAtIndex:i]; + [self.tabsSegmentedControl setTitle:NSLocalizedString(oldTitle, nil) forSegmentAtIndex:i]; + } +} + -(IBAction) segmentPressed:(id) sender { UISegmentedControl *theSegment = (UISegmentedControl *)sender; @@ -104,15 +118,16 @@ [self.view bringSubviewToFront:schemeWeaponConfigViewController.view]; break; case 3: - /* if (helpPage == nil) { helpPage = [[HelpPageLobbyViewController alloc] initWithNibName:@"HelpPageLobbyViewController-iPhone" bundle:nil]; + CGRect helpPageFrame = self.view.frame; + helpPageFrame.size.height -= 44; //toolbar height + self.helpPage.view.frame = helpPageFrame; [self.view addSubview:helpPage.view]; } // this message is compulsory otherwise the table won't be loaded at all [helpPage viewWillAppear:NO]; [self.view bringSubviewToFront:helpPage.view]; - */ break; default: DLog(@"Nope"); @@ -121,6 +136,8 @@ } +#pragma mark - + -(BOOL) isEverythingSet { // don't start playing if the preview is in progress if ([self.mapConfigViewController busy]) { @@ -229,71 +246,95 @@ [gameDictionary release]; } --(void) loadNiceHogs { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - srand(time(NULL)); - NSString *filePath = [[NSString alloc] initWithFormat:@"%@/Hedgehog/Idle.png",GRAPHICS_DIRECTORY()]; - UIImage *hogSprite = [[UIImage alloc] initWithContentsOfFile:filePath]; - [filePath release]; +-(void) loadNiceHogs +{ + @autoreleasepool + { + + NSString *filePath = [[NSString alloc] initWithFormat:@"%@/Hedgehog/Idle.png",GRAPHICS_DIRECTORY()]; + UIImage *hogSprite = [[UIImage alloc] initWithContentsOfFile:filePath]; + [filePath release]; - NSArray *hatArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:HATS_DIRECTORY() error:NULL]; - int numberOfHats = [hatArray count]; - int animationFrames = IS_VERY_POWERFUL([HWUtils modelType]) ? 18 : 1; - - if (self.imgContainer != nil) - [self.imgContainer removeFromSuperview]; - - self.imgContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 40)]; - NSInteger numberOfHogs = 1 + random() % 20; - DLog(@"Drawing %d nice hedgehogs", numberOfHogs); - for (int i = 0; i < numberOfHogs; i++) { - NSString *hat = [hatArray objectAtIndex:random()%numberOfHats]; + NSArray *hatArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:HATS_DIRECTORY() error:NULL]; + NSUInteger numberOfHats = [hatArray count]; + int animationFrames = IS_VERY_POWERFUL([HWUtils modelType]) ? 16 : 1; + + self.imgContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 40)]; + NSInteger numberOfHogs = 1 + arc4random_uniform(15); + DLog(@"Drawing %ld nice hedgehogs", (long)numberOfHogs); + for (int i = 0; i < numberOfHogs; i++) { + NSString *hat = [hatArray objectAtIndex:arc4random_uniform((int)numberOfHats)]; - NSString *hatFile = [[NSString alloc] initWithFormat:@"%@/%@", HATS_DIRECTORY(), hat]; - UIImage *hatSprite = [[UIImage alloc] initWithContentsOfFile:hatFile]; - NSMutableArray *animation = [[NSMutableArray alloc] initWithCapacity:animationFrames]; - for (int j = 0; j < animationFrames; j++) { - int x = ((j*32)/(int)hatSprite.size.height)*32; - int y = (j*32)%(int)hatSprite.size.height; - UIImage *hatSpriteFrame = [hatSprite cutAt:CGRectMake(x, y, 32, 32)]; - UIImage *hogSpriteFrame = [hogSprite cutAt:CGRectMake(x, y, 32, 32)]; - UIImage *hogWithHat = [hogSpriteFrame mergeWith:hatSpriteFrame atPoint:CGPointMake(0, 5)]; - [animation addObject:hogWithHat]; - } - [hatSprite release]; - [hatFile release]; + NSString *hatFile = [[NSString alloc] initWithFormat:@"%@/%@", HATS_DIRECTORY(), hat]; + UIImage *hatSprite = [[UIImage alloc] initWithContentsOfFile:hatFile]; + NSMutableArray *animation = [[NSMutableArray alloc] initWithCapacity:animationFrames]; + for (int j = 0; j < animationFrames; j++) { + int x = ((j*32)/(int)hatSprite.size.height)*32; + int y = (j*32)%(int)hatSprite.size.height; + UIImage *hatSpriteFrame = [hatSprite cutAt:CGRectMake(x, y, 32, 32)]; + UIImage *hogSpriteFrame = [hogSprite cutAt:CGRectMake(x, y, 32, 32)]; + UIImage *hogWithHat = [hogSpriteFrame mergeWith:hatSpriteFrame atPoint:CGPointMake(0, 5)]; + [animation addObject:hogWithHat]; + } + [hatSprite release]; + [hatFile release]; + + UIImageView *hog = [[UIImageView alloc] initWithImage:[animation objectAtIndex:0]]; + hog.animationImages = animation; + hog.animationDuration = 3; + [animation release]; - UIImageView *hog = [[UIImageView alloc] initWithImage:[animation objectAtIndex:0]]; - hog.animationImages = animation; - hog.animationDuration = 3; - [animation release]; - - int x = 20*i+random()%128; - if (x > 320 - 32) - x = i*random()%32; - hog.frame = CGRectMake(x, 25, hog.frame.size.width, hog.frame.size.height); - [self.imgContainer addSubview:hog]; - [hog startAnimating]; - [hog release]; + int x = 20*i+arc4random_uniform(128); + while (x > 320 - 32) + x = i*arc4random_uniform(32); + + hog.frame = CGRectMake(x, 25, hog.frame.size.width, hog.frame.size.height); + [self.imgContainer addSubview:hog]; + [hog startAnimating]; + [hog release]; + } + [hogSprite release]; + + dispatch_async(dispatch_get_main_queue(), ^{ + + [self.view addSubview:self.imgContainer]; + + // don't place the nice hogs if there is no space for them + if ((self.interfaceOrientation == UIInterfaceOrientationPortrait || + self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)) + self.imgContainer.alpha = 0; + + self.isDrawingNiceHogs = NO; + }); } - - // don't place the nice hogs if there is no space for them - if ((self.interfaceOrientation == UIInterfaceOrientationPortrait || - self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)) - self.imgContainer.alpha = 0; - - [self.view addSubview:self.imgContainer]; - [hogSprite release]; - [pool drain]; } --(void) viewDidLoad { +- (void)clearImgContainer +{ + for (UIView *oneView in [self.imgContainer subviews]) + { + if ([oneView isMemberOfClass:[UIImageView class]]) + { + UIImageView *anImageView = (UIImageView *)oneView; + [anImageView removeFromSuperview]; + } + } + + [self.imgContainer removeFromSuperview]; + self.imgContainer = nil; +} + +-(void) viewDidLoad +{ + [super viewDidLoad]; + self.view.backgroundColor = [UIColor blackColor]; CGRect screenRect = [[UIScreen mainScreen] safeBounds]; self.view.frame = screenRect; - if (IS_IPAD()) { + if (IS_IPAD()) + { // the label for the filter slider UILabel *backLabel = [[UILabel alloc] initWithFrame:CGRectMake(116, 714, 310, 40) andTitle:nil @@ -312,21 +353,37 @@ [self.view addSubview:maxLabel]; self.mapConfigViewController.maxLabel = maxLabel; [maxLabel release]; - } else { + } + else + { + [self localizeTabsSegmentedControl]; + + [self.backButton setTitle:NSLocalizedString(@"Back", nil)]; + [self.startButton setTitle:NSLocalizedString(@"Start", nil)]; + self.mapConfigViewController.view.frame = CGRectMake(0, 0, screenRect.size.width, screenRect.size.height-44); } + [self.view addSubview:self.mapConfigViewController.view]; [self.view bringSubviewToFront:self.mapConfigViewController.slider]; - - [super viewDidLoad]; } -(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval) duration { if (IS_IPAD() == NO) return; - if ((toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || - toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)) { + [self updateiPadUIForInterfaceOrientation:toInterfaceOrientation]; + + if (self.helpPage) + { + self.helpPage.view.frame = self.view.frame; + } +} + +- (void)updateiPadUIForInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + if ((interfaceOrientation == UIInterfaceOrientationLandscapeLeft || + interfaceOrientation == UIInterfaceOrientationLandscapeRight)) { self.imgContainer.alpha = 1; self.titleImage.frame = CGRectMake(357, 17, 309, 165); self.schemeWeaponConfigViewController.view.frame = CGRectMake(0, 60, 320, 620); @@ -345,46 +402,41 @@ self.sliderBackground.frame = CGRectMake(465, 975, 200, 40); self.mapConfigViewController.slider.frame = CGRectMake(475, 983, 180, 23); } - - [self.schemeWeaponConfigViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation - duration:duration]; -} - --(void) viewWillAppear:(BOOL)animated { - if (IS_IPAD()) - [NSThread detachNewThreadSelector:@selector(loadNiceHogs) toTarget:self withObject:nil]; - - [self.mapConfigViewController viewWillAppear:animated]; - [self.teamConfigViewController viewWillAppear:animated]; - [self.schemeWeaponConfigViewController viewWillAppear:animated]; - // add other controllers here and below - - [super viewWillAppear:animated]; } --(void) viewDidAppear:(BOOL)animated { - [self.mapConfigViewController viewDidAppear:animated]; - [self.teamConfigViewController viewDidAppear:animated]; - [self.schemeWeaponConfigViewController viewDidAppear:animated]; - [super viewDidAppear:animated]; +-(void) viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; + + if (IS_IPAD() && !self.imgContainer && !self.isDrawingNiceHogs) + { + self.isDrawingNiceHogs = YES; + [NSThread detachNewThreadSelector:@selector(loadNiceHogs) toTarget:self withObject:nil]; + } + + if (IS_IPAD()) + { + // we assume here what 'statusBarOrientation' will never be changed manually! + UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation]; + [self updateiPadUIForInterfaceOrientation:currentOrientation]; + } } --(void) viewWillDisappear:(BOOL)animated { - [self.mapConfigViewController viewWillDisappear:animated]; - [self.teamConfigViewController viewWillDisappear:animated]; - [self.schemeWeaponConfigViewController viewWillDisappear:animated]; - [super viewWillDisappear:animated]; +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + + if (IS_IPAD()) + { + // need to call this again in order to fix layout on iOS 9 when going back from rotated stats page + UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation]; + [self updateiPadUIForInterfaceOrientation:currentOrientation]; + } } --(void) viewDidDisappear:(BOOL)animated { - [self.mapConfigViewController viewDidDisappear:animated]; - [self.teamConfigViewController viewDidDisappear:animated]; - [self.schemeWeaponConfigViewController viewDidDisappear:animated]; - [super viewDidDisappear:animated]; -} - --(void) didReceiveMemoryWarning { - self.imgContainer = nil; +-(void) didReceiveMemoryWarning +{ + [self clearImgContainer]; if (self.titleImage.superview == nil) self.titleImage = nil; @@ -397,8 +449,8 @@ self.teamConfigViewController = nil; if (self.schemeWeaponConfigViewController.view.superview == nil) self.schemeWeaponConfigViewController = nil; - //if (self.helpPage.view.superview == nil) - // self.helpPage = nil; + if (self.helpPage.view.superview == nil) + self.helpPage = nil; MSG_MEMCLEAN(); [super didReceiveMemoryWarning]; } @@ -410,19 +462,22 @@ self.schemeWeaponConfigViewController = nil; self.teamConfigViewController = nil; self.mapConfigViewController = nil; - //self.helpPage = nil; + self.helpPage = nil; MSG_DIDUNLOAD(); [super viewDidUnload]; } -(void) dealloc { + releaseAndNil(_tabsSegmentedControl); + releaseAndNil(_backButton); + releaseAndNil(_startButton); releaseAndNil(imgContainer); releaseAndNil(titleImage); releaseAndNil(sliderBackground); releaseAndNil(schemeWeaponConfigViewController); releaseAndNil(teamConfigViewController); releaseAndNil(mapConfigViewController); - //releaseAndNil(helpPage); + releaseAndNil(helpPage); [super dealloc]; }