summaryrefslogtreecommitdiffstats
path: root/macosx/HBPictureController.m
diff options
context:
space:
mode:
authorritsuka <[email protected]>2014-12-27 10:49:35 +0000
committerritsuka <[email protected]>2014-12-27 10:49:35 +0000
commit6a17f942bfee8c4f79d893032dc0a5b6c9bdea2e (patch)
tree7e50315aea348534eb4daab15938e3029e553541 /macosx/HBPictureController.m
parent11e8c42dca071c1f4536d939adbfdb13bbd6645a (diff)
MacGui: rename PictureController.* to HBPictureController.* .
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6657 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'macosx/HBPictureController.m')
-rw-r--r--macosx/HBPictureController.m349
1 files changed, 349 insertions, 0 deletions
diff --git a/macosx/HBPictureController.m b/macosx/HBPictureController.m
new file mode 100644
index 000000000..ff69f2dde
--- /dev/null
+++ b/macosx/HBPictureController.m
@@ -0,0 +1,349 @@
+/* $Id: PictureController.mm,v 1.11 2005/08/01 15:10:44 titer Exp $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
+
+#import "HBPictureController.h"
+#import "HBFilters.h"
+#import "HBPicture.h"
+
+static void *HBPictureControllerContext = &HBPictureControllerContext;
+
+@interface HBPictureController ()
+{
+ /* Picture Sizing */
+ IBOutlet NSTabView * fSizeFilterView;
+ IBOutlet NSBox * fPictureSizeBox;
+ IBOutlet NSBox * fPictureCropBox;
+
+ IBOutlet NSPopUpButton * fAnamorphicPopUp;
+ IBOutlet NSStepper * fWidthStepper;
+ IBOutlet NSStepper * fHeightStepper;
+
+ /* Video Filters */
+ IBOutlet NSBox * fDetelecineBox;
+ IBOutlet NSBox * fDecombDeinterlaceBox;
+ IBOutlet NSBox * fDecombBox;
+ IBOutlet NSBox * fDeinterlaceBox;
+
+ IBOutlet NSTextField * fDeblockField;
+
+ IBOutlet NSTextField *fDenoisePreset;
+ IBOutlet NSPopUpButton *fDenoisePresetPopUp;
+ IBOutlet NSTextField *fDenoiseTuneLabel;
+ IBOutlet NSPopUpButton *fDenoiseTunePopUp;
+ IBOutlet NSTextField *fDenoiseCustomLabel;
+ IBOutlet NSTextField *fDenoiseCustomField;
+}
+
+@end
+
+@implementation HBPictureController
+
+- (instancetype)init
+{
+ if (self = [super initWithWindowNibName:@"PictureSettings"])
+ {
+ // NSWindowController likes to lazily load its window. However since
+ // this controller tries to set all sorts of outlets before the window
+ // is displayed, we need it to load immediately. The correct way to do
+ // this, according to the documentation, is simply to invoke the window
+ // getter once.
+ //
+ // If/when we switch a lot of this stuff to bindings, this can probably
+ // go away.
+ [self window];
+
+ // Add the observers for the filters values
+ NSArray *observerdKeyPaths = @[@"self.filters.useDecomb", @"self.filters.deblock",
+ @"self.filters.denoise", @"self.filters.denoisePreset"];
+ for (NSString *keyPath in observerdKeyPaths)
+ {
+ [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionInitial context:HBPictureControllerContext];
+ }
+
+ [self addObserver:self forKeyPath:@"self.picture.anamorphicMode" options:NSKeyValueObservingOptionInitial context:HBPictureControllerContext];
+ [self addObserver:self forKeyPath:@"self.picture.modulus" options:NSKeyValueObservingOptionInitial context:HBPictureControllerContext];
+ }
+
+ return self;
+}
+
+- (void) dealloc
+{
+ NSArray *observerdKeyPaths = @[@"self.filters.useDecomb", @"self.filters.deblock",
+ @"self.filters.denoise", @"self.filters.denoisePreset"];
+ @try {
+ for (NSString *keyPath in observerdKeyPaths)
+ {
+ [self removeObserver:self forKeyPath:keyPath];
+ }
+
+ } @catch (NSException * __unused exception) {}
+
+ self.filters = nil;
+ self.picture = nil;
+
+ [super dealloc];
+}
+
+- (void)windowDidLoad
+{
+ [[self window] setExcludedFromWindowsMenu:YES];
+
+ // Set the panel appearance explicity to aqua.
+ // can be removed when Apple will fix UI appearance on Yosemite.
+ if (NSClassFromString(@"NSVisualEffectView")) {
+ [self.window setAppearance:[NSClassFromString(@"NSAppearance") appearanceNamed:@"NSAppearanceNameAqua"]];
+ }
+
+ /* Populate the Anamorphic NSPopUp button here */
+ [fAnamorphicPopUp removeAllItems];
+ [fAnamorphicPopUp addItemsWithTitles:@[@"None", @"Strict", @"Loose", @"Custom"]];
+
+ [self resizeInspectorForTab:nil];
+ [self adjustSizingDisplay:nil];
+}
+
+#pragma mark - KVO
+
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
+{
+ if (context == HBPictureControllerContext)
+ {
+ // We use KVO to update the panel
+ // and notify the main controller of the changes
+ // in the filters and picture settings.
+
+ if ([keyPath isEqualToString:@"self.picture.anamorphicMode"])
+ {
+ [self adjustSizingDisplay:nil];
+ }
+ else if ([keyPath isEqualToString:@"self.picture.modulus"])
+ {
+ [fWidthStepper setIncrement:self.picture.modulus];
+ [fHeightStepper setIncrement:self.picture.modulus];
+ }
+ else if ([keyPath isEqualToString:@"self.filters.useDecomb"])
+ {
+ if (self.filters.useDecomb)
+ {
+ [fDecombBox setHidden:NO];
+ [fDeinterlaceBox setHidden:YES];
+ }
+ else
+ {
+ [fDecombBox setHidden:YES];
+ [fDeinterlaceBox setHidden:NO];
+ }
+ }
+ else if ([keyPath isEqualToString:@"self.filters.deblock"])
+ {
+ // The minimum deblock value is 5,
+ // set it to 0 if the value is
+ // less than 4.
+ if (self.filters.deblock == 4)
+ {
+ [fDeblockField setStringValue: @"Off"];
+ self.filters.deblock = 0;
+ }
+ else if (self.filters.deblock > 4)
+ {
+ [fDeblockField setStringValue:[NSString stringWithFormat: @"%.0ld", (long)self.filters.deblock]];
+ }
+ }
+ else if ([keyPath isEqualToString:@"self.filters.denoise"] || [keyPath isEqualToString:@"self.filters.denoisePreset"])
+ {
+ [self validateDenoiseUI];
+ }
+ }
+ else
+ {
+ [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
+ }
+}
+
+/**
+ * Validates the denoise UI items,
+ * disables/enables the right ones.
+ */
+- (void)validateDenoiseUI
+{
+ if ([self.filters.denoise isEqualToString:@"off"])
+ {
+ NSArray *uiElements = @[fDenoisePreset, fDenoisePresetPopUp,
+ fDenoiseTuneLabel, fDenoiseTunePopUp,
+ fDenoiseCustomLabel, fDenoiseCustomField];
+ for (NSView *view in uiElements)
+ [view setHidden:YES];
+ }
+ else
+ {
+ NSArray *uiElements = @[fDenoisePreset, fDenoisePresetPopUp];
+ for (NSView *view in uiElements)
+ [view setHidden:NO];
+
+ if ([self.filters.denoisePreset isEqualToString:@"none"])
+ {
+ [fDenoiseTuneLabel setHidden:YES];
+ [fDenoiseTunePopUp setHidden:YES];
+ [fDenoiseCustomLabel setHidden:NO];
+ [fDenoiseCustomField setHidden:NO];
+ }
+ else if ([self.filters.denoise isEqualToString:@"hqdn3d"])
+ {
+ [fDenoiseTuneLabel setHidden:YES];
+ [fDenoiseTunePopUp setHidden:YES];
+ [fDenoiseCustomLabel setHidden:YES];
+ [fDenoiseCustomField setHidden:YES];
+ }
+ else
+ {
+ [fDenoiseTuneLabel setHidden:NO];
+ [fDenoiseTunePopUp setHidden:NO];
+ [fDenoiseCustomLabel setHidden:YES];
+ [fDenoiseCustomField setHidden:YES];
+ }
+ }
+}
+
+#pragma mark -
+#pragma mark Interface Resize
+
+/**
+ * This method is used to detect clicking on a tab in fSizeFilterView
+ */
+- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
+{
+ [self resizeInspectorForTab:nil];
+}
+
+/**
+ * resizeInspectorForTab is called at launch, and each time either the
+ * Size or Filters tab is clicked. Size gives a horizontally oriented
+ * inspector and Filters is a vertically aligned inspector.
+ */
+- (void) resizeInspectorForTab: (id) sender
+{
+ NSRect frame = [[self window] frame];
+ NSSize screenSize = [[[self window] screen] frame].size;
+ NSPoint screenOrigin = [[[self window] screen] frame].origin;
+
+ /* We base our inspector size/layout on which tab is active for fSizeFilterView */
+ /* we are 1 which is Filters*/
+ if ([fSizeFilterView indexOfTabViewItem: [fSizeFilterView selectedTabViewItem]] == 1)
+ {
+ frame.size.width = 484;
+ /* we glean the height from the size of the boxes plus the extra window space
+ * needed for non boxed display
+ */
+ frame.size.height = 100.0 + [fDetelecineBox frame].size.height + [fDecombDeinterlaceBox frame].size.height;
+ /* Hide the size readout at the bottom as the vertical inspector is not wide enough */
+ }
+ else // we are Tab index 0 which is size
+ {
+ frame.size.width = 30.0 + [fPictureSizeBox frame].size.width + [fPictureCropBox frame].size.width;
+ frame.size.height = [fPictureSizeBox frame].size.height + 90;
+ /* hide the size summary field at the bottom */
+ }
+ /* get delta's for the change in window size */
+ CGFloat deltaX = frame.size.width - [[self window] frame].size.width;
+ CGFloat deltaY = frame.size.height - [[self window] frame].size.height;
+
+ /* change the inspector origin via the deltaY */
+ frame.origin.y -= deltaY;
+ /* keep the inspector centered so the tabs stay in place */
+ frame.origin.x -= deltaX / 2.0;
+
+ /* we make sure we are not horizontally off of our screen.
+ * this would be the case if we are on the vertical filter tab
+ * and we hit the size tab and the inspector grows horizontally
+ * off the screen to the right
+ */
+ if ((frame.origin.x + frame.size.width) > (screenOrigin.x + screenSize.width))
+ {
+ /* the right side of the preview is off the screen, so shift to the left */
+ frame.origin.x = (screenOrigin.x + screenSize.width) - frame.size.width;
+ }
+
+ [[self window] setFrame:frame display:YES animate:YES];
+}
+
+- (void) adjustSizingDisplay: (id) sender
+{
+ NSSize pictureSizingBoxSize = [fPictureSizeBox frame].size;
+
+ NSPoint fPictureSizeBoxOrigin = [fPictureSizeBox frame].origin;
+ NSSize pictureCropBoxSize = [fPictureCropBox frame].size;
+ NSPoint fPictureCropBoxOrigin = [fPictureCropBox frame].origin;
+
+ if ([fAnamorphicPopUp indexOfSelectedItem] == 3)
+ { // custom / power user jamboree
+ pictureSizingBoxSize.width = 350;
+ }
+ else
+ {
+ pictureSizingBoxSize.width = 200;
+ }
+
+ /* Check to see if we have changed the size from current */
+ if (pictureSizingBoxSize.height != [fPictureSizeBox frame].size.height ||
+ pictureSizingBoxSize.width != [fPictureSizeBox frame].size.width)
+ {
+ /* Get our delta for the change in picture size box height */
+ CGFloat deltaYSizeBoxShift = pictureSizingBoxSize.height -
+ [fPictureSizeBox frame].size.height;
+ fPictureSizeBoxOrigin.y -= deltaYSizeBoxShift;
+ /* Get our delta for the change in picture size box width */
+ CGFloat deltaXSizeBoxShift = pictureSizingBoxSize.width -
+ [fPictureSizeBox frame].size.width;
+ //fPictureSizeBoxOrigin.x += deltaXSizeBoxShift;
+ /* set our new Picture size box size */
+ [fPictureSizeBox setFrameSize:pictureSizingBoxSize];
+ [fPictureSizeBox setFrameOrigin:fPictureSizeBoxOrigin];
+
+ pictureCropBoxSize.height += deltaYSizeBoxShift;
+ fPictureCropBoxOrigin.y -= deltaYSizeBoxShift;
+ fPictureCropBoxOrigin.x += deltaXSizeBoxShift;
+
+ [fPictureCropBox setFrameSize:pictureCropBoxSize];
+ [[fPictureCropBox animator] setFrameOrigin:fPictureCropBoxOrigin];
+ }
+
+ /* now we call to resize the entire inspector window */
+ [self resizeInspectorForTab:nil];
+}
+
+#pragma mark -
+
+/**
+ * Displays and brings the picture window to the front
+ */
+- (void)showPictureWindow
+{
+ if ([[self window] isVisible])
+ {
+ [[self window] close];
+ }
+ else
+ {
+ [self showWindow:self];
+ [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"PictureSizeWindowIsOpen"];
+ }
+
+ [self resizeInspectorForTab:nil];
+ [self adjustSizingDisplay:nil];
+}
+
+- (IBAction) showPreviewWindow: (id) sender
+{
+ [self.delegate showPreviewWindow:sender];
+}
+
+- (void) windowWillClose: (NSNotification *)aNotification
+{
+ [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"PictureSizeWindowIsOpen"];
+}
+
+@end