project_files/HedgewarsMobile/Classes/OverlayViewController.m
changeset 6624 e049b5bb0ad1
parent 6615 65602f1ef0f8
child 6666 0e2f5b81cbf2
equal deleted inserted replaced
6623:6bf169f1e97c 6624:e049b5bb0ad1
    20 
    20 
    21 
    21 
    22 #import "OverlayViewController.h"
    22 #import "OverlayViewController.h"
    23 #import "InGameMenuViewController.h"
    23 #import "InGameMenuViewController.h"
    24 #import "HelpPageViewController.h"
    24 #import "HelpPageViewController.h"
    25 #import "AmmoMenuViewController.h"
       
    26 #import "CGPointUtils.h"
    25 #import "CGPointUtils.h"
    27 #import "ObjcExports.h"
    26 #import "ObjcExports.h"
    28 
    27 
    29 
    28 
    30 #define HIDING_TIME_DEFAULT [NSDate dateWithTimeIntervalSinceNow:2.7]
    29 #define HIDING_TIME_DEFAULT [NSDate dateWithTimeIntervalSinceNow:2.7]
    31 #define HIDING_TIME_NEVER   [NSDate dateWithTimeIntervalSinceNow:10000]
    30 #define HIDING_TIME_NEVER   [NSDate dateWithTimeIntervalSinceNow:10000]
    32 #define doDim()             [dimTimer setFireDate: (IS_DUALHEAD()) ? HIDING_TIME_NEVER : HIDING_TIME_DEFAULT]
    31 #define doDim()             [dimTimer setFireDate:HIDING_TIME_DEFAULT]
    33 #define doNotDim()          [dimTimer setFireDate:HIDING_TIME_NEVER]
    32 #define doNotDim()          [dimTimer setFireDate:HIDING_TIME_NEVER]
    34 
    33 
    35 
    34 
    36 static OverlayViewController *mainOverlay;
    35 static OverlayViewController *mainOverlay;
    37 
    36 
    38 @implementation OverlayViewController
    37 @implementation OverlayViewController
    39 @synthesize popoverController, popupMenu, helpPage, amvc, initialScreenCount, loadingIndicator,
    38 @synthesize popoverController, popupMenu, helpPage, loadingIndicator, confirmButton, grenadeTimeSegment;
    40             confirmButton, grenadeTimeSegment;
       
    41 
    39 
    42 #pragma mark -
    40 #pragma mark -
    43 #pragma mark rotation
    41 #pragma mark rotation
    44 
    42 
    45 -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
    43 -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
    50 #pragma mark View Management
    48 #pragma mark View Management
    51 -(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    49 -(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    52     if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
    50     if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
    53         isAttacking = NO;
    51         isAttacking = NO;
    54         isPopoverVisible = NO;
    52         isPopoverVisible = NO;
    55         initialScreenCount = (IS_DUALHEAD() ? 2 : 1);
       
    56         loadingIndicator = nil;
    53         loadingIndicator = nil;
    57         mainOverlay = self;
    54         mainOverlay = self;
    58     }
    55     }
    59     return self;
    56     return self;
    60 }
    57 }
    65 
    62 
    66 -(void) viewDidLoad {
    63 -(void) viewDidLoad {
    67     // fill all the screen available as sdlview disables autoresizing
    64     // fill all the screen available as sdlview disables autoresizing
    68     self.view.frame = [[UIScreen mainScreen] safeBounds];
    65     self.view.frame = [[UIScreen mainScreen] safeBounds];
    69     // the timer used to dim the overlay
    66     // the timer used to dim the overlay
    70     dimTimer = [[NSTimer alloc] initWithFireDate:(IS_DUALHEAD()) ? HIDING_TIME_NEVER : [NSDate dateWithTimeIntervalSinceNow:6]
    67     dimTimer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:6]
    71                                         interval:1000
    68                                         interval:1000
    72                                           target:self
    69                                           target:self
    73                                         selector:@selector(dimOverlay)
    70                                         selector:@selector(dimOverlay)
    74                                         userInfo:nil
    71                                         userInfo:nil
    75                                          repeats:YES];
    72                                          repeats:YES];
    79     // display the help page, required by the popover on ipad
    76     // display the help page, required by the popover on ipad
    80     [[NSNotificationCenter defaultCenter] addObserver:self
    77     [[NSNotificationCenter defaultCenter] addObserver:self
    81                                              selector:@selector(showHelp:)
    78                                              selector:@selector(showHelp:)
    82                                                  name:@"show help ingame"
    79                                                  name:@"show help ingame"
    83                                                object:nil];
    80                                                object:nil];
    84 
       
    85     if (IS_IPAD()) {
       
    86         [[NSNotificationCenter defaultCenter] addObserver:self
       
    87                                                  selector:@selector(numberOfScreensIncreased)
       
    88                                                      name:UIScreenDidConnectNotification
       
    89                                                    object:nil];
       
    90         
       
    91         [[NSNotificationCenter defaultCenter] addObserver:self
       
    92                                                  selector:@selector(numberOfScreensDecreased)
       
    93                                                      name:UIScreenDidDisconnectNotification
       
    94                                                    object:nil];
       
    95     }
       
    96     
    81     
    97     // present the overlay
    82     // present the overlay
    98     self.view.alpha = 0;
    83     self.view.alpha = 0;
    99     [UIView beginAnimations:@"showing overlay" context:NULL];
    84     [UIView beginAnimations:@"showing overlay" context:NULL];
   100     [UIView setAnimationDuration:2];
    85     [UIView setAnimationDuration:2];
   113     dimTimer = nil;
    98     dimTimer = nil;
   114     mainOverlay = nil;
    99     mainOverlay = nil;
   115     self.helpPage = nil;
   100     self.helpPage = nil;
   116     [self dismissPopover];
   101     [self dismissPopover];
   117     self.popoverController = nil;
   102     self.popoverController = nil;
   118     self.amvc = nil;
       
   119     self.loadingIndicator = nil;
   103     self.loadingIndicator = nil;
   120     MSG_DIDUNLOAD();
   104     MSG_DIDUNLOAD();
   121     [super viewDidUnload];
   105     [super viewDidUnload];
   122 }
   106 }
   123 
   107 
   124 -(void) didReceiveMemoryWarning {
   108 -(void) didReceiveMemoryWarning {
   125     if (self.popupMenu.view.superview == nil)
   109     if (self.popupMenu.view.superview == nil)
   126         self.popupMenu = nil;
   110         self.popupMenu = nil;
   127     if (self.helpPage.view.superview == nil)
   111     if (self.helpPage.view.superview == nil)
   128         self.helpPage = nil;
   112         self.helpPage = nil;
   129     if (self.amvc.view.superview == nil)
       
   130         self.amvc = nil;
       
   131     if (self.loadingIndicator.superview == nil)
   113     if (self.loadingIndicator.superview == nil)
   132         self.loadingIndicator = nil;
   114         self.loadingIndicator = nil;
   133     if (self.confirmButton.superview == nil)
   115     if (self.confirmButton.superview == nil)
   134         self.confirmButton = nil;
   116         self.confirmButton = nil;
   135     if (self.grenadeTimeSegment.superview == nil)
   117     if (self.grenadeTimeSegment.superview == nil)
   144 
   126 
   145 -(void) dealloc {
   127 -(void) dealloc {
   146     releaseAndNil(popupMenu);
   128     releaseAndNil(popupMenu);
   147     releaseAndNil(helpPage);
   129     releaseAndNil(helpPage);
   148     releaseAndNil(popoverController);
   130     releaseAndNil(popoverController);
   149     releaseAndNil(amvc);
       
   150     releaseAndNil(loadingIndicator);
   131     releaseAndNil(loadingIndicator);
   151     releaseAndNil(confirmButton);
   132     releaseAndNil(confirmButton);
   152     releaseAndNil(grenadeTimeSegment);
   133     releaseAndNil(grenadeTimeSegment);
   153     // dimTimer is autoreleased
   134     // dimTimer is autoreleased
   154     [super dealloc];
   135     [super dealloc];
   155 }
       
   156 
       
   157 -(void) numberOfScreensIncreased {
       
   158     if (self.initialScreenCount == 1) {
       
   159         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"New display detected"
       
   160                                                         message:NSLocalizedString(@"Hedgewars supports multi-monitor configurations, but the screen has to be connected before launching the game.",@"")
       
   161                                                        delegate:nil
       
   162                                               cancelButtonTitle:@"Ok"
       
   163                                               otherButtonTitles:nil];
       
   164         [alert show];
       
   165         [alert release];
       
   166         HW_pause();
       
   167     }
       
   168 }
       
   169 
       
   170 -(void) numberOfScreensDecreased {
       
   171     if (self.initialScreenCount == 2) {
       
   172         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Oh noes! Display disconnected"
       
   173                                                         message:NSLocalizedString(@"A monitor has been disconnected while playing and this has ended the match! You need to restart the game if you wish to use the second display again.",@"")
       
   174                                                        delegate:nil
       
   175                                               cancelButtonTitle:@"Ok"
       
   176                                               otherButtonTitles:nil];
       
   177         [alert show];
       
   178         [alert release];
       
   179         HW_terminate(NO);
       
   180     }
       
   181 }
   136 }
   182 
   137 
   183 #pragma mark -
   138 #pragma mark -
   184 #pragma mark overlay appearance
   139 #pragma mark overlay appearance
   185 // nice transition for dimming, should be called only by the timer himself
   140 // nice transition for dimming, should be called only by the timer himself
   279         case 6:
   234         case 6:
   280             HW_backjump();
   235             HW_backjump();
   281             break;
   236             break;
   282         case 10:
   237         case 10:
   283             [AudioManagerController playClickSound];
   238             [AudioManagerController playClickSound];
   284             clearView();
       
   285             HW_pause();
   239             HW_pause();
   286             if (self.amvc.isVisible && IS_DUALHEAD() == NO) {
       
   287                 doDim();
       
   288                 [self.amvc disappear];
       
   289             }
       
   290             clearView();
   240             clearView();
   291             [self showPopover];
   241             [self showPopover];
   292             break;
   242             break;
   293         case 11:
   243         case 11:
   294             [AudioManagerController playClickSound];
   244             [AudioManagerController playClickSound];
   295             clearView();
   245             clearView();
   296             
   246             HW_ammoMenu();
   297             if (IS_DUALHEAD() || [[[NSUserDefaults standardUserDefaults] objectForKey:@"classic_menu"] boolValue] == NO) {
       
   298                 if (self.amvc == nil)
       
   299                     self.amvc = [[AmmoMenuViewController alloc] init];
       
   300 
       
   301                 if (self.amvc.isVisible) {
       
   302                     doDim();
       
   303                     [self.amvc disappear];
       
   304                 } else {
       
   305                     if (HW_isAmmoMenuNotAllowed() == NO) {
       
   306                         doNotDim();
       
   307                         [self.amvc appearInView:self.view];
       
   308                     }
       
   309                 }
       
   310             } else
       
   311                 HW_ammoMenu();
       
   312             break;
   247             break;
   313         default:
   248         default:
   314             DLog(@"Nope");
   249             DLog(@"Nope");
   315             break;
   250             break;
   316     }
   251     }
   418 
   353 
   419     // hide in-game menu
   354     // hide in-game menu
   420     if (isPopoverVisible)
   355     if (isPopoverVisible)
   421         [self dismissPopover];
   356         [self dismissPopover];
   422 
   357 
   423     if (self.amvc.isVisible && IS_DUALHEAD() == NO) {
       
   424         doDim();
       
   425         [self.amvc disappear];
       
   426     }
       
   427     // reset default dimming
   358     // reset default dimming
   428     doDim();
   359     doDim();
   429 
   360 
   430     HW_setPianoSound([allTouches count]);
   361     HW_setPianoSound([allTouches count]);
   431 
   362