diff options
author | ritsuka <[email protected]> | 2015-01-22 10:30:26 +0000 |
---|---|---|
committer | ritsuka <[email protected]> | 2015-01-22 10:30:26 +0000 |
commit | dfa1f8dd4bbaed3fba144a5afead99a1ea102c44 (patch) | |
tree | 9a487f570a21d91cd6d8beeb7ada67e5b99002e8 /macosx | |
parent | 1784a808ebe642b54bff0d06abc147226d0287fe (diff) |
MacGui: move the application delegate to its own class. Removed the "Open Source (Title Specific)" menu item, now integrated in the standard open panel.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6784 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'macosx')
-rw-r--r-- | macosx/Controller.h | 64 | ||||
-rw-r--r-- | macosx/Controller.m | 1414 | ||||
-rw-r--r-- | macosx/English.lproj/MainMenu.xib | 830 | ||||
-rw-r--r-- | macosx/English.lproj/MainWindow.xib | 724 | ||||
-rw-r--r-- | macosx/English.lproj/Preferences.xib | 11 | ||||
-rw-r--r-- | macosx/HBAppDelegate.h | 14 | ||||
-rw-r--r-- | macosx/HBAppDelegate.m | 482 | ||||
-rw-r--r-- | macosx/HBQueueController.h | 4 | ||||
-rw-r--r-- | macosx/HBQueueController.mm | 44 | ||||
-rw-r--r-- | macosx/HandBrake.xcodeproj/project.pbxproj | 18 | ||||
-rw-r--r-- | macosx/main.mm | 21 |
11 files changed, 1800 insertions, 1826 deletions
diff --git a/macosx/Controller.h b/macosx/Controller.h index 49074f322..83a47e434 100644 --- a/macosx/Controller.h +++ b/macosx/Controller.h @@ -18,15 +18,13 @@ @class HBPreviewController; @class HBPreferencesController; -@class HBOutputPanelController; @class HBPresetsViewController; @class HBPresetsManager; @class HBJob; -@interface HBController : NSObject <NSApplicationDelegate, NSDrawerDelegate> +@interface HBController : NSWindowController <NSDrawerDelegate> { - IBOutlet NSWindow *fWindow; IBOutlet NSTabView *fMainTabView; // Video view controller @@ -49,17 +47,6 @@ HBAdvancedController * fAdvancedOptions; IBOutlet NSTabViewItem * fAdvancedTab; - // Main Menu Outlets - NSMenuItem * fOpenSourceTitleMMenu; - - // Source Title Scan Outlets - IBOutlet NSPanel * fScanSrcTitlePanel; - IBOutlet NSTextField * fScanSrcTitlePathField; - IBOutlet NSTextField * fSrcDsplyNameTitleScan; - IBOutlet NSTextField * fScanSrcTitleNumField; - IBOutlet NSButton * fScanSrcTitleCancelButton; - IBOutlet NSButton * fScanSrcTitleOpenButton; - // Picture Settings HBPictureController * fPictureController; // Picture Preview @@ -68,9 +55,6 @@ // Queue panel HBQueueController * fQueueController; - - // Output panel - HBOutputPanelController * outputPanel; // Source box IBOutlet NSProgressIndicator * fScanIndicator; @@ -94,33 +78,23 @@ IBOutlet NSTextField * fQueueStatus; IBOutlet NSProgressIndicator * fRipIndicator; BOOL fRipIndicatorShown; - + // User Preset HBPresetsManager * presetManager; HBPresetsViewController * fPresetsView; - IBOutlet NSMenu * presetsMenu; IBOutlet NSDrawer * fPresetDrawer; } -@property (nonatomic, readonly) NSWindow *window; +- (instancetype)initWithQueue:(HBQueueController *)queueController presetsManager:(HBPresetsManager *)manager; -- (IBAction) browseSources: (id) sender; -- (IBAction) showSourceTitleScanPanel: (id) sender; -- (IBAction) closeSourceTitleScanPanel: (id) sender; -- (void) performScan:(NSURL *)scanURL scanTitleNum:(NSInteger)scanTitleNum; +- (void)launchAction; +- (void)openFile:(NSURL *)fileURL; -- (IBAction) titlePopUpChanged: (id) sender; -- (IBAction) chapterPopUpChanged: (id) sender; +- (IBAction)browseSources:(id)sender; -- (IBAction) autoSetM4vExtension: (id) sender; - -- (IBAction) browseFile: (id) sender; - -- (IBAction) showPicturePanel: (id) sender; -- (IBAction) showPreviewWindow: (id) sender; -- (void)pictureSettingsDidChange; -- (IBAction) openMainWindow: (id) sender; +- (IBAction)showPicturePanel:(id)sender; +- (IBAction)showPreviewWindow:(id)sender; // Queue - (IBAction)addToQueue:(id)sender; @@ -130,26 +104,18 @@ - (void)setQueueState:(NSString *)info; - (void)setQueueInfo:(NSString *)info progress:(double)progress hidden:(BOOL)hidden; -- (IBAction)showQueueWindow:(id)sender; - -- (IBAction)showPreferencesWindow:(id)sender; - - (IBAction)rip:(id)sender; - (IBAction)pause:(id)sender; -- (IBAction) openHomepage: (id) sender; -- (IBAction) openForums: (id) sender; -- (IBAction) openUserGuide: (id) sender; +// Preset Methods +// Export / Import Presets +- (IBAction)browseExportPresetFile:(id)sender; +- (IBAction)browseImportPresetFile:(id)sender; -// Preset Methods Here -/* Export / Import Presets */ -- (IBAction) browseExportPresetFile: (id) sender; -- (IBAction) browseImportPresetFile: (id) sender; +- (IBAction)selectPresetFromMenu:(id)sender; -/* Manage User presets */ -- (IBAction) showAddPresetPanel: (id) sender; +// Manage User presets +- (IBAction)showAddPresetPanel:(id)sender; - (IBAction)selectDefaultPreset:(id)sender; -- (IBAction)addFactoryPresets:(id)sender; -- (IBAction)showDebugOutputPanel:(id)sender; @end diff --git a/macosx/Controller.m b/macosx/Controller.m index 0f729eb57..bed4b5280 100644 --- a/macosx/Controller.m +++ b/macosx/Controller.m @@ -9,7 +9,6 @@ #import "HBQueueController.h" #import "HBOutputPanelController.h" -#import "HBPreferencesController.h" #import "HBPresetsManager.h" #import "HBPreset.h" #import "HBUtilities.h" @@ -31,6 +30,14 @@ @interface HBController () <HBPresetsViewControllerDelegate, HBPreviewControllerDelegate, HBPictureControllerDelegate> +@property (assign) IBOutlet NSView *openTitleView; +@property (nonatomic, readwrite) BOOL scanSpecificTitle; +@property (nonatomic, readwrite) NSInteger scanSpecificTitleIdx; + +/** + * The name of the source, it might differ from the source + * last path component if it's a package or a folder. + */ @property (nonatomic, copy) NSString *browsedSourceDisplayName; /// The current job. @@ -52,45 +59,28 @@ @implementation HBController -- (instancetype)init +- (instancetype)initWithQueue:(HBQueueController *)queueController presetsManager:(HBPresetsManager *)manager; { - self = [super init]; + self = [super initWithWindowNibName:@"MainWindow"]; if (self) { - // Register the defaults preferences - [HBPreferencesController registerUserDefaults]; - - // Inits the controllers - outputPanel = [[HBOutputPanelController alloc] init]; - fPictureController = [[HBPictureController alloc] init]; - fPreviewController = [[HBPreviewController alloc] initWithDelegate:self]; - fQueueController = [[HBQueueController alloc] init]; - fQueueController.controller = self; - fQueueController.outputPanel = outputPanel; - - // we init the HBPresetsManager - NSURL *presetsURL = [NSURL fileURLWithPath:[[HBUtilities appSupportPath] stringByAppendingPathComponent:@"UserPresets.plist"]]; - presetManager = [[HBPresetsManager alloc] initWithURL:presetsURL]; - _selectedPreset = [presetManager.defaultPreset retain]; - - // Lets report the HandBrake version number here to the activity log and text log file - NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary]; - NSString *versionStringFull = [NSString stringWithFormat:@"Handbrake Version: %@ (%@)", infoDict[@"CFBundleShortVersionString"], infoDict[@"CFBundleVersion"]]; - [HBUtilities writeToActivityLog: "%s", versionStringFull.UTF8String]; - - // Optionally use dvd nav - [HBCore setDVDNav:[[[NSUserDefaults standardUserDefaults] objectForKey:@"UseDvdNav"] boolValue]]; - // Init libhb int loggingLevel = [[[NSUserDefaults standardUserDefaults] objectForKey:@"LoggingLevel"] intValue]; _core = [[HBCore alloc] initWithLoggingLevel:loggingLevel]; _core.name = @"ScanCore"; + // Inits the controllers + fPictureController = [[HBPictureController alloc] init]; [fPictureController setDelegate:self]; + + fPreviewController = [[HBPreviewController alloc] initWithDelegate:self]; [fPreviewController setCore:self.core]; - // Set the Growl Delegate - [GrowlApplicationBridge setGrowlDelegate:fQueueController]; + fQueueController = queueController; + fQueueController.controller = self; + + presetManager = manager; + _selectedPreset = [presetManager.defaultPreset retain]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(autoSetM4vExtension:) name:HBMixdownChangedNotification object:nil]; } @@ -98,319 +88,27 @@ return self; } -- (void) applicationDidFinishLaunching: (NSNotification *) notification -{ - [self enableUI:NO]; - - // Checks for presets updates - [self checkBuiltInsForUpdates]; - - // Show/Hide the Presets drawer upon launch based - // on user preference DefaultPresetsDrawerShow - if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HBDefaultPresetsDrawerShow"]) - { - [fPresetDrawer open:self]; - } - - // Get the number of HandBrake instances currently running - NSUInteger hbInstanceNum = [NSRunningApplication runningApplicationsWithBundleIdentifier:[[NSBundle mainBundle] bundleIdentifier]].count; - - // If we are a single instance it is safe to clean up the previews if there are any - // left over. This is a bit of a kludge but will prevent a build up of old instance - // live preview cruft. No danger of removing an active preview directory since they - // are created later in HBPreviewController if they don't exist at the moment a live - // preview encode is initiated. - if (hbInstanceNum == 1) - { - NSString *previewDirectory = [[HBUtilities appSupportPath] stringByAppendingPathComponent:@"Previews"]; - NSError *error = nil; - NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:previewDirectory error:&error]; - for (NSString *file in files) - { - BOOL result = [[NSFileManager defaultManager] removeItemAtPath:[previewDirectory stringByAppendingPathComponent:file] error:&error]; - if (result == NO && error) - { - [HBUtilities writeToActivityLog: "Could not remove existing preview at : %s", file.UTF8String]; - } - } - } - - // Open debug output window now if it was visible when HB was closed - if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OutputPanelIsOpen"]) - [self showDebugOutputPanel:nil]; - - // Open queue window now if it was visible when HB was closed - if ([[NSUserDefaults standardUserDefaults] boolForKey:@"QueueWindowIsOpen"]) - [self showQueueWindow:nil]; - - [self openMainWindow:nil]; - - // Now we re-check the queue array to see if there are - // any remaining encodes to be done in it and ask the - // user if they want to reload the queue */ - if (fQueueController.count) - { - // On Screen Notification - // We check to see if there is already another instance of hb running. - // Note: hbInstances == 1 means we are the only instance of HandBrake.app - NSAlert *alert = nil; - if (hbInstanceNum > 1) - { - alert = [[NSAlert alloc] init]; - [alert setMessageText:NSLocalizedString(@"There is already an instance of HandBrake running.", @"")]; - [alert setInformativeText:NSLocalizedString(@"HandBrake will now load up the existing queue.", nil)]; - [alert addButtonWithTitle:NSLocalizedString(@"Reload Queue", nil)]; - } - else - { - if (fQueueController.workingItemsCount > 0 || fQueueController.pendingItemsCount > 0) - { - NSString *alertTitle; - - if (fQueueController.workingItemsCount > 0) - { - alertTitle = [NSString stringWithFormat: - NSLocalizedString(@"HandBrake Has Detected %d Previously Encoding Item(s) and %d Pending Item(s) In Your Queue.", @""), - fQueueController.workingItemsCount, fQueueController.pendingItemsCount]; - } - else - { - alertTitle = [NSString stringWithFormat: - NSLocalizedString(@"HandBrake Has Detected %d Pending Item(s) In Your Queue.", @""), - fQueueController.pendingItemsCount]; - } - - alert = [[NSAlert alloc] init]; - [alert setMessageText:alertTitle]; - [alert setInformativeText:NSLocalizedString(@"Do you want to reload them ?", nil)]; - [alert addButtonWithTitle:NSLocalizedString(@"Reload Queue", nil)]; - [alert addButtonWithTitle:NSLocalizedString(@"Empty Queue", nil)]; - [alert setAlertStyle:NSCriticalAlertStyle]; - } - else - { - // Since we addressed any pending or previously encoding items above, we go ahead and make sure - // the queue is empty of any finished items or cancelled items. - [fQueueController removeAllJobs]; - - if (self.core.state != HBStateScanning && !self.job) - { - // We show whichever open source window specified in LaunchSourceBehavior preference key - if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"LaunchSourceBehavior"] isEqualToString: @"Open Source"]) - { - [self browseSources:nil]; - } - - if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"LaunchSourceBehavior"] isEqualToString: @"Open Source (Title Specific)"]) - { - [self browseSources:(id)fOpenSourceTitleMMenu]; - } - } - } - } - - if (alert) - { - NSModalResponse response = [alert runModal]; - - if (response == NSAlertSecondButtonReturn) - { - [HBUtilities writeToActivityLog: "didDimissReloadQueue NSAlertSecondButtonReturn Chosen"]; - [fQueueController removeAllJobs]; - - // We show whichever open source window specified in LaunchSourceBehavior preference key - if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"LaunchSourceBehavior"] isEqualToString: @"Open Source"]) - { - [self browseSources:nil]; - } - - if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"LaunchSourceBehavior"] isEqualToString: @"Open Source (Title Specific)"]) - { - [self browseSources:(id)fOpenSourceTitleMMenu]; - } - } - else - { - [HBUtilities writeToActivityLog: "didDimissReloadQueue NSAlertFirstButtonReturn Chosen"]; - if (hbInstanceNum == 1) - { - [fQueueController setEncodingJobsAsPending]; - } - - [self showQueueWindow:nil]; - } - - [alert release]; - } - } - else - { - if (self.core.state != HBStateScanning && !self.job) - { - // We show whichever open source window specified in LaunchSourceBehavior preference key - if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"LaunchSourceBehavior"] isEqualToString: @"Open Source"]) - { - [self browseSources:nil]; - } - - if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"LaunchSourceBehavior"] isEqualToString: @"Open Source (Title Specific)"]) - { - [self browseSources:(id)fOpenSourceTitleMMenu]; - } - } - } -} - -- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames -{ - [self openFile:[NSURL fileURLWithPath:filenames.firstObject]]; - [NSApp replyToOpenOrPrint:NSApplicationDelegateReplySuccess]; -} - -- (void)openFile:(NSURL *)fileURL +- (void)dealloc { - if (self.core.state != HBStateScanning) - { - self.browsedSourceDisplayName = fileURL.lastPathComponent; - [self performScan:fileURL scanTitleNum:0]; - } -} - -- (void)setJob:(HBJob *)job -{ - // Set the jobs info to the view controllers - fPictureController.picture = job.picture; - fPictureController.filters = job.filters; - fPreviewController.job = job; - - fVideoController.job = job; - fAudioController.audio = job.audio; - fSubtitlesViewController.subtitles = job.subtitles; - fChapterTitlesController.job = job; - - if (job) - { - [[NSNotificationCenter defaultCenter] removeObserver:_job]; - [[NSNotificationCenter defaultCenter] removeObserver:_job.picture]; - [[NSNotificationCenter defaultCenter] removeObserver:_job.filters]; - [[NSNotificationCenter defaultCenter] removeObserver:_job.video]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pictureSettingsDidChange) name:HBPictureChangedNotification object:job.picture]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pictureSettingsDidChange) name:HBFiltersChangedNotification object:job.filters]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(formatChanged:) name:HBContainerChangedNotification object:job]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customSettingUsed) name:HBVideoChangedNotification object:job.video]; - } - - // Retain the new job - [_job autorelease]; - _job = [job retain]; - - [self enableUI:(job != nil)]; -} - -#pragma mark - -#pragma mark Drag & drop handling - -// This method is used by OSX to know what kind of files can be drag & drop on the NSWindow -// We only want filenames (and so folders too) -- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender -{ - NSPasteboard *pboard = [sender draggingPasteboard]; - - if ([[pboard types] containsObject:NSFilenamesPboardType]) - { - NSArray *paths = [pboard propertyListForType:NSFilenamesPboardType]; - return paths.count == 1 ? NSDragOperationGeneric : NSDragOperationNone; - } - - return NSDragOperationNone; -} - -// This method is doing the job after the drag & drop operation has been validated by [self draggingEntered] and OSX -- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender -{ - NSPasteboard *pboard = [sender draggingPasteboard]; - - if ([pboard.types containsObject:NSFilenamesPboardType]) - { - NSArray *paths = [pboard propertyListForType:NSFilenamesPboardType]; - [self openFile:[NSURL fileURLWithPath:paths.firstObject]]; - } - - return YES; -} - -#pragma mark - - -- (NSApplicationTerminateReply) applicationShouldTerminate: (NSApplication *) app -{ - if (fQueueController.core.state != HBStateIdle) - { - NSAlert *alert = [[NSAlert alloc] init]; - [alert setMessageText:NSLocalizedString(@"Are you sure you want to quit HandBrake?", nil)]; - [alert setInformativeText:NSLocalizedString(@"If you quit HandBrake your current encode will be reloaded into your queue at next launch. Do you want to quit anyway?", nil)]; - [alert addButtonWithTitle:NSLocalizedString(@"Quit", nil)]; - [alert addButtonWithTitle:NSLocalizedString(@"Don't Quit", nil)]; - [alert setAlertStyle:NSCriticalAlertStyle]; - - NSInteger result = [alert runModal]; - [alert release]; - - if (result == NSAlertFirstButtonReturn) - { - return NSTerminateNow; - } - else - { - return NSTerminateCancel; - } - } - - // Warn if items still in the queue - else if (fQueueController.pendingItemsCount > 0) - { - NSAlert *alert = [[NSAlert alloc] init]; - [alert setMessageText:NSLocalizedString(@"Are you sure you want to quit HandBrake?", nil)]; - [alert setInformativeText:NSLocalizedString(@"There are pending encodes in your queue. Do you want to quit anyway?",nil)]; - [alert addButtonWithTitle:NSLocalizedString(@"Quit", nil)]; - [alert addButtonWithTitle:NSLocalizedString(@"Don't Quit", nil)]; - [alert setAlertStyle:NSCriticalAlertStyle]; - NSInteger result = [alert runModal]; - [alert release]; - if (result == NSAlertFirstButtonReturn) - { - return NSTerminateNow; - } - else - { - return NSTerminateCancel; - } - } - - return NSTerminateNow; -} - -- (void)applicationWillTerminate:(NSNotification *)aNotification -{ - [presetManager savePresets]; - [presetManager release]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [outputPanel release]; - [fQueueController release]; - [fQueueController release]; [fPreviewController release]; [fPictureController release]; - self.core = nil; - self.browsedSourceDisplayName = nil; + [_browsedSourceDisplayName release]; + [_job release]; + [_jobFromQueue release]; + [_selectedPreset release]; + [_labelColor release]; + [_core release]; - [HBCore closeGlobal]; + [super dealloc]; } -- (void) awakeFromNib -{ +- (void)windowDidLoad +{ + [self enableUI:NO]; + /* For 64 bit builds, the threaded animation in the progress * indicators conflicts with the animation in the advanced tab * for reasons not completely clear. jbrjake found a note in the @@ -421,20 +119,11 @@ * as it test out fine on both and there is no reason our progress indicators * should require their own thread. */ - - _window = fWindow; - [fScanIndicator setUsesThreadedAnimation:NO]; [fRipIndicator setUsesThreadedAnimation:NO]; - // Presets initialization - [self buildPresetsMenu]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(buildPresetsMenu) name:HBPresetsChangedNotification object:nil]; - - [fPresetDrawer setDelegate:self]; NSSize drawerSize = NSSizeFromString([[NSUserDefaults standardUserDefaults] - stringForKey:@"HBDrawerSize"]); + stringForKey:@"HBDrawerSize"]); if (drawerSize.width) { [fPresetDrawer setContentSize: drawerSize]; @@ -449,7 +138,7 @@ [fSrcTimeStartEncodingField setFrameOrigin:startPoint]; [fSrcTimeEndEncodingField setFrameOrigin:endPoint]; - + [fSrcFrameStartEncodingField setFrameOrigin:startPoint]; [fSrcFrameEndEncodingField setFrameOrigin:endPoint]; @@ -457,7 +146,7 @@ [fStatusField setStringValue:@""]; // Register HBController's Window as a receiver for files/folders drag & drop operations - [fWindow registerForDraggedTypes:@[NSFilenamesPboardType]]; + [self.window registerForDraggedTypes:@[NSFilenamesPboardType]]; // Set up the preset drawer fPresetsView = [[HBPresetsViewController alloc] initWithPresetManager:presetManager]; @@ -471,28 +160,63 @@ // setup the subtitles view fSubtitlesViewController = [[HBSubtitlesController alloc] init]; - [fSubtitlesTab setView:[fSubtitlesViewController view]]; + [fSubtitlesTab setView:[fSubtitlesViewController view]]; - // setup the audio controller + // setup the audio controller fAudioController = [[HBAudioController alloc] init]; - [fAudioTab setView:[fAudioController view]]; + [fAudioTab setView:[fAudioController view]]; // setup the advanced view controller fAdvancedOptions = [[HBAdvancedController alloc] init]; - [fAdvancedTab setView:[fAdvancedOptions view]]; + [fAdvancedTab setView:[fAdvancedOptions view]]; // setup the video view controller fVideoController = [[HBVideoController alloc] initWithAdvancedController:fAdvancedOptions]; - [fVideoTab setView:[fVideoController view]]; + [fVideoTab setView:[fVideoController view]]; [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.HBShowAdvancedTab" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:NULL]; + + [self.window recalculateKeyViewLoop]; +} + +#pragma mark - +#pragma mark Drag & drop handling + +/** This method is used by OSX to know what kind of files can be drag & drop on the NSWindow + * We only want filenames (and so folders too) + */ +- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender +{ + NSPasteboard *pboard = [sender draggingPasteboard]; + + if ([[pboard types] containsObject:NSFilenamesPboardType]) + { + NSArray *paths = [pboard propertyListForType:NSFilenamesPboardType]; + return paths.count == 1 ? NSDragOperationGeneric : NSDragOperationNone; + } + + return NSDragOperationNone; +} + +// This method is doing the job after the drag & drop operation has been validated by [self draggingEntered] and OSX +- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender +{ + NSPasteboard *pboard = [sender draggingPasteboard]; + + if ([pboard.types containsObject:NSFilenamesPboardType]) + { + NSArray *paths = [pboard propertyListForType:NSFilenamesPboardType]; + [self openFile:[NSURL fileURLWithPath:paths.firstObject]]; + } - [fWindow recalculateKeyViewLoop]; + return YES; } +#pragma mark - KVO + - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (context == NULL) @@ -534,10 +258,14 @@ fPresetsView.enabled = enabled; } -#pragma mark - -#pragma mark Toolbar +- (NSSize)drawerWillResizeContents:(NSDrawer *) drawer toSize:(NSSize)contentSize { + [[NSUserDefaults standardUserDefaults] setObject:NSStringFromSize(contentSize) forKey:@"HBDrawerSize"]; + return contentSize; +} -- (BOOL) validateToolbarItem: (NSToolbarItem *) toolbarItem +#pragma mark - UI Validation + +- (BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem { SEL action = toolbarItem.action; @@ -617,89 +345,73 @@ if (self.job) { - if (action == @selector(showPicturePanel:)) - return YES; - if (action == @selector(showPreviewWindow:)) - return YES; - if (action == @selector(addToQueue:)) + if (action == @selector(showPicturePanel:) || + action == @selector(showPreviewWindow:) || + action == @selector(addToQueue:)) + { return YES; + } } else { - if (action == @selector(showPicturePanel:)) - return NO; - if (action == @selector(showPreviewWindow:)) - return NO; - if (action == @selector(addToQueue:)) + if (action == @selector(showPicturePanel:) || + action == @selector(showPreviewWindow:) || + action == @selector(addToQueue:)) + { return NO; + } } // If there are any pending queue items, make sure the start/stop button is active. if (action == @selector(rip:) && (fQueueController.pendingItemsCount > 0 || self.job)) + { return YES; - if (action == @selector(showQueueWindow:)) - return YES; - if (action == @selector(toggleDrawer:)) - return YES; - if (action == @selector(browseSources:)) - return YES; - if (action == @selector(showDebugOutputPanel:)) - return YES; + } - return NO; + return YES; } -- (BOOL) validateMenuItem: (NSMenuItem *) menuItem +- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { SEL action = [menuItem action]; - HBState queueState = fQueueController.core.state; - - if (action == @selector(addToQueue:) || action == @selector(addAllTitlesToQueue:) || action == @selector(showPicturePanel:) || action == @selector(showAddPresetPanel:)) - return self.job && [fWindow attachedSheet] == nil; + if (action == @selector(addToQueue:) || action == @selector(addAllTitlesToQueue:) || + action == @selector(showPicturePanel:) || action == @selector(showAddPresetPanel:) || + action == @selector(showPreviewWindow:)) + { + return self.job && self.window.attachedSheet == nil; + } if (action == @selector(selectDefaultPreset:)) - return [fWindow attachedSheet] == nil; - + { + return self.window.attachedSheet == nil; + } if (action == @selector(pause:)) { - if (queueState == HBStateWorking) - { - if(![[menuItem title] isEqualToString:@"Pause Encoding"]) - [menuItem setTitle:@"Pause Encoding"]; - return YES; - } - else if (queueState == HBStatePaused) - { - if(![[menuItem title] isEqualToString:@"Resume Encoding"]) - [menuItem setTitle:@"Resume Encoding"]; - return YES; - } - else - return NO; + return [fQueueController validateMenuItem:menuItem]; } if (action == @selector(rip:)) { - if (queueState == HBStateWorking || queueState == HBStateMuxing || queueState == HBStatePaused) - { - if(![[menuItem title] isEqualToString:@"Stop Encoding"]) - [menuItem setTitle:@"Stop Encoding"]; - return YES; - } - else if (self.job) + BOOL result = [fQueueController validateMenuItem:menuItem]; + + if ([menuItem.title isEqualToString:NSLocalizedString(@"Start Encoding", nil)]) { - if(![[menuItem title] isEqualToString:@"Start Encoding"]) - [menuItem setTitle:@"Start Encoding"]; - return [fWindow attachedSheet] == nil; + if (!result && self.job) + { + return YES; + } } - else - return NO; + + return result; } if (action == @selector(browseSources:)) { - if (self.core.state == HBStateScanning) + if (self.core.state == HBStateScanning) { return NO; + } else - return [fWindow attachedSheet] == nil; + { + return self.window.attachedSheet == nil; + } } if (action == @selector(selectPresetFromMenu:)) { @@ -711,13 +423,67 @@ { menuItem.state = NSOffState; } + return (self.job != nil); } return YES; } -#pragma mark - -#pragma mark Get New Source +#pragma mark - Get New Source + +- (void)launchAction +{ + if (self.core.state != HBStateScanning && !self.job) + { + // We show whichever open source window specified in LaunchSourceBehavior preference key + if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"LaunchSourceBehavior"] isEqualToString: @"Open Source"]) + { + [self browseSources:nil]; + } + } + +} + +- (void)openFile:(NSURL *)fileURL +{ + if (self.core.state != HBStateScanning) + { + self.browsedSourceDisplayName = fileURL.lastPathComponent; + [self performScan:fileURL scanTitleNum:0]; + } +} + +- (void)setJob:(HBJob *)job +{ + // Set the jobs info to the view controllers + fPictureController.picture = job.picture; + fPictureController.filters = job.filters; + fPreviewController.job = job; + + fVideoController.job = job; + fAudioController.audio = job.audio; + fSubtitlesViewController.subtitles = job.subtitles; + fChapterTitlesController.job = job; + + if (job) + { + [[NSNotificationCenter defaultCenter] removeObserver:_job]; + [[NSNotificationCenter defaultCenter] removeObserver:_job.picture]; + [[NSNotificationCenter defaultCenter] removeObserver:_job.filters]; + [[NSNotificationCenter defaultCenter] removeObserver:_job.video]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pictureSettingsDidChange) name:HBPictureChangedNotification object:job.picture]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pictureSettingsDidChange) name:HBFiltersChangedNotification object:job.filters]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(formatChanged:) name:HBContainerChangedNotification object:job]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(customSettingUsed) name:HBVideoChangedNotification object:job.video]; + } + + // Retain the new job + [_job autorelease]; + _job = [job retain]; + + [self enableUI:(job != nil)]; +} /** * Opens the source browse window, called from Open Source widgets @@ -746,150 +512,86 @@ } [panel setDirectoryURL:sourceDirectory]; - - [panel beginSheetModalForWindow:fWindow completionHandler: ^(NSInteger result) - { - if (result == NSOKButton) - { - NSURL *scanURL = panel.URL; - // we set the last searched source directory in the prefs here - [[NSUserDefaults standardUserDefaults] setURL:scanURL.URLByDeletingLastPathComponent forKey:@"HBLastSourceDirectoryURL"]; - - // we order out sheet, which is the browse window as we need to open - // the title selection sheet right away - [panel orderOut:self]; - - if (sender == fOpenSourceTitleMMenu || [[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask) - { - // We put the chosen source path in the source display text field for the - // source title selection sheet in which the user specifies the specific title to be - // scanned as well as the short source name in fSrcDsplyNameTitleScan just for display - // purposes in the title panel - - // Full Path - [fScanSrcTitlePathField setStringValue:scanURL.path]; - NSString *displayTitlescanSourceName; - - if ([scanURL.lastPathComponent isEqualToString:@"VIDEO_TS"]) - { - // If VIDEO_TS Folder is chosen, choose its parent folder for the source display name - // we have to use the title->path value so we get the proper name of the volume if a physical dvd is the source - displayTitlescanSourceName = scanURL.URLByDeletingLastPathComponent.lastPathComponent; - } - else - { - // if not the VIDEO_TS Folder, we can assume the chosen folder is the source name - displayTitlescanSourceName = scanURL.lastPathComponent; - } - // we set the source display name in the title selection dialogue - [fSrcDsplyNameTitleScan setStringValue:displayTitlescanSourceName]; - // we set the attempted scans display name for main window to displayTitlescanSourceName - self.browsedSourceDisplayName = displayTitlescanSourceName; - // We show the actual sheet where the user specifies the title to be scanned - // as we are going to do a title specific scan - - [self showSourceTitleScanPanel:nil]; - } - else - { - // We are just doing a standard full source scan, so we specify "0" to libhb - NSURL *url = panel.URL; - - // We check to see if the chosen file at path is a package - if ([[NSWorkspace sharedWorkspace] isFilePackageAtPath:url.path]) - { - [HBUtilities writeToActivityLog:"trying to open a package at: %s", url.path.UTF8String]; - // We check to see if this is an .eyetv package - if ([url.pathExtension isEqualToString:@"eyetv"]) - { - [HBUtilities writeToActivityLog:"trying to open eyetv package"]; - // We're looking at an EyeTV package - try to open its enclosed .mpg media file - self.browsedSourceDisplayName = url.URLByDeletingPathExtension.lastPathComponent; - NSString *mpgname; - NSUInteger n = [[url.path stringByAppendingString: @"/"] - completePathIntoString: &mpgname caseSensitive: YES - matchesIntoArray: nil - filterTypes: @[@"mpg"]]; - if (n > 0) - { - // Found an mpeg inside the eyetv package, make it our scan path - [HBUtilities writeToActivityLog:"found mpeg in eyetv package"]; - url = [NSURL fileURLWithPath:mpgname]; - } - else - { - // We did not find an mpeg file in our package, so we do not call performScan - [HBUtilities writeToActivityLog:"no valid mpeg in eyetv package"]; - } - } - // We check to see if this is a .dvdmedia package - else if ([url.pathExtension isEqualToString:@"dvdmedia"]) - { - // path IS a package - but dvdmedia packages can be treaded like normal directories - self.browsedSourceDisplayName = url.URLByDeletingPathExtension.lastPathComponent; - [HBUtilities writeToActivityLog:"trying to open dvdmedia package"]; - } - else - { - // The package is not an eyetv package, try to open it anyway - self.browsedSourceDisplayName = url.lastPathComponent; - [HBUtilities writeToActivityLog:"not a known to package"]; - } - } - else - { - // path is not a package, so we call perform scan directly on our file - if ([url.lastPathComponent isEqualToString:@"VIDEO_TS"]) - { - [HBUtilities writeToActivityLog:"trying to open video_ts folder (video_ts folder chosen)"]; - // If VIDEO_TS Folder is chosen, choose its parent folder for the source display name - url = url.URLByDeletingLastPathComponent; - self.browsedSourceDisplayName = url.lastPathComponent; - } - else - { - [HBUtilities writeToActivityLog:"trying to open a folder or file"]; - // if not the VIDEO_TS Folder, we can assume the chosen folder is the source name - // make sure we remove any path extension - self.browsedSourceDisplayName = url.lastPathComponent; - } - } - - [self performScan:url scanTitleNum:0]; - } - } - }]; -} - -/* Here we open the title selection sheet where we can specify an exact title to be scanned */ -- (IBAction) showSourceTitleScanPanel: (id) sender -{ - /* We default the title number to be scanned to "0" which results in a full source scan, unless the - * user changes it - */ - [fScanSrcTitleNumField setStringValue: @"0"]; - /* Show the panel */ - [NSApp beginSheet:fScanSrcTitlePanel modalForWindow:fWindow modalDelegate:nil didEndSelector:NULL contextInfo:NULL]; -} - -- (IBAction) closeSourceTitleScanPanel: (id) sender -{ - [NSApp endSheet: fScanSrcTitlePanel]; - [fScanSrcTitlePanel orderOut: self]; - - if (sender == fScanSrcTitleOpenButton) - { - // We setup the scan status in the main window to indicate a source title scan - [fSrcDVD2Field setStringValue: @"Opening a new source titleā¦"]; - [fScanIndicator setHidden: NO]; - [fScanHorizontalLine setHidden: YES]; - [fScanIndicator setIndeterminate: YES]; - [fScanIndicator startAnimation: nil]; - - // We use the performScan method to actually perform the specified scan passing the path and the title - // to be scanned - [self performScan:[NSURL fileURLWithPath:fScanSrcTitlePathField.stringValue] scanTitleNum:fScanSrcTitleNumField.intValue]; - } + [panel setAccessoryView:self.openTitleView]; + + [panel beginSheetModalForWindow:self.window completionHandler: ^(NSInteger result) + { + if (result == NSOKButton) + { + NSURL *scanURL = panel.URL; + // we set the last searched source directory in the prefs here + [[NSUserDefaults standardUserDefaults] setURL:scanURL.URLByDeletingLastPathComponent forKey:@"HBLastSourceDirectoryURL"]; + + NSURL *url = panel.URL; + + // We check to see if the chosen file at path is a package + if ([[NSWorkspace sharedWorkspace] isFilePackageAtPath:url.path]) + { + [HBUtilities writeToActivityLog:"trying to open a package at: %s", url.path.UTF8String]; + // We check to see if this is an .eyetv package + if ([url.pathExtension isEqualToString:@"eyetv"]) + { + [HBUtilities writeToActivityLog:"trying to open eyetv package"]; + // We're looking at an EyeTV package - try to open its enclosed .mpg media file + self.browsedSourceDisplayName = url.URLByDeletingPathExtension.lastPathComponent; + NSString *mpgname; + NSUInteger n = [[url.path stringByAppendingString: @"/"] + completePathIntoString: &mpgname caseSensitive: YES + matchesIntoArray: nil + filterTypes: @[@"mpg"]]; + if (n > 0) + { + // Found an mpeg inside the eyetv package, make it our scan path + [HBUtilities writeToActivityLog:"found mpeg in eyetv package"]; + url = [NSURL fileURLWithPath:mpgname]; + } + else + { + // We did not find an mpeg file in our package, so we do not call performScan + [HBUtilities writeToActivityLog:"no valid mpeg in eyetv package"]; + } + } + // We check to see if this is a .dvdmedia package + else if ([url.pathExtension isEqualToString:@"dvdmedia"]) + { + // path IS a package - but dvdmedia packages can be treaded like normal directories + self.browsedSourceDisplayName = url.URLByDeletingPathExtension.lastPathComponent; + [HBUtilities writeToActivityLog:"trying to open dvdmedia package"]; + } + else + { + // The package is not an eyetv package, try to open it anyway + self.browsedSourceDisplayName = url.lastPathComponent; + [HBUtilities writeToActivityLog:"not a known to package"]; + } + } + else + { + // path is not a package, so we call perform scan directly on our file + if ([url.lastPathComponent isEqualToString:@"VIDEO_TS"]) + { + [HBUtilities writeToActivityLog:"trying to open video_ts folder (video_ts folder chosen)"]; + // If VIDEO_TS Folder is chosen, choose its parent folder for the source display name + url = url.URLByDeletingLastPathComponent; + self.browsedSourceDisplayName = url.lastPathComponent; + } + else + { + [HBUtilities writeToActivityLog:"trying to open a folder or file"]; + // if not the VIDEO_TS Folder, we can assume the chosen folder is the source name + // make sure we remove any path extension + self.browsedSourceDisplayName = url.lastPathComponent; + } + } + + NSInteger titleIdx = 0; + if (self.scanSpecificTitle) + { + titleIdx = self.scanSpecificTitleIdx; + } + [self performScan:url scanTitleNum:titleIdx]; + } + }]; } /* Here we actually tell hb_scan to perform the source scan, using the path to source and title number*/ @@ -902,6 +604,7 @@ } self.job = nil; + [fSrcTitlePopUp removeAllItems]; NSError *outError = NULL; BOOL suppressWarning = [[NSUserDefaults standardUserDefaults] boolForKey:@"suppresslibdvdcss"]; @@ -992,7 +695,7 @@ // We display a message if a valid source was not chosen fSrcDVD2Field.stringValue = NSLocalizedString(@"No Valid Source Found", @""); } - [fWindow.toolbar validateVisibleItems]; + [self.window.toolbar validateVisibleItems]; }]; } } @@ -1009,8 +712,6 @@ [HBUtilities writeToActivityLog: "showNewScan: This is a new source item scan"]; } - [fSrcTitlePopUp removeAllItems]; - for (HBTitle *title in self.core.titles) { // Set Source Name at top of window with the browsedSourceDisplayName grokked right before -performScan @@ -1049,64 +750,187 @@ } } -#pragma mark - -#pragma mark New Output Destination +#pragma mark - GUI Controls Changed Methods -- (IBAction)browseFile:(id)sender +- (IBAction)browseDestination:(id)sender { // Open a panel to let the user choose and update the text field NSSavePanel *panel = [NSSavePanel savePanel]; panel.directoryURL = self.job.destURL.URLByDeletingLastPathComponent; panel.nameFieldStringValue = self.job.destURL.lastPathComponent; - [panel beginSheetModalForWindow:fWindow completionHandler:^(NSInteger result) { - if (result == NSFileHandlingPanelOKButton) - { - self.job.destURL = panel.URL; + [panel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) + { + if (result == NSFileHandlingPanelOKButton) + { + self.job.destURL = panel.URL; - // Save this path to the prefs so that on next browse destination window it opens there - [[NSUserDefaults standardUserDefaults] setURL:panel.URL.URLByDeletingLastPathComponent - forKey:@"HBLastDestinationDirectory"]; - } - }]; + // Save this path to the prefs so that on next browse destination window it opens there + [[NSUserDefaults standardUserDefaults] setURL:panel.URL.URLByDeletingLastPathComponent + forKey:@"HBLastDestinationDirectory"]; + } + }]; } -#pragma mark - -#pragma mark Main Window Control +- (void)updateFileName +{ + HBTitle *title = self.job.title; + + // Generate a new file name + NSString *fileName = [HBUtilities automaticNameForSource:title.name + title:title.hb_title->index + chapters:NSMakeRange(self.job.range.chapterStart + 1, self.job.range.chapterStop + 1) + quality:self.job.video.qualityType ? self.job.video.quality : 0 + bitrate:!self.job.video.qualityType ? self.job.video.avgBitrate : 0 + videoCodec:self.job.video.encoder]; + + // Swap the old one with the new one + self.job.destURL = [[self.job.destURL URLByDeletingLastPathComponent] URLByAppendingPathComponent: + [NSString stringWithFormat:@"%@.%@", fileName, self.job.destURL.pathExtension]]; +} -- (IBAction) openMainWindow: (id) sender +- (NSURL *)destURLForJob:(HBJob *)job { - [fWindow makeKeyAndOrderFront:nil]; + // Check to see if the last destination has been set,use if so, if not, use Desktop + NSURL *destURL = [[NSUserDefaults standardUserDefaults] URLForKey:@"HBLastDestinationDirectory"]; + if (!destURL || ![[NSFileManager defaultManager] fileExistsAtPath:destURL.path]) + { + destURL = [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES) firstObject] + isDirectory:YES]; + } + + destURL = [destURL URLByAppendingPathComponent:job.title.name]; + // use the correct extension based on the container + const char *ext = hb_container_get_default_extension(self.job.container); + destURL = [destURL URLByAppendingPathExtension:@(ext)]; + + return destURL; } -- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag +- (IBAction)titlePopUpChanged:(id)sender { - if( !flag ) { - [fWindow makeKeyAndOrderFront:nil]; + // If there is already a title load, save the current settings to a preset + if (self.job) + { + self.selectedPreset = [self createPresetFromCurrentSettings]; + } + + HBTitle *title = self.core.titles[fSrcTitlePopUp.indexOfSelectedItem]; + + // Check if we are reapplying a job from the queue, or creating a new one + if (self.jobFromQueue) + { + self.jobFromQueue.title = title; + self.job = self.jobFromQueue; + } + else + { + self.job = [[[HBJob alloc] initWithTitle:title andPreset:self.selectedPreset] autorelease]; + self.job.destURL = [self destURLForJob:self.job]; + + // set m4v extension if necessary - do not override user-specified .mp4 extension + if (self.job.container & HB_MUX_MASK_MP4) + { + [self autoSetM4vExtension:nil]; + } + } + + // If we are a stream type and a batch scan, grok the output file name from title->name upon title change + if ((title.hb_title->type == HB_STREAM_TYPE || title.hb_title->type == HB_FF_STREAM_TYPE) && self.core.titles.count > 1) + { + // Change the source to read out the parent folder also + fSrcDVD2Field.stringValue = [NSString stringWithFormat:@"%@/%@", self.browsedSourceDisplayName, title.name]; + } + + // apply the current preset + if (!self.jobFromQueue) + { + [self applyPreset:self.selectedPreset]; + } +} + +- (void)chapterPopUpChanged:(NSNotification *)notification +{ + // We're changing the chapter range - we may need to flip the m4v/mp4 extension + if (self.job.container & HB_MUX_MASK_MP4) + { + [self autoSetM4vExtension:notification]; + } + + // If Auto Naming is on it might need to be update if it includes the chapters range + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultAutoNaming"]) + { + [self updateFileName]; } - return YES; } -- (NSSize) drawerWillResizeContents:(NSDrawer *) drawer toSize:(NSSize) contentSize { - [[NSUserDefaults standardUserDefaults] setObject:NSStringFromSize( contentSize ) forKey:@"HBDrawerSize"]; - return contentSize; +- (void)formatChanged:(NSNotification *)notification +{ + if (self.job) + { + int videoContainer = self.job.container; + + // set the file extension + const char *ext = hb_container_get_default_extension(videoContainer); + self.job.destURL = [[self.job.destURL URLByDeletingPathExtension] URLByAppendingPathExtension:@(ext)]; + + if (videoContainer & HB_MUX_MASK_MP4) + { + [self autoSetM4vExtension:notification]; + } + } } -#pragma mark - Queue Item Editing +- (void)autoSetM4vExtension:(NSNotification *)notification +{ + if (!(self.job.container & HB_MUX_MASK_MP4)) + return; + + NSString *extension = @"mp4"; + + BOOL anyCodecAC3 = [self.job.audio anyCodecMatches:HB_ACODEC_AC3] || [self.job.audio anyCodecMatches:HB_ACODEC_AC3_PASS]; + // Chapter markers are enabled if the checkbox is ticked and we are doing p2p or we have > 1 chapter + BOOL chapterMarkers = (self.job.chaptersEnabled) && + (self.job.range.type != HBRangeTypeChapters || + self.job.range.chapterStart < self.job.range.chapterStop); + + if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"DefaultMpegExtension"] isEqualToString: @".m4v"] || + ((YES == anyCodecAC3 || YES == chapterMarkers) && + [[[NSUserDefaults standardUserDefaults] objectForKey:@"DefaultMpegExtension"] isEqualToString: @"Auto"])) + { + extension = @"m4v"; + } + + if ([extension isEqualTo:self.job.destURL.pathExtension]) + { + return; + } + else + { + self.job.destURL = [[self.job.destURL URLByDeletingPathExtension] URLByAppendingPathExtension:extension]; + } +} /** - * Rescans the chosen queue item back into the main window + * Method to determine if we should change the UI + * To reflect whether or not a Preset is being used or if + * the user is using "Custom" settings by determining the sender */ -- (void)rescanJobToMainWindow:(HBJob *)queueItem +- (void)customSettingUsed { - // Set the browsedSourceDisplayName for showNewScan - self.jobFromQueue = queueItem; - self.browsedSourceDisplayName = self.jobFromQueue.fileURL.lastPathComponent; + // Deselect the currently selected Preset if there is one + [fPresetsView deselect]; + // Change UI to show "Custom" settings are being used + self.job.presetName = NSLocalizedString(@"Custom", @""); - [self performScan:self.jobFromQueue.fileURL scanTitleNum:self.jobFromQueue.titleIdx]; + // If Auto Naming is on it might need to be update if it includes the quality token + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultAutoNaming"]) + { + [self updateFileName]; + } } -#pragma mark - Queue +#pragma mark - Queue progress - (void)setQueueState:(NSString *)info { @@ -1125,16 +949,16 @@ { if (fRipIndicatorShown) { - NSRect frame = fWindow.frame; + NSRect frame = self.window.frame; if (frame.size.width <= WINDOW_HEIGHT) frame.size.width = WINDOW_HEIGHT; frame.size.height += -WINDOW_HEIGHT_OFFSET; frame.origin.y -= -WINDOW_HEIGHT_OFFSET; - [fWindow setFrame:frame display:YES animate:YES]; + [self.window setFrame:frame display:YES animate:YES]; fRipIndicatorShown = NO; // Refresh the toolbar buttons - [fWindow.toolbar validateVisibleItems]; + [self.window.toolbar validateVisibleItems]; } } else @@ -1143,16 +967,16 @@ // that now. if (!fRipIndicatorShown) { - NSRect frame = fWindow.frame; + NSRect frame = self.window.frame; if (frame.size.width <= WINDOW_HEIGHT) frame.size.width = WINDOW_HEIGHT; frame.size.height += WINDOW_HEIGHT_OFFSET; frame.origin.y -= WINDOW_HEIGHT_OFFSET; - [fWindow setFrame:frame display:YES animate:YES]; + [self.window setFrame:frame display:YES animate:YES]; fRipIndicatorShown = YES; // Refresh the toolbar buttons - [fWindow.toolbar validateVisibleItems]; + [self.window.toolbar validateVisibleItems]; } } } @@ -1195,7 +1019,7 @@ [alert addButtonWithTitle:NSLocalizedString(@"Overwrite", @"")]; [alert setAlertStyle:NSCriticalAlertStyle]; - [alert beginSheetModalForWindow:fWindow modalDelegate:self didEndSelector:@selector(overwriteAddToQueueAlertDone:returnCode:contextInfo:) contextInfo:NULL]; + [alert beginSheetModalForWindow:self.window modalDelegate:self didEndSelector:@selector(overwriteAddToQueueAlertDone:returnCode:contextInfo:) contextInfo:NULL]; [alert release]; } else if ([fQueueController jobExistAtURL:self.job.destURL]) @@ -1208,7 +1032,7 @@ [alert addButtonWithTitle:NSLocalizedString(@"Overwrite", @"")]; [alert setAlertStyle:NSCriticalAlertStyle]; - [alert beginSheetModalForWindow:fWindow modalDelegate:self didEndSelector:@selector(overwriteAddToQueueAlertDone:returnCode:contextInfo:) contextInfo:NULL]; + [alert beginSheetModalForWindow:self.window modalDelegate:self didEndSelector:@selector(overwriteAddToQueueAlertDone:returnCode:contextInfo:) contextInfo:NULL]; [alert release]; } else @@ -1231,6 +1055,18 @@ } } +/** + * Rescans the chosen queue item back into the main window + */ +- (void)rescanJobToMainWindow:(HBJob *)queueItem +{ + // Set the browsedSourceDisplayName for showNewScan + self.jobFromQueue = queueItem; + self.browsedSourceDisplayName = self.jobFromQueue.fileURL.lastPathComponent; + + [self performScan:self.jobFromQueue.fileURL scanTitleNum:self.jobFromQueue.titleIdx]; +} + - (void)doRip { // if there are no jobs in the queue, then add this one to the queue and rip @@ -1285,7 +1121,7 @@ [alert addButtonWithTitle:NSLocalizedString(@"Overwrite", @"")]; [alert setAlertStyle:NSCriticalAlertStyle]; - [alert beginSheetModalForWindow:fWindow modalDelegate:self didEndSelector:@selector(overWriteAlertDone:returnCode:contextInfo:) contextInfo:NULL]; + [alert beginSheetModalForWindow:self.window modalDelegate:self didEndSelector:@selector(overWriteAlertDone:returnCode:contextInfo:) contextInfo:NULL]; // overWriteAlertDone: will be called when the alert is dismissed. It will call doRip. [alert release]; } @@ -1333,7 +1169,7 @@ [alert addButtonWithTitle:NSLocalizedString(@"Yes, I want to add all titles to the queue", @"")]; [alert setAlertStyle:NSCriticalAlertStyle]; - [alert beginSheetModalForWindow:fWindow modalDelegate:self didEndSelector:@selector(addAllTitlesToQueueAlertDone:returnCode:contextInfo:) contextInfo:NULL]; + [alert beginSheetModalForWindow:self.window modalDelegate:self didEndSelector:@selector(addAllTitlesToQueueAlertDone:returnCode:contextInfo:) contextInfo:NULL]; [alert release]; } @@ -1363,168 +1199,6 @@ [jobs release]; } -#pragma mark - -#pragma mark GUI Controls Changed Methods - -- (void)updateFileName -{ - HBTitle *title = self.job.title; - - // Generate a new file name - NSString *fileName = [HBUtilities automaticNameForSource:title.name - title:title.hb_title->index - chapters:NSMakeRange(self.job.range.chapterStart + 1, self.job.range.chapterStop + 1) - quality:self.job.video.qualityType ? self.job.video.quality : 0 - bitrate:!self.job.video.qualityType ? self.job.video.avgBitrate : 0 - videoCodec:self.job.video.encoder]; - - // Swap the old one with the new one - self.job.destURL = [[self.job.destURL URLByDeletingLastPathComponent] URLByAppendingPathComponent: - [NSString stringWithFormat:@"%@.%@", fileName, self.job.destURL.pathExtension]]; -} - -- (NSURL *)destURLForJob:(HBJob *)job -{ - // Check to see if the last destination has been set,use if so, if not, use Desktop - NSURL *destURL = [[NSUserDefaults standardUserDefaults] URLForKey:@"HBLastDestinationDirectory"]; - if (!destURL || ![[NSFileManager defaultManager] fileExistsAtPath:destURL.path]) - { - destURL = [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES) firstObject] - isDirectory:YES]; - } - - destURL = [destURL URLByAppendingPathComponent:job.title.name]; - // use the correct extension based on the container - const char *ext = hb_container_get_default_extension(self.job.container); - destURL = [destURL URLByAppendingPathExtension:@(ext)]; - - return destURL; -} - -- (IBAction) titlePopUpChanged: (id) sender -{ - // If there is already a title load, save the current settings to a preset - if (self.job) - { - self.selectedPreset = [self createPresetFromCurrentSettings]; - } - - HBTitle *title = self.core.titles[fSrcTitlePopUp.indexOfSelectedItem]; - - // Check if we are reapplying a job from the queue, or creating a new one - if (self.jobFromQueue) - { - self.jobFromQueue.title = title; - self.job = self.jobFromQueue; - } - else - { - self.job = [[[HBJob alloc] initWithTitle:title andPreset:self.selectedPreset] autorelease]; - self.job.destURL = [self destURLForJob:self.job]; - - // set m4v extension if necessary - do not override user-specified .mp4 extension - if (self.job.container & HB_MUX_MASK_MP4) - { - [self autoSetM4vExtension:nil]; - } - } - - // If we are a stream type and a batch scan, grok the output file name from title->name upon title change - if ((title.hb_title->type == HB_STREAM_TYPE || title.hb_title->type == HB_FF_STREAM_TYPE) && self.core.titles.count > 1) - { - // Change the source to read out the parent folder also - fSrcDVD2Field.stringValue = [NSString stringWithFormat:@"%@/%@", self.browsedSourceDisplayName, title.name]; - } - - // apply the current preset - if (!self.jobFromQueue) - { - [self applyPreset:self.selectedPreset]; - } -} - -- (void)chapterPopUpChanged:(NSNotification *)notification -{ - // We're changing the chapter range - we may need to flip the m4v/mp4 extension - if (self.job.container & HB_MUX_MASK_MP4) - { - [self autoSetM4vExtension:notification]; - } - - // If Auto Naming is on it might need to be update if it includes the chapters range - if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultAutoNaming"]) - { - [self updateFileName]; - } -} - -- (void)formatChanged:(NSNotification *)notification -{ - if (self.job) - { - int videoContainer = self.job.container; - - // set the file extension - const char *ext = hb_container_get_default_extension(videoContainer); - self.job.destURL = [[self.job.destURL URLByDeletingPathExtension] URLByAppendingPathExtension:@(ext)]; - - if (videoContainer & HB_MUX_MASK_MP4) - { - [self autoSetM4vExtension:notification]; - } - } -} - -- (void) autoSetM4vExtension:(NSNotification *)notification -{ - if (!(self.job.container & HB_MUX_MASK_MP4)) - return; - - NSString *extension = @"mp4"; - - BOOL anyCodecAC3 = [self.job.audio anyCodecMatches:HB_ACODEC_AC3] || [self.job.audio anyCodecMatches:HB_ACODEC_AC3_PASS]; - // Chapter markers are enabled if the checkbox is ticked and we are doing p2p or we have > 1 chapter - BOOL chapterMarkers = (self.job.chaptersEnabled) && - (self.job.range.type != HBRangeTypeChapters || - self.job.range.chapterStart < self.job.range.chapterStop); - - if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"DefaultMpegExtension"] isEqualToString: @".m4v"] || - ((YES == anyCodecAC3 || YES == chapterMarkers) && - [[[NSUserDefaults standardUserDefaults] objectForKey:@"DefaultMpegExtension"] isEqualToString: @"Auto"])) - { - extension = @"m4v"; - } - - if ([extension isEqualTo:self.job.destURL.pathExtension]) - { - return; - } - else - { - self.job.destURL = [[self.job.destURL URLByDeletingPathExtension] URLByAppendingPathExtension:extension]; - } -} - -/** - * Method to determine if we should change the UI - * To reflect whether or not a Preset is being used or if - * the user is using "Custom" settings by determining the sender - */ -- (void)customSettingUsed -{ - // Deselect the currently selected Preset if there is one - [fPresetsView deselect]; - // Change UI to show "Custom" settings are being used - self.job.presetName = NSLocalizedString(@"Custom", @""); - - // If Auto Naming is on it might need to be update if it includes the quality token - if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultAutoNaming"]) - { - [self updateFileName]; - } -} - -#pragma mark - #pragma mark - Picture /** @@ -1536,62 +1210,9 @@ [self customSettingUsed]; } -#pragma mark - -#pragma mark Open New Windows - -- (IBAction) openHomepage: (id) sender -{ - [[NSWorkspace sharedWorkspace] openURL: [NSURL - URLWithString:@"http://handbrake.fr/"]]; -} - -- (IBAction) openForums: (id) sender -{ - [[NSWorkspace sharedWorkspace] openURL: [NSURL - URLWithString:@"http://forum.handbrake.fr/"]]; -} -- (IBAction) openUserGuide: (id) sender -{ - [[NSWorkspace sharedWorkspace] openURL: [NSURL - URLWithString:@"http://trac.handbrake.fr/wiki/HandBrakeGuide"]]; -} - -/** - * Shows debug output window. - */ -- (IBAction)showDebugOutputPanel:(id)sender -{ - [outputPanel showOutputPanel:sender]; -} - -/** - * Shows preferences window. - */ -- (IBAction) showPreferencesWindow: (id) sender -{ - if (fPreferencesController == nil) - { - fPreferencesController = [[HBPreferencesController alloc] init]; - } - - NSWindow *window = [fPreferencesController window]; - if (![window isVisible]) - [window center]; - - [window makeKeyAndOrderFront: nil]; -} - -/** - * Shows queue window. - */ -- (IBAction) showQueueWindow:(id)sender -{ - [fQueueController showWindow:sender]; -} - -- (IBAction) toggleDrawer:(id)sender +- (IBAction)toggleDrawer:(id)sender { - if ([fPresetDrawer state] == NSDrawerClosedState) + if (fPresetDrawer.state == NSDrawerClosedState) { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HBDefaultPresetsDrawerShow"]; } @@ -1606,17 +1227,24 @@ /** * Shows Picture Settings Window. */ -- (IBAction) showPicturePanel: (id) sender +- (IBAction)showPicturePanel:(id)sender { [fPictureController showPictureWindow]; } -- (IBAction) showPreviewWindow: (id) sender +- (IBAction)showPreviewWindow:(id)sender { [fPreviewController showWindow:sender]; } -#pragma mark - Preset Methods +#pragma mark - Presets View Controller Delegate + +- (void)selectionDidChange +{ + [self applyPreset:fPresetsView.selectedPreset]; +} + +#pragma mark - Presets - (void)applyPreset:(HBPreset *)preset { @@ -1637,44 +1265,13 @@ } } -#pragma mark - Presets View Controller Delegate - -- (void)selectionDidChange -{ - [self applyPreset:fPresetsView.selectedPreset]; -} - -#pragma mark - -#pragma mark Manage Presets - -- (void) checkBuiltInsForUpdates -{ - /* if we have built in presets to update, then do so AlertBuiltInPresetUpdate*/ - if ([presetManager checkBuiltInsForUpdates]) - { - if( [[NSUserDefaults standardUserDefaults] boolForKey:@"AlertBuiltInPresetUpdate"] == YES) - { - /* Show an alert window that built in presets will be updated */ - /*On Screen Notification*/ - [NSApp requestUserAttention:NSCriticalRequest]; - NSAlert *alert = [[NSAlert alloc] init]; - [alert setMessageText:@"HandBrake has determined your built in presets are out of dateā¦"]; - [alert setInformativeText:@"HandBrake will now update your built-in presets."]; - [alert runModal]; - [alert release]; - } - /* when alert is dismissed, go ahead and update the built in presets */ - [presetManager generateBuiltInPresets]; - } -} - - (IBAction)showAddPresetPanel:(id)sender { - /* Show the add panel */ + // Show the add panel HBAddPresetController *addPresetController = [[HBAddPresetController alloc] initWithPreset:[self createPresetFromCurrentSettings] videoSize:NSMakeSize(self.job.picture.width, self.job.picture.height)]; - [NSApp beginSheet:addPresetController.window modalForWindow:fWindow modalDelegate:self didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) contextInfo:addPresetController]; + [NSApp beginSheet:addPresetController.window modalForWindow:self.window modalDelegate:self didEndSelector:@selector(sheetDidEnd:returnCode:contextInfo:) contextInfo:addPresetController]; } - (void)sheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo @@ -1722,20 +1319,20 @@ - (IBAction) browseExportPresetFile: (id) sender { - /* Open a panel to let the user choose where and how to save the export file */ + // Open a panel to let the user choose where and how to save the export file NSSavePanel *panel = [NSSavePanel savePanel]; - /* We get the current file name and path from the destination field here */ - NSString *defaultExportDirectory = [NSString stringWithFormat: @"%@/Desktop/", NSHomeDirectory()]; - [panel setDirectoryURL:[NSURL fileURLWithPath:defaultExportDirectory]]; + // We get the current file name and path from the destination field here + NSURL *defaultExportDirectory = [[NSURL fileURLWithPath:NSHomeDirectory()] URLByAppendingPathComponent:@"Desktop"]; + [panel setDirectoryURL:defaultExportDirectory]; [panel setNameFieldStringValue:@"HB_Export.plist"]; - [panel beginSheetModalForWindow:fWindow completionHandler:^(NSInteger result) { + [panel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) { if( result == NSOKButton ) { NSURL *exportPresetsFile = [panel URL]; NSURL *presetExportDirectory = [exportPresetsFile URLByDeletingLastPathComponent]; [[NSUserDefaults standardUserDefaults] setURL:presetExportDirectory forKey:@"LastPresetExportDirectoryURL"]; - /* We check for the presets.plist */ + // We check for the presets.plist if ([[NSFileManager defaultManager] fileExistsAtPath:[exportPresetsFile path]] == 0) { [[NSFileManager defaultManager] createFileAtPath:[exportPresetsFile path] contents:nil attributes:nil]; @@ -1745,7 +1342,7 @@ if (presetsToExport == nil) { presetsToExport = [[NSMutableArray alloc] init]; - /* now get and add selected presets to export */ + // now get and add selected presets to export } if (fPresetsView.selectedPreset != nil) { @@ -1758,9 +1355,7 @@ - (IBAction)browseImportPresetFile:(id)sender { - NSOpenPanel *panel; - - panel = [NSOpenPanel openPanel]; + NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setAllowsMultipleSelection:NO]; [panel setCanChooseFiles:YES]; [panel setCanChooseDirectories:NO]; @@ -1775,31 +1370,29 @@ { sourceDirectory = [[NSURL fileURLWithPath:NSHomeDirectory()] URLByAppendingPathComponent:@"Desktop"]; } - /* we open up the browse sources sheet here and call for browseSourcesDone after the sheet is closed - * to evaluate whether we want to specify a title, we pass the sender in the contextInfo variable - */ - /* set this for allowed file types, not sure if we should allow xml or not */ + + // set this for allowed file types, not sure if we should allow xml or not. [panel setDirectoryURL:sourceDirectory]; - [panel beginSheetModalForWindow:fWindow completionHandler:^(NSInteger result) + [panel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) { NSURL *importPresetsFile = [panel URL]; NSURL *importPresetsDirectory = nil;//[importPresetsFile URLByDeletingLastPathComponent]; [[NSUserDefaults standardUserDefaults] setURL:importPresetsDirectory forKey:@"LastPresetImportDirectoryURL"]; - /* NOTE: here we need to do some sanity checking to verify we do not hose up our presets file */ + // NOTE: here we need to do some sanity checking to verify we do not hose up our presets file NSMutableArray *presetsToImport = [[NSMutableArray alloc] initWithContentsOfURL:importPresetsFile]; - /* iterate though the new array of presets to import and add them to our presets array */ - for (NSMutableDictionary *tempObject in presetsToImport) + // iterate though the new array of presets to import and add them to our presets array + for (NSMutableDictionary *dict in presetsToImport) { - /* make any changes to the incoming preset we see fit */ - /* make sure the incoming preset is not tagged as default */ - [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"Default"]; - /* prepend "(imported) to the name of the incoming preset for clarification since it can be changed */ - NSString *prependedName = [@"(import) " stringByAppendingString:[tempObject objectForKey:@"PresetName"]] ; - [tempObject setObject:prependedName forKey:@"PresetName"]; - - /* actually add the new preset to our presets array */ - [presetManager addPresetFromDictionary:tempObject]; + // make any changes to the incoming preset we see fit + // make sure the incoming preset is not tagged as default + dict[@"Default"] = @0; + // prepend "(imported) to the name of the incoming preset for clarification since it can be changed + NSString *prependedName = [@"(import) " stringByAppendingString:dict[@"PresetName"]] ; + dict[@"PresetName"] = prependedName; + + // actually add the new preset to our presets array + [presetManager addPresetFromDictionary:dict]; } [presetsToImport autorelease]; }]; @@ -1828,69 +1421,4 @@ [fPresetsView setSelection:preset]; } -/** - * Adds the presets list to the menu. - */ -- (void)buildPresetsMenu -{ - // First we remove all the preset menu items - // inserted previosly - NSArray *menuItems = [presetsMenu.itemArray copy]; - for (NSMenuItem *item in menuItems) - { - if (item.tag != -1) - { - [presetsMenu removeItem:item]; - } - } - [menuItems release]; - - __block NSUInteger i = 0; - __block BOOL builtInEnded = NO; - [presetManager.root enumerateObjectsUsingBlock:^(id obj, NSIndexPath *idx, BOOL *stop) - { - if (idx.length) - { - NSMenuItem *item = [[NSMenuItem alloc] init]; - item.title = [obj name]; - item.tag = i++; - - // Set an action only to the actual presets, - // not on the folders. - if ([obj isLeaf]) - { - item.action = @selector(selectPresetFromMenu:); - item.representedObject = obj; - } - // Make the default preset font bold. - if ([obj isDefault]) - { - NSAttributedString *newTitle = [[NSAttributedString alloc] initWithString:[obj name] - attributes:@{NSFontAttributeName: [NSFont boldSystemFontOfSize:14]}]; - [item setAttributedTitle:newTitle]; - [newTitle release]; - } - // Add a separator line after the last builtIn preset - if ([obj isBuiltIn] == NO && builtInEnded == NO) - { - [presetsMenu addItem:[NSMenuItem separatorItem]]; - builtInEnded = YES; - } - - item.indentationLevel = idx.length - 1; - - [presetsMenu addItem:item]; - [item release]; - } - }]; -} - -/** - * We use this method to recreate new, updated factory presets - */ -- (IBAction)addFactoryPresets:(id)sender -{ - [presetManager generateBuiltInPresets]; -} - @end diff --git a/macosx/English.lproj/MainMenu.xib b/macosx/English.lproj/MainMenu.xib index 5675c4a56..112c27a1f 100644 --- a/macosx/English.lproj/MainMenu.xib +++ b/macosx/English.lproj/MainMenu.xib @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6724" systemVersion="14C99d" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none"> +<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6724" systemVersion="14C106a" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none"> <dependencies> <deployment version="1060" identifier="macosx"/> <development version="5100" identifier="xcode"/> @@ -8,637 +8,11 @@ <objects> <customObject id="-2" userLabel="File's Owner" customClass="NSApplication"> <connections> - <outlet property="delegate" destination="240" id="247"/> + <outlet property="delegate" destination="6lr-Yy-GMc" id="XE4-FY-xSp"/> </connections> </customObject> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> <customObject id="-3" userLabel="Application" customClass="NSObject"/> - <window title="HandBrake" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="HBMainWindow" animationBehavior="default" id="21" userLabel="MainWindow"> - <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" unifiedTitleAndToolbar="YES"/> - <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> - <rect key="contentRect" x="41" y="572" width="946" height="568"/> - <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1178"/> - <value key="minSize" type="size" width="946" height="568"/> - <value key="maxSize" type="size" width="1600" height="568"/> - <view key="contentView" id="2"> - <rect key="frame" x="0.0" y="0.0" width="946" height="568"/> - <autoresizingMask key="autoresizingMask"/> - <subviews> - <textField verticalHuggingPriority="750" id="1123"> - <rect key="frame" x="18" y="2" width="711" height="28"/> - <autoresizingMask key="autoresizingMask" flexibleMinY="YES"/> - <textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="left" id="4846"> - <font key="font" metaFont="smallSystem"/> - <string key="title">DO NOT TRANSLATE THIS NIB FILE, -</string> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <progressIndicator verticalHuggingPriority="750" maxValue="100" bezeled="NO" style="bar" id="1373"> - <rect key="frame" x="18" y="-26" width="910" height="20"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> - </progressIndicator> - <tabView controlSize="small" initialItem="1477" id="1474"> - <rect key="frame" x="13" y="27" width="920" height="357"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> - <tabViewItems> - <tabViewItem label="Video" identifier="1" id="1477"> - <view key="view" id="1478"> - <rect key="frame" x="10" y="29" width="900" height="315"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - </view> - </tabViewItem> - <tabViewItem label="Audio" identifier="2" id="1475"> - <view key="view" id="1476"> - <rect key="frame" x="10" y="25" width="900" height="319"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - </view> - </tabViewItem> - <tabViewItem label="Subtitles" identifier="3" id="5194"> - <view key="view" id="5195"> - <rect key="frame" x="10" y="25" width="900" height="319"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - </view> - </tabViewItem> - <tabViewItem label="Advanced" identifier="5" id="2015"> - <view key="view" id="2016"> - <rect key="frame" x="10" y="25" width="900" height="319"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - </view> - </tabViewItem> - <tabViewItem label="Chapters" identifier="4" id="1989"> - <view key="view" id="1990"> - <rect key="frame" x="10" y="25" width="900" height="319"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - </view> - </tabViewItem> - </tabViewItems> - </tabView> - <textField verticalHuggingPriority="750" id="1538"> - <rect key="frame" x="20" y="540" width="54" height="14"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="left" title="Source:" id="4905"> - <font key="font" metaFont="smallSystemBold"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <textField verticalHuggingPriority="750" id="1540"> - <rect key="frame" x="17" y="511" width="35" height="14"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Title:" id="4907"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="240" name="textColor" keyPath="self.labelColor" id="hQD-eK-scB"/> - </connections> - </textField> - <popUpButton verticalHuggingPriority="750" id="1541"> - <rect key="frame" x="53" y="506" width="312" height="22"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> - <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="clipping" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="1543" id="4908"> - <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="smallSystem"/> - <menu key="menu" title="OtherViews" id="1542"> - <items> - <menuItem state="on" id="1543"/> - </items> - </menu> - </popUpButtonCell> - <accessibility description="Title"/> - <connections> - <action selector="titlePopUpChanged:" target="240" id="1567"/> - <binding destination="240" name="enabled" keyPath="self.job" id="qhW-2r-Dyu"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSIsNotNil</string> - </dictionary> - </binding> - </connections> - </popUpButton> - <popUpButton verticalHuggingPriority="750" id="5513"> - <rect key="frame" x="492" y="506" width="84" height="22"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="clipping" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" id="5514"> - <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="smallSystem"/> - <menu key="menu" title="OtherViews" id="5515"/> - </popUpButtonCell> - <connections> - <binding destination="240" name="enabled" keyPath="self.job" id="0hv-wd-DYQ"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSIsNotNil</string> - </dictionary> - </binding> - <binding destination="240" name="selectedIndex" keyPath="self.job.range.type" previousBinding="nr8-sN-wpW" id="eJw-0h-DAa"/> - <binding destination="240" name="content" keyPath="self.job.range.types" id="nr8-sN-wpW"/> - </connections> - </popUpButton> - <textField verticalHuggingPriority="750" id="5180"> - <rect key="frame" x="390" y="511" width="46" height="14"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Angle:" id="5185"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="240" name="textColor" keyPath="self.labelColor" id="04p-bK-jZu"/> - <binding destination="5676" name="hidden" keyPath="values.UseDvdNav" id="GhV-lP-BWw"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSNegateBoolean</string> - </dictionary> - </binding> - </connections> - </textField> - <popUpButton verticalHuggingPriority="750" id="5181"> - <rect key="frame" x="436" y="506" width="44" height="22"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="clipping" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="5184" id="5182"> - <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="smallSystem"/> - <menu key="menu" title="OtherViews" id="5183"> - <items> - <menuItem state="on" id="5184"/> - </items> - </menu> - </popUpButtonCell> - <accessibility description="Angle"/> - <connections> - <binding destination="240" name="enabled" keyPath="self.job" id="E6D-8s-CYK"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSIsNotNil</string> - </dictionary> - </binding> - <binding destination="240" name="content" keyPath="self.job.angles" id="oFZ-d6-aeJ"/> - <binding destination="5676" name="hidden" keyPath="values.UseDvdNav" previousBinding="E6D-8s-CYK" id="U04-3Y-Z7d"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSNegateBoolean</string> - </dictionary> - </binding> - </connections> - </popUpButton> - <textField verticalHuggingPriority="750" id="1552"> - <rect key="frame" x="5" y="454" width="47" height="17"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="File:" id="4913"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="240" name="textColor" keyPath="self.labelColor" id="qTW-e6-NIe"/> - </connections> - </textField> - <textField verticalHuggingPriority="750" id="1553"> - <rect key="frame" x="764" y="511" width="65" height="14"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Duration:" id="4914"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="240" name="hidden" keyPath="self.job" id="1z1-WP-lXF"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSIsNil</string> - </dictionary> - </binding> - </connections> - </textField> - <textField verticalHuggingPriority="750" id="1554"> - <rect key="frame" x="829" y="511" width="99" height="14"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="00:00:00" id="4915"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" red="0.76630436999999996" green="0.0" blue="0.0" alpha="0.0" colorSpace="calibratedRGB"/> - </textFieldCell> - <connections> - <binding destination="240" name="hidden" keyPath="self.job" id="Xf7-IA-bzp"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSIsNil</string> - </dictionary> - </binding> - <binding destination="240" name="value" keyPath="self.job.range.duration" id="D3F-S5-u15"/> - </connections> - </textField> - <textField verticalHuggingPriority="750" id="1555"> - <rect key="frame" x="20" y="486" width="70" height="14"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="left" title="Destination" id="4916"> - <font key="font" metaFont="smallSystemBold"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <popUpButton verticalHuggingPriority="750" id="1557"> - <rect key="frame" x="76" y="398" width="177" height="22"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="clipping" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="1559" id="4918"> - <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="smallSystem"/> - <menu key="menu" title="OtherViews" id="1558"> - <items> - <menuItem state="on" id="1559"/> - </items> - </menu> - </popUpButtonCell> - <accessibility description="Format"/> - <connections> - <binding destination="240" name="enabled" keyPath="self.job" id="rkV-UW-k5X"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSIsNotNil</string> - </dictionary> - </binding> - <binding destination="240" name="selectedValue" keyPath="self.job.container" previousBinding="7Po-AA-KsM" id="brh-Ek-It1"> - <dictionary key="options"> - <string key="NSValueTransformerName">HBContainerTransformer</string> - </dictionary> - </binding> - <binding destination="240" name="content" keyPath="self.job.containers" id="7Po-AA-KsM"/> - </connections> - </popUpButton> - <button verticalHuggingPriority="750" id="1562"> - <rect key="frame" x="841" y="450" width="90" height="28"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <buttonCell key="cell" type="push" title="Browseā¦" bezelStyle="rounded" alignment="center" controlSize="small" borderStyle="border" inset="2" id="4920"> - <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="smallSystem"/> - </buttonCell> - <connections> - <action selector="browseFile:" target="240" id="1579"/> - <binding destination="240" name="enabled" keyPath="self.job" id="MHg-yi-1ag"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSIsNotNil</string> - </dictionary> - </binding> - </connections> - </button> - <box verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="1623"> - <rect key="frame" x="98" y="490" width="828" height="5"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> - <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/> - <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> - <font key="titleFont" metaFont="system"/> - </box> - <textField verticalHuggingPriority="750" id="1539"> - <rect key="frame" x="70" y="540" width="310" height="14.000000042040593"/> - <autoresizingMask key="autoresizingMask" flexibleMinY="YES" heightSizable="YES"/> - <textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" alignment="left" id="4906"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/> - </textFieldCell> - </textField> - <textField verticalHuggingPriority="750" id="1561"> - <rect key="frame" x="56" y="455" width="782" height="19"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" continuous="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="left" drawsBackground="YES" id="4919"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="240" name="enabled" keyPath="self.job" id="13e-O9-Pfx"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSIsNotNil</string> - </dictionary> - </binding> - <binding destination="240" name="value" keyPath="self.job.destURL" id="Vmi-3b-LD5"> - <dictionary key="options"> - <bool key="NSContinuouslyUpdatesValue" value="YES"/> - <string key="NSValueTransformerName">HBURLTransformer</string> - </dictionary> - </binding> - </connections> - </textField> - <textField hidden="YES" verticalHuggingPriority="750" id="5491"> - <rect key="frame" x="581" y="492" width="54" height="19"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="5492"> - <numberFormatter key="formatter" formatterBehavior="default10_4" usesGroupingSeparator="NO" minimumIntegerDigits="0" maximumIntegerDigits="42" id="Fdv-uE-tUA"> - <real key="minimum" value="0.0"/> - </numberFormatter> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="240" name="hidden" keyPath="self.job.range.secondsSelected" id="VlL-Hz-ZR5"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSNegateBoolean</string> - </dictionary> - </binding> - <binding destination="240" name="value" keyPath="self.job.range.secondsStart" id="oC5-nl-aJ3"> - <dictionary key="options"> - <bool key="NSContinuouslyUpdatesValue" value="YES"/> - <bool key="NSValidatesImmediately" value="YES"/> - </dictionary> - </binding> - </connections> - </textField> - <textField hidden="YES" verticalHuggingPriority="750" id="5521"> - <rect key="frame" x="638" y="492" width="54" height="19"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="5522"> - <numberFormatter key="formatter" formatterBehavior="default10_4" usesGroupingSeparator="NO" minimumIntegerDigits="0" maximumIntegerDigits="42" id="Wpt-92-R1O"> - <real key="minimum" value="0.0"/> - </numberFormatter> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="240" name="hidden" keyPath="self.job.range.framesSelected" id="nnF-AN-v4Q"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSNegateBoolean</string> - </dictionary> - </binding> - <binding destination="240" name="value" keyPath="self.job.range.frameStart" id="xEY-Wf-hxo"> - <dictionary key="options"> - <bool key="NSContinuouslyUpdatesValue" value="YES"/> - <bool key="NSValidatesImmediately" value="YES"/> - </dictionary> - </binding> - </connections> - </textField> - <textField hidden="YES" verticalHuggingPriority="750" id="5493"> - <rect key="frame" x="696" y="492" width="54" height="19"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="left" drawsBackground="YES" id="5494"> - <numberFormatter key="formatter" formatterBehavior="default10_4" usesGroupingSeparator="NO" minimumIntegerDigits="0" maximumIntegerDigits="42" id="tD5-HN-B7h"> - <real key="minimum" value="0.0"/> - </numberFormatter> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="240" name="hidden" keyPath="self.job.range.secondsSelected" id="Qmg-D1-0rm"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSNegateBoolean</string> - </dictionary> - </binding> - <binding destination="240" name="value" keyPath="self.job.range.secondsStop" id="yhq-KM-3Fs"> - <dictionary key="options"> - <bool key="NSContinuouslyUpdatesValue" value="YES"/> - <bool key="NSValidatesImmediately" value="YES"/> - </dictionary> - </binding> - </connections> - </textField> - <textField hidden="YES" verticalHuggingPriority="750" id="5523"> - <rect key="frame" x="758" y="492" width="54" height="19"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="left" drawsBackground="YES" id="5524"> - <numberFormatter key="formatter" formatterBehavior="default10_4" usesGroupingSeparator="NO" minimumIntegerDigits="0" maximumIntegerDigits="42" id="WrK-kN-ZN0"> - <real key="minimum" value="0.0"/> - </numberFormatter> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="240" name="hidden" keyPath="self.job.range.framesSelected" id="P5u-F3-Qyx"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSNegateBoolean</string> - </dictionary> - </binding> - <binding destination="240" name="value" keyPath="self.job.range.frameStop" id="JVa-Qr-2DQ"> - <dictionary key="options"> - <bool key="NSContinuouslyUpdatesValue" value="YES"/> - <bool key="NSValidatesImmediately" value="YES"/> - </dictionary> - </binding> - </connections> - </textField> - <textField verticalHuggingPriority="750" id="1627"> - <rect key="frame" x="20" y="430" width="97" height="14"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="left" title="Output Settings:" id="4923"> - <font key="font" metaFont="smallSystemBold"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <box verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="1628"> - <rect key="frame" x="292" y="434" width="634" height="5"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> - <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/> - <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> - <font key="titleFont" metaFont="system"/> - </box> - <textField verticalHuggingPriority="750" id="1882"> - <rect key="frame" x="121" y="430" width="165" height="14"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" sendsActionOnEndEditing="YES" id="4924"> - <font key="font" metaFont="smallSystemBold"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="240" name="value" keyPath="self.job.presetName" id="R4b-YQ-IeI"/> - </connections> - </textField> - <textField verticalHuggingPriority="750" id="2006"> - <rect key="frame" x="711" y="15" width="218" height="14"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="right" id="4925"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <textField verticalHuggingPriority="750" id="1556"> - <rect key="frame" x="21" y="403" width="53" height="14"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Format:" id="4917"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="240" name="textColor" keyPath="self.labelColor" id="Esr-ae-0fm"/> - </connections> - </textField> - <box verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="3205"> - <rect key="frame" x="386" y="543" width="540" height="5"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/> - <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> - <font key="titleFont" metaFont="system"/> - </box> - <progressIndicator hidden="YES" verticalHuggingPriority="750" maxValue="100" bezeled="NO" controlSize="small" style="bar" id="3203"> - <rect key="frame" x="386" y="542.0000000420406" width="541" height="12"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - </progressIndicator> - <button toolTip="This rearranges the header of the MP4 file to optimize it for streaming across the web." id="4579"> - <rect key="frame" x="269" y="401" width="102" height="18"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <buttonCell key="cell" type="check" title="Web optimized" bezelStyle="regularSquare" imagePosition="left" alignment="left" controlSize="small" inset="2" id="4927"> - <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> - <font key="font" metaFont="smallSystem"/> - </buttonCell> - <connections> - <binding destination="240" name="value" keyPath="self.job.mp4HttpOptimize" id="b1e-md-dT3"/> - <binding destination="240" name="hidden" keyPath="self.job.mp4OptionsEnabled" id="D27-Mk-6hO"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSNegateBoolean</string> - </dictionary> - </binding> - </connections> - </button> - <button toolTip="This option adds an atom to the MP4 file which allows older iPods (5th Generation classic style) to play the file." id="4967"> - <rect key="frame" x="388" y="401" width="108" height="18"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <buttonCell key="cell" type="check" title="iPod 5G support" bezelStyle="regularSquare" imagePosition="left" alignment="left" controlSize="small" inset="2" id="4968"> - <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> - <font key="font" metaFont="smallSystem"/> - </buttonCell> - <connections> - <binding destination="240" name="value" keyPath="self.job.mp4iPodCompatible" id="GWA-QG-Bfu"/> - <binding destination="240" name="hidden" keyPath="self.job.mp4iPodCompatibleEnabled" id="eGS-R2-zSV"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSNegateBoolean</string> - </dictionary> - </binding> - </connections> - </button> - <textField verticalHuggingPriority="750" id="5505"> - <rect key="frame" x="637" y="510" width="56" height="15"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="through" id="5506"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <connections> - <binding destination="240" name="hidden" keyPath="self.job" id="6TJ-gX-20A"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSIsNil</string> - </dictionary> - </binding> - </connections> - </textField> - <popUpButton verticalHuggingPriority="750" id="1545"> - <rect key="frame" x="578" y="506" width="60" height="22"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="clipping" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="1547" id="4910"> - <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="smallSystem"/> - <menu key="menu" title="OtherViews" id="1546"> - <items> - <menuItem state="on" id="1547"/> - </items> - </menu> - </popUpButtonCell> - <accessibility description="Start Chapter"/> - <connections> - <binding destination="240" name="selectedIndex" keyPath="self.job.range.chapterStart" previousBinding="6kP-TS-bEc" id="U76-2W-TvD"/> - <binding destination="240" name="content" keyPath="self.job.range.chapters" id="6kP-TS-bEc"/> - <binding destination="240" name="hidden" keyPath="self.job.range.chaptersSelected" id="fix-9c-5P3"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSNegateBoolean</string> - </dictionary> - </binding> - </connections> - </popUpButton> - <popUpButton verticalHuggingPriority="750" id="1548"> - <rect key="frame" x="693" y="506" width="60" height="22"/> - <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> - <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="clipping" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="1550" id="4911"> - <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="smallSystem"/> - <menu key="menu" title="OtherViews" id="1549"> - <items> - <menuItem state="on" id="1550"/> - </items> - </menu> - </popUpButtonCell> - <accessibility description="End Chapter"/> - <connections> - <binding destination="240" name="selectedIndex" keyPath="self.job.range.chapterStop" previousBinding="Yqp-Sg-lBf" id="4k2-Sm-RoJ"/> - <binding destination="240" name="content" keyPath="self.job.range.chapters" id="Yqp-Sg-lBf"/> - <binding destination="240" name="hidden" keyPath="self.job.range.chaptersSelected" id="PxP-LY-ZXR"> - <dictionary key="options"> - <string key="NSValueTransformerName">NSNegateBoolean</string> - </dictionary> - </binding> - </connections> - </popUpButton> - </subviews> - </view> - <toolbar key="toolbar" implicitIdentifier="E92CA47A-01F7-432A-A61C-28FE4D58C2CD" autosavesConfiguration="NO" displayMode="iconAndLabel" sizeMode="regular" id="7g3-gy-bUl"> - <allowedToolbarItems> - <toolbarItem implicitItemIdentifier="NSToolbarSpaceItem" id="ZEH-cS-zXY"/> - <toolbarItem implicitItemIdentifier="NSToolbarFlexibleSpaceItem" id="wjB-Tl-5qq"/> - <toolbarItem implicitItemIdentifier="B3BAB305-77BF-4967-B8E6-D11F40EF822B" label="Source" paletteLabel="Source" toolTip="Choose Video Source" tag="-1" image="source" id="8r8-nZ-dYs"> - <connections> - <action selector="browseSources:" target="240" id="LD2-b1-vqJ"/> - </connections> - </toolbarItem> - <toolbarItem implicitItemIdentifier="4CAB4280-DF01-4BDC-B23B-98BD6E6190F4" label="Start" paletteLabel="Start Encoding" toolTip="Start Encoding" tag="-1" image="encode" id="byg-kj-sEM"> - <connections> - <action selector="rip:" target="240" id="0Db-56-2aY"/> - </connections> - </toolbarItem> - <toolbarItem implicitItemIdentifier="E4C5E251-DD8D-4288-AC80-AF8E654B7A32" label="Pause" paletteLabel="Pause Encoding" toolTip="Pause Encoding" tag="-1" image="pauseencode" id="wTQ-KF-5KW"> - <connections> - <action selector="pause:" target="240" id="OjT-ck-YX1"/> - </connections> - </toolbarItem> - <toolbarItem implicitItemIdentifier="69E83092-D0D1-48A5-BF46-99EFB3EC630A" label="Add To Queue" paletteLabel="Add To Queue" tag="-1" image="addqueue" id="DZZ-Fe-wjw"> - <connections> - <action selector="addToQueue:" target="240" id="3oq-nG-Sdo"/> - </connections> - </toolbarItem> - <toolbarItem implicitItemIdentifier="6EFCA879-A80D-45D7-A846-EAD85261F864" label="Show Queue" paletteLabel="Show Queue" tag="-1" image="showqueue" id="HCx-ku-nF7"> - <connections> - <action selector="showQueueWindow:" target="240" id="Rur-8T-VEx"/> - </connections> - </toolbarItem> - <toolbarItem implicitItemIdentifier="CBA63584-4A4E-43E5-8096-9C20B59AC580" label="Picture Settings" paletteLabel="Show Picture Settings" toolTip="Show Picture Settings" tag="-1" image="picturesettings" id="2uP-T2-02Q"> - <connections> - <action selector="showPicturePanel:" target="240" id="tlM-Jx-yzk"/> - </connections> - </toolbarItem> - <toolbarItem implicitItemIdentifier="DAAC2346-2B39-4A35-A62B-C12826F6AB42" label="Preview Window" paletteLabel="Show Preview Window" toolTip="Show Preview Window" tag="-1" image="preview" id="dK4-jt-v4K"> - <connections> - <action selector="showPreviewWindow:" target="240" id="C49-TV-CDw"/> - </connections> - </toolbarItem> - <toolbarItem implicitItemIdentifier="D9753B5B-F09B-451E-9FD8-E8DD979FBFA2" label="Activity Window" paletteLabel="Show Activity Window" toolTip="Show Activity Window" tag="-1" image="activity" id="p7Q-L3-zcW"> - <connections> - <action selector="showDebugOutputPanel:" target="240" id="TTZ-YA-vgx"/> - </connections> - </toolbarItem> - <toolbarItem implicitItemIdentifier="B774D9D7-AE89-4C1A-8685-D631473867F6" label="Toggle Presets" paletteLabel="Toggle Presets" toolTip="Open/Close Preset Drawer" tag="-1" image="presets" id="9ll-Jg-YAB"> - <connections> - <action selector="toggleDrawer:" target="240" id="gY0-Xe-pxb"/> - </connections> - </toolbarItem> - </allowedToolbarItems> - <defaultToolbarItems> - <toolbarItem reference="8r8-nZ-dYs"/> - <toolbarItem reference="byg-kj-sEM"/> - <toolbarItem reference="wTQ-KF-5KW"/> - <toolbarItem reference="DZZ-Fe-wjw"/> - <toolbarItem reference="HCx-ku-nF7"/> - <toolbarItem reference="wjB-Tl-5qq"/> - <toolbarItem reference="2uP-T2-02Q"/> - <toolbarItem reference="dK4-jt-v4K"/> - <toolbarItem reference="p7Q-L3-zcW"/> - <toolbarItem reference="9ll-Jg-YAB"/> - </defaultToolbarItems> - </toolbar> - <connections> - <outlet property="delegate" destination="240" id="433"/> - </connections> - <point key="canvasLocation" x="842" y="531"/> - </window> <menu title="MainMenu" systemMenu="main" id="29" userLabel="MainMenu"> <items> <menuItem title="HandBrake" id="56"> @@ -660,7 +34,7 @@ </menuItem> <menuItem title="Preferencesā¦" keyEquivalent="," id="1445"> <connections> - <action selector="showPreferencesWindow:" target="240" id="2517"/> + <action selector="showPreferencesWindow:" target="6lr-Yy-GMc" id="ORc-bQ-Pdo"/> </connections> </menuItem> <menuItem isSeparatorItem="YES" id="bDt-OE-wyf"> @@ -704,12 +78,7 @@ <items> <menuItem title="Open Sourceā¦" keyEquivalent="o" id="1198"> <connections> - <action selector="browseSources:" target="240" id="2718"/> - </connections> - </menuItem> - <menuItem title="Open Source (Title Specific)ā¦" id="2698"> - <connections> - <action selector="browseSources:" target="240" id="2717"/> + <action selector="browseSources:" target="-1" id="9Ko-Me-Xae"/> </connections> </menuItem> <menuItem isSeparatorItem="YES" id="2507"> @@ -725,12 +94,12 @@ </menuItem> <menuItem title="Add To Queue" keyEquivalent="b" id="2443"> <connections> - <action selector="addToQueue:" target="240" id="2447"/> + <action selector="addToQueue:" target="-1" id="9mH-2S-tBG"/> </connections> </menuItem> <menuItem title="Add All Titles To Queueā¦" keyEquivalent="B" id="5897"> <connections> - <action selector="addAllTitlesToQueue:" target="240" id="5899"/> + <action selector="addAllTitlesToQueue:" target="-1" id="EyT-yw-TMf"/> </connections> </menuItem> <menuItem isSeparatorItem="YES" id="Kee-pg-bfk"> @@ -738,12 +107,12 @@ </menuItem> <menuItem title="Start Encoding" keyEquivalent="s" id="2444"> <connections> - <action selector="rip:" target="240" id="kGM-Ym-khx"/> + <action selector="rip:" target="-1" id="gca-l6-qac"/> </connections> </menuItem> <menuItem title="Pause Encoding" keyEquivalent="p" id="2494"> <connections> - <action selector="pause:" target="240" id="RAM-7s-91U"/> + <action selector="pause:" target="-1" id="tq4-oz-OV9"/> </connections> </menuItem> </items> @@ -875,7 +244,7 @@ <items> <menuItem title="New Presetā¦" tag="-1" keyEquivalent="n" id="1955"> <connections> - <action selector="showAddPresetPanel:" target="-1" id="iWH-6U-rv2"/> + <action selector="showAddPresetPanel:" target="-1" id="83j-3C-fCg"/> </connections> </menuItem> <menuItem title="New Folder" tag="-1" keyEquivalent="N" id="wvb-60-cWL"> @@ -888,7 +257,7 @@ </menuItem> <menuItem title="Select Default Preset" tag="-1" id="2421"> <connections> - <action selector="selectDefaultPreset:" target="240" id="2422"/> + <action selector="selectDefaultPreset:" target="-1" id="2eH-zk-T3n"/> </connections> </menuItem> <menuItem isSeparatorItem="YES" tag="-1" id="CQW-qW-5C5"> @@ -897,18 +266,18 @@ <menuItem title="Importā¦" tag="-1" id="5192"> <modifierMask key="keyEquivalentModifierMask"/> <connections> - <action selector="browseImportPresetFile:" target="240" id="5193"/> + <action selector="browseImportPresetFile:" target="-1" id="keX-1B-XYZ"/> </connections> </menuItem> <menuItem title="Exportā¦" tag="-1" id="5188"> <modifierMask key="keyEquivalentModifierMask"/> <connections> - <action selector="browseExportPresetFile:" target="240" id="5191"/> + <action selector="browseExportPresetFile:" target="-1" id="kJa-oi-hY2"/> </connections> </menuItem> <menuItem title="Update Built-in Presets" tag="-1" id="1950"> <connections> - <action selector="addFactoryPresets:" target="240" id="1952"/> + <action selector="addFactoryPresets:" target="6lr-Yy-GMc" id="5Ga-rb-ORy"/> </connections> </menuItem> <menuItem isSeparatorItem="YES" tag="-1" id="wgI-bc-Ors"> @@ -935,12 +304,12 @@ </menuItem> <menuItem title="HandBrake" keyEquivalent="1" id="2368"> <connections> - <action selector="openMainWindow:" target="240" id="2369"/> + <action selector="showMainWindow:" target="6lr-Yy-GMc" id="jt4-Bl-0zq"/> </connections> </menuItem> <menuItem title="Queue" keyEquivalent="2" id="2445"> <connections> - <action selector="showQueueWindow:" target="240" id="2446"/> + <action selector="showQueueWindow:" target="6lr-Yy-GMc" id="WFe-Tm-3XP"/> </connections> </menuItem> <menuItem isSeparatorItem="YES" id="2519"> @@ -948,23 +317,23 @@ </menuItem> <menuItem title="Presets Drawer" keyEquivalent="t" id="1884"> <connections> - <action selector="toggleDrawer:" target="240" id="5Yh-Cm-6ea"/> + <action selector="toggleDrawer:" target="-1" id="pVD-TD-4r1"/> </connections> </menuItem> <menuItem title="Picture Settings" keyEquivalent="P" id="2488"> <connections> - <action selector="showPicturePanel:" target="240" id="2493"/> + <action selector="showPicturePanel:" target="-1" id="e5F-sb-9Jt"/> </connections> </menuItem> <menuItem title="Preview Window" id="5157"> <modifierMask key="keyEquivalentModifierMask"/> <connections> - <action selector="showPreviewWindow:" target="240" id="5158"/> + <action selector="showPreviewWindow:" target="-1" id="b7R-uV-KeA"/> </connections> </menuItem> <menuItem title="Activity Window" keyEquivalent="D" id="2295"> <connections> - <action selector="showDebugOutputPanel:" target="240" id="2296"/> + <action selector="showOutputPanel:" target="6lr-Yy-GMc" id="mEr-6M-u1q"/> </connections> </menuItem> </items> @@ -975,17 +344,17 @@ <items> <menuItem title="HandBrake User Guide" keyEquivalent="?" id="1985"> <connections> - <action selector="openUserGuide:" target="240" id="1986"/> + <action selector="openUserGuide:" target="6lr-Yy-GMc" id="Fda-3E-7Ya"/> </connections> </menuItem> <menuItem title="HandBrake Homepage" id="1432"> <connections> - <action selector="openHomepage:" target="240" id="1434"/> + <action selector="openHomepage:" target="6lr-Yy-GMc" id="KTB-6B-jIe"/> </connections> </menuItem> <menuItem title="HandBrake Forums" id="1433"> <connections> - <action selector="openForums:" target="240" id="1435"/> + <action selector="openForums:" target="6lr-Yy-GMc" id="k9C-68-hJt"/> </connections> </menuItem> </items> @@ -993,161 +362,12 @@ </menuItem> </items> </menu> - <drawer trailingOffset="15" id="1841" userLabel="PresetsDrawer"> - <size key="contentSize" width="240" height="550"/> - <size key="minContentSize" width="100" height="50"/> - <size key="maxContentSize" width="280" height="550"/> - <connections> - <outlet property="parentWindow" destination="21" id="1842"/> - </connections> - </drawer> - <window title="SourceTitlePanel" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="2701" userLabel="SourceTitlePanel" customClass="NSPanel"> - <windowStyleMask key="styleMask" titled="YES"/> - <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> - <rect key="contentRect" x="302" y="989" width="392" height="144"/> - <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1178"/> - <value key="minSize" type="size" width="213" height="107"/> - <view key="contentView" id="2702"> - <rect key="frame" x="0.0" y="0.0" width="392" height="144"/> - <autoresizingMask key="autoresizingMask"/> - <subviews> - <textField verticalHuggingPriority="750" id="2703"> - <rect key="frame" x="96" y="45" width="279" height="38"/> - <autoresizingMask key="autoresizingMask"/> - <textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Source Path Here" id="4945"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <textField verticalHuggingPriority="750" id="2704"> - <rect key="frame" x="155" y="106" width="26" height="14"/> - <autoresizingMask key="autoresizingMask"/> - <textFieldCell key="cell" sendsActionOnEndEditing="YES" title="for" id="4946"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <textField verticalHuggingPriority="750" id="2705"> - <rect key="frame" x="17" y="106" width="104" height="15"/> - <autoresizingMask key="autoresizingMask"/> - <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Scan title number" id="4947"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <textField verticalHuggingPriority="750" id="2706"> - <rect key="frame" x="126" y="105" width="24" height="19"/> - <autoresizingMask key="autoresizingMask"/> - <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="center" title="0" drawsBackground="YES" id="4948"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <button verticalHuggingPriority="750" id="2708"> - <rect key="frame" x="290" y="13" width="87" height="28"/> - <autoresizingMask key="autoresizingMask"/> - <buttonCell key="cell" type="push" title="Open Title" bezelStyle="rounded" alignment="center" controlSize="small" borderStyle="border" inset="2" id="4950"> - <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="smallSystem"/> - <string key="keyEquivalent" base64-UTF8="YES"> -DQ -</string> - </buttonCell> - <connections> - <action selector="closeSourceTitleScanPanel:" target="240" id="2715"/> - </connections> - </button> - <textField verticalHuggingPriority="750" id="2716"> - <rect key="frame" x="17" y="83" width="455" height="19"/> - <autoresizingMask key="autoresizingMask"/> - <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Note: (entering 0 or leaving blank will result in a full source scan)" id="4951"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <textField verticalHuggingPriority="750" id="2719"> - <rect key="frame" x="17" y="69" width="77" height="14"/> - <autoresizingMask key="autoresizingMask"/> - <textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Source Path:" id="4952"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <textField verticalHuggingPriority="750" id="2720"> - <rect key="frame" x="177" y="106" width="198" height="14"/> - <autoresizingMask key="autoresizingMask"/> - <textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Small System Font Text" id="4953"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - <button verticalHuggingPriority="750" id="2707"> - <rect key="frame" x="212" y="13" width="80" height="28"/> - <autoresizingMask key="autoresizingMask"/> - <buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" controlSize="small" borderStyle="border" inset="2" id="4949"> - <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> - <font key="font" metaFont="smallSystem"/> - </buttonCell> - <connections> - <action selector="closeSourceTitleScanPanel:" target="240" id="2714"/> - </connections> - </button> - </subviews> - </view> - <point key="canvasLocation" x="515" y="271"/> - </window> - <customObject id="240" userLabel="HBController" customClass="HBController"> + <customObject id="4963" customClass="SUUpdater"/> + <customObject id="6lr-Yy-GMc" customClass="HBAppDelegate"> <connections> - <outlet property="fAdvancedTab" destination="2015" id="4eO-Lg-7cH"/> - <outlet property="fAudioTab" destination="1475" id="AuZ-Uf-bla"/> - <outlet property="fChaptersTitlesTab" destination="1989" id="oUt-8L-Ag2"/> - <outlet property="fMainTabView" destination="1474" id="XMU-Vi-8QM"/> - <outlet property="fOpenSourceTitleMMenu" destination="2698" id="2700"/> - <outlet property="fPresetDrawer" destination="1841" id="1889"/> - <outlet property="fQueueStatus" destination="2006" id="2007"/> - <outlet property="fRipIndicator" destination="1373" id="1374"/> - <outlet property="fScanHorizontalLine" destination="3205" id="6004"/> - <outlet property="fScanIndicator" destination="3203" id="3204"/> - <outlet property="fScanSrcTitleCancelButton" destination="2707" id="2711"/> - <outlet property="fScanSrcTitleNumField" destination="2706" id="2710"/> - <outlet property="fScanSrcTitleOpenButton" destination="2708" id="2712"/> - <outlet property="fScanSrcTitlePanel" destination="2701" id="2713"/> - <outlet property="fScanSrcTitlePathField" destination="2703" id="2709"/> - <outlet property="fSrcChapterEndPopUp" destination="1548" id="1569"/> - <outlet property="fSrcChapterStartPopUp" destination="1545" id="1568"/> - <outlet property="fSrcDVD2Field" destination="1539" id="1591"/> - <outlet property="fSrcDsplyNameTitleScan" destination="2720" id="2721"/> - <outlet property="fSrcFrameEndEncodingField" destination="5523" id="5526"/> - <outlet property="fSrcFrameStartEncodingField" destination="5521" id="5525"/> - <outlet property="fSrcTimeEndEncodingField" destination="5493" id="5508"/> - <outlet property="fSrcTimeStartEncodingField" destination="5491" id="5507"/> - <outlet property="fSrcTitlePopUp" destination="1541" id="1593"/> - <outlet property="fStatusField" destination="1123" id="1238"/> - <outlet property="fSubtitlesTab" destination="5194" id="d9b-rJ-XrS"/> - <outlet property="fVideoTab" destination="1477" id="6o2-cM-yy4"/> - <outlet property="fWindow" destination="21" id="350"/> - <outlet property="presetsMenu" destination="1949" id="bkm-2h-uFI"/> + <outlet property="presetsMenu" destination="1949" id="7YL-mr-2tO"/> </connections> </customObject> - <customObject id="4963" customClass="SUUpdater"/> <userDefaultsController representsSharedInstance="YES" id="5676"/> </objects> - <resources> - <image name="activity" width="24" height="24"/> - <image name="addqueue" width="12" height="12"/> - <image name="encode" width="24" height="24"/> - <image name="pauseencode" width="24" height="24"/> - <image name="picturesettings" width="24" height="24"/> - <image name="presets" width="24" height="24"/> - <image name="preview" width="24" height="24"/> - <image name="showqueue" width="24" height="24"/> - <image name="source" width="24" height="24"/> - </resources> </document> diff --git a/macosx/English.lproj/MainWindow.xib b/macosx/English.lproj/MainWindow.xib new file mode 100644 index 000000000..1ecae028c --- /dev/null +++ b/macosx/English.lproj/MainWindow.xib @@ -0,0 +1,724 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6724" systemVersion="14C106a" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none"> + <dependencies> + <deployment version="1060" identifier="macosx"/> + <development version="5100" identifier="xcode"/> + <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6724"/> + </dependencies> + <objects> + <customObject id="-2" userLabel="File's Owner" customClass="HBController"> + <connections> + <outlet property="fAdvancedTab" destination="2015" id="8FF-6a-xSj"/> + <outlet property="fAudioTab" destination="1475" id="AJX-Da-Tfc"/> + <outlet property="fChaptersTitlesTab" destination="1989" id="df9-TK-GBD"/> + <outlet property="fMainTabView" destination="1474" id="sl5-BZ-ymC"/> + <outlet property="fPresetDrawer" destination="1841" id="LDc-Da-rl7"/> + <outlet property="fQueueStatus" destination="2006" id="o5x-Kd-lxv"/> + <outlet property="fRipIndicator" destination="1373" id="an5-ng-etT"/> + <outlet property="fScanHorizontalLine" destination="3205" id="W26-Wu-2YJ"/> + <outlet property="fScanIndicator" destination="3203" id="cG1-SY-gbt"/> + <outlet property="fSrcChapterEndPopUp" destination="1548" id="9V3-lu-BqX"/> + <outlet property="fSrcChapterStartPopUp" destination="1545" id="ZQk-wM-0mL"/> + <outlet property="fSrcDVD2Field" destination="1539" id="pxg-Wl-Mn7"/> + <outlet property="fSrcFrameEndEncodingField" destination="5523" id="0lZ-7S-OEo"/> + <outlet property="fSrcFrameStartEncodingField" destination="5521" id="iCh-Jo-pXi"/> + <outlet property="fSrcTimeEndEncodingField" destination="5493" id="QN5-jU-eed"/> + <outlet property="fSrcTimeStartEncodingField" destination="5491" id="2ln-oU-tgH"/> + <outlet property="fSrcTitlePopUp" destination="1541" id="glh-1k-i69"/> + <outlet property="fStatusField" destination="1123" id="mPD-cg-5dk"/> + <outlet property="fSubtitlesTab" destination="5194" id="PF0-qx-Iu4"/> + <outlet property="fVideoTab" destination="1477" id="hFY-kK-afW"/> + <outlet property="openTitleView" destination="lZQ-gl-3wX" id="Wh6-fB-pWi"/> + <outlet property="window" destination="21" id="qib-ZH-aNm"/> + </connections> + </customObject> + <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> + <customObject id="-3" userLabel="Application" customClass="NSObject"/> + <window title="HandBrake" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="HBMainWindow" animationBehavior="default" id="21" userLabel="MainWindow"> + <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" unifiedTitleAndToolbar="YES"/> + <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> + <rect key="contentRect" x="41" y="572" width="946" height="568"/> + <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1178"/> + <value key="minSize" type="size" width="946" height="568"/> + <value key="maxSize" type="size" width="1600" height="568"/> + <view key="contentView" id="2"> + <rect key="frame" x="0.0" y="0.0" width="946" height="568"/> + <autoresizingMask key="autoresizingMask"/> + <subviews> + <textField verticalHuggingPriority="750" id="1123"> + <rect key="frame" x="18" y="2" width="711" height="28"/> + <autoresizingMask key="autoresizingMask" flexibleMinY="YES"/> + <textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="left" id="4846"> + <font key="font" metaFont="smallSystem"/> + <string key="title">DO NOT TRANSLATE THIS NIB FILE, +</string> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + </textField> + <progressIndicator verticalHuggingPriority="750" maxValue="100" bezeled="NO" style="bar" id="1373"> + <rect key="frame" x="18" y="-26" width="910" height="20"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> + </progressIndicator> + <tabView controlSize="small" initialItem="1477" id="1474"> + <rect key="frame" x="13" y="27" width="920" height="357"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> + <tabViewItems> + <tabViewItem label="Video" identifier="1" id="1477"> + <view key="view" id="1478"> + <rect key="frame" x="10" y="29" width="900" height="315"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + </view> + </tabViewItem> + <tabViewItem label="Audio" identifier="2" id="1475"> + <view key="view" id="1476"> + <rect key="frame" x="10" y="25" width="900" height="319"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + </view> + </tabViewItem> + <tabViewItem label="Subtitles" identifier="3" id="5194"> + <view key="view" id="5195"> + <rect key="frame" x="10" y="25" width="900" height="319"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + </view> + </tabViewItem> + <tabViewItem label="Advanced" identifier="5" id="2015"> + <view key="view" id="2016"> + <rect key="frame" x="10" y="25" width="900" height="319"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + </view> + </tabViewItem> + <tabViewItem label="Chapters" identifier="4" id="1989"> + <view key="view" id="1990"> + <rect key="frame" x="10" y="25" width="900" height="319"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + </view> + </tabViewItem> + </tabViewItems> + </tabView> + <textField verticalHuggingPriority="750" id="1538"> + <rect key="frame" x="20" y="540" width="54" height="14"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="left" title="Source:" id="4905"> + <font key="font" metaFont="smallSystemBold"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + </textField> + <textField verticalHuggingPriority="750" id="1540"> + <rect key="frame" x="17" y="511" width="35" height="14"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Title:" id="4907"> + <font key="font" metaFont="smallSystem"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <binding destination="-2" name="textColor" keyPath="self.labelColor" id="cpH-Kt-lRM"/> + </connections> + </textField> + <popUpButton verticalHuggingPriority="750" id="1541"> + <rect key="frame" x="53" y="506" width="312" height="22"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> + <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="clipping" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="1543" id="4908"> + <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> + <font key="font" metaFont="smallSystem"/> + <menu key="menu" title="OtherViews" id="1542"> + <items> + <menuItem state="on" id="1543"/> + </items> + </menu> + </popUpButtonCell> + <accessibility description="Title"/> + <connections> + <action selector="titlePopUpChanged:" target="-2" id="kSs-y7-Mfi"/> + <binding destination="-2" name="enabled" keyPath="self.job" id="FoT-nx-ryU"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSIsNotNil</string> + </dictionary> + </binding> + </connections> + </popUpButton> + <popUpButton verticalHuggingPriority="750" id="5513"> + <rect key="frame" x="492" y="506" width="84" height="22"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="clipping" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" id="5514"> + <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> + <font key="font" metaFont="smallSystem"/> + <menu key="menu" title="OtherViews" id="5515"/> + </popUpButtonCell> + <connections> + <binding destination="-2" name="enabled" keyPath="self.job" id="OMf-GZ-Uvf"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSIsNotNil</string> + </dictionary> + </binding> + <binding destination="-2" name="selectedIndex" keyPath="self.job.range.type" previousBinding="jpv-yJ-Fca" id="lsk-jg-EAY"/> + <binding destination="-2" name="content" keyPath="self.job.range.types" id="jpv-yJ-Fca"/> + </connections> + </popUpButton> + <textField verticalHuggingPriority="750" id="5180"> + <rect key="frame" x="390" y="511" width="46" height="14"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Angle:" id="5185"> + <font key="font" metaFont="smallSystem"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <binding destination="-2" name="textColor" keyPath="self.labelColor" id="pe4-ce-1x7"/> + <binding destination="5676" name="hidden" keyPath="values.UseDvdNav" id="GhV-lP-BWw"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSNegateBoolean</string> + </dictionary> + </binding> + </connections> + </textField> + <popUpButton verticalHuggingPriority="750" id="5181"> + <rect key="frame" x="436" y="506" width="44" height="22"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="clipping" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="5184" id="5182"> + <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> + <font key="font" metaFont="smallSystem"/> + <menu key="menu" title="OtherViews" id="5183"> + <items> + <menuItem state="on" id="5184"/> + </items> + </menu> + </popUpButtonCell> + <accessibility description="Angle"/> + <connections> + <binding destination="-2" name="enabled" keyPath="self.job" id="pA6-GK-w84"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSIsNotNil</string> + </dictionary> + </binding> + <binding destination="-2" name="content" keyPath="self.job.angles" id="If4-Fp-R0g"/> + <binding destination="5676" name="hidden" keyPath="values.UseDvdNav" previousBinding="pA6-GK-w84" id="Ocv-Hr-bje"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSNegateBoolean</string> + </dictionary> + </binding> + </connections> + </popUpButton> + <textField verticalHuggingPriority="750" id="1552"> + <rect key="frame" x="5" y="454" width="47" height="17"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="File:" id="4913"> + <font key="font" metaFont="smallSystem"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <binding destination="-2" name="textColor" keyPath="self.labelColor" id="cNL-U3-HcC"/> + </connections> + </textField> + <textField verticalHuggingPriority="750" id="1553"> + <rect key="frame" x="764" y="511" width="65" height="14"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Duration:" id="4914"> + <font key="font" metaFont="smallSystem"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <binding destination="-2" name="hidden" keyPath="self.job" id="A4K-w4-n6U"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSIsNil</string> + </dictionary> + </binding> + </connections> + </textField> + <textField verticalHuggingPriority="750" id="1554"> + <rect key="frame" x="829" y="511" width="99" height="14"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="00:00:00" id="4915"> + <font key="font" metaFont="smallSystem"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" red="0.76630436999999996" green="0.0" blue="0.0" alpha="0.0" colorSpace="calibratedRGB"/> + </textFieldCell> + <connections> + <binding destination="-2" name="hidden" keyPath="self.job" id="42H-WA-xrv"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSIsNil</string> + </dictionary> + </binding> + <binding destination="-2" name="value" keyPath="self.job.range.duration" id="I4g-Nz-YXQ"/> + </connections> + </textField> + <textField verticalHuggingPriority="750" id="1555"> + <rect key="frame" x="20" y="486" width="70" height="14"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="left" title="Destination" id="4916"> + <font key="font" metaFont="smallSystemBold"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + </textField> + <popUpButton verticalHuggingPriority="750" id="1557"> + <rect key="frame" x="76" y="398" width="177" height="22"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="clipping" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="1559" id="4918"> + <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> + <font key="font" metaFont="smallSystem"/> + <menu key="menu" title="OtherViews" id="1558"> + <items> + <menuItem state="on" id="1559"/> + </items> + </menu> + </popUpButtonCell> + <accessibility description="Format"/> + <connections> + <binding destination="-2" name="enabled" keyPath="self.job" id="GHf-iI-Xg0"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSIsNotNil</string> + </dictionary> + </binding> + <binding destination="-2" name="selectedValue" keyPath="self.job.container" previousBinding="aNr-1N-DaN" id="lwk-pF-rbW"> + <dictionary key="options"> + <string key="NSValueTransformerName">HBContainerTransformer</string> + </dictionary> + </binding> + <binding destination="-2" name="content" keyPath="self.job.containers" id="aNr-1N-DaN"/> + </connections> + </popUpButton> + <button verticalHuggingPriority="750" id="1562"> + <rect key="frame" x="841" y="450" width="90" height="28"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <buttonCell key="cell" type="push" title="Browseā¦" bezelStyle="rounded" alignment="center" controlSize="small" borderStyle="border" inset="2" id="4920"> + <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> + <font key="font" metaFont="smallSystem"/> + </buttonCell> + <connections> + <action selector="browseDestination:" target="-2" id="FqS-ZD-MaJ"/> + <binding destination="-2" name="enabled" keyPath="self.job" id="uGd-Ul-eBq"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSIsNotNil</string> + </dictionary> + </binding> + </connections> + </button> + <box verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="1623"> + <rect key="frame" x="98" y="490" width="828" height="5"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> + <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/> + <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> + <font key="titleFont" metaFont="system"/> + </box> + <textField verticalHuggingPriority="750" id="1539"> + <rect key="frame" x="70" y="540" width="310" height="14.000000042040593"/> + <autoresizingMask key="autoresizingMask" flexibleMinY="YES" heightSizable="YES"/> + <textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" selectable="YES" sendsActionOnEndEditing="YES" alignment="left" id="4906"> + <font key="font" metaFont="smallSystem"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/> + </textFieldCell> + </textField> + <textField verticalHuggingPriority="750" id="1561"> + <rect key="frame" x="56" y="455" width="782" height="19"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" continuous="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="left" drawsBackground="YES" id="4919"> + <font key="font" metaFont="smallSystem"/> + <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <binding destination="-2" name="enabled" keyPath="self.job" id="JXO-Eg-p84"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSIsNotNil</string> + </dictionary> + </binding> + <binding destination="-2" name="value" keyPath="self.job.destURL" id="5zX-7b-Y0f"> + <dictionary key="options"> + <bool key="NSContinuouslyUpdatesValue" value="YES"/> + <string key="NSValueTransformerName">HBURLTransformer</string> + </dictionary> + </binding> + </connections> + </textField> + <textField hidden="YES" verticalHuggingPriority="750" id="5491"> + <rect key="frame" x="581" y="492" width="54" height="19"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="5492"> + <numberFormatter key="formatter" formatterBehavior="default10_4" usesGroupingSeparator="NO" minimumIntegerDigits="0" maximumIntegerDigits="42" id="Fdv-uE-tUA"> + <real key="minimum" value="0.0"/> + </numberFormatter> + <font key="font" metaFont="smallSystem"/> + <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <binding destination="-2" name="hidden" keyPath="self.job.range.secondsSelected" id="nK6-QE-OSQ"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSNegateBoolean</string> + </dictionary> + </binding> + <binding destination="-2" name="value" keyPath="self.job.range.secondsStart" id="0Cj-wW-5Se"> + <dictionary key="options"> + <bool key="NSContinuouslyUpdatesValue" value="YES"/> + <bool key="NSValidatesImmediately" value="YES"/> + </dictionary> + </binding> + </connections> + </textField> + <textField hidden="YES" verticalHuggingPriority="750" id="5521"> + <rect key="frame" x="638" y="492" width="54" height="19"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="5522"> + <numberFormatter key="formatter" formatterBehavior="default10_4" usesGroupingSeparator="NO" minimumIntegerDigits="0" maximumIntegerDigits="42" id="Wpt-92-R1O"> + <real key="minimum" value="0.0"/> + </numberFormatter> + <font key="font" metaFont="smallSystem"/> + <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <binding destination="-2" name="value" keyPath="self.job.range.frameStart" id="gMK-Oo-iNV"> + <dictionary key="options"> + <bool key="NSContinuouslyUpdatesValue" value="YES"/> + <bool key="NSValidatesImmediately" value="YES"/> + </dictionary> + </binding> + <binding destination="-2" name="hidden" keyPath="self.job.range.framesSelected" id="0dp-Lu-RBt"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSNegateBoolean</string> + </dictionary> + </binding> + </connections> + </textField> + <textField hidden="YES" verticalHuggingPriority="750" id="5493"> + <rect key="frame" x="696" y="492" width="54" height="19"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="left" drawsBackground="YES" id="5494"> + <numberFormatter key="formatter" formatterBehavior="default10_4" usesGroupingSeparator="NO" minimumIntegerDigits="0" maximumIntegerDigits="42" id="tD5-HN-B7h"> + <real key="minimum" value="0.0"/> + </numberFormatter> + <font key="font" metaFont="smallSystem"/> + <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <binding destination="-2" name="hidden" keyPath="self.job.range.secondsSelected" id="CkY-Gb-kMw"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSNegateBoolean</string> + </dictionary> + </binding> + <binding destination="-2" name="value" keyPath="self.job.range.secondsStop" id="5SR-rs-7eh"> + <dictionary key="options"> + <bool key="NSContinuouslyUpdatesValue" value="YES"/> + <bool key="NSValidatesImmediately" value="YES"/> + </dictionary> + </binding> + </connections> + </textField> + <textField hidden="YES" verticalHuggingPriority="750" id="5523"> + <rect key="frame" x="758" y="492" width="54" height="19"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="left" drawsBackground="YES" id="5524"> + <numberFormatter key="formatter" formatterBehavior="default10_4" usesGroupingSeparator="NO" minimumIntegerDigits="0" maximumIntegerDigits="42" id="WrK-kN-ZN0"> + <real key="minimum" value="0.0"/> + </numberFormatter> + <font key="font" metaFont="smallSystem"/> + <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <binding destination="-2" name="value" keyPath="self.job.range.frameStop" id="pjc-WR-Cps"> + <dictionary key="options"> + <bool key="NSContinuouslyUpdatesValue" value="YES"/> + <bool key="NSValidatesImmediately" value="YES"/> + </dictionary> + </binding> + <binding destination="-2" name="hidden" keyPath="self.job.range.framesSelected" id="mCj-hb-nRY"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSNegateBoolean</string> + </dictionary> + </binding> + </connections> + </textField> + <textField verticalHuggingPriority="750" id="1627"> + <rect key="frame" x="20" y="430" width="97" height="14"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="left" title="Output Settings:" id="4923"> + <font key="font" metaFont="smallSystemBold"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + </textField> + <box verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="1628"> + <rect key="frame" x="292" y="434" width="634" height="5"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> + <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/> + <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> + <font key="titleFont" metaFont="system"/> + </box> + <textField verticalHuggingPriority="750" id="1882"> + <rect key="frame" x="121" y="430" width="165" height="14"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" sendsActionOnEndEditing="YES" id="4924"> + <font key="font" metaFont="smallSystemBold"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <binding destination="-2" name="value" keyPath="self.job.presetName" id="W9D-4K-e1F"/> + </connections> + </textField> + <textField verticalHuggingPriority="750" id="2006"> + <rect key="frame" x="711" y="15" width="218" height="14"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="right" id="4925"> + <font key="font" metaFont="smallSystem"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + </textField> + <textField verticalHuggingPriority="750" id="1556"> + <rect key="frame" x="21" y="403" width="53" height="14"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Format:" id="4917"> + <font key="font" metaFont="smallSystem"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <binding destination="-2" name="textColor" keyPath="self.labelColor" id="j6q-iC-kqw"/> + </connections> + </textField> + <box verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="3205"> + <rect key="frame" x="386" y="543" width="540" height="5"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/> + <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> + <font key="titleFont" metaFont="system"/> + </box> + <progressIndicator hidden="YES" verticalHuggingPriority="750" maxValue="100" bezeled="NO" controlSize="small" style="bar" id="3203"> + <rect key="frame" x="386" y="542.0000000420406" width="541" height="12"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + </progressIndicator> + <button toolTip="This rearranges the header of the MP4 file to optimize it for streaming across the web." id="4579"> + <rect key="frame" x="269" y="401" width="102" height="18"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <buttonCell key="cell" type="check" title="Web optimized" bezelStyle="regularSquare" imagePosition="left" alignment="left" controlSize="small" inset="2" id="4927"> + <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> + <font key="font" metaFont="smallSystem"/> + </buttonCell> + <connections> + <binding destination="-2" name="value" keyPath="self.job.mp4HttpOptimize" id="k6d-kB-gvH"/> + <binding destination="-2" name="hidden" keyPath="self.job.mp4OptionsEnabled" id="5Ru-HP-Pjj"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSNegateBoolean</string> + </dictionary> + </binding> + </connections> + </button> + <button toolTip="This option adds an atom to the MP4 file which allows older iPods (5th Generation classic style) to play the file." id="4967"> + <rect key="frame" x="388" y="401" width="126" height="18"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <buttonCell key="cell" type="check" title="iPod 5G support" bezelStyle="regularSquare" imagePosition="left" alignment="left" controlSize="small" inset="2" id="4968"> + <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> + <font key="font" metaFont="smallSystem"/> + </buttonCell> + <connections> + <binding destination="-2" name="value" keyPath="self.job.mp4iPodCompatible" id="Wze-yP-0B0"/> + <binding destination="-2" name="hidden" keyPath="self.job.mp4iPodCompatibleEnabled" id="uSs-Xh-6ng"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSNegateBoolean</string> + </dictionary> + </binding> + </connections> + </button> + <textField verticalHuggingPriority="750" id="5505"> + <rect key="frame" x="637" y="510" width="56" height="15"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="through" id="5506"> + <font key="font" metaFont="smallSystem"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <binding destination="-2" name="hidden" keyPath="self.job" id="3Oi-Rz-VGX"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSIsNil</string> + </dictionary> + </binding> + </connections> + </textField> + <popUpButton verticalHuggingPriority="750" id="1545"> + <rect key="frame" x="578" y="506" width="60" height="22"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="clipping" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="1547" id="4910"> + <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> + <font key="font" metaFont="smallSystem"/> + <menu key="menu" title="OtherViews" id="1546"> + <items> + <menuItem state="on" id="1547"/> + </items> + </menu> + </popUpButtonCell> + <accessibility description="Start Chapter"/> + <connections> + <binding destination="-2" name="selectedIndex" keyPath="self.job.range.chapterStart" previousBinding="iug-tk-BPC" id="6Lh-6x-j09"/> + <binding destination="-2" name="content" keyPath="self.job.range.chapters" id="iug-tk-BPC"/> + <binding destination="-2" name="hidden" keyPath="self.job.range.chaptersSelected" id="ycW-js-Hi5"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSNegateBoolean</string> + </dictionary> + </binding> + </connections> + </popUpButton> + <popUpButton verticalHuggingPriority="750" id="1548"> + <rect key="frame" x="693" y="506" width="60" height="22"/> + <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> + <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="clipping" state="on" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" selectedItem="1550" id="4911"> + <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> + <font key="font" metaFont="smallSystem"/> + <menu key="menu" title="OtherViews" id="1549"> + <items> + <menuItem state="on" id="1550"/> + </items> + </menu> + </popUpButtonCell> + <accessibility description="End Chapter"/> + <connections> + <binding destination="-2" name="selectedIndex" keyPath="self.job.range.chapterStop" previousBinding="wDD-Bt-zMX" id="eHK-zg-A5x"/> + <binding destination="-2" name="content" keyPath="self.job.range.chapters" id="wDD-Bt-zMX"/> + <binding destination="-2" name="hidden" keyPath="self.job.range.chaptersSelected" id="Afk-fL-rtv"> + <dictionary key="options"> + <string key="NSValueTransformerName">NSNegateBoolean</string> + </dictionary> + </binding> + </connections> + </popUpButton> + </subviews> + </view> + <toolbar key="toolbar" implicitIdentifier="E92CA47A-01F7-432A-A61C-28FE4D58C2CD" autosavesConfiguration="NO" displayMode="iconAndLabel" sizeMode="regular" id="7g3-gy-bUl"> + <allowedToolbarItems> + <toolbarItem implicitItemIdentifier="NSToolbarSpaceItem" id="ZEH-cS-zXY"/> + <toolbarItem implicitItemIdentifier="NSToolbarFlexibleSpaceItem" id="wjB-Tl-5qq"/> + <toolbarItem implicitItemIdentifier="B3BAB305-77BF-4967-B8E6-D11F40EF822B" label="Source" paletteLabel="Source" toolTip="Choose Video Source" tag="-1" image="source" id="8r8-nZ-dYs"> + <connections> + <action selector="browseSources:" target="-2" id="zi1-Tk-0YL"/> + </connections> + </toolbarItem> + <toolbarItem implicitItemIdentifier="4CAB4280-DF01-4BDC-B23B-98BD6E6190F4" label="Start" paletteLabel="Start Encoding" toolTip="Start Encoding" tag="-1" image="encode" id="byg-kj-sEM"> + <connections> + <action selector="rip:" target="-2" id="f6w-0B-Qvn"/> + </connections> + </toolbarItem> + <toolbarItem implicitItemIdentifier="E4C5E251-DD8D-4288-AC80-AF8E654B7A32" label="Pause" paletteLabel="Pause Encoding" toolTip="Pause Encoding" tag="-1" image="pauseencode" id="wTQ-KF-5KW"> + <connections> + <action selector="pause:" target="-2" id="AN1-8V-lc1"/> + </connections> + </toolbarItem> + <toolbarItem implicitItemIdentifier="69E83092-D0D1-48A5-BF46-99EFB3EC630A" label="Add To Queue" paletteLabel="Add To Queue" tag="-1" image="addqueue" id="DZZ-Fe-wjw"> + <connections> + <action selector="addToQueue:" target="-2" id="TRB-HE-1GW"/> + </connections> + </toolbarItem> + <toolbarItem implicitItemIdentifier="6EFCA879-A80D-45D7-A846-EAD85261F864" label="Show Queue" paletteLabel="Show Queue" tag="-1" image="showqueue" id="HCx-ku-nF7"> + <connections> + <action selector="showQueueWindow:" target="-1" id="vZB-dY-DbD"/> + </connections> + </toolbarItem> + <toolbarItem implicitItemIdentifier="CBA63584-4A4E-43E5-8096-9C20B59AC580" label="Picture Settings" paletteLabel="Show Picture Settings" toolTip="Show Picture Settings" tag="-1" image="picturesettings" id="2uP-T2-02Q"> + <connections> + <action selector="showPicturePanel:" target="-2" id="xXB-FD-XyP"/> + </connections> + </toolbarItem> + <toolbarItem implicitItemIdentifier="DAAC2346-2B39-4A35-A62B-C12826F6AB42" label="Preview Window" paletteLabel="Show Preview Window" toolTip="Show Preview Window" tag="-1" image="preview" id="dK4-jt-v4K"> + <connections> + <action selector="showPreviewWindow:" target="-2" id="uci-BT-5bQ"/> + </connections> + </toolbarItem> + <toolbarItem implicitItemIdentifier="D9753B5B-F09B-451E-9FD8-E8DD979FBFA2" label="Activity Window" paletteLabel="Show Activity Window" toolTip="Show Activity Window" tag="-1" image="activity" id="p7Q-L3-zcW"> + <connections> + <action selector="showOutputPanel:" target="-1" id="TxI-PX-wlm"/> + </connections> + </toolbarItem> + <toolbarItem implicitItemIdentifier="B774D9D7-AE89-4C1A-8685-D631473867F6" label="Toggle Presets" paletteLabel="Toggle Presets" toolTip="Open/Close Preset Drawer" tag="-1" image="presets" id="9ll-Jg-YAB"> + <connections> + <action selector="toggleDrawer:" target="-2" id="YN2-RM-4ss"/> + </connections> + </toolbarItem> + </allowedToolbarItems> + <defaultToolbarItems> + <toolbarItem reference="8r8-nZ-dYs"/> + <toolbarItem reference="byg-kj-sEM"/> + <toolbarItem reference="wTQ-KF-5KW"/> + <toolbarItem reference="DZZ-Fe-wjw"/> + <toolbarItem reference="HCx-ku-nF7"/> + <toolbarItem reference="wjB-Tl-5qq"/> + <toolbarItem reference="2uP-T2-02Q"/> + <toolbarItem reference="dK4-jt-v4K"/> + <toolbarItem reference="p7Q-L3-zcW"/> + <toolbarItem reference="9ll-Jg-YAB"/> + </defaultToolbarItems> + </toolbar> + <connections> + <outlet property="delegate" destination="-2" id="M3v-Rc-7Ca"/> + </connections> + <point key="canvasLocation" x="538" y="-161"/> + </window> + <drawer trailingOffset="15" id="1841" userLabel="PresetsDrawer"> + <size key="contentSize" width="240" height="550"/> + <size key="minContentSize" width="100" height="50"/> + <size key="maxContentSize" width="280" height="550"/> + <connections> + <outlet property="delegate" destination="-2" id="skU-2X-nDc"/> + <outlet property="parentWindow" destination="21" id="1842"/> + </connections> + </drawer> + <userDefaultsController representsSharedInstance="YES" id="5676"/> + <customView id="lZQ-gl-3wX" userLabel="Open Panel View"> + <rect key="frame" x="0.0" y="0.0" width="227" height="38"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <subviews> + <button id="DN4-48-aOI"> + <rect key="frame" x="28" y="9" width="114" height="18"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <buttonCell key="cell" type="check" title="Scan only title:" bezelStyle="regularSquare" imagePosition="left" inset="2" id="eQA-t2-FcV"> + <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> + <font key="font" metaFont="system"/> + </buttonCell> + <connections> + <binding destination="-2" name="value" keyPath="self.scanSpecificTitle" id="bMP-E7-iZy"/> + </connections> + </button> + <textField verticalHuggingPriority="750" id="3w9-Iu-3u2"> + <rect key="frame" x="148" y="7" width="50" height="22"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" title="0" drawsBackground="YES" id="6E4-AG-PEh"> + <numberFormatter key="formatter" formatterBehavior="default10_4" usesGroupingSeparator="NO" minimumIntegerDigits="0" maximumIntegerDigits="42" id="V1R-X1-vLz"> + <real key="minimum" value="0.0"/> + </numberFormatter> + <font key="font" metaFont="system"/> + <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <binding destination="-2" name="enabled" keyPath="self.scanSpecificTitle" id="3aE-hX-Q0r"/> + <binding destination="-2" name="value" keyPath="self.scanSpecificTitleIdx" id="dJZ-JM-2BP"> + <dictionary key="options"> + <bool key="NSContinuouslyUpdatesValue" value="YES"/> + <integer key="NSNullPlaceholder" value="0"/> + </dictionary> + </binding> + </connections> + </textField> + </subviews> + <point key="canvasLocation" x="458.5" y="-571"/> + </customView> + </objects> + <resources> + <image name="activity" width="24" height="24"/> + <image name="addqueue" width="12" height="12"/> + <image name="encode" width="24" height="24"/> + <image name="pauseencode" width="24" height="24"/> + <image name="picturesettings" width="24" height="24"/> + <image name="presets" width="24" height="24"/> + <image name="preview" width="24" height="24"/> + <image name="showqueue" width="24" height="24"/> + <image name="source" width="24" height="24"/> + </resources> +</document> diff --git a/macosx/English.lproj/Preferences.xib b/macosx/English.lproj/Preferences.xib index c2e0f97c5..f6abd81a0 100644 --- a/macosx/English.lproj/Preferences.xib +++ b/macosx/English.lproj/Preferences.xib @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6250" systemVersion="14B23" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none"> +<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6724" systemVersion="14C99d" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none"> <dependencies> <deployment version="1060" identifier="macosx"/> <development version="5100" identifier="xcode"/> - <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6250"/> + <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6724"/> </dependencies> <objects> <customObject id="-2" userLabel="File's Owner" customClass="HBPreferencesController"> @@ -49,7 +49,6 @@ <items> <menuItem title="Do Nothing" id="378"/> <menuItem title="Open Source" state="on" id="379"/> - <menuItem title="Open Source (Title Specific)" id="377"/> </items> </menu> </popUpButtonCell> @@ -212,13 +211,13 @@ <popUpButton verticalHuggingPriority="750" id="491"> <rect key="frame" x="124" y="271" width="195" height="22"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> - <popUpButtonCell key="cell" type="push" title="Alert Window" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="495" id="492"> + <popUpButtonCell key="cell" type="push" title="Do Nothing" bezelStyle="rounded" alignment="left" controlSize="small" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="494" id="492"> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> <font key="font" metaFont="smallSystem"/> <menu key="menu" title="OtherViews" id="493"> <items> - <menuItem title="Do Nothing" id="494"/> - <menuItem title="Alert Window" state="on" id="495"/> + <menuItem title="Do Nothing" state="on" id="494"/> + <menuItem title="Alert Window" id="495"/> <menuItem title="Growl Notification" id="499"/> <menuItem title="Alert Window And Growl" id="496"/> <menuItem title="Put Computer To Sleep" id="497"/> diff --git a/macosx/HBAppDelegate.h b/macosx/HBAppDelegate.h new file mode 100644 index 000000000..a115696e7 --- /dev/null +++ b/macosx/HBAppDelegate.h @@ -0,0 +1,14 @@ +/* HBAppDelegate.h $ + + 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 <Cocoa/Cocoa.h> + +@interface HBAppDelegate : NSObject <NSApplicationDelegate> + +- (IBAction)showPreferencesWindow:(id)sender; +- (IBAction)showOutputPanel:(id)sender; + +@end diff --git a/macosx/HBAppDelegate.m b/macosx/HBAppDelegate.m new file mode 100644 index 000000000..09b294b9d --- /dev/null +++ b/macosx/HBAppDelegate.m @@ -0,0 +1,482 @@ +/* HBAppDelegate.m $ + + 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 "HBAppDelegate.h" + +#import "HBUtilities.h" +#import "HBPresetsManager.h" +#import "HBPreset.h" + +#import "HBPreferencesController.h" +#import "HBQueueController.h" +#import "HBOutputPanelController.h" +#import "HBCore.h" +#import "Controller.h" + +static void hb_error_handler(const char *errmsg) +{ + NSString *error = @(errmsg); + + if (error && [[NSUserDefaults standardUserDefaults] boolForKey:@"HBDebugAlert"]) + { + dispatch_async(dispatch_get_main_queue(), ^{ + NSAlert *alert = [[NSAlert alloc] init]; + [alert setMessageText:NSLocalizedString(@"Internal Error.", @"")]; + [alert runModal]; + [alert release]; + }); + } + + fprintf(stderr, "error: %s\n", errmsg); +} + +@interface HBAppDelegate () + +@property (nonatomic, retain) HBPresetsManager *presetsManager; +@property (assign) IBOutlet NSMenu *presetsMenu; + +@property (nonatomic, retain) HBPreferencesController *preferencesController; +@property (nonatomic, retain) HBQueueController *queueController; + +@property (nonatomic, retain) HBOutputPanelController *outputPanel; + +@property (nonatomic, retain) HBController *mainController; + +@end + +@implementation HBAppDelegate + +- (instancetype)init +{ + self = [super init]; + if (self) + { + hb_global_init(); + hb_register_error_handler(&hb_error_handler); + + // Optionally use dvd nav + [HBCore setDVDNav:[[[NSUserDefaults standardUserDefaults] objectForKey:@"UseDvdNav"] boolValue]]; + + // Register the defaults preferences + [HBPreferencesController registerUserDefaults]; + + _outputPanel = [[HBOutputPanelController alloc] init]; + + // Lets report the HandBrake version number here to the activity log and text log file + NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary]; + NSString *versionStringFull = [NSString stringWithFormat:@"Handbrake Version: %@ (%@)", infoDict[@"CFBundleShortVersionString"], infoDict[@"CFBundleVersion"]]; + [HBUtilities writeToActivityLog: "%s", versionStringFull.UTF8String]; + + // we init the HBPresetsManager + NSURL *presetsURL = [NSURL fileURLWithPath:[[HBUtilities appSupportPath] stringByAppendingPathComponent:@"UserPresets.plist"]]; + _presetsManager = [[HBPresetsManager alloc] initWithURL:presetsURL]; + + _queueController = [[HBQueueController alloc] init]; + _queueController.outputPanel = _outputPanel; + _queueController.delegate = self; + _mainController = [[HBController alloc] initWithQueue:_queueController presetsManager:_presetsManager]; + + // Set the Growl Delegate + [GrowlApplicationBridge setGrowlDelegate:_queueController]; + } + return self; +} + +#pragma mark - NSApplicationDelegate + +- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag +{ + if (!flag) + { + [self.mainController showWindow:nil]; + } + return YES; +} + +- (void)applicationDidFinishLaunching:(NSNotification *)notification +{ + // Updates built-ins presets if needed + [self checkBuiltInsForUpdates]; + [self buildPresetsMenu]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(buildPresetsMenu) name:HBPresetsChangedNotification object:nil]; + + // Get the number of HandBrake instances currently running + NSUInteger instances = [NSRunningApplication runningApplicationsWithBundleIdentifier:[[NSBundle mainBundle] bundleIdentifier]].count; + + // If we are a single instance it is safe to clean up the previews if there are any + // left over. This is a bit of a kludge but will prevent a build up of old instance + // live preview cruft. No danger of removing an active preview directory since they + // are created later in HBPreviewController if they don't exist at the moment a live + // preview encode is initiated. + if (instances == 1) + { + NSString *previewDirectory = [[HBUtilities appSupportPath] stringByAppendingPathComponent:@"Previews"]; + NSError *error = nil; + NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:previewDirectory error:&error]; + for (NSString *file in files) + { + BOOL result = [[NSFileManager defaultManager] removeItemAtPath:[previewDirectory stringByAppendingPathComponent:file] error:&error]; + if (result == NO && error) + { + [HBUtilities writeToActivityLog: "Could not remove existing preview at : %s", file.UTF8String]; + } + } + } + + [self showMainWindow:self]; + + // Now we re-check the queue array to see if there are + // any remaining encodes to be done in it and ask the + // user if they want to reload the queue + if (self.queueController.count) + { + // On Screen Notification + // We check to see if there is already another instance of hb running. + // Note: hbInstances == 1 means we are the only instance of HandBrake.app + NSAlert *alert = nil; + if (instances > 1) + { + alert = [[NSAlert alloc] init]; + [alert setMessageText:NSLocalizedString(@"There is already an instance of HandBrake running.", @"")]; + [alert setInformativeText:NSLocalizedString(@"HandBrake will now load up the existing queue.", nil)]; + [alert addButtonWithTitle:NSLocalizedString(@"Reload Queue", nil)]; + } + else + { + if (self.queueController.workingItemsCount > 0 || self.queueController.pendingItemsCount > 0) + { + NSString *alertTitle; + + if (self.queueController.workingItemsCount > 0) + { + alertTitle = [NSString stringWithFormat: + NSLocalizedString(@"HandBrake Has Detected %d Previously Encoding Item(s) and %d Pending Item(s) In Your Queue.", @""), + self.queueController.workingItemsCount, self.queueController.pendingItemsCount]; + } + else + { + alertTitle = [NSString stringWithFormat: + NSLocalizedString(@"HandBrake Has Detected %d Pending Item(s) In Your Queue.", @""), + self.queueController.pendingItemsCount]; + } + + alert = [[NSAlert alloc] init]; + [alert setMessageText:alertTitle]; + [alert setInformativeText:NSLocalizedString(@"Do you want to reload them ?", nil)]; + [alert addButtonWithTitle:NSLocalizedString(@"Reload Queue", nil)]; + [alert addButtonWithTitle:NSLocalizedString(@"Empty Queue", nil)]; + [alert setAlertStyle:NSCriticalAlertStyle]; + } + else + { + // Since we addressed any pending or previously encoding items above, we go ahead and make sure + // the queue is empty of any finished items or cancelled items. + [self.queueController removeAllJobs]; + [self.mainController launchAction]; + } + } + + if (alert) + { + NSModalResponse response = [alert runModal]; + + if (response == NSAlertSecondButtonReturn) + { + [HBUtilities writeToActivityLog:"didDimissReloadQueue NSAlertSecondButtonReturn Chosen"]; + [self.queueController removeAllJobs]; + [self.mainController launchAction]; + } + else + { + [HBUtilities writeToActivityLog:"didDimissReloadQueue NSAlertFirstButtonReturn Chosen"]; + if (instances == 1) + { + [self.queueController setEncodingJobsAsPending]; + } + + [self showQueueWindow:nil]; + } + + [alert release]; + } + } + else + { + [self.mainController launchAction]; + } + + // Open debug output window now if it was visible when HB was closed + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OutputPanelIsOpen"]) + [self showOutputPanel:nil]; + + // Open queue window now if it was visible when HB was closed + if ([[NSUserDefaults standardUserDefaults] boolForKey:@"QueueWindowIsOpen"]) + [self showQueueWindow:nil]; +} + +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)app +{ + if (self.queueController.core.state != HBStateIdle) + { + NSAlert *alert = [[NSAlert alloc] init]; + [alert setMessageText:NSLocalizedString(@"Are you sure you want to quit HandBrake?", nil)]; + [alert setInformativeText:NSLocalizedString(@"If you quit HandBrake your current encode will be reloaded into your queue at next launch. Do you want to quit anyway?", nil)]; + [alert addButtonWithTitle:NSLocalizedString(@"Quit", nil)]; + [alert addButtonWithTitle:NSLocalizedString(@"Don't Quit", nil)]; + [alert setAlertStyle:NSCriticalAlertStyle]; + + NSInteger result = [alert runModal]; + [alert release]; + + if (result == NSAlertFirstButtonReturn) + { + return NSTerminateNow; + } + else + { + return NSTerminateCancel; + } + } + + // Warn if items still in the queue + else if (self.queueController.pendingItemsCount > 0) + { + NSAlert *alert = [[NSAlert alloc] init]; + [alert setMessageText:NSLocalizedString(@"Are you sure you want to quit HandBrake?", nil)]; + [alert setInformativeText:NSLocalizedString(@"There are pending encodes in your queue. Do you want to quit anyway?",nil)]; + [alert addButtonWithTitle:NSLocalizedString(@"Quit", nil)]; + [alert addButtonWithTitle:NSLocalizedString(@"Don't Quit", nil)]; + [alert setAlertStyle:NSCriticalAlertStyle]; + NSInteger result = [alert runModal]; + [alert release]; + if (result == NSAlertFirstButtonReturn) + { + return NSTerminateNow; + } + else + { + return NSTerminateCancel; + } + } + + return NSTerminateNow; +} + +- (void)applicationWillTerminate:(NSNotification *)notification +{ + [self.presetsManager savePresets]; + + [_mainController release]; + _mainController = nil; + [_queueController release]; + _queueController = nil; + + [HBCore closeGlobal]; +} + +- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames +{ + [self.mainController openFile:[NSURL fileURLWithPath:filenames.firstObject]]; + [NSApp replyToOpenOrPrint:NSApplicationDelegateReplySuccess]; +} + +- (BOOL)validateMenuItem:(NSMenuItem *)menuItem +{ + SEL action = menuItem.action; + + if (action == @selector(rip:) || action == @selector(pause:)) + { + // Delegate the validation to the queue controller + return [self.queueController validateMenuItem:menuItem]; + } + else if (action == @selector(showPicturePanel:) || action == @selector(showAddPresetPanel:) || + action == @selector(showPreviewWindow:) || action == @selector(browseSources:)) + { + // Delegate the validation to the main controller + return [self.mainController validateMenuItem:menuItem]; + } + + return YES; +} + +#pragma mark - Menu actions + +- (IBAction)rip:(id)sender +{ + [self.queueController rip:self]; +} + +- (IBAction)pause:(id)sender +{ + [self.queueController togglePauseResume:self]; +} + +- (IBAction)browseSources:(id)sender +{ + [self.mainController browseSources:self]; +} + +#pragma mark - Presets Menu actions + +- (void)checkBuiltInsForUpdates +{ + // if we have built in presets to update, then do so AlertBuiltInPresetUpdate + if ([self.presetsManager checkBuiltInsForUpdates]) + { + if( [[NSUserDefaults standardUserDefaults] boolForKey:@"AlertBuiltInPresetUpdate"] == YES) + { + // Show an alert window that built in presets will be updated + [NSApp requestUserAttention:NSCriticalRequest]; + NSAlert *alert = [[NSAlert alloc] init]; + [alert setMessageText:@"HandBrake has determined your built in presets are out of dateā¦"]; + [alert setInformativeText:@"HandBrake will now update your built-in presets."]; + [alert runModal]; + [alert release]; + } + // when alert is dismissed, go ahead and update the built in presets + [self.presetsManager generateBuiltInPresets]; + } +} + +/** + * Adds the presets list to the menu. + */ +- (void)buildPresetsMenu +{ + // First we remove all the preset menu items + // inserted previosly + NSArray *menuItems = [self.presetsMenu.itemArray copy]; + for (NSMenuItem *item in menuItems) + { + if (item.tag != -1) + { + [self.presetsMenu removeItem:item]; + } + } + [menuItems release]; + + __block NSUInteger i = 0; + __block BOOL builtInEnded = NO; + [self.presetsManager.root enumerateObjectsUsingBlock:^(id obj, NSIndexPath *idx, BOOL *stop) + { + if (idx.length) + { + NSMenuItem *item = [[NSMenuItem alloc] init]; + item.title = [obj name]; + item.tag = i++; + + // Set an action only to the actual presets, + // not on the folders. + if ([obj isLeaf]) + { + item.action = @selector(selectPresetFromMenu:); + item.representedObject = obj; + } + // Make the default preset font bold. + if ([obj isDefault]) + { + NSAttributedString *newTitle = [[NSAttributedString alloc] initWithString:[obj name] + attributes:@{NSFontAttributeName: [NSFont boldSystemFontOfSize:14]}]; + [item setAttributedTitle:newTitle]; + [newTitle release]; + } + // Add a separator line after the last builtIn preset + if ([obj isBuiltIn] == NO && builtInEnded == NO) + { + [self.presetsMenu addItem:[NSMenuItem separatorItem]]; + builtInEnded = YES; + } + + item.indentationLevel = idx.length - 1; + + [self.presetsMenu addItem:item]; + [item release]; + } + }]; +} + +/** + * We use this method to recreate new, updated factory presets + */ +- (IBAction)addFactoryPresets:(id)sender +{ + [self.presetsManager generateBuiltInPresets]; +} + +#pragma mark - Show Window Menu Items + +/** + * Shows preferences window. + */ +- (IBAction)showPreferencesWindow:(id)sender +{ + if (_preferencesController == nil) + { + _preferencesController = [[HBPreferencesController alloc] init]; + } + + NSWindow *window = [_preferencesController window]; + if (![window isVisible]) + { + [window center]; + } + + [window makeKeyAndOrderFront:nil]; +} + +/** + * Shows queue window. + */ +- (IBAction)showQueueWindow:(id)sender +{ + [self.queueController showWindow:sender]; +} + +/** + * Shows debug output window. + */ +- (IBAction)showOutputPanel:(id)sender +{ + [self.outputPanel showOutputPanel:sender]; +} + +- (IBAction)showPicturePanel:(id)sender +{ + [self.mainController showPicturePanel:self]; +} + +- (IBAction)showPreviewWindow:(id)sender +{ + [self.mainController showPreviewWindow:self]; +} + +/** + * Shows main window. + */ +- (IBAction)showMainWindow:(id)sender +{ + [self.mainController showWindow:sender]; +} + +- (IBAction)openHomepage:(id)sender +{ + [[NSWorkspace sharedWorkspace] openURL:[NSURL + URLWithString:@"http://handbrake.fr/"]]; +} + +- (IBAction)openForums:(id)sender +{ + [[NSWorkspace sharedWorkspace] openURL:[NSURL + URLWithString:@"http://forum.handbrake.fr/"]]; +} +- (IBAction)openUserGuide:(id)sender +{ + [[NSWorkspace sharedWorkspace] openURL:[NSURL + URLWithString:@"http://trac.handbrake.fr/wiki/HandBrakeGuide"]]; +} + +@end diff --git a/macosx/HBQueueController.h b/macosx/HBQueueController.h index 73cdc2a21..0a48dff66 100644 --- a/macosx/HBQueueController.h +++ b/macosx/HBQueueController.h @@ -7,6 +7,7 @@ #import <Cocoa/Cocoa.h> #import <Growl/Growl.h> +@class HBAppDelegate; @class HBController; @class HBOutputPanelController; @class HBCore; @@ -18,6 +19,7 @@ @property (nonatomic, readonly) HBCore *core; @property (nonatomic, assign) HBController *controller; +@property (nonatomic, assign) HBAppDelegate *delegate; @property (nonatomic, assign) HBOutputPanelController *outputPanel; @property (nonatomic, readonly) NSUInteger count; @@ -35,4 +37,6 @@ - (IBAction)rip:(id)sender; - (IBAction)cancelRip:(id)sender; +- (IBAction)togglePauseResume:(id)sender; + @end diff --git a/macosx/HBQueueController.mm b/macosx/HBQueueController.mm index b835599a9..1a8712653 100644 --- a/macosx/HBQueueController.mm +++ b/macosx/HBQueueController.mm @@ -9,6 +9,7 @@ #import "HBCore.h" #import "Controller.h" +#import "HBAppDelegate.h" #import "HBOutputPanelController.h" #import "HBQueueOutlineView.h" @@ -136,6 +137,45 @@ #pragma mark Toolbar +- (BOOL)validateMenuItem:(NSMenuItem *)menuItem +{ + SEL action = menuItem.action; + + if (action == @selector(rip:)) + { + if (self.core.state == HBStateIdle) + { + menuItem.title = NSLocalizedString(@"Start Encoding", nil); + menuItem.keyEquivalent = @"s"; + + return (self.pendingItemsCount > 0); + } + else if (self.core.state != HBStateIdle) + { + menuItem.title = NSLocalizedString(@"Stop Encoding", nil); + menuItem.keyEquivalent = @"."; + + return YES; + } + } + + if (action == @selector(pause:)) + { + if (self.core.state != HBStatePaused) + { + menuItem.title = NSLocalizedString(@"Pause Encoding", nil); + } + else + { + menuItem.title = NSLocalizedString(@"Resume Encoding", nil); + } + + return (self.core.state == HBStateWorking || self.core.state == HBStatePaused); + } + + return YES; +} + - (BOOL)validateToolbarItem:(NSToolbarItem *)theItem { SEL action = theItem.action; @@ -898,7 +938,7 @@ NSInteger response = [alert runModal]; if (response == NSAlertSecondButtonReturn) { - [self.controller showPreferencesWindow:nil]; + [self.delegate showPreferencesWindow:nil]; } [alert release]; } @@ -917,7 +957,7 @@ NSInteger response = [alert runModal]; if (response == NSAlertSecondButtonReturn) { - [self.controller showPreferencesWindow:nil]; + [self.delegate showPreferencesWindow:nil]; } [alert release]; } diff --git a/macosx/HandBrake.xcodeproj/project.pbxproj b/macosx/HandBrake.xcodeproj/project.pbxproj index 48805d713..6410bdb02 100644 --- a/macosx/HandBrake.xcodeproj/project.pbxproj +++ b/macosx/HandBrake.xcodeproj/project.pbxproj @@ -127,6 +127,8 @@ A9204DC51A16C5AB007CA74C /* [email protected] in Resources */ = {isa = PBXBuildFile; fileRef = A9204DC21A16C5AB007CA74C /* [email protected] */; }; A9204DC61A16C5AB007CA74C /* [email protected] in Resources */ = {isa = PBXBuildFile; fileRef = A9204DC31A16C5AB007CA74C /* [email protected] */; }; A9204DC71A16C5AB007CA74C /* [email protected] in Resources */ = {isa = PBXBuildFile; fileRef = A9204DC41A16C5AB007CA74C /* [email protected] */; }; + A92268781A6E555500A8D5C5 /* HBAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A92268771A6E555500A8D5C5 /* HBAppDelegate.m */; }; + A922687B1A6E569B00A8D5C5 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A92268791A6E569B00A8D5C5 /* MainWindow.xib */; }; A9252C041A17343500B8B7F8 /* [email protected] in Resources */ = {isa = PBXBuildFile; fileRef = A9252C031A17343500B8B7F8 /* [email protected] */; }; A9252C091A173D4800B8B7F8 /* [email protected] in Resources */ = {isa = PBXBuildFile; fileRef = A9252C051A173D4800B8B7F8 /* [email protected] */; }; A9252C0A1A173D4800B8B7F8 /* [email protected] in Resources */ = {isa = PBXBuildFile; fileRef = A9252C061A173D4800B8B7F8 /* [email protected] */; }; @@ -375,6 +377,9 @@ A9204DC21A16C5AB007CA74C /* [email protected] */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "[email protected]"; sourceTree = "<group>"; }; A9204DC31A16C5AB007CA74C /* [email protected] */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "[email protected]"; sourceTree = "<group>"; }; A9204DC41A16C5AB007CA74C /* [email protected] */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "[email protected]"; sourceTree = "<group>"; }; + A92268761A6E555500A8D5C5 /* HBAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBAppDelegate.h; sourceTree = "<group>"; }; + A92268771A6E555500A8D5C5 /* HBAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBAppDelegate.m; sourceTree = "<group>"; }; + A922687A1A6E569B00A8D5C5 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = MainWindow.xib; sourceTree = "<group>"; }; A9252C031A17343500B8B7F8 /* [email protected] */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "[email protected]"; sourceTree = "<group>"; }; A9252C051A173D4800B8B7F8 /* [email protected] */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "[email protected]"; sourceTree = "<group>"; }; A9252C061A173D4800B8B7F8 /* [email protected] */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "[email protected]"; sourceTree = "<group>"; }; @@ -789,6 +794,7 @@ children = ( 273F217C14ADDDA10021BE6D /* InfoPlist.strings */, 273F217E14ADDDA10021BE6D /* MainMenu.xib */, + A92268791A6E569B00A8D5C5 /* MainWindow.xib */, A9CF25EF1990D62C0023F727 /* Presets.xib */, A9E2FD291A21BC6F000E8D3F /* AddPreset.xib */, A93E0ED51972958C00FD67FB /* Video.xib */, @@ -958,6 +964,8 @@ A9B34D6F197683FE00871B7D /* Controllers */ = { isa = PBXGroup; children = ( + A92268761A6E555500A8D5C5 /* HBAppDelegate.h */, + A92268771A6E555500A8D5C5 /* HBAppDelegate.m */, 273F208E14ADBE670021BE6D /* Controller.h */, 273F208F14ADBE670021BE6D /* Controller.m */, A9B34D701976841800871B7D /* Main Window View Controllers */, @@ -1150,6 +1158,7 @@ 273F218E14ADDDA10021BE6D /* PicturePreview.xib in Resources */, 273F218F14ADDDA10021BE6D /* PictureSettings.xib in Resources */, 273F219014ADDDA10021BE6D /* Preferences.xib in Resources */, + A922687B1A6E569B00A8D5C5 /* MainWindow.xib in Resources */, 273F219114ADDDA10021BE6D /* Queue.xib in Resources */, 3490BCB41614CF8D002A5AD7 /* HandBrake.icns in Resources */, A9E1468016BC2AD800C307BC /* next-p.pdf in Resources */, @@ -1223,6 +1232,7 @@ A98C29C41977B10600AF5DED /* HBLanguagesSelection.m in Sources */, A9BB0F2719A0ECE40079F1C1 /* HBHUDButtonCell.m in Sources */, A932E273198834130047D13E /* HBAudioDefaults.m in Sources */, + A92268781A6E555500A8D5C5 /* HBAppDelegate.m in Sources */, A91806711A4807B000FC9BED /* HBRange.m in Sources */, A9DEC8771A23C88D00C79B48 /* HBVideo.m in Sources */, A9523937199A6AAE00588AEF /* HBFilters.m in Sources */, @@ -1353,6 +1363,14 @@ name = Queue.xib; sourceTree = "<group>"; }; + A92268791A6E569B00A8D5C5 /* MainWindow.xib */ = { + isa = PBXVariantGroup; + children = ( + A922687A1A6E569B00A8D5C5 /* English */, + ); + name = MainWindow.xib; + sourceTree = "<group>"; + }; A932E26A1988334B0047D13E /* AudioDefaults.xib */ = { isa = PBXVariantGroup; children = ( diff --git a/macosx/main.mm b/macosx/main.mm index 1d7d6ed69..961d1fa78 100644 --- a/macosx/main.mm +++ b/macosx/main.mm @@ -5,24 +5,6 @@ It may be used under the terms of the GNU General Public License. */ #import <Cocoa/Cocoa.h> -#include "hb.h" - -static void hb_error_handler(const char *errmsg) -{ - NSString *error = @(errmsg); - - if (error && [[NSUserDefaults standardUserDefaults] boolForKey:@"HBDebugAlert"]) - { - dispatch_async(dispatch_get_main_queue(), ^{ - NSAlert *alert = [[NSAlert alloc] init]; - [alert setMessageText:NSLocalizedString(@"Internal Error.", @"")]; - [alert runModal]; - [alert release]; - }); - } - - fprintf(stderr, "error: %s\n", errmsg); -} int main(int argc, const char **argv) { @@ -39,8 +21,5 @@ int main(int argc, const char **argv) action.sa_handler = SIG_IGN; sigaction(SIGINT, &action, NULL); - hb_global_init(); - hb_register_error_handler(&hb_error_handler); - return NSApplicationMain(argc, argv); } |