diff --git a/extras/package/macosx/VLC.xcodeproj/project.pbxproj b/extras/package/macosx/VLC.xcodeproj/project.pbxproj index 3e28d52b18e3bdfd64f41927cc701369d70968e5..2a3dcdcb9d65c42242a0bf9d5a8396a8322d31f9 100644 --- a/extras/package/macosx/VLC.xcodeproj/project.pbxproj +++ b/extras/package/macosx/VLC.xcodeproj/project.pbxproj @@ -137,6 +137,7 @@ 7D903EAF224392B400917358 /* timespec_get.c in Sources */ = {isa = PBXBuildFile; fileRef = 7D903EAE224392B400917358 /* timespec_get.c */; }; 7D903EB6224394BE00917358 /* specific.c in Sources */ = {isa = PBXBuildFile; fileRef = 7D903EB5224394BE00917358 /* specific.c */; }; 7D903EB92243952100917358 /* threads.c in Sources */ = {isa = PBXBuildFile; fileRef = 7D903EB82243952100917358 /* threads.c */; }; + 7D93D8FC2316C2DC001C0063 /* VLCCustomCropArWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D93D8FB2316C2DC001C0063 /* VLCCustomCropArWindowController.m */; }; 7DB40D2A20CBCEB500F63173 /* VLCMainMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DB40D2920CBCEB500F63173 /* VLCMainMenu.m */; }; 7DB40D2D20CBCEC200F63173 /* VLCStatusBarIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DB40D2B20CBCEC200F63173 /* VLCStatusBarIcon.m */; }; 7DB7F1EC20CC036D00C2CAED /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7DB7F1EB20CC036D00C2CAED /* AudioUnit.framework */; }; @@ -527,6 +528,9 @@ 7D903EAE224392B400917358 /* timespec_get.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = timespec_get.c; path = ../../../../compat/timespec_get.c; sourceTree = "<group>"; }; 7D903EB5224394BE00917358 /* specific.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = specific.c; path = ../../../src/darwin/specific.c; sourceTree = "<group>"; }; 7D903EB82243952100917358 /* threads.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = threads.c; path = ../../../../src/misc/threads.c; sourceTree = "<group>"; }; + 7D93D8F92316C142001C0063 /* VLCCustomCropARPanel.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VLCCustomCropARPanel.xib; sourceTree = "<group>"; }; + 7D93D8FA2316C2DC001C0063 /* VLCCustomCropArWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCCustomCropArWindowController.h; sourceTree = "<group>"; }; + 7D93D8FB2316C2DC001C0063 /* VLCCustomCropArWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCCustomCropArWindowController.m; sourceTree = "<group>"; }; 7DB40D2820CBCEB500F63173 /* VLCMainMenu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCMainMenu.h; sourceTree = "<group>"; }; 7DB40D2920CBCEB500F63173 /* VLCMainMenu.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCMainMenu.m; sourceTree = "<group>"; }; 7DB40D2B20CBCEC200F63173 /* VLCStatusBarIcon.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCStatusBarIcon.m; sourceTree = "<group>"; }; @@ -1105,6 +1109,8 @@ CC461F6D160078340022423C /* VLCTextfieldPanelController.m */, 1C7CB91A1D787E7600388902 /* VLCPopupPanelController.h */, 1C7CB91B1D787E7600388902 /* VLCPopupPanelController.m */, + 7D93D8FA2316C2DC001C0063 /* VLCCustomCropArWindowController.h */, + 7D93D8FB2316C2DC001C0063 /* VLCCustomCropArWindowController.m */, ); path = dialogs; sourceTree = "<group>"; @@ -1540,6 +1546,7 @@ 7DF14FBC2270CB1C0008ABE4 /* VLCMediaSourceDeviceCollectionViewItem.xib */, 6B82241A1E4D2A9000833BE1 /* VLCStatusBarIconMainMenu.xib */, 6B8224181E4D2A9000833BE1 /* VLCFullScreenPanel.xib */, + 7D93D8F92316C142001C0063 /* VLCCustomCropARPanel.xib */, 6B8223FE1E4D2A8F00833BE1 /* About.xib */, 6B8223FF1E4D2A9000833BE1 /* AddonManager.xib */, 6B8224001E4D2A9000833BE1 /* AudioEffects.xib */, @@ -1707,6 +1714,7 @@ 7DFBDCB7226CDFD600B700A5 /* VLCImageView.m in Sources */, 7D404ABF2281892C00B28EF4 /* NSView+VLCAdditions.m in Sources */, 7DE9C7DD220728420089108F /* VLCPlayerController.m in Sources */, + 7D93D8FC2316C2DC001C0063 /* VLCCustomCropArWindowController.m in Sources */, 1C3113941E508C6900D4DD76 /* VLCAddonsWindowController.m in Sources */, 7D2E0EDE20CD206F0033A221 /* VLCVideoWindowCommon.m in Sources */, 1C3113961E508C6900D4DD76 /* applescript.m in Sources */, diff --git a/modules/gui/macosx/Makefile.am b/modules/gui/macosx/Makefile.am index ef6db51d54403e6ec0d0393d9b7a76d568bae5b3..83f23d9337e85cecb0713270d046ed12624b75f5 100644 --- a/modules/gui/macosx/Makefile.am +++ b/modules/gui/macosx/Makefile.am @@ -133,6 +133,8 @@ libmacosx_plugin_la_SOURCES = \ gui/macosx/panels/VLCVideoEffectsWindowController.m \ gui/macosx/panels/dialogs/VLCCoreDialogProvider.h \ gui/macosx/panels/dialogs/VLCCoreDialogProvider.m \ + gui/macosx/panels/dialogs/VLCCustomCropArWindowController.h \ + gui/macosx/panels/dialogs/VLCCustomCropArWindowController.m \ gui/macosx/panels/dialogs/VLCPopupPanelController.h \ gui/macosx/panels/dialogs/VLCPopupPanelController.m \ gui/macosx/panels/dialogs/VLCResumeDialogController.h \ @@ -269,6 +271,7 @@ libmacosx_plugin_la_XIB_SOURCES = \ gui/macosx/UI/Help.xib \ gui/macosx/UI/LogMessageWindow.xib \ gui/macosx/UI/MainMenu.xib \ + gui/macosx/UI/VLCCustomCropARPanel.xib \ gui/macosx/UI/VLCLibraryAlbumTableCellView.xib \ gui/macosx/UI/VLCLibraryWindow.xib \ gui/macosx/UI/VLCLibraryTableCellView.xib \ diff --git a/modules/gui/macosx/UI/VLCCustomCropARPanel.xib b/modules/gui/macosx/UI/VLCCustomCropARPanel.xib new file mode 100644 index 0000000000000000000000000000000000000000..9936dc56351cef75c1ff1ab8334326661728ddf3 --- /dev/null +++ b/modules/gui/macosx/UI/VLCCustomCropARPanel.xib @@ -0,0 +1,125 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> + <dependencies> + <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> + </dependencies> + <objects> + <customObject id="-2" userLabel="File's Owner" customClass="VLCCustomCropArWindowController"> + <connections> + <outlet property="applyButton" destination="ggs-u2-5DB" id="KYB-GX-w4R"/> + <outlet property="cancelButton" destination="J1x-uo-ZpT" id="oVQ-qk-o98"/> + <outlet property="denominatorTextField" destination="Smg-Kh-Pjv" id="WhX-dO-loi"/> + <outlet property="numeratorTextField" destination="KFt-K5-ogc" id="dE7-LF-UfA"/> + <outlet property="titleLabel" destination="bB6-Le-Ilg" id="MQv-r9-Qdw"/> + <outlet property="window" destination="Fqe-af-Tt9" id="u4H-rX-p0W"/> + </connections> + </customObject> + <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> + <customObject id="-3" userLabel="Application" customClass="NSObject"/> + <window title="Custom Crop" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="Fqe-af-Tt9" userLabel="CustomCropAr"> + <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> + <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> + <rect key="contentRect" x="429" y="553" width="265" height="110"/> + <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1177"/> + <view key="contentView" id="NrR-3A-NOR"> + <rect key="frame" x="0.0" y="0.0" width="265" height="122"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <subviews> + <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="bB6-Le-Ilg" userLabel="Testlabel"> + <rect key="frame" x="86" y="99" width="93" height="17"/> + <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="Custom Crop" id="vXn-nw-Nrc"> + <font key="font" metaFont="systemBold"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + </textField> + <textField verticalHuggingPriority="750" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Smg-Kh-Pjv" userLabel="Mins Text Field"> + <rect key="frame" x="145" y="59" width="33" height="22"/> + <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="center" title="0" drawsBackground="YES" id="2wj-p0-8uH"> + <font key="font" metaFont="system"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <outlet property="nextKeyView" destination="J1x-uo-ZpT" id="jSh-vr-TWH"/> + </connections> + </textField> + <textField verticalHuggingPriority="750" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KFt-K5-ogc" userLabel="Hours Text Field"> + <rect key="frame" x="87" y="59" width="33" height="22"/> + <constraints> + <constraint firstAttribute="width" constant="33" id="xwZ-sK-Qq8"/> + </constraints> + <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="center" title="0" drawsBackground="YES" id="UWz-WZ-unY"> + <font key="font" metaFont="system"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + <connections> + <outlet property="nextKeyView" destination="Smg-Kh-Pjv" id="OlL-xH-Oc6"/> + </connections> + </textField> + <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="vW2-B8-0jf" userLabel="Testlabel"> + <rect key="frame" x="126" y="62" width="13" height="17"/> + <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title=":" id="OUw-pe-eva"> + <font key="font" metaFont="systemBold"/> + <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + </textField> + <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ggs-u2-5DB"> + <rect key="frame" x="176" y="13" width="75" height="32"/> + <buttonCell key="cell" type="push" title="Apply" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="1nM-QF-enb"> + <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> + <font key="font" metaFont="system"/> + <string key="keyEquivalent" base64-UTF8="YES"> +DQ +</string> + </buttonCell> + <connections> + <action selector="buttonPressed:" target="-2" id="irY-sT-eAB"/> + <outlet property="nextKeyView" destination="KFt-K5-ogc" id="SZR-3a-Nhx"/> + </connections> + </button> + <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="J1x-uo-ZpT"> + <rect key="frame" x="94" y="13" width="82" height="32"/> + <buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="AHd-5X-fcR"> + <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> + <font key="font" metaFont="system"/> + <string key="keyEquivalent" base64-UTF8="YES"> +Gw +</string> + </buttonCell> + <connections> + <action selector="buttonPressed:" target="-2" id="dp8-L6-N7m"/> + <outlet property="nextKeyView" destination="ggs-u2-5DB" id="tW3-MQ-uef"/> + </connections> + </button> + </subviews> + <constraints> + <constraint firstAttribute="trailing" secondItem="ggs-u2-5DB" secondAttribute="trailing" constant="20" id="1W0-1s-3gv"/> + <constraint firstItem="KFt-K5-ogc" firstAttribute="width" secondItem="Smg-Kh-Pjv" secondAttribute="width" id="24N-1L-5Qx"/> + <constraint firstItem="Smg-Kh-Pjv" firstAttribute="centerY" secondItem="vW2-B8-0jf" secondAttribute="centerY" id="2mI-T4-igU"/> + <constraint firstItem="J1x-uo-ZpT" firstAttribute="top" secondItem="Smg-Kh-Pjv" secondAttribute="bottom" constant="18" id="4tw-eG-Guy"/> + <constraint firstItem="ggs-u2-5DB" firstAttribute="centerY" secondItem="J1x-uo-ZpT" secondAttribute="centerY" id="5tD-9J-E96"/> + <constraint firstAttribute="bottom" secondItem="ggs-u2-5DB" secondAttribute="bottom" constant="20" id="8kZ-L4-ND0"/> + <constraint firstItem="bB6-Le-Ilg" firstAttribute="top" secondItem="NrR-3A-NOR" secondAttribute="top" constant="6" id="AmG-Sh-CJP"/> + <constraint firstItem="Smg-Kh-Pjv" firstAttribute="leading" secondItem="vW2-B8-0jf" secondAttribute="trailing" constant="8" id="OEg-PS-VM3"/> + <constraint firstItem="ggs-u2-5DB" firstAttribute="leading" secondItem="J1x-uo-ZpT" secondAttribute="trailing" constant="12" id="aCf-3u-Xfg"/> + <constraint firstItem="vW2-B8-0jf" firstAttribute="centerX" secondItem="NrR-3A-NOR" secondAttribute="centerX" id="ddl-Ly-MTh"/> + <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="bB6-Le-Ilg" secondAttribute="trailing" constant="20" symbolic="YES" id="epj-mp-Lnm"/> + <constraint firstItem="bB6-Le-Ilg" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="NrR-3A-NOR" secondAttribute="leading" constant="20" symbolic="YES" id="j6a-V4-oje"/> + <constraint firstItem="KFt-K5-ogc" firstAttribute="centerY" secondItem="vW2-B8-0jf" secondAttribute="centerY" id="kWs-Sa-960"/> + <constraint firstItem="Smg-Kh-Pjv" firstAttribute="baseline" secondItem="KFt-K5-ogc" secondAttribute="baseline" id="mOE-Qf-1wF"/> + <constraint firstItem="KFt-K5-ogc" firstAttribute="top" secondItem="bB6-Le-Ilg" secondAttribute="bottom" constant="18" id="oqx-8I-mgW"/> + <constraint firstItem="vW2-B8-0jf" firstAttribute="leading" secondItem="KFt-K5-ogc" secondAttribute="trailing" constant="8" id="sHD-Ov-r3y"/> + <constraint firstItem="bB6-Le-Ilg" firstAttribute="centerX" secondItem="NrR-3A-NOR" secondAttribute="centerX" id="uga-pS-4jS"/> + </constraints> + </view> + <connections> + <outlet property="initialFirstResponder" destination="KFt-K5-ogc" id="RUn-tc-Qvg"/> + </connections> + <point key="canvasLocation" x="146.5" y="157"/> + </window> + </objects> +</document> diff --git a/modules/gui/macosx/menus/VLCMainMenu.m b/modules/gui/macosx/menus/VLCMainMenu.m index c90e1e7caad618042e6c260cf55a6dbc08e7a4a1..d869b1a637e9d885396e5910ce86e0cd0c8010a2 100644 --- a/modules/gui/macosx/menus/VLCMainMenu.m +++ b/modules/gui/macosx/menus/VLCMainMenu.m @@ -37,6 +37,7 @@ #import "panels/VLCVideoEffectsWindowController.h" #import "panels/VLCBookmarksWindowController.h" #import "panels/dialogs/VLCCoreDialogProvider.h" +#import "panels/dialogs/VLCCustomCropArWindowController.h" #import "panels/VLCInformationWindowController.h" #import "panels/VLCTimeSelectionPanelController.h" @@ -106,6 +107,7 @@ typedef NS_ENUM(NSInteger, VLCObjectType) { NSMenu *_playlistTableColumnsContextMenu; __strong VLCTimeSelectionPanelController *_timeSelectionPanel; + __strong VLCCustomCropArWindowController *_customARController; } @end @@ -647,12 +649,14 @@ typedef NS_ENUM(NSInteger, VLCObjectType) { objectType:VLCObjectTypeVout var:"aspect-ratio" selector:@selector(toggleVar:)]; + [self appendCustomizationItem:_aspect_ratio]; [self setupVarMenuItem:_crop target:VLC_OBJECT(p_vout) objectType:VLCObjectTypeVout var:"crop" selector:@selector(toggleVar:)]; + [self appendCustomizationItem:_crop]; [self setupVarMenuItem:_deinterlace target:VLC_OBJECT(p_vout) @@ -1619,7 +1623,6 @@ typedef NS_ENUM(NSInteger, VLCObjectType) { free(text); } - - (void)setupVarMenu:(NSMenu *)menu forMenuItem:(NSMenuItem *)parent target:(vlc_object_t *)p_object @@ -1772,6 +1775,49 @@ typedef NS_ENUM(NSInteger, VLCObjectType) { } } +#pragma mark - crop and AR customization + +- (void)appendCustomizationItem:(NSMenuItem *)menuItem +{ + NSMenu *submenu = menuItem.submenu; + NSMenuItem *customizationItem = [[NSMenuItem alloc] initWithTitle:_NS("Custom") + action:menuItem == _aspect_ratio ? @selector(performCustomAspectRatio:) : @selector(performCustomCrop:) + keyEquivalent:@""]; + [customizationItem setTarget:self]; + [submenu addItem:[NSMenuItem separatorItem]]; + [submenu addItem:customizationItem]; +} + +- (void)performCustomCropOrAspectRatioActionWithVariable:(const char *)variable andl10nString:(NSString *)l10nString +{ + if (!_customARController) { + _customARController = [[VLCCustomCropArWindowController alloc] init]; + } + _customARController.title = l10nString; + [_customARController runModalForWindow:[NSApp mainWindow] + completionHandler:^(NSInteger returnCode, NSString * _Nonnull geometry) { + if (returnCode != NSModalResponseOK) { + return; + } + + vout_thread_t *p_vout = [self->_playerController videoOutputThreadForKeyWindow]; + if (p_vout) { + var_SetString(p_vout, variable, [geometry UTF8String]); + vout_Release(p_vout); + } + }]; +} + +- (void)performCustomAspectRatio:(id)sender +{ + [self performCustomCropOrAspectRatioActionWithVariable:"aspect-ratio" andl10nString:_NS("Aspect Ratio")]; +} + +- (void)performCustomCrop:(id)sender +{ + [self performCustomCropOrAspectRatioActionWithVariable:"crop" andl10nString:_NS("Crop")]; +} + #pragma mark - menu delegation - (void)menuWillOpen:(NSMenu *)menu diff --git a/modules/gui/macosx/panels/dialogs/VLCCustomCropArWindowController.h b/modules/gui/macosx/panels/dialogs/VLCCustomCropArWindowController.h new file mode 100644 index 0000000000000000000000000000000000000000..b01723217a11477fe56519dba7e39efea8da8c63 --- /dev/null +++ b/modules/gui/macosx/panels/dialogs/VLCCustomCropArWindowController.h @@ -0,0 +1,52 @@ +/***************************************************************************** + * VLCCustomCropArWindowController.h: Controller for custom crop / AR panel + ***************************************************************************** + * Copyright (C) 2019 VideoLAN and authors + * Author: Felix Paul Kühne <fkuehne # videolan.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#import <Cocoa/Cocoa.h> + +NS_ASSUME_NONNULL_BEGIN + +@interface VLCCustomCropArWindowController : NSWindowController + +@property (readwrite, weak) IBOutlet NSButton *cancelButton; +@property (readwrite, weak) IBOutlet NSButton *applyButton; +@property (readwrite, weak) IBOutlet NSTextField *titleLabel; +@property (readwrite, weak) IBOutlet NSTextField *numeratorTextField; +@property (readwrite, weak) IBOutlet NSTextField *denominatorTextField; +@property (readwrite, retain) NSString *title; + +- (IBAction)buttonPressed:(id)sender; + +/** + * \param returnCode Result from panel. Can be NSModalResponseOK or NSModalResponseCancel. + * \param geometry Geometry based on numbers entered in panel + */ +typedef void(^CustomCropArCompletionHandler)(NSInteger returnCode, NSString *geometry); + +/** + * Shows the panel as a modal dialog with window as its owner. + * \param window Parent window for the dialog. + * \param handler Completion block. + */ +- (void)runModalForWindow:(NSWindow *)window completionHandler:(CustomCropArCompletionHandler)handler; + +@end + +NS_ASSUME_NONNULL_END diff --git a/modules/gui/macosx/panels/dialogs/VLCCustomCropArWindowController.m b/modules/gui/macosx/panels/dialogs/VLCCustomCropArWindowController.m new file mode 100644 index 0000000000000000000000000000000000000000..026d85563aba5c1d921b6a9c1f84fb5ac1f3f199 --- /dev/null +++ b/modules/gui/macosx/panels/dialogs/VLCCustomCropArWindowController.m @@ -0,0 +1,63 @@ +/***************************************************************************** + * VLCCustomCropArWindowController.m: Controller for custom crop / AR panel + ***************************************************************************** + * Copyright (C) 2019 VideoLAN and authors + * Author: Felix Paul Kühne <fkuehne # videolan.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#import "VLCCustomCropArWindowController.h" +#import "extensions/NSString+Helpers.h" + +@interface VLCCustomCropArWindowController () +{ + CustomCropArCompletionHandler _completionHandler; +} +@end + +@implementation VLCCustomCropArWindowController + +- (instancetype)init +{ + self = [super initWithWindowNibName:@"VLCCustomCropARPanel"]; + return self; +} + +- (void)windowDidLoad { + [super windowDidLoad]; + + [_applyButton setTitle:_NS("Apply")]; + [_cancelButton setTitle:_NS("Cancel")]; + [_titleLabel setStringValue:self.title]; +} + +- (void)buttonPressed:(id)sender +{ + [self.window orderOut:sender]; + [NSApp endSheet: self.window]; + NSString *geometry = [NSString stringWithFormat:@"%@:%@", _numeratorTextField.stringValue, _denominatorTextField.stringValue]; + + if (_completionHandler) + _completionHandler(sender == _applyButton ? NSModalResponseOK : NSModalResponseCancel, geometry); +} + +- (void)runModalForWindow:(NSWindow *)window completionHandler:(CustomCropArCompletionHandler)handler +{ + _completionHandler = handler; + [window beginSheet:self.window completionHandler:nil]; +} + +@end diff --git a/po/POTFILES.in b/po/POTFILES.in index 6552e071a289935f07ca5c6c24a48ade2c3b775f..5cecd6ccd51ac213c11d8b0091d0ec10075366e0 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -539,6 +539,8 @@ modules/gui/macosx/panels/VLCVideoEffectsWindowController.h modules/gui/macosx/panels/VLCVideoEffectsWindowController.m modules/gui/macosx/panels/dialogs/VLCCoreDialogProvider.h modules/gui/macosx/panels/dialogs/VLCCoreDialogProvider.m +modules/gui/macosx/panels/dialogs/VLCCustomCropArWindowController.h +modules/gui/macosx/panels/dialogs/VLCCustomCropArWindowController.m modules/gui/macosx/panels/dialogs/VLCPopupPanelController.h modules/gui/macosx/panels/dialogs/VLCPopupPanelController.m modules/gui/macosx/panels/dialogs/VLCResumeDialogController.h