summaryrefslogtreecommitdiffstats
path: root/macosx/HBPreviewViewController.m
diff options
context:
space:
mode:
authorDamiano Galassi <[email protected]>2017-12-15 15:13:46 +0100
committerDamiano Galassi <[email protected]>2017-12-15 15:13:46 +0100
commitdd89c106cf88c972f90ec425442b2fa305a4c602 (patch)
treec566d6822fcde275e1dd651c69fda3316f6c618e /macosx/HBPreviewViewController.m
parentb16949a1c14e42c0b56873b5488a339812225bf9 (diff)
MacGui: add a next and previous button to the summary panel preview.
Diffstat (limited to 'macosx/HBPreviewViewController.m')
-rw-r--r--macosx/HBPreviewViewController.m209
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