From dd89c106cf88c972f90ec425442b2fa305a4c602 Mon Sep 17 00:00:00 2001 From: Damiano Galassi Date: Fri, 15 Dec 2017 15:13:46 +0100 Subject: [PATCH] MacGui: add a next and previous button to the summary panel preview. --- .../English.lproj/HBPreviewViewController.xib | 77 +++++++ .../English.lproj/HBSummaryViewController.xib | 7 +- macosx/HBPreviewViewController.h | 19 ++ macosx/HBPreviewViewController.m | 209 ++++++++++++++++++ macosx/HBSummaryViewController.m | 60 ++--- 5 files changed, 326 insertions(+), 46 deletions(-) create mode 100644 macosx/English.lproj/HBPreviewViewController.xib create mode 100644 macosx/HBPreviewViewController.h create mode 100644 macosx/HBPreviewViewController.m diff --git a/macosx/English.lproj/HBPreviewViewController.xib b/macosx/English.lproj/HBPreviewViewController.xib new file mode 100644 index 000000000..94364a9a5 --- /dev/null +++ b/macosx/English.lproj/HBPreviewViewController.xib @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macosx/English.lproj/HBSummaryViewController.xib b/macosx/English.lproj/HBSummaryViewController.xib index 942816e26..e7df77063 100644 --- a/macosx/English.lproj/HBSummaryViewController.xib +++ b/macosx/English.lproj/HBSummaryViewController.xib @@ -1,9 +1,8 @@ - + - - + @@ -95,7 +94,7 @@ - + diff --git a/macosx/HBPreviewViewController.h b/macosx/HBPreviewViewController.h new file mode 100644 index 000000000..d3101a540 --- /dev/null +++ b/macosx/HBPreviewViewController.h @@ -0,0 +1,19 @@ +// +// HBPreviewViewController.h +// HandBrake +// +// Created by Damiano Galassi on 14/12/2017. +// + +#import + +@class HBPreviewGenerator; +@class HBPreviewController; + +@interface HBPreviewViewController : NSViewController + +@property (nonatomic, readwrite, weak, nullable) HBPreviewGenerator *generator; + +- (void)update; + +@end 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 +#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 diff --git a/macosx/HBSummaryViewController.m b/macosx/HBSummaryViewController.m index e16f26e87..52c192172 100644 --- a/macosx/HBSummaryViewController.m +++ b/macosx/HBSummaryViewController.m @@ -5,7 +5,8 @@ It may be used under the terms of the GNU General Public License. */ #import "HBSummaryViewController.h" -#import "HBPreviewView.h" + +#import "HBPreviewViewController.h" #import "HBPreviewGenerator.h" @import HandBrakeKit; @@ -25,14 +26,14 @@ static void *HBSummaryViewControllerSubsContext = &HBSummaryViewControllerSubsCo @property (nonatomic, strong) IBOutlet NSTextField *filtersLabel; @property (nonatomic, strong) IBOutlet NSTextField *dimensionLabel; -@property (nonatomic, strong) IBOutlet HBPreviewView *previewView; +@property (nonatomic, strong) IBOutlet NSView *previewView; + +@property (nonatomic, strong) HBPreviewViewController *previewViewController; @property (nonatomic) BOOL tracksReloadInQueue; @property (nonatomic) BOOL filtersReloadInQueue; @property (nonatomic) BOOL pictureReloadInQueue; -@property (nonatomic) BOOL visible; - @end @implementation HBSummaryViewController @@ -40,43 +41,25 @@ static void *HBSummaryViewControllerSubsContext = &HBSummaryViewControllerSubsCo - (instancetype)init { self = [super initWithNibName:@"HBSummaryViewController" bundle:nil]; + if (self) + { + _previewViewController = [[HBPreviewViewController alloc] init]; + } return self; } - (void)loadView { [super loadView]; - self.previewView.showShadow = NO; - self.visible = YES; + self.previewViewController.view.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; + self.previewViewController.view.frame = NSMakeRect(0, 0, self.previewView.frame.size.width, self.previewView.frame.size.height); + [self.previewView addSubview:self.previewViewController.view]; [self resetLabels]; } -- (void)viewWillAppear -{ - self.visible = YES; - if (self.pictureReloadInQueue || self.previewView.image == NULL) - { - [self updatePicture]; - } -} - -- (void)viewDidDisappear -{ - self.visible = NO; -} - - (void)setGenerator:(HBPreviewGenerator *)generator { - _generator = generator; - - if (generator) - { - [self updatePicture]; - } - else - { - self.previewView.image = nil; - } + self.previewViewController.generator = generator; } - (void)setJob:(HBJob *)job @@ -258,7 +241,7 @@ static void *HBSummaryViewControllerSubsContext = &HBSummaryViewControllerSubsCo // to avoid reloading the same image multiple times. if (self.pictureReloadInQueue == NO) { - [[NSRunLoop mainRunLoop] performSelector:@selector(updatePicture) target:self argument:nil order:0 modes:@[NSDefaultRunLoopMode]]; + [[NSRunLoop mainRunLoop] performSelector:@selector(updatePictureLabel) target:self argument:nil order:0 modes:@[NSDefaultRunLoopMode]]; self.pictureReloadInQueue = YES; } } @@ -285,18 +268,11 @@ static void *HBSummaryViewControllerSubsContext = &HBSummaryViewControllerSubsCo self.filtersReloadInQueue = NO; } -- (void)updatePicture +- (void)updatePictureLabel { - if (self.visible && self.generator) - { - NSUInteger index = self.generator.imagesCount > 1 ? 1 : 0; - CGImageRef fPreviewImage = [self.generator copyImageAtIndex:index shouldCache:NO]; - self.previewView.image = fPreviewImage; - CFRelease(fPreviewImage); - self.pictureReloadInQueue = NO; - - self.dimensionLabel.stringValue = self.job.picture.shortInfo; - } + self.pictureReloadInQueue = NO; + self.dimensionLabel.stringValue = self.job.picture.shortInfo; + [self.previewViewController update]; } @end -- 2.40.0