diff options
author | Damiano Galassi <[email protected]> | 2017-12-15 15:13:46 +0100 |
---|---|---|
committer | Damiano Galassi <[email protected]> | 2017-12-15 15:13:46 +0100 |
commit | dd89c106cf88c972f90ec425442b2fa305a4c602 (patch) | |
tree | c566d6822fcde275e1dd651c69fda3316f6c618e /macosx/HBPreviewViewController.m | |
parent | b16949a1c14e42c0b56873b5488a339812225bf9 (diff) |
MacGui: add a next and previous button to the summary panel preview.
Diffstat (limited to 'macosx/HBPreviewViewController.m')
-rw-r--r-- | macosx/HBPreviewViewController.m | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/macosx/HBPreviewViewController.m b/macosx/HBPreviewViewController.m new file mode 100644 index 000000000..a9e275e28 --- /dev/null +++ b/macosx/HBPreviewViewController.m @@ -0,0 +1,209 @@ +// +// HBPreviewViewController.m +// HandBrake +// +// Created by Damiano Galassi on 14/12/2017. +// + +#import <QuartzCore/QuartzCore.h> +#import "HBPreviewViewController.h" + +#import "HBPreviewView.h" +#import "HBPreviewGenerator.h" +#import "HBPreviewController.h" + +@interface HBPreviewViewController () + +@property (nonatomic, strong) IBOutlet HBPreviewView *previewView; + +@property (nonatomic, strong) IBOutlet NSView *hud; + +@property (nonatomic) NSInteger selectedIndex; +@property (nonatomic) BOOL visible; + +@property (nonatomic) NSTimer *hudTimer; +@property (nonatomic) BOOL mouseInView; + +@end + +@implementation HBPreviewViewController + +- (instancetype)init +{ + self = [super initWithNibName:@"HBPreviewViewController" bundle:nil]; + if (self) + { + _selectedIndex = 1; + } + return self; +} + +- (void)loadView +{ + [super loadView]; + self.visible = YES; + self.previewView.showShadow = NO; + + NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:self.view.frame + options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingInVisibleRect | NSTrackingActiveAlways + owner:self + userInfo:nil]; + [self.view addTrackingArea:trackingArea]; + self.hud.hidden = YES; + self.hud.layer.opacity = 0; +} + +- (void)viewWillAppear +{ + self.visible = YES; + [self updatePicture]; +} + +- (void)viewDidDisappear +{ + self.visible = NO; +} + +- (void)setGenerator:(HBPreviewGenerator *)generator +{ + _generator = generator; + if (generator) + { + self.selectedIndex = self.selectedIndex; + [self updatePicture]; + } + else + { + self.previewView.image = nil; + } +} + +- (void)update +{ + [self updatePicture]; +} + +#pragma MARK: - HUD + +- (void)mouseEntered:(NSEvent *)theEvent +{ + if (self.generator) + { + [self showHudWithAnimation:self.hud]; + } + self.mouseInView = YES; +} + +- (void)mouseMoved:(NSEvent *)theEvent +{ + [super mouseMoved:theEvent]; + + // Test for mouse location to show/hide hud controls + if (self.generator && self.mouseInView) + { + [self showHudWithAnimation:self.hud]; + } +} + +- (void)mouseExited:(NSEvent *)theEvent +{ + [self hideHudWithAnimation:self.hud]; + self.mouseInView = NO; +} + +#define ANIMATION_DUR 0.15 + +- (void)showHudWithAnimation:(NSView *)hud +{ + // The standard view animator doesn't play + // nicely with the Yosemite visual effects yet. + // So let's do the fade ourself. + if (hud.layer.opacity == 0 || hud.isHidden) + { + hud.hidden = NO; + + [CATransaction begin]; + CABasicAnimation *fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; + fadeInAnimation.fromValue = @(hud.layer.presentationLayer.opacity); + fadeInAnimation.toValue = @(1.0); + fadeInAnimation.beginTime = 0.0; + fadeInAnimation.duration = ANIMATION_DUR; + + [hud.layer addAnimation:fadeInAnimation forKey:nil]; + [hud.layer setOpacity:1]; + + [CATransaction commit]; + } +} + +- (void)hideHudWithAnimation:(NSView *)hud +{ + if (hud.layer.opacity != 0) + { + [CATransaction begin]; + CABasicAnimation *fadeOutAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; + fadeOutAnimation.fromValue = @(hud.layer.presentationLayer.opacity); + fadeOutAnimation.toValue = @(0.0); + fadeOutAnimation.beginTime = 0.0; + fadeOutAnimation.duration = ANIMATION_DUR; + + [hud.layer addAnimation:fadeOutAnimation forKey:nil]; + [hud.layer setOpacity:0]; + + [CATransaction commit]; + } +} + +#pragma MARK: - Preview index + +- (void)setSelectedIndex:(NSInteger)selectedIndex +{ + NSInteger count = self.generator.imagesCount; + if (selectedIndex >= count) + { + selectedIndex = count -1; + } + else if (selectedIndex < 0) + { + selectedIndex = 0; + } + _selectedIndex = selectedIndex; +} + +- (IBAction)next:(id)sender +{ + self.selectedIndex += 1; + [self updatePicture]; +} + +- (IBAction)previous:(id)sender +{ + self.selectedIndex -= 1; + [self updatePicture]; +} + +- (void)updatePicture +{ + if (self.generator && self.visible) + { + CGImageRef fPreviewImage = [self.generator copyImageAtIndex:self.selectedIndex shouldCache:YES]; + self.previewView.image = fPreviewImage; + CFRelease(fPreviewImage); + } +} + +- (void)scrollWheel:(NSEvent *)theEvent +{ + if (theEvent.deltaY < 0) + { + self.selectedIndex += 1; + [self updatePicture]; + } + else if (theEvent.deltaY > 0) + { + self.selectedIndex -= 1; + [self updatePicture]; + } +} + +@end |