diff options
author | dynaflash <[email protected]> | 2009-01-21 03:46:14 +0000 |
---|---|---|
committer | dynaflash <[email protected]> | 2009-01-21 03:46:14 +0000 |
commit | e22c0e8c13d799104e616de5c469cb11b4defca0 (patch) | |
tree | 445364840421e5f40d84ec04e29246c8194ba9ce /macosx/HBPreviewController.mm | |
parent | cb23938da2747334ee19e359a64db9bb9eec4a55 (diff) |
MacGui: Preview Window scale to screen initial implementation
- Allows scaling the preview to fit the screen when in full screen mode.
- Also hopefully fixes a bug where multiple cycles of windowed and full screen cause the hud overlay to not appear.
- hud overlay delay timer changed from 20 to 10 seconds
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@2091 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'macosx/HBPreviewController.mm')
-rw-r--r-- | macosx/HBPreviewController.mm | 399 |
1 files changed, 244 insertions, 155 deletions
diff --git a/macosx/HBPreviewController.mm b/macosx/HBPreviewController.mm index 10c885587..6a50d461b 100644 --- a/macosx/HBPreviewController.mm +++ b/macosx/HBPreviewController.mm @@ -6,7 +6,6 @@ #import "HBPreviewController.h" #import "Controller.h" -//#import "PictureController.h" @interface PreviewController (Private) @@ -43,117 +42,6 @@ } -- (void) mouseMoved:(NSEvent *)theEvent -{ - [super mouseMoved:theEvent]; - - if (isEncoding == NO) - { - if (hudTimerSeconds == 0) - { - hudTimerSeconds ++; - [self startHudTimer]; - } - - if (hudTimerSeconds > 20) - { - - - [self stopHudTimer]; - [self showHideHudControls]; - } - - } -} - -- (void) startHudTimer -{ - if (!fHudTimer) - { - fHudTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(hudTimerFired:) userInfo:nil repeats:YES]; - [fHudTimer retain]; - } -} - -- (void) stopHudTimer -{ - if (fHudTimer) - { - [fHudTimer invalidate]; - [fHudTimer release]; - fHudTimer = nil; - hudTimerSeconds = 0; - } -} - -- (void) hudTimerFired: (NSTimer*)theTimer -{ - hudTimerSeconds ++; - [self showHideHudControls]; - -} - -- (void) showHideHudControls -{ - /* Test for mouse location to show/hide hud controls */ - NSPoint mouseLoc; - NSRect targetFrame; - NSRect controlBoxFrame; - targetFrame = [fPictureViewArea frame]; - controlBoxFrame = [fPictureControlBox frame]; - - if (isFullScreen) - { - mouseLoc = [fFullScreenWindow mouseLocationOutsideOfEventStream]; - } - else - { - mouseLoc = [fPreviewWindow mouseLocationOutsideOfEventStream]; - } - - /* if the pointer is inside the picture view areas but not - * in the controlbox, check the hudTimerSeconds to see if - * its in the allowable time span - */ - if ( hudTimerSeconds > 0 && hudTimerSeconds < 20) - { - if (NSPointInRect (mouseLoc, controlBoxFrame)) - { - /* Mouse is over the preview area so show hud controls so just - * reset the timer to keep the control box visible - */ - //[fPictureControlBox setHidden: NO]; - hudTimerSeconds = 1; - return; - } - - /* Else, if we are not encoding a preview, we show/hide the hud controls */ - if (isEncoding == NO) - { - /* Re-verify we are within the target frame */ - if (NSPointInRect (mouseLoc, targetFrame)) - { - /* Mouse is over the preview area so show hud controls */ - [[fPictureControlBox animator] setHidden: NO]; - /* increment our timer by one */ - hudTimerSeconds ++; - } - else - { - [[fPictureControlBox animator] setHidden: YES]; - [self stopHudTimer]; - } - } - - } - else - { - [[fPictureControlBox animator] setHidden: YES]; - } - -} - - //------------------------------------------------------------------------------------ // Displays and brings the picture window to the front @@ -163,6 +51,7 @@ [self showWindow:sender]; /* lets set the preview window to accept mouse moved events */ [fPreviewWindow setAcceptsMouseMovedEvents:YES]; + hudTimerSeconds = 0; [self pictureSliderChanged:nil]; [self startReceivingLibhbNotifications]; } @@ -196,6 +85,7 @@ [fPictureSlider setWantsLayer:YES]; [fFullScreenToggleButton setWantsLayer:YES]; [fPictureSettingsToggleButton setWantsLayer:YES]; + [fScaleToScreenToggleButton setWantsLayer:YES]; [fCreatePreviewMovieButton setWantsLayer:YES]; [fEncodingControlBox setWantsLayer:YES]; @@ -323,8 +213,10 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; [fPictureView setHidden:NO]; [fPictureView setImage: [self imageForPicture: fPicture]]; + - NSSize displaySize = NSMakeSize( ( CGFloat )fTitle->width, ( CGFloat )fTitle->height ); + + NSSize displaySize = NSMakeSize( ( CGFloat )fTitle->width, ( CGFloat )fTitle->height ); /* Set the picture size display fields below the Preview Picture*/ if( fTitle->job->pixel_ratio == 1 ) // Original PAR Implementation { @@ -354,7 +246,8 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; } NSSize viewSize = [self optimalViewSizeForImageSize:displaySize]; - if( [self viewNeedsToResizeToSize:viewSize] ) + /* we also need to take into account scaling to full screen to activate switching the view size */ + if( [self viewNeedsToResizeToSize:viewSize]) { /* In the case of loose anamorphic, do not resize the window when scaling down */ // FIX ME: we need a new way to do this as we do not havefWidthField anymore @@ -365,7 +258,8 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; [self setViewSize:viewSize]; } } - + + // Show the scaled text (use the height to check since the width can vary // with anamorphic video). if( ( ( int )viewSize.height ) != fTitle->height ) @@ -375,22 +269,24 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; NSLocalizedString( @" (Preview scaled to %.0f%% actual size)", @"String shown when a preview is scaled" ), scale * 100.0]; - [fInfoField setStringValue: [[fInfoField stringValue] stringByAppendingString:scaleString]]; + [fscaleInfoField setStringValue: [NSString stringWithFormat: + @"%@", scaleString]]; + + } + else + { + [fscaleInfoField setStringValue: @""]; } } - (IBAction) previewDurationPopUpChanged: (id) sender { - -[[NSUserDefaults standardUserDefaults] setObject:[fPreviewMovieLengthPopUp titleOfSelectedItem] forKey:@"PreviewLength"]; - -} + [[NSUserDefaults standardUserDefaults] setObject:[fPreviewMovieLengthPopUp titleOfSelectedItem] forKey:@"PreviewLength"]; + +} - - - - (IBAction) SettingsChanged: (id) sender { // Purge the existing picture previews so they get recreated the next time @@ -424,18 +320,133 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; { [self SetTitle:title]; [self showWindow:sender]; + [fPreviewWindow setAcceptsMouseMovedEvents:YES]; isFullScreen = NO; + scaleToScreen = NO; hudTimerSeconds = 0; + [self startHudTimer]; } - (IBAction)showPictureSettings:(id)sender { -[fHBController showPicturePanel:self]; + [fHBController showPicturePanel:self]; } +#pragma mark Hud Control Overlay +- (void) mouseMoved:(NSEvent *)theEvent +{ + [super mouseMoved:theEvent]; + + if (isEncoding == NO) + { + if (hudTimerSeconds == 0) + { + hudTimerSeconds ++; + [self startHudTimer]; + } + + if (hudTimerSeconds > 20) + { + + + [self stopHudTimer]; + [self showHideHudControls]; + } + + } +} -#pragma mark Cocoa For Fullscreen Mode +- (void) startHudTimer +{ + if (!fHudTimer) + { + fHudTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(hudTimerFired:) userInfo:nil repeats:YES]; + [fHudTimer retain]; + } +} + +- (void) stopHudTimer +{ + if (fHudTimer) + { + [fHudTimer invalidate]; + [fHudTimer release]; + fHudTimer = nil; + hudTimerSeconds = 0; + } +} + +- (void) hudTimerFired: (NSTimer*)theTimer +{ + hudTimerSeconds ++; + [self showHideHudControls]; + +} + +- (void) showHideHudControls +{ + /* Test for mouse location to show/hide hud controls */ + NSPoint mouseLoc; + NSRect targetFrame; + NSRect controlBoxFrame; + targetFrame = [fPictureViewArea frame]; + controlBoxFrame = [fPictureControlBox frame]; + + if (isFullScreen) + { + mouseLoc = [fFullScreenWindow mouseLocationOutsideOfEventStream]; + [fScaleToScreenToggleButton setHidden:NO]; + } + else + { + mouseLoc = [fPreviewWindow mouseLocationOutsideOfEventStream]; + [fScaleToScreenToggleButton setHidden:YES]; + } + + /* if the pointer is inside the picture view areas but not + * in the controlbox, check the hudTimerSeconds to see if + * its in the allowable time span + */ + if ( hudTimerSeconds > 0 && hudTimerSeconds < 20) + { + + if (isEncoding == NO) + { + if (NSPointInRect (mouseLoc, controlBoxFrame)) + { + /* Mouse is over the preview area so show hud controls so just + * reset the timer to keep the control box visible + */ + [fPictureControlBox setHidden: NO]; + hudTimerSeconds = 1; + return; + } + /* Re-verify we are within the target frame */ + if (NSPointInRect (mouseLoc, targetFrame)) + { + /* Mouse is over the preview area so show hud controls */ + [[fPictureControlBox animator] setHidden: NO]; + /* increment our timer by one */ + hudTimerSeconds ++; + } + else + { + [[fPictureControlBox animator] setHidden: YES]; + [self stopHudTimer]; + } + } + + } + else + { + [[fPictureControlBox animator] setHidden: YES]; + } + +} + + +#pragma mark Fullscreen Mode - (IBAction)toggleScreenMode:(id)sender { @@ -449,6 +460,32 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; } } +- (IBAction)toggleScaleToScreen:(id)sender +{ + if (scaleToScreen == YES) + { + scaleToScreen = NO; + /* make sure we are set to a still preview */ + [self pictureSliderChanged:nil]; + [fScaleToScreenToggleButton setTitle:@"<->"]; + } + else + { + scaleToScreen = YES; + /* make sure we are set to a still preview */ + [self pictureSliderChanged:nil]; + [fScaleToScreenToggleButton setTitle:@">-<"]; + } + + /* Actually perform the scaling */ + /* + NSSize displaySize = NSMakeSize( ( CGFloat )fTitle->width, ( CGFloat )fTitle->height ); + NSSize viewSize = [self optimalViewSizeForImageSize:displaySize]; + [self resizeSheetForViewSize:viewSize]; + [self setViewSize:viewSize]; + */ +} + - (BOOL)fullScreen { return isFullScreen; @@ -467,8 +504,15 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; if (err == CGDisplayNoErr) { + /* make sure we are set to a still preview and not scaled to screen */ + scaleToScreen = NO; + [self pictureSliderChanged:nil]; + // Create the full-screen window. - NSRect winRect = [fPreviewWindow frame]; + //NSRect winRect = [mainScreen frame]; + //fPictureViewArea + NSRect winRect = [fPictureViewArea frame]; + fFullScreenWindow = [[NSWindow alloc] initWithContentRect:winRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered @@ -502,11 +546,7 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; [fFullScreenWindow setFrameOrigin:windowOrigin]; - /* Using the simple center method for NSWindow - * though note this will cause the window to be slightly - * higher than center - */ - //[fFullScreenWindow center]; + /* lets kill the timer for now */ [self stopReceivingLibhbNotifications]; @@ -524,9 +564,6 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; // Show the window. [fFullScreenWindow makeKeyAndOrderFront:self]; - [fPreviewWindow setAcceptsMouseMovedEvents:NO]; - [fFullScreenWindow setAcceptsMouseMovedEvents:YES]; - /* Change the name of fFullScreenToggleButton appropriately */ [fFullScreenToggleButton setTitle: @"Windowed"]; @@ -534,12 +571,17 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; [self startReceivingLibhbNotifications]; isFullScreen = YES; + [fScaleToScreenToggleButton setHidden:NO]; /* make sure we are set to a still preview */ [self pictureSliderChanged:nil]; - /* set the picture settings pallete above the shielding level */ - //[fHBController picturePanelFullScreen]; + //[fPreviewWindow setAcceptsMouseMovedEvents:NO]; + [fFullScreenWindow setAcceptsMouseMovedEvents:YES]; + + + hudTimerSeconds = 0; + [self startHudTimer]; } } @@ -548,13 +590,16 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; /* Get the screen info to release the display but don't actually do * it until the windowed screen is setup. - */ + */ + scaleToScreen = NO; + [self pictureSliderChanged:nil]; + [fScaleToScreenToggleButton setTitle:@"<->"]; + NSScreen* mainScreen = [NSScreen mainScreen]; NSDictionary* screenInfo = [mainScreen deviceDescription]; NSNumber* screenID = [screenInfo objectForKey:@"NSScreenNumber"]; CGDirectDisplayID displayID = (CGDirectDisplayID)[screenID longValue]; - [fFullScreenWindow setAcceptsMouseMovedEvents:NO]; [fFullScreenWindow dealloc]; [fFullScreenWindow release]; @@ -569,22 +614,28 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; /* Set the window back to regular level */ [fPreviewWindow setLevel:NSNormalWindowLevel]; - [fPreviewWindow setAcceptsMouseMovedEvents:YES]; - - /* Set the isFullScreen flag back to NO */ isFullScreen = NO; + scaleToScreen = NO; + /* make sure we are set to a still preview */ + [self pictureSliderChanged:nil]; [self showPreviewWindow:nil]; /* Change the name of fFullScreenToggleButton appropriately */ [fFullScreenToggleButton setTitle: @"Full Screen"]; - + // [fScaleToScreenToggleButton setHidden:YES]; /* set the picture settings pallete back to normal level */ [fHBController picturePanelWindowed]; /* Release the display now that the we are back in windowed mode */ CGDisplayRelease(displayID); + [fPreviewWindow setAcceptsMouseMovedEvents:YES]; + //[fFullScreenWindow setAcceptsMouseMovedEvents:NO]; + + hudTimerSeconds = 0; + [self startHudTimer]; + } @@ -1016,14 +1067,13 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; /* We need to find out if the preview movie needs to be scaled down so * that it doesn't overflow our available viewing container (just like for image * in -displayPreview) for HD sources, etc. [fPictureViewArea frame].size.height*/ - if( ((int)movieBounds.size.height) > [fPictureView frame].size.height ) + if( ((int)movieBounds.size.height) > [fPictureView frame].size.height || scaleToScreen == YES) { /* The preview movie would be larger than the available viewing area * in the preview movie, so we go ahead and scale it down to the same size * as the still preview or we readjust our window to allow for the added height if need be */ NSSize displaySize = NSMakeSize( (float)movieBounds.size.width, (float)movieBounds.size.height ); - //NSSize displaySize = NSMakeSize( (float)fTitle->width, (float)fTitle->height ); NSSize viewSize = [self optimalViewSizeForImageSize:displaySize]; if( [self viewNeedsToResizeToSize:viewSize] ) { @@ -1033,6 +1083,7 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; } + [fMovieView setPreservesAspectRatio:YES]; [fMovieView setFrameSize:viewSize]; } else @@ -1040,8 +1091,12 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; /* Since the preview movie is smaller than the available viewing area * we can go ahead and use the preview movies native size */ [fMovieView setFrameSize:movieBounds.size]; + } + + + // lets reposition the movie if need be NSPoint origin = [fPictureViewArea frame].origin; @@ -1141,13 +1196,40 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; resultSize.height = maxHeight; } - return resultSize; + if (scaleToScreen == YES) + { + //CGFloat scaleToScreenWidth; + //CGFloat scaleToScreenHeight; + CGFloat screenAspect; + CGFloat viewAreaAspect; + //note, a mbp 15" at 1440 x 900 is a 1.6 ar + screenAspect = screenSize.width / screenSize.height; + + // Note, a standard dvd will use 720 x 480 which is a 1.5 + viewAreaAspect = viewAreaSize.width / viewAreaSize.height; + + if (screenAspect < viewAreaAspect) + { + resultSize.width = screenSize.width; + resultSize.height = (screenSize.width / viewAreaAspect); + } + else + { + resultSize.height = screenSize.height; + resultSize.width = resultSize.height * viewAreaAspect; + } + + } + + return resultSize; + + } // // -[PictureController(Private) resizePanelForViewSize:animate:] // -// Resizes the entire sheet to accomodate a view of a particular size. +// Resizes the entire window to accomodate a view of a particular size. // - (void)resizeSheetForViewSize: (NSSize)viewSize { @@ -1155,7 +1237,7 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; NSSize currentSize = [fPictureViewArea frame].size; CGFloat deltaX = viewSize.width - currentSize.width; CGFloat deltaY = viewSize.height - currentSize.height; - + // Now resize the whole panel by those same deltas, but don't exceed the min NSRect frame = [[self window] frame]; NSSize maxSize = [[self window] maxSize]; @@ -1172,24 +1254,31 @@ MaxOutputWidth = title->width - job->crop[2] - job->crop[3]; frame.size.height = minSize.height; } - + // But now the sheet is off-center, so also shift the origin to center it and // keep the top aligned. if( frame.size.width != [[self window] frame].size.width ) frame.origin.x -= (deltaX / 2.0); - + if (isFullScreen) { - if( frame.size.height != [[self window] frame].size.height ) - frame.origin.y -= (deltaY / 2.0); + if( frame.size.height != [[self window] frame].size.height ) + { + frame.origin.y -= (deltaY / 2.0); + } + else + { + if( frame.size.height != [[self window] frame].size.height ) + frame.origin.y -= deltaY; + } + + [[self window] setFrame:frame display:YES animate:NO]; } else { - if( frame.size.height != [[self window] frame].size.height ) - frame.origin.y -= deltaY; + [[self window] setFrame:frame display:YES animate:YES]; } - - [[self window] setFrame:frame display:YES animate:YES]; + } // |