/* HBAddPresetController.m
This file is part of the HandBrake source code.
Homepage: .
It may be used under the terms of the GNU General Public License. */
#import "HBAddPresetController.h"
#import "HBAddCategoryController.h"
#import "HBAudioDefaultsController.h"
#import "HBSubtitlesDefaultsController.h"
@interface HBAddPresetController ()
@property (nonatomic, unsafe_unretained) IBOutlet NSTextField *name;
@property (nonatomic, unsafe_unretained) IBOutlet NSTextField *desc;
@property (nonatomic, unsafe_unretained) IBOutlet NSPopUpButton *categories;
@property (nonatomic, unsafe_unretained) IBOutlet NSPopUpButton *picSettingsPopUp;
@property (nonatomic, unsafe_unretained) IBOutlet NSTextField *picWidth;
@property (nonatomic, unsafe_unretained) IBOutlet NSTextField *picHeight;
@property (nonatomic, unsafe_unretained) IBOutlet NSView *picWidthHeightBox;
@property (nonatomic, strong) HBPreset *preset;
@property (nonatomic, strong) HBMutablePreset *mutablePreset;
@property (nonatomic, strong) HBPreset *selectedCategory;
@property (nonatomic, strong) HBPresetsManager *manager;
@property (nonatomic) int width;
@property (nonatomic) int height;
@property (nonatomic) HBPictureResolutionLimitMode resolutionLimitMode;
@property (nonatomic, readwrite, strong) NSWindowController *defaultsController;
@end
@implementation HBAddPresetController
- (instancetype)initWithPreset:(HBPreset *)preset presetManager:(HBPresetsManager *)manager customWidth:(int)customWidth customHeight:(int)customHeight resolutionLimitMode:(HBPictureResolutionLimitMode)resolutionLimitMode
{
self = [super initWithWindowNibName:@"AddPreset"];
if (self)
{
NSParameterAssert(preset);
_mutablePreset = [preset mutableCopy];
[_mutablePreset resetBuiltInAndDefaultState];
_manager = manager;
_width = customWidth;
_height = customHeight;
_resolutionLimitMode = resolutionLimitMode;
}
return self;
}
- (void)windowDidLoad {
[super windowDidLoad];
// Build the categories menu, and select the first
[self buildCategoriesMenu];
if ([self.categories selectItemWithTag:2] == NO)
{
HBPreset *category = [[HBPreset alloc] initWithCategoryName:@"My Presets" builtIn:NO];
[self.manager addPreset:category];
NSMenuItem *item = [self buildMenuItemWithCategory:category];
[self.categories.menu insertItem:item atIndex:2];
[self.categories selectItemWithTag:2];
}
self.selectedCategory = self.categories.selectedItem.representedObject;
// Populate the preset picture settings popup.
// Use [NSMenuItem tag] to store preset values for each option.
[self.picSettingsPopUp addItemWithTitle:NSLocalizedString(@"None", @"Add preset window -> picture setting")];
[self.picSettingsPopUp.lastItem setTag:HBPictureResolutionLimitModeNone];
[self.picSettingsPopUp addItemWithTitle:NSLocalizedString(@"4320p 8K Ultra HD", @"Add preset window -> picture setting")];
[self.picSettingsPopUp.lastItem setTag:HBPictureResolutionLimitMode8K];
[self.picSettingsPopUp addItemWithTitle:NSLocalizedString(@"2160p 4K Ultra HD", @"Add preset window -> picture setting")];
[self.picSettingsPopUp.lastItem setTag:HBPictureResolutionLimitMode4K];
[self.picSettingsPopUp addItemWithTitle:NSLocalizedString(@"1080p HD", @"Add preset window -> picture setting")];
[self.picSettingsPopUp.lastItem setTag:HBPictureResolutionLimitMode1080p];
[self.picSettingsPopUp addItemWithTitle:NSLocalizedString(@"720p HD", @"Add preset window -> picture setting")];
[self.picSettingsPopUp.lastItem setTag:HBPictureResolutionLimitMode720p];
[self.picSettingsPopUp addItemWithTitle:NSLocalizedString(@"576p PAL SD", @"Add preset window -> picture setting")];
[self.picSettingsPopUp.lastItem setTag:HBPictureResolutionLimitMode576p];
[self.picSettingsPopUp addItemWithTitle:NSLocalizedString(@"480p NTSC SD", @"Add preset window -> picture setting")];
[self.picSettingsPopUp.lastItem setTag:HBPictureResolutionLimitMode480p];
[self.picSettingsPopUp addItemWithTitle:NSLocalizedString(@"Custom", @"Add preset window -> picture setting")];
[self.picSettingsPopUp.lastItem setTag:HBPictureResolutionLimitModeCustom];
[self.picSettingsPopUp selectItemWithTag:self.resolutionLimitMode];
// Initialize custom height and width settings to current values
[self.picWidth setIntValue:self.width];
[self.picHeight setIntValue:self.height];
[self addPresetPicDropdownChanged:nil];
}
/**
* Adds the presets list to the menu.
*/
- (void)buildCategoriesMenu
{
for (HBPreset *preset in self.manager.root.children)
{
if (preset.isBuiltIn == NO && preset.isLeaf == NO)
{
[self.categories.menu addItem:[self buildMenuItemWithCategory:preset]];
}
}
}
- (NSMenuItem *)buildMenuItemWithCategory:(HBPreset *)preset
{
NSMenuItem *item = [[NSMenuItem alloc] init];
item.title = preset.name;
item.toolTip = preset.presetDescription;
item.tag = 2;
item.action = @selector(selectCategoryFromMenu:);
item.representedObject = preset;
return item;
}
- (IBAction)showNewCategoryWindow:(id)sender
{
HBAddCategoryController *addCategoryController = [[HBAddCategoryController alloc] initWithPresetManager:self.manager];
[self.window beginSheet:addCategoryController.window completionHandler:^(NSModalResponse returnCode) {
if (returnCode == NSModalResponseOK)
{
NSMenuItem *item = [self buildMenuItemWithCategory:addCategoryController.category];
[self.categories.menu insertItem:item atIndex:2];
}
[self.categories selectItemWithTag:2];
[self selectCategoryFromMenu:self.categories.selectedItem];
}];
}
- (IBAction)selectCategoryFromMenu:(NSMenuItem *)sender
{
self.selectedCategory = sender.representedObject;
}
- (IBAction)addPresetPicDropdownChanged:(id)sender
{
self.picWidthHeightBox.hidden = self.picSettingsPopUp.selectedItem.tag != HBPictureResolutionLimitModeCustom;
}
- (IBAction)showAudioSettingsSheet:(id)sender
{
HBAudioDefaults *defaults = [[HBAudioDefaults alloc] init];
[defaults applyPreset:self.mutablePreset];
self.defaultsController = [[HBAudioDefaultsController alloc] initWithSettings:defaults];
[self.window beginSheet:self.defaultsController.window completionHandler:^(NSModalResponse returnCode) {
if (returnCode == NSModalResponseOK)
{
[defaults writeToPreset:self.mutablePreset];
}
self.defaultsController = nil;
}];
}
- (IBAction)showSubtitlesSettingsSheet:(id)sender
{
HBSubtitlesDefaults *defaults = [[HBSubtitlesDefaults alloc] init];
[defaults applyPreset:self.mutablePreset];
self.defaultsController = [[HBSubtitlesDefaultsController alloc] initWithSettings:defaults];
[self.window beginSheet:self.defaultsController.window completionHandler:^(NSModalResponse returnCode) {
if (returnCode == NSModalResponseOK)
{
[defaults writeToPreset:self.mutablePreset];
}
self.defaultsController = nil;
}];
}
- (IBAction)add:(id)sender
{
if (self.name.stringValue.length == 0)
{
NSAlert *alert = [[NSAlert alloc] init];
[alert setMessageText:NSLocalizedString(@"The preset name cannot be empty.", @"Add preset window -> name alert message")];
[alert setInformativeText:NSLocalizedString(@"Please enter a name.", @"Add preset window -> name alert informative text")];
[alert runModal];
}
else
{
HBMutablePreset *newPreset = self.mutablePreset;
newPreset.name = self.name.stringValue;
newPreset.presetDescription = self.desc.stringValue;
switch (self.picSettingsPopUp.selectedTag) {
case HBPictureResolutionLimitModeNone:
newPreset[@"PictureWidth"] = @(0);
newPreset[@"PictureHeight"] = @(0);
break;
case HBPictureResolutionLimitMode8K:
newPreset[@"PictureWidth"] = @(7680);
newPreset[@"PictureHeight"] = @(4320);
break;
case HBPictureResolutionLimitMode4K:
newPreset[@"PictureWidth"] = @(3840);
newPreset[@"PictureHeight"] = @(2160);
break;
case HBPictureResolutionLimitMode1080p:
newPreset[@"PictureWidth"] = @(1920);
newPreset[@"PictureHeight"] = @(1080);
break;
case HBPictureResolutionLimitMode720p:
newPreset[@"PictureWidth"] = @(1280);
newPreset[@"PictureHeight"] = @(720);
break;
case HBPictureResolutionLimitMode576p:
newPreset[@"PictureWidth"] = @(720);
newPreset[@"PictureHeight"] = @(576);
break;
case HBPictureResolutionLimitMode480p:
newPreset[@"PictureWidth"] = @(720);
newPreset[@"PictureHeight"] = @(480);
break;
case HBPictureResolutionLimitModeCustom:
default:
newPreset[@"PictureWidth"] = @(self.picWidth.integerValue);
newPreset[@"PictureHeight"] = @(self.picHeight.integerValue);
break;
}
// Always use Picture Filter settings for the preset
newPreset[@"UsesPictureFilters"] = @YES;
[newPreset cleanUp];
self.preset = [newPreset copy];
[self.selectedCategory insertObject:self.preset inChildrenAtIndex:self.selectedCategory.countOfChildren];
[self.window.sheetParent endSheet:self.window returnCode:NSModalResponseOK];
}
}
- (IBAction)cancel:(id)sender
{
[self.window.sheetParent endSheet:self.window returnCode:NSModalResponseCancel];
}
- (IBAction)openUserGuide:(id)sender
{
[[NSWorkspace sharedWorkspace] openURL:[HBUtilities.documentationURL URLByAppendingPathComponent:@"advanced/custom-presets.html"]];
}
@end
@interface HBAddPresetController (TouchBar)
@end
@implementation HBAddPresetController (TouchBar)
@dynamic touchBar;
static NSTouchBarItemIdentifier HBTouchBarGroup = @"fr.handbrake.buttonsGroup";
static NSTouchBarItemIdentifier HBTouchBarAdd = @"fr.handbrake.openSource";
static NSTouchBarItemIdentifier HBTouchBarCancel = @"fr.handbrake.addToQueue";
- (NSTouchBar *)makeTouchBar
{
NSTouchBar *bar = [[NSTouchBar alloc] init];
bar.delegate = self;
bar.defaultItemIdentifiers = @[NSTouchBarItemIdentifierOtherItemsProxy, HBTouchBarGroup];
bar.principalItemIdentifier = HBTouchBarGroup;
return bar;
}
- (NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier
{
if ([identifier isEqualTo:HBTouchBarGroup])
{
NSCustomTouchBarItem *cancelItem = [[NSCustomTouchBarItem alloc] initWithIdentifier:HBTouchBarAdd];
cancelItem.customizationLabel = NSLocalizedString(@"Cancel", @"Touch bar");
NSButton *cancelButton = [NSButton buttonWithTitle:NSLocalizedString(@"Cancel", @"Touch bar") target:self action:@selector(cancel:)];
[cancelButton.widthAnchor constraintGreaterThanOrEqualToConstant:160].active = YES;
cancelItem.view = cancelButton;
NSCustomTouchBarItem *addItem = [[NSCustomTouchBarItem alloc] initWithIdentifier:HBTouchBarCancel];
addItem.customizationLabel = NSLocalizedString(@"Add Preset", @"Touch bar");
NSButton *addButton = [NSButton buttonWithTitle:NSLocalizedString(@"Add Preset", @"Touch bar") target:self action:@selector(add:)];
[addButton.widthAnchor constraintGreaterThanOrEqualToConstant:160].active = YES;
addButton.keyEquivalent = @"\r";
addItem.view = addButton;
NSGroupTouchBarItem *item = [NSGroupTouchBarItem groupItemWithIdentifier:identifier items:@[cancelItem, addItem]];
return item;
}
return nil;
}
@end