diff --git a/macosx/Base.lproj/Queue.xib b/macosx/Base.lproj/Queue.xib index b1e193b88..c4b858ada 100644 --- a/macosx/Base.lproj/Queue.xib +++ b/macosx/Base.lproj/Queue.xib @@ -1,8 +1,8 @@ - + - + @@ -43,7 +43,7 @@ - + @@ -83,7 +83,7 @@ - + @@ -118,6 +118,20 @@ + + + + + + + @@ -137,6 +151,7 @@ + diff --git a/macosx/HBQueueActionItem.m b/macosx/HBQueueActionItem.m index 41401f271..6aafe66cc 100644 --- a/macosx/HBQueueActionItem.m +++ b/macosx/HBQueueActionItem.m @@ -30,6 +30,11 @@ return NO; } +- (NSURL *)destinationURL +{ + return nil; +} + - (NSAttributedString *)attributedDescription { return [[NSAttributedString alloc] initWithString:NSLocalizedString(@"Stop action.", @"Queue -> Stop action") diff --git a/macosx/HBQueueController.m b/macosx/HBQueueController.m index 73dbf6629..e53af7afe 100644 --- a/macosx/HBQueueController.m +++ b/macosx/HBQueueController.m @@ -19,6 +19,7 @@ #import "NSArray+HBAdditions.h" @import HandBrakeKit; +@import QuickLookUI; @interface HBQueueController () @@ -708,6 +709,18 @@ NSString * const HBQueueItemNotificationPathKey = @"HBQueueItemNotificationPathK detailsItem.animator.collapsed = !detailsItem.isCollapsed; } +- (IBAction)toggleQuickLook:(id)sender +{ + if (QLPreviewPanel.sharedPreviewPanelExists && QLPreviewPanel.sharedPreviewPanel.isVisible) + { + [QLPreviewPanel.sharedPreviewPanel orderOut:sender]; + } + else + { + [QLPreviewPanel.sharedPreviewPanel makeKeyAndOrderFront:sender]; + } +} + #pragma mark - table view controller delegate - (void)tableViewDidSelectItemsAtIndexes:(NSIndexSet *)indexes diff --git a/macosx/HBQueueItem.h b/macosx/HBQueueItem.h index bd883c423..4368fd001 100644 --- a/macosx/HBQueueItem.h +++ b/macosx/HBQueueItem.h @@ -27,6 +27,8 @@ typedef NS_ENUM(NSUInteger, HBQueueItemState) { /// Whether the item has a file representation on disk or not. @property (nonatomic, readonly) BOOL hasFileRepresentation; +@property (nonatomic, readonly, copy, nullable) NSURL *destinationURL; + /// The title of the item. @property (nonatomic, readonly) NSString *title; @property (nonatomic, readonly) NSAttributedString *attributedDescription; diff --git a/macosx/HBQueueTableViewController.m b/macosx/HBQueueTableViewController.m index 11d608a3c..119dc6c16 100644 --- a/macosx/HBQueueTableViewController.m +++ b/macosx/HBQueueTableViewController.m @@ -13,7 +13,9 @@ #import "NSArray+HBAdditions.h" #import "HBPasteboardItem.h" -@interface HBQueueTableViewController () +@import QuickLookUI; + +@interface HBQueueTableViewController () @property (nonatomic, weak, readonly) HBQueue *queue; @property (nonatomic, strong) id delegate; @@ -399,4 +401,75 @@ return YES; } +#pragma mark - QuickLook + +- (BOOL)acceptsPreviewPanelControl:(QLPreviewPanel *)panel +{ + return YES; +} + +- (void)beginPreviewPanelControl:(QLPreviewPanel *)panel +{ + QLPreviewPanel.sharedPreviewPanel.delegate = self; + QLPreviewPanel.sharedPreviewPanel.dataSource = self; +} + +- (void)endPreviewPanelControl:(QLPreviewPanel *)panel +{ + QLPreviewPanel.sharedPreviewPanel.delegate = nil; + QLPreviewPanel.sharedPreviewPanel.dataSource = nil; +} + +- (NSInteger)numberOfPreviewItemsInPreviewPanel:(QLPreviewPanel *)panel +{ + return self.tableView.selectedRowIndexes.count; +} + +- (id)previewPanel:(QLPreviewPanel *)panel previewItemAtIndex:(NSInteger)index +{ + NSArray> *items = [self.queue.items objectsAtIndexes:self.tableView.selectedRowIndexes]; + if (items.count > index) + { + return items[index].destinationURL; + } + else + { + return nil; + } +} + +- (BOOL)previewPanel:(QLPreviewPanel *)panel handleEvent:(NSEvent *)event +{ + if (event.type == NSEventTypeKeyDown) + { + [self.tableView keyDown:event]; + [QLPreviewPanel.sharedPreviewPanel reloadData]; + return YES; + } + return NO; +} + +- (void)keyDown:(NSEvent *)event +{ + NSString *characters = event.charactersIgnoringModifiers; + if (characters.length) + { + unichar key = [characters characterAtIndex:0]; + if (key == ' ') + { + if (QLPreviewPanel.sharedPreviewPanel.isVisible) + { + [QLPreviewPanel.sharedPreviewPanel orderOut:self]; + } + else + { + [QLPreviewPanel.sharedPreviewPanel makeKeyAndOrderFront:self]; + } + return; + } + } + + [super keyDown:event]; +} + @end diff --git a/macosx/HandBrake.xcodeproj/project.pbxproj b/macosx/HandBrake.xcodeproj/project.pbxproj index d7fd96b23..a1327eaf4 100644 --- a/macosx/HandBrake.xcodeproj/project.pbxproj +++ b/macosx/HandBrake.xcodeproj/project.pbxproj @@ -265,6 +265,7 @@ A990C55322FF4FBA00E07CE2 /* HandBrakeKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9736F021C7DA5FE008F1D18 /* HandBrakeKit.framework */; }; A9935865256C346F00A6875E /* libzimg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A9935852256C346F00A6875E /* libzimg.a */; }; A9935866256C347800A6875E /* libzimg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A9935852256C346F00A6875E /* libzimg.a */; }; + A9998605278868220019E76F /* QuickLookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A99985F3278868220019E76F /* QuickLookUI.framework */; }; A99F40CF1B624E7E00750170 /* HBPictureViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A99F40CD1B624E7E00750170 /* HBPictureViewController.m */; }; A9A0CBE81CCEA3670045B3DF /* HBPlayerTrack.m in Sources */ = {isa = PBXBuildFile; fileRef = A9A0CBE61CCEA1D10045B3DF /* HBPlayerTrack.m */; }; A9A25D9C21182741005A8A0F /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9A25D9B21182741005A8A0F /* CoreMedia.framework */; }; @@ -924,6 +925,7 @@ A99422DE1B1887B000DDB077 /* NSJSONSerialization+HBAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSJSONSerialization+HBAdditions.h"; sourceTree = ""; }; A99422DF1B1887B000DDB077 /* NSJSONSerialization+HBAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSJSONSerialization+HBAdditions.m"; sourceTree = ""; }; A997D8EB1A4ABB0900E19B6F /* HBPresetCoding.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HBPresetCoding.h; sourceTree = ""; }; + A99985F3278868220019E76F /* QuickLookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLookUI.framework; path = System/Library/Frameworks/QuickLookUI.framework; sourceTree = SDKROOT; }; A99F40CC1B624E7E00750170 /* HBPictureViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBPictureViewController.h; sourceTree = ""; }; A99F40CD1B624E7E00750170 /* HBPictureViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBPictureViewController.m; sourceTree = ""; }; A9A0CBE51CCEA1D10045B3DF /* HBPlayerTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBPlayerTrack.h; sourceTree = ""; }; @@ -1262,6 +1264,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + A9998605278868220019E76F /* QuickLookUI.framework in Frameworks */, A9BB1C6924DAD869007CD416 /* Sparkle.framework in Frameworks */, 273F203C14ADBC210021BE6D /* Cocoa.framework in Frameworks */, A9E1467B16BC2ABD00C307BC /* QuartzCore.framework in Frameworks */, @@ -1451,6 +1454,7 @@ 273F203414ADBAC30021BE6D /* Frameworks */ = { isa = PBXGroup; children = ( + A99985F3278868220019E76F /* QuickLookUI.framework */, A9935852256C346F00A6875E /* libzimg.a */, A9442CDD24DABFED005EDF62 /* Sparkle.xcodeproj */, A9A25D9B21182741005A8A0F /* CoreMedia.framework */,