[vlc-commits] [Git][videolan/vlc][master] 13 commits: macosx: Add starter classic-style video playback view
Felix Paul Kühne (@fkuehne)
gitlab at videolan.org
Wed Sep 17 12:40:55 UTC 2025
Felix Paul Kühne pushed to branch master at VideoLAN / VLC
Commits:
bd0918a5 by Claudio Cambra at 2025-09-17T11:44:43+00:00
macosx: Add starter classic-style video playback view
- - - - -
175d52f7 by Claudio Cambra at 2025-09-17T11:44:43+00:00
macosx: Do not instantiate the video view controller twice
- - - - -
9ef9a3bc by Claudio Cambra at 2025-09-17T11:44:43+00:00
macosx: Add fake titlebar to classic main video view
- - - - -
c754bd18 by Claudio Cambra at 2025-09-17T11:44:43+00:00
macosx: Add settings option to switch between new and classic video player layout
- - - - -
981fa2e2 by Claudio Cambra at 2025-09-17T11:44:43+00:00
macosx: Fix time fields in classic main video view
- - - - -
1623981d by Claudio Cambra at 2025-09-17T11:44:43+00:00
macosx: Add separator line to top of classic main video view bottom bar
- - - - -
4fbbc9e1 by Claudio Cambra at 2025-09-17T11:44:43+00:00
macosx: Fix positioning and showing/hiding of important elements in classic main video view
- - - - -
b7070cfe by Claudio Cambra at 2025-09-17T11:44:43+00:00
macosx: Fix reopening video view not applying constraints as expected in classic mode
- - - - -
623117a7 by Claudio Cambra at 2025-09-17T11:44:43+00:00
macosx: Adjust video view bottom constraints when showing or hiding the controls bar in the classic video view
- - - - -
1800879f by Claudio Cambra at 2025-09-17T11:44:43+00:00
macosx: Add visual effect view background to classic main video view bottom controls bar
- - - - -
37c5330c by Claudio Cambra at 2025-09-17T11:44:43+00:00
macosx: Perform classic main video view constraint change outside animation blocks
- - - - -
29bf33e9 by Claudio Cambra at 2025-09-17T11:44:43+00:00
macosx: Ensure the constraint to the bottom bar top in classic main video view is valid after returning the video view
- - - - -
4f9f2690 by Claudio Cambra at 2025-09-17T11:44:43+00:00
macosx: Do not perform show/hide control procedures when vout view was taken
- - - - -
10 changed files:
- extras/package/macosx/VLC.xcodeproj/project.pbxproj
- modules/gui/macosx/Makefile.am
- modules/gui/macosx/UI/SimplePreferences.xib
- + modules/gui/macosx/UI/VLCClassicMainVideoView.xib
- modules/gui/macosx/main/VLCMain.m
- modules/gui/macosx/preferences/VLCSimplePrefsController.h
- modules/gui/macosx/preferences/VLCSimplePrefsController.m
- modules/gui/macosx/windows/video/VLCMainVideoViewController.h
- modules/gui/macosx/windows/video/VLCMainVideoViewController.m
- modules/gui/macosx/windows/video/VLCVideoWindowCommon.m
Changes:
=====================================
extras/package/macosx/VLC.xcodeproj/project.pbxproj
=====================================
@@ -937,6 +937,7 @@
8ED6C28203E2EB1C0059A3A7 /* VLCOpenWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCOpenWindowController.m; sourceTree = "<group>"; };
8ED6C28503E2EB1C0059A3A7 /* prefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prefs.h; sourceTree = "<group>"; };
8ED6C28603E2EB1C0059A3A7 /* prefs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = prefs.m; sourceTree = "<group>"; };
+ CAA639942E6C914000C9A71D /* VLCClassicMainVideoView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = VLCClassicMainVideoView.xib; sourceTree = "<group>"; };
CC0663341566C34C003A411C /* VLCConvertAndSaveWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = VLCConvertAndSaveWindowController.h; sourceTree = "<group>"; };
CC0663351566C34C003A411C /* VLCConvertAndSaveWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = VLCConvertAndSaveWindowController.m; sourceTree = "<group>"; };
CC1941240B9C1F8400635F6B /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = /System/Library/Frameworks/QTKit.framework; sourceTree = "<absolute>"; };
@@ -2188,6 +2189,7 @@
536283FA2911476A00640C15 /* VLCLibrarySongTableCellView.xib */,
7DE2F0482282D7980040DD0A /* VLCLibraryTableCellView.xib */,
534E8E3729A04F95009503F8 /* VLCMainVideoView.xib */,
+ CAA639942E6C914000C9A71D /* VLCClassicMainVideoView.xib */,
7D67318322C8F3F60000AD40 /* VLCMediaSourceCollectionViewItem.xib */,
7DF14FBC2270CB1C0008ABE4 /* VLCMediaSourceDeviceCollectionViewItem.xib */,
530429942DD1ED66004BB598 /* VLCPlaybackEndView.xib */,
=====================================
modules/gui/macosx/Makefile.am
=====================================
@@ -562,6 +562,7 @@ libmacosx_plugin_la_XIB_SOURCES = \
gui/macosx/UI/VLCLibraryHeroView.xib \
gui/macosx/UI/VLCLibraryHomeViewActionsView.xib \
gui/macosx/UI/VLCLibrarySongTableCellView.xib \
+ gui/macosx/UI/VLCClassicMainVideoView.xib \
gui/macosx/UI/VLCMainVideoView.xib \
gui/macosx/UI/VLCMainVideoViewAudioMediaDecorativeView.xib \
gui/macosx/UI/VLCMediaSourceCollectionViewItem.xib \
=====================================
modules/gui/macosx/UI/SimplePreferences.xib
=====================================
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="23504" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="23727" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
- <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="23504"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="23727"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -157,6 +157,7 @@
<outlet property="video_snap_prefixTextField" destination="2474" id="O5Q-MK-Cz3"/>
<outlet property="video_snap_seqnumCheckbox" destination="2476" id="Fa0-ZE-QW9"/>
<outlet property="video_startInFullscreenCheckbox" destination="5Db-fa-Ffw" id="eK9-Wr-Nym"/>
+ <outlet property="video_useClassicLayoutCheckbox" destination="6yQ-ig-eP0" id="2Yd-Dh-NMh"/>
<outlet property="video_videoBox" destination="3722" id="bRq-1u-kBT"/>
<outlet property="video_videodecoCheckbox" destination="3728" id="yE0-ry-RZA"/>
<outlet property="window" destination="2265" id="mGG-NZ-eoi"/>
@@ -167,7 +168,7 @@
<windowStyleMask key="styleMask" titled="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="105" y="903" width="580" height="620"/>
- <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1025"/>
+ <rect key="screenRect" x="0.0" y="0.0" width="1800" height="1125"/>
<view key="contentView" id="2266">
<rect key="frame" x="0.0" y="0.0" width="580" height="620"/>
<autoresizingMask key="autoresizingMask"/>
@@ -176,7 +177,7 @@
<rect key="frame" x="0.0" y="44" width="580" height="576"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="ecH-Hh-jJF" customClass="VLCSimplePrefsClipView">
<rect key="frame" x="1" y="1" width="578" height="574"/>
- <autoresizingMask key="autoresizingMask"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view translatesAutoresizingMaskIntoConstraints="NO" id="HOX-DS-Fgr" userLabel="content view">
<rect key="frame" x="0.0" y="0.0" width="578" height="574"/>
@@ -286,10 +287,10 @@ Gw
</window>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="2311" userLabel="Interface">
- <rect key="frame" x="0.0" y="-19" width="597" height="549"/>
+ <rect key="frame" x="0.0" y="0.0" width="597" height="573"/>
<subviews>
<box borderType="line" title="General Settings" translatesAutoresizingMaskIntoConstraints="NO" id="kup-aY-Wqq">
- <rect key="frame" x="18" y="397" width="563" height="131"/>
+ <rect key="frame" x="18" y="421" width="563" height="131"/>
<view key="contentView" id="wFl-aV-3Hn">
<rect key="frame" x="4" y="5" width="555" height="111"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -352,13 +353,13 @@ Gw
</view>
</box>
<box borderType="line" title="Playback control" translatesAutoresizingMaskIntoConstraints="NO" id="CZP-ZN-k6p">
- <rect key="frame" x="18" y="328" width="563" height="65"/>
+ <rect key="frame" x="18" y="328" width="563" height="89"/>
<view key="contentView" id="gj4-zO-E26">
- <rect key="frame" x="4" y="5" width="555" height="45"/>
+ <rect key="frame" x="4" y="5" width="555" height="69"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3919">
- <rect key="frame" x="15" y="17" width="117" height="16"/>
+ <rect key="frame" x="15" y="41" width="117" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Continue playback" usesSingleLineMode="YES" id="3923">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -366,7 +367,7 @@ Gw
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3920">
- <rect key="frame" x="144" y="11" width="398" height="25"/>
+ <rect key="frame" x="144" y="35" width="398" height="25"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" inset="2" arrowPosition="arrowAtCenter" preferredEdge="maxY" id="3921">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="message"/>
@@ -848,10 +849,10 @@ Gw
<point key="canvasLocation" x="265.5" y="1003"/>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="2440" userLabel="Video">
- <rect key="frame" x="0.0" y="-20" width="582" height="543"/>
+ <rect key="frame" x="0.0" y="0.0" width="582" height="572"/>
<subviews>
<button mirrorLayoutDirectionWhenInternationalizing="always" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2448">
- <rect key="frame" x="18" y="506" width="106" height="18"/>
+ <rect key="frame" x="18" y="535" width="106" height="18"/>
<buttonCell key="cell" type="check" title="Enable Video" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="3477">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
@@ -861,13 +862,13 @@ Gw
</connections>
</button>
<box verticalHuggingPriority="249" title="Display" translatesAutoresizingMaskIntoConstraints="NO" id="2449">
- <rect key="frame" x="17" y="358" width="548" height="141"/>
+ <rect key="frame" x="17" y="358" width="548" height="170"/>
<view key="contentView" id="eGM-I9-pBb">
- <rect key="frame" x="4" y="5" width="540" height="121"/>
+ <rect key="frame" x="4" y="5" width="540" height="150"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button mirrorLayoutDirectionWhenInternationalizing="always" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2452">
- <rect key="frame" x="15" y="94" width="218" height="18"/>
+ <rect key="frame" x="15" y="123" width="218" height="18"/>
<buttonCell key="cell" type="check" title="Show video within main window" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="3479">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
@@ -876,6 +877,16 @@ Gw
<action selector="videoSettingChanged:" target="-2" id="jdL-pA-9Ed"/>
</connections>
</button>
+ <button mirrorLayoutDirectionWhenInternationalizing="always" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6yQ-ig-eP0">
+ <rect key="frame" x="15" y="95" width="212" height="18"/>
+ <buttonCell key="cell" type="check" title="Use classic video player layout" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="hMN-gu-1VU">
+ <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <connections>
+ <action selector="videoSettingChanged:" target="-2" id="qef-S5-w02"/>
+ </connections>
+ </button>
<button mirrorLayoutDirectionWhenInternationalizing="always" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2451">
<rect key="frame" x="15" y="11" width="111" height="18"/>
<buttonCell key="cell" type="check" title="Always on top" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="3478">
@@ -923,13 +934,15 @@ Gw
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="rpy-5O-tek" secondAttribute="trailing" constant="17" id="B4h-FQ-7aL"/>
<constraint firstItem="2451" firstAttribute="top" secondItem="4a1-oW-HKH" secondAttribute="bottom" constant="12" id="DId-Tv-O07"/>
<constraint firstItem="rpy-5O-tek" firstAttribute="leading" secondItem="2452" secondAttribute="leading" id="KNc-3N-uYy"/>
+ <constraint firstItem="6yQ-ig-eP0" firstAttribute="leading" secondItem="2452" secondAttribute="leading" id="MpH-Rx-aFH"/>
<constraint firstItem="2451" firstAttribute="leading" secondItem="rpy-5O-tek" secondAttribute="leading" id="O89-st-t01"/>
+ <constraint firstItem="6yQ-ig-eP0" firstAttribute="top" secondItem="2452" secondAttribute="bottom" constant="12" id="YMn-dn-aKz"/>
<constraint firstItem="2452" firstAttribute="top" secondItem="eGM-I9-pBb" secondAttribute="top" constant="10" id="Zf8-Vt-ftS"/>
<constraint firstItem="2452" firstAttribute="leading" secondItem="eGM-I9-pBb" secondAttribute="leading" constant="17" id="dxV-cD-quf"/>
<constraint firstAttribute="bottom" secondItem="3728" secondAttribute="bottom" constant="12" id="eDu-6Y-ggq"/>
+ <constraint firstItem="rpy-5O-tek" firstAttribute="top" secondItem="6yQ-ig-eP0" secondAttribute="bottom" constant="12" id="mON-fs-ju4"/>
<constraint firstItem="3728" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="2451" secondAttribute="trailing" constant="17" id="qd2-aN-XVK"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="3728" secondAttribute="trailing" constant="17" id="rDL-Im-FxZ"/>
- <constraint firstItem="rpy-5O-tek" firstAttribute="top" secondItem="2452" secondAttribute="bottom" constant="11" id="rH1-SK-emj"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="2452" secondAttribute="trailing" constant="17" id="tZx-bu-85x"/>
<constraint firstItem="4a1-oW-HKH" firstAttribute="leading" secondItem="rpy-5O-tek" secondAttribute="leading" id="vPv-oH-IkT"/>
</constraints>
@@ -1212,7 +1225,7 @@ Gw
</view>
</box>
<customView hidden="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Hrj-mH-eqd" userLabel="half size helper view">
- <rect key="frame" x="291" y="503" width="271" height="23"/>
+ <rect key="frame" x="291" y="532" width="271" height="23"/>
<constraints>
<constraint firstAttribute="height" constant="23" id="5d3-4W-bXj"/>
</constraints>
@@ -1874,7 +1887,7 @@ Gw
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
- <tableColumn identifier="action" editable="NO" width="297" minWidth="40" maxWidth="1000" id="2671">
+ <tableColumn identifier="action" editable="NO" width="282.5" minWidth="40" maxWidth="1000" id="2671">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Action">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.33333299" alpha="1" colorSpace="calibratedWhite"/>
@@ -1886,7 +1899,7 @@ Gw
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
</tableColumn>
- <tableColumn identifier="shortcut" editable="NO" width="216" minWidth="8" maxWidth="1000" id="2672">
+ <tableColumn identifier="shortcut" editable="NO" width="201.5" minWidth="8" maxWidth="1000" id="2672">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Shortcut">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.33333299" alpha="1" colorSpace="calibratedWhite"/>
@@ -1958,7 +1971,7 @@ Gw
<windowStyleMask key="styleMask" titled="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="433" y="441" width="440" height="170"/>
- <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1025"/>
+ <rect key="screenRect" x="0.0" y="0.0" width="1800" height="1125"/>
<view key="contentView" id="2678">
<rect key="frame" x="0.0" y="0.0" width="440" height="170"/>
<autoresizingMask key="autoresizingMask"/>
@@ -2049,7 +2062,7 @@ Gw
<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="340" y="383" width="485" height="254"/>
- <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1025"/>
+ <rect key="screenRect" x="0.0" y="0.0" width="1800" height="1125"/>
<view key="contentView" id="3746">
<rect key="frame" x="0.0" y="0.0" width="485" height="254"/>
<autoresizingMask key="autoresizingMask"/>
@@ -2384,7 +2397,7 @@ Gw
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
</tableColumn>
- <tableColumn editable="NO" width="200" minWidth="40" maxWidth="1000" id="QBg-HT-Vvb">
+ <tableColumn editable="NO" width="171" minWidth="40" maxWidth="1000" id="QBg-HT-Vvb">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
=====================================
modules/gui/macosx/UI/VLCClassicMainVideoView.xib
=====================================
@@ -0,0 +1,421 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="23727" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+ <dependencies>
+ <deployment version="101000" identifier="macosx"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="23727"/>
+ <capability name="Image references" minToolsVersion="12.0"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <objects>
+ <customObject id="-2" userLabel="File's Owner" customClass="VLCMainVideoViewController">
+ <connections>
+ <outlet property="bottomBarView" destination="5hr-Af-mP0" id="btm-bar-view"/>
+ <outlet property="controlsBar" destination="3" id="Mfq-2w-2uR"/>
+ <outlet property="fakeTitleBar" destination="VIa-0w-fl8" id="EvT-Rx-xF4"/>
+ <outlet property="fakeTitleBarHeightConstraint" destination="amB-S5-eDf" id="NFm-6D-mkF"/>
+ <outlet property="floatOnTopIndicatorImageView" destination="CrW-mq-gge" id="hqR-4Z-a18"/>
+ <outlet property="loadingIndicator" destination="xOQ-YR-iAc" id="CtX-Yo-UX2"/>
+ <outlet property="mainControlsView" destination="main-controls-container" id="yal-ql-KOV"/>
+ <outlet property="playQueueButton" destination="Drq-if-dw4" id="BZe-Cr-mzZ"/>
+ <outlet property="playQueueButtonTopConstraint" destination="queue-btn-top" id="93W-Yu-w5Z"/>
+ <outlet property="playQueueButtonTrailingConstraint" destination="queue-btn-trailing" id="NxJ-O5-Qu5"/>
+ <outlet property="returnButton" destination="UoQ-34-Pox" id="nyY-OF-9zj"/>
+ <outlet property="returnButtonLeadingConstraint" destination="return-btn-leading" id="Ax9-Sl-Imd"/>
+ <outlet property="returnButtonTopConstraint" destination="return-btn-top" id="cHZ-kY-t4E"/>
+ <outlet property="videoViewBottomConstraint" destination="video-to-controls" id="video-bottom-constraint"/>
+ <outlet property="view" destination="WRu-Ic-lQK" id="B9p-x5-Kd8"/>
+ <outlet property="voutContainingView" destination="MTR-ds-I8o" id="cim-tb-1lO"/>
+ <outlet property="voutView" destination="mAS-4a-RS8" id="GeX-XO-HYC"/>
+ </connections>
+ </customObject>
+ <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+ <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+ <customObject id="3" userLabel="Main Video View Controls Bar" customClass="VLCMainVideoViewControlsBar">
+ <connections>
+ <outlet property="backwardButton" destination="V9d-hX-iyg" id="ZFn-jn-7OB"/>
+ <outlet property="floatOnTopButton" destination="8jZ-hd-YVq" id="x53-4o-LsM"/>
+ <outlet property="forwardButton" destination="sF5-Z0-bef" id="H6w-Le-NAK"/>
+ <outlet property="fullscreenButton" destination="dYZ-ri-Kra" id="Cw2-BS-QG9"/>
+ <outlet property="jumpBackwardButton" destination="AXA-01-AU8" id="gfa-Yt-ezI"/>
+ <outlet property="jumpForwardButton" destination="aAq-uE-mLW" id="M7n-mW-tNe"/>
+ <outlet property="muteVolumeButton" destination="afi-4d-rQk" id="y6R-6o-2OM"/>
+ <outlet property="pipButton" destination="yEi-SZ-SIS" id="vFi-Ln-9lT"/>
+ <outlet property="playButton" destination="PCC-8a-sVF" id="ddT-ZM-Jhz"/>
+ <outlet property="timeField" destination="f4v-2z-dQ1" id="7kP-c4-1Rv"/>
+ <outlet property="timeSlider" destination="qNZ-Fh-W8i" id="Fkk-fj-s5Q"/>
+ <outlet property="trailingTimeField" destination="3ri-8b-8mw" id="vrZ-ps-Gkf"/>
+ <outlet property="volumeSlider" destination="fKc-2d-Uu6" id="2pU-fH-Afo"/>
+ </connections>
+ </customObject>
+ <customView appearanceType="darkAqua" translatesAutoresizingMaskIntoConstraints="NO" id="WRu-Ic-lQK">
+ <rect key="frame" x="0.0" y="0.0" width="1027" height="480"/>
+ <subviews>
+ <customView translatesAutoresizingMaskIntoConstraints="NO" id="MTR-ds-I8o" userLabel="Vout Containing View">
+ <rect key="frame" x="0.0" y="38" width="1027" height="442"/>
+ <subviews>
+ <customView translatesAutoresizingMaskIntoConstraints="NO" id="mAS-4a-RS8" customClass="VLCVoutView">
+ <rect key="frame" x="0.0" y="0.0" width="1027" height="442"/>
+ <constraints>
+ <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="288" id="BvW-zM-Gro"/>
+ </constraints>
+ </customView>
+ </subviews>
+ <constraints>
+ <constraint firstItem="mAS-4a-RS8" firstAttribute="leading" secondItem="MTR-ds-I8o" secondAttribute="leading" id="2Ha-xU-Dz8"/>
+ <constraint firstAttribute="trailing" secondItem="mAS-4a-RS8" secondAttribute="trailing" id="3hD-hq-Q3C"/>
+ <constraint firstItem="mAS-4a-RS8" firstAttribute="top" secondItem="MTR-ds-I8o" secondAttribute="top" id="NhJ-5W-ZqG"/>
+ <constraint firstAttribute="bottom" secondItem="mAS-4a-RS8" secondAttribute="bottom" id="xjG-dc-nlA"/>
+ </constraints>
+ </customView>
+ <box boxType="custom" borderType="none" borderWidth="0.0" title="Box" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="main-controls-container">
+ <rect key="frame" x="0.0" y="0.0" width="1027" height="480"/>
+ <view key="contentView" id="main-controls-content">
+ <rect key="frame" x="0.0" y="0.0" width="1027" height="480"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <visualEffectView blendingMode="withinWindow" material="titlebar" state="followsWindowActiveState" translatesAutoresizingMaskIntoConstraints="NO" id="VIa-0w-fl8">
+ <rect key="frame" x="0.0" y="480" width="1027" height="0.0"/>
+ <constraints>
+ <constraint firstAttribute="height" id="amB-S5-eDf"/>
+ </constraints>
+ </visualEffectView>
+ <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="UoQ-34-Pox">
+ <rect key="frame" x="20" y="431" width="22" height="29"/>
+ <shadow key="shadow" blurRadius="2">
+ <color key="color" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </shadow>
+ <buttonCell key="cell" type="recessed" bezelStyle="recessed" imagePosition="only" controlSize="large" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="CU4-UE-tsW">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ <imageReference key="image" image="NSLeftFacingTriangleTemplate" symbolScale="large"/>
+ </buttonCell>
+ <color key="contentTintColor" red="0.99999600649999998" green="1" blue="1" alpha="0.85338267140000001" colorSpace="custom" customColorSpace="sRGB"/>
+ <connections>
+ <action selector="returnToLibrary:" target="-2" id="rnL-S1-zSR"/>
+ </connections>
+ </button>
+ <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Drq-if-dw4">
+ <rect key="frame" x="976" y="431" width="31" height="29"/>
+ <shadow key="shadow" blurRadius="2">
+ <color key="color" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </shadow>
+ <buttonCell key="cell" type="recessed" bezelStyle="recessed" imagePosition="only" controlSize="large" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="VDP-ql-lW8">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="YES"/>
+ <font key="font" metaFont="system"/>
+ <imageReference key="image" image="NSListViewTemplate" symbolScale="large"/>
+ </buttonCell>
+ <color key="contentTintColor" red="0.99999600649999998" green="1" blue="1" alpha="0.85338267140000001" colorSpace="custom" customColorSpace="sRGB"/>
+ <connections>
+ <action selector="togglePlayQueue:" target="-2" id="WrP-vg-etw"/>
+ </connections>
+ </button>
+ <stackView distribution="fill" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="CjJ-z0-ITu">
+ <rect key="frame" x="478" y="224" width="72" height="32"/>
+ <subviews>
+ <progressIndicator maxValue="100" indeterminate="YES" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="xOQ-YR-iAc">
+ <rect key="frame" x="0.0" y="0.0" width="32" height="32"/>
+ </progressIndicator>
+ <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="CrW-mq-gge">
+ <rect key="frame" x="40" y="-6.5" width="32.5" height="45"/>
+ <constraints>
+ <constraint firstAttribute="width" constant="32" id="wyi-7y-I1n"/>
+ <constraint firstAttribute="height" constant="32" id="yeS-Wi-3sX"/>
+ </constraints>
+ <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyUpOrDown" id="OcH-tO-P80">
+ <imageReference key="image" image="pin.fill" catalog="system" symbolScale="large"/>
+ </imageCell>
+ </imageView>
+ </subviews>
+ <visibilityPriorities>
+ <integer value="1000"/>
+ <integer value="1000"/>
+ </visibilityPriorities>
+ <customSpacing>
+ <real value="3.4028234663852886e+38"/>
+ <real value="3.4028234663852886e+38"/>
+ </customSpacing>
+ </stackView>
+ <customView translatesAutoresizingMaskIntoConstraints="NO" id="5hr-Af-mP0">
+ <rect key="frame" x="0.0" y="0.0" width="1027" height="38"/>
+ <subviews>
+ <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="sep-line-top">
+ <rect key="frame" x="0.0" y="35" width="1027" height="5"/>
+ </box>
+ <button verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="AXA-01-AU8" customClass="VLCImageButton">
+ <rect key="frame" x="-1" y="-1" width="48" height="40"/>
+ <shadow key="shadow" blurRadius="20">
+ <color key="color" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </shadow>
+ <buttonCell key="cell" type="push" bezelStyle="rounded" image="arrow.trianglehead.counterclockwise" catalog="system" imagePosition="only" alignment="center" controlSize="large" continuous="YES" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="BGU-Ew-pvq">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <color key="contentTintColor" red="0.99999600649999998" green="1" blue="1" alpha="0.85338267140000001" colorSpace="custom" customColorSpace="sRGB"/>
+ <connections>
+ <action selector="jumpBackward:" target="3" id="Kkq-12-jbm"/>
+ </connections>
+ </button>
+ <button verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="V9d-hX-iyg" customClass="VLCImageButton">
+ <rect key="frame" x="40" y="-1" width="48" height="40"/>
+ <shadow key="shadow" blurRadius="20">
+ <color key="color" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </shadow>
+ <buttonCell key="cell" type="push" bezelStyle="rounded" image="backward.fill" catalog="system" imagePosition="only" alignment="center" controlSize="large" continuous="YES" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="fFm-ZG-R1p">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <color key="contentTintColor" red="0.99999600649999998" green="1" blue="1" alpha="0.85338267140000001" colorSpace="custom" customColorSpace="sRGB"/>
+ <connections>
+ <action selector="bwd:" target="3" id="nDS-qm-Htv"/>
+ </connections>
+ </button>
+ <button verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="PCC-8a-sVF" customClass="VLCImageButton">
+ <rect key="frame" x="81" y="-1" width="48" height="40"/>
+ <shadow key="shadow" blurRadius="30">
+ <color key="color" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </shadow>
+ <buttonCell key="cell" type="push" bezelStyle="rounded" image="play.fill" catalog="system" imagePosition="only" alignment="center" controlSize="large" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Jk0-sw-EOp">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <color key="contentTintColor" red="0.99999600649999998" green="1" blue="1" alpha="0.85338267136324741" colorSpace="custom" customColorSpace="sRGB"/>
+ <userDefinedRuntimeAttributes>
+ <userDefinedRuntimeAttribute type="boolean" keyPath="toggle" value="YES"/>
+ </userDefinedRuntimeAttributes>
+ <connections>
+ <action selector="play:" target="3" id="owy-mi-Djp"/>
+ </connections>
+ </button>
+ <button verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="sF5-Z0-bef" customClass="VLCImageButton">
+ <rect key="frame" x="122" y="-1" width="48" height="40"/>
+ <shadow key="shadow" blurRadius="20">
+ <color key="color" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </shadow>
+ <buttonCell key="cell" type="push" bezelStyle="rounded" image="forward.fill" catalog="system" imagePosition="only" alignment="center" controlSize="large" continuous="YES" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="I4n-VO-oYa">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <color key="contentTintColor" red="0.99999600649999998" green="1" blue="1" alpha="0.85338267140000001" colorSpace="custom" customColorSpace="sRGB"/>
+ <connections>
+ <action selector="fwd:" target="3" id="uPX-Xa-CwO"/>
+ </connections>
+ </button>
+ <button verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="aAq-uE-mLW" customClass="VLCImageButton">
+ <rect key="frame" x="163" y="-1" width="48" height="40"/>
+ <shadow key="shadow" blurRadius="20">
+ <color key="color" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </shadow>
+ <buttonCell key="cell" type="push" bezelStyle="rounded" image="arrow.trianglehead.clockwise" catalog="system" imagePosition="only" alignment="center" controlSize="large" continuous="YES" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="V5z-Pf-hj2">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <color key="contentTintColor" red="0.99999600649999998" green="1" blue="1" alpha="0.85338267140000001" colorSpace="custom" customColorSpace="sRGB"/>
+ <connections>
+ <action selector="jumpForward:" target="3" id="5yg-na-tAR"/>
+ </connections>
+ </button>
+ <stackView distribution="fill" orientation="horizontal" alignment="centerY" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LIP-09-gHL">
+ <rect key="frame" x="210" y="11" width="561" height="16"/>
+ <subviews>
+ <textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="1000" verticalHuggingPriority="1000" horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="f4v-2z-dQ1" customClass="VLCTimeField">
+ <rect key="frame" x="-2" y="1" width="79" height="14"/>
+ <constraints>
+ <constraint firstAttribute="width" constant="75" id="8Zz-X6-yY1"/>
+ </constraints>
+ <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" allowsUndo="NO" sendsActionOnEndEditing="YES" alignment="right" placeholderString="0:00" id="FlV-4J-8Jc">
+ <font key="font" metaFont="smallSystem"/>
+ <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
+ <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+ </textFieldCell>
+ </textField>
+ <slider verticalHuggingPriority="1000" horizontalCompressionResistancePriority="250" verticalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="qNZ-Fh-W8i" customClass="VLCPlaybackProgressSlider">
+ <rect key="frame" x="81" y="-2" width="399" height="20"/>
+ <sliderCell key="cell" controlSize="small" continuous="YES" state="on" alignment="left" maxValue="1" tickMarkPosition="above" sliderType="linear" id="dZM-dm-qvL" customClass="VLCPlaybackProgressSliderCell"/>
+ <connections>
+ <action selector="timeSliderAction:" target="3" id="W32-wA-rN9"/>
+ </connections>
+ </slider>
+ <textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="1000" verticalHuggingPriority="1000" horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="3ri-8b-8mw" customClass="VLCTimeField">
+ <rect key="frame" x="484" y="1" width="79" height="14"/>
+ <constraints>
+ <constraint firstAttribute="width" constant="75" id="S9v-aM-nfL"/>
+ </constraints>
+ <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" allowsUndo="NO" sendsActionOnEndEditing="YES" alignment="left" placeholderString="0:00" usesSingleLineMode="YES" id="0ya-Dd-ecT">
+ <font key="font" metaFont="smallSystem"/>
+ <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
+ <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+ </textFieldCell>
+ </textField>
+ </subviews>
+ <visibilityPriorities>
+ <integer value="1000"/>
+ <integer value="1000"/>
+ <integer value="1000"/>
+ </visibilityPriorities>
+ <customSpacing>
+ <real value="3.4028234663852886e+38"/>
+ <real value="3.4028234663852886e+38"/>
+ <real value="3.4028234663852886e+38"/>
+ </customSpacing>
+ </stackView>
+ <stackView distribution="fill" orientation="horizontal" alignment="centerY" spacing="5" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zyp-45-IgR">
+ <rect key="frame" x="776" y="5" width="128" height="28"/>
+ <subviews>
+ <button wantsLayer="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="afi-4d-rQk" customClass="VLCImageButton">
+ <rect key="frame" x="-6" y="-6" width="50" height="40"/>
+ <buttonCell key="cell" type="push" bezelStyle="rounded" image="speaker.wave.3.fill" catalog="system" imagePosition="only" alignment="center" controlSize="large" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="POe-ne-XtP">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <connections>
+ <action selector="volumeAction:" target="3" id="GOu-6c-pg9"/>
+ </connections>
+ </button>
+ <slider verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="fKc-2d-Uu6" customClass="VLCVolumeSlider">
+ <rect key="frame" x="41" y="6" width="89" height="17"/>
+ <sliderCell key="cell" controlSize="mini" continuous="YES" state="on" alignment="left" maxValue="512" doubleValue="50" tickMarkPosition="above" sliderType="linear" id="Gp6-7o-lvj" customClass="VLCVolumeSliderCell"/>
+ <connections>
+ <action selector="volumeAction:" target="3" id="soW-Fc-H3Y"/>
+ </connections>
+ </slider>
+ </subviews>
+ <constraints>
+ <constraint firstAttribute="trailing" secondItem="fKc-2d-Uu6" secondAttribute="trailing" id="85r-h1-eFH"/>
+ <constraint firstItem="fKc-2d-Uu6" firstAttribute="centerY" secondItem="zyp-45-IgR" secondAttribute="centerY" id="IYy-2l-SZD"/>
+ <constraint firstAttribute="width" constant="128" id="jNA-Wq-ASr"/>
+ </constraints>
+ <visibilityPriorities>
+ <integer value="1000"/>
+ <integer value="1000"/>
+ </visibilityPriorities>
+ <customSpacing>
+ <real value="3.4028234663852886e+38"/>
+ <real value="3.4028234663852886e+38"/>
+ </customSpacing>
+ </stackView>
+ <stackView distribution="fillEqually" orientation="horizontal" alignment="centerY" spacing="5" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Kb6-da-vSR">
+ <rect key="frame" x="909" y="5" width="113" height="28"/>
+ <subviews>
+ <button wantsLayer="YES" horizontalHuggingPriority="1000" verticalHuggingPriority="750" horizontalCompressionResistancePriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="yEi-SZ-SIS" customClass="VLCImageButton">
+ <rect key="frame" x="-6" y="-6" width="48" height="40"/>
+ <buttonCell key="cell" type="push" bezelStyle="rounded" image="pip.enter" catalog="system" imagePosition="only" alignment="center" controlSize="large" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Q7p-GS-7p0">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <connections>
+ <action selector="onPipButtonClick:" target="3" id="2Yi-Jo-2No"/>
+ </connections>
+ </button>
+ <button wantsLayer="YES" horizontalHuggingPriority="1000" verticalHuggingPriority="750" horizontalCompressionResistancePriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="dYZ-ri-Kra" customClass="VLCImageButton">
+ <rect key="frame" x="35" y="-6" width="44" height="40"/>
+ <buttonCell key="cell" type="push" bezelStyle="rounded" image="arrow.up.left.and.arrow.down.right" catalog="system" imagePosition="only" alignment="center" controlSize="large" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Z8g-js-0W6">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <connections>
+ <action selector="fullscreen:" target="3" id="0Kk-UV-WtF"/>
+ </connections>
+ </button>
+ <button wantsLayer="YES" horizontalHuggingPriority="1000" verticalHuggingPriority="750" horizontalCompressionResistancePriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="8jZ-hd-YVq" customClass="VLCImageButton">
+ <rect key="frame" x="72" y="-6" width="47" height="40"/>
+ <buttonCell key="cell" type="push" bezelStyle="rounded" image="play.rectangle.on.rectangle" catalog="system" imagePosition="only" alignment="center" controlSize="large" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="fyV-F5-ogO">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <connections>
+ <action selector="toggleFloatOnTop:" target="3" id="BvH-qi-jx1"/>
+ </connections>
+ </button>
+ </subviews>
+ <visibilityPriorities>
+ <integer value="1000"/>
+ <integer value="1000"/>
+ <integer value="1000"/>
+ </visibilityPriorities>
+ <customSpacing>
+ <real value="3.4028234663852886e+38"/>
+ <real value="3.4028234663852886e+38"/>
+ <real value="3.4028234663852886e+38"/>
+ </customSpacing>
+ </stackView>
+ </subviews>
+ <constraints>
+ <constraint firstItem="sep-line-top" firstAttribute="leading" secondItem="5hr-Af-mP0" secondAttribute="leading" id="2qs-Oc-0iQ"/>
+ <constraint firstItem="AXA-01-AU8" firstAttribute="width" secondItem="V9d-hX-iyg" secondAttribute="width" id="6Xb-Cr-4s3"/>
+ <constraint firstItem="V9d-hX-iyg" firstAttribute="centerY" secondItem="5hr-Af-mP0" secondAttribute="centerY" id="72N-YC-W4S"/>
+ <constraint firstItem="AXA-01-AU8" firstAttribute="leading" secondItem="5hr-Af-mP0" secondAttribute="leading" constant="5" id="Ajh-Cy-gox"/>
+ <constraint firstItem="sep-line-top" firstAttribute="top" secondItem="5hr-Af-mP0" secondAttribute="top" id="Btm-xc-Fxd"/>
+ <constraint firstItem="Kb6-da-vSR" firstAttribute="centerY" secondItem="5hr-Af-mP0" secondAttribute="centerY" id="EdK-qC-e0V"/>
+ <constraint firstItem="AXA-01-AU8" firstAttribute="centerY" secondItem="5hr-Af-mP0" secondAttribute="centerY" id="EnE-2L-wBh"/>
+ <constraint firstItem="sF5-Z0-bef" firstAttribute="leading" secondItem="PCC-8a-sVF" secondAttribute="trailing" constant="5" id="G3J-50-BR7"/>
+ <constraint firstAttribute="height" constant="38" id="GLX-Xa-lVf"/>
+ <constraint firstItem="sF5-Z0-bef" firstAttribute="centerY" secondItem="5hr-Af-mP0" secondAttribute="centerY" id="Gu3-uc-Ear"/>
+ <constraint firstItem="sF5-Z0-bef" firstAttribute="height" secondItem="aAq-uE-mLW" secondAttribute="height" id="HFU-a4-Do0"/>
+ <constraint firstItem="aAq-uE-mLW" firstAttribute="width" secondItem="sF5-Z0-bef" secondAttribute="width" id="J39-m1-Vs4"/>
+ <constraint firstItem="AXA-01-AU8" firstAttribute="height" secondItem="V9d-hX-iyg" secondAttribute="height" id="Lay-ui-iBJ"/>
+ <constraint firstAttribute="bottom" secondItem="AXA-01-AU8" secondAttribute="bottom" constant="5" id="QaD-Pf-ZpA"/>
+ <constraint firstAttribute="trailing" secondItem="Kb6-da-vSR" secondAttribute="trailing" constant="5" id="SKZ-79-jNZ"/>
+ <constraint firstItem="AXA-01-AU8" firstAttribute="top" secondItem="5hr-Af-mP0" secondAttribute="top" constant="5" id="WqJ-h6-EHV"/>
+ <constraint firstItem="LIP-09-gHL" firstAttribute="leading" secondItem="aAq-uE-mLW" secondAttribute="trailing" constant="5" id="WwI-tp-LCr"/>
+ <constraint firstItem="zyp-45-IgR" firstAttribute="leading" secondItem="LIP-09-gHL" secondAttribute="trailing" constant="5" id="Za4-qe-3M8"/>
+ <constraint firstItem="Kb6-da-vSR" firstAttribute="leading" secondItem="zyp-45-IgR" secondAttribute="trailing" constant="5" id="d6K-IH-npl"/>
+ <constraint firstItem="PCC-8a-sVF" firstAttribute="height" secondItem="sF5-Z0-bef" secondAttribute="height" id="dLj-aI-TU9"/>
+ <constraint firstItem="PCC-8a-sVF" firstAttribute="width" secondItem="sF5-Z0-bef" secondAttribute="width" id="dXF-sz-z4c"/>
+ <constraint firstItem="aAq-uE-mLW" firstAttribute="leading" secondItem="sF5-Z0-bef" secondAttribute="trailing" constant="5" id="eyX-7z-y6N"/>
+ <constraint firstItem="LIP-09-gHL" firstAttribute="centerY" secondItem="5hr-Af-mP0" secondAttribute="centerY" id="kvw-CD-5dD"/>
+ <constraint firstAttribute="trailing" secondItem="sep-line-top" secondAttribute="trailing" id="oTf-sL-MFV"/>
+ <constraint firstItem="aAq-uE-mLW" firstAttribute="centerY" secondItem="5hr-Af-mP0" secondAttribute="centerY" id="pmy-FH-xIH"/>
+ <constraint firstItem="V9d-hX-iyg" firstAttribute="leading" secondItem="AXA-01-AU8" secondAttribute="trailing" constant="5" id="qTY-xe-IHm"/>
+ <constraint firstItem="zyp-45-IgR" firstAttribute="centerY" secondItem="5hr-Af-mP0" secondAttribute="centerY" id="qyN-Rp-Zah"/>
+ <constraint firstItem="PCC-8a-sVF" firstAttribute="centerY" secondItem="5hr-Af-mP0" secondAttribute="centerY" id="u1m-dp-AeX"/>
+ <constraint firstItem="PCC-8a-sVF" firstAttribute="leading" secondItem="V9d-hX-iyg" secondAttribute="trailing" constant="5" id="vBD-yc-Pxq"/>
+ <constraint firstItem="V9d-hX-iyg" firstAttribute="height" secondItem="PCC-8a-sVF" secondAttribute="height" id="x5g-pr-HFq"/>
+ <constraint firstItem="PCC-8a-sVF" firstAttribute="width" secondItem="V9d-hX-iyg" secondAttribute="width" id="xld-dk-rQY"/>
+ </constraints>
+ </customView>
+ </subviews>
+ <constraints>
+ <constraint firstAttribute="bottom" secondItem="5hr-Af-mP0" secondAttribute="bottom" id="controls-bar-bottom"/>
+ <constraint firstItem="5hr-Af-mP0" firstAttribute="leading" secondItem="main-controls-content" secondAttribute="leading" id="controls-bar-leading"/>
+ <constraint firstItem="5hr-Af-mP0" firstAttribute="trailing" secondItem="main-controls-content" secondAttribute="trailing" id="controls-bar-trailing"/>
+ <constraint firstItem="CjJ-z0-ITu" firstAttribute="centerX" secondItem="main-controls-content" secondAttribute="centerX" id="loading-center-x"/>
+ <constraint firstItem="CjJ-z0-ITu" firstAttribute="centerY" secondItem="main-controls-content" secondAttribute="centerY" id="loading-center-y"/>
+ <constraint firstItem="Drq-if-dw4" firstAttribute="top" secondItem="VIa-0w-fl8" secondAttribute="top" constant="20" id="queue-btn-top"/>
+ <constraint firstItem="VIa-0w-fl8" firstAttribute="trailing" secondItem="Drq-if-dw4" secondAttribute="trailing" constant="20" id="queue-btn-trailing"/>
+ <constraint firstItem="UoQ-34-Pox" firstAttribute="leading" secondItem="VIa-0w-fl8" secondAttribute="leading" constant="20" id="return-btn-leading"/>
+ <constraint firstItem="UoQ-34-Pox" firstAttribute="top" secondItem="VIa-0w-fl8" secondAttribute="top" constant="20" id="return-btn-top"/>
+ <constraint firstItem="VIa-0w-fl8" firstAttribute="leading" secondItem="main-controls-content" secondAttribute="leading" id="title-bar-leading"/>
+ <constraint firstItem="VIa-0w-fl8" firstAttribute="top" secondItem="main-controls-content" secondAttribute="top" id="title-bar-top"/>
+ <constraint firstItem="VIa-0w-fl8" firstAttribute="trailing" secondItem="main-controls-content" secondAttribute="trailing" id="title-bar-trailing"/>
+ </constraints>
+ </view>
+ </box>
+ </subviews>
+ <constraints>
+ <constraint firstItem="MTR-ds-I8o" firstAttribute="top" secondItem="WRu-Ic-lQK" secondAttribute="top" id="2cq-kJ-XAR"/>
+ <constraint firstAttribute="trailing" secondItem="MTR-ds-I8o" secondAttribute="trailing" id="E2t-0S-hdB"/>
+ <constraint firstItem="MTR-ds-I8o" firstAttribute="leading" secondItem="WRu-Ic-lQK" secondAttribute="leading" id="TJ3-v0-eiw"/>
+ <constraint firstAttribute="bottom" secondItem="main-controls-container" secondAttribute="bottom" id="main-controls-bottom"/>
+ <constraint firstItem="main-controls-container" firstAttribute="leading" secondItem="WRu-Ic-lQK" secondAttribute="leading" id="main-controls-leading"/>
+ <constraint firstItem="main-controls-container" firstAttribute="top" secondItem="WRu-Ic-lQK" secondAttribute="top" id="main-controls-top"/>
+ <constraint firstItem="main-controls-container" firstAttribute="trailing" secondItem="WRu-Ic-lQK" secondAttribute="trailing" id="main-controls-trailing"/>
+ <constraint firstItem="5hr-Af-mP0" firstAttribute="top" secondItem="MTR-ds-I8o" secondAttribute="bottom" id="video-to-controls"/>
+ </constraints>
+ <point key="canvasLocation" x="-507.5" y="-232"/>
+ </customView>
+ </objects>
+ <resources>
+ <image name="NSLeftFacingTriangleTemplate" width="12" height="17"/>
+ <image name="NSListViewTemplate" width="21" height="15"/>
+ <image name="arrow.trianglehead.clockwise" catalog="system" width="15" height="17"/>
+ <image name="arrow.trianglehead.counterclockwise" catalog="system" width="15" height="17"/>
+ <image name="arrow.up.left.and.arrow.down.right" catalog="system" width="16" height="15"/>
+ <image name="backward.fill" catalog="system" width="20" height="12"/>
+ <image name="forward.fill" catalog="system" width="20" height="12"/>
+ <image name="pin.fill" catalog="system" width="19" height="22"/>
+ <image name="pip.enter" catalog="system" width="20" height="16"/>
+ <image name="play.fill" catalog="system" width="12" height="13"/>
+ <image name="play.rectangle.on.rectangle" catalog="system" width="19" height="15"/>
+ <image name="speaker.wave.3.fill" catalog="system" width="22" height="15"/>
+ </resources>
+</document>
=====================================
modules/gui/macosx/main/VLCMain.m
=====================================
@@ -86,6 +86,7 @@
#import "windows/logging/VLCLogWindowController.h"
#import "windows/video/VLCVoutView.h"
#import "windows/video/VLCVideoOutputProvider.h"
+#import "windows/video/VLCMainVideoViewController.h"
#ifdef HAVE_SPARKLE
#import <Sparkle/Sparkle.h> /* we're the update delegate */
@@ -348,6 +349,7 @@ static VLCMain *sharedInstance = nil;
if ([defaults integerForKey:kVLCPreferencesVersion] != 4) {
[defaults setBool:YES forKey:VLCPlaybackEndViewEnabledKey];
[defaults setBool:NO forKey:VLCDisplayTrackNumberPlayQueueKey];
+ [defaults setBool:YES forKey:VLCUseClassicVideoPlayerLayoutKey];
[self migrateOldPreferences];
}
=====================================
modules/gui/macosx/preferences/VLCSimplePrefsController.h
=====================================
@@ -177,6 +177,7 @@
@property (readwrite, weak) IBOutlet NSButton *video_onTopCheckbox;
@property (readwrite, weak) IBOutlet NSButton *video_videodecoCheckbox;
@property (readwrite, weak) IBOutlet NSButton *video_resizeToNativeSizeCheckbox;
+ at property (readwrite, weak) IBOutlet NSButton *video_useClassicLayoutCheckbox;
// video pane - fullscreen box
@property (readwrite, weak) IBOutlet NSBox *video_fullscreenBox;
=====================================
modules/gui/macosx/preferences/VLCSimplePrefsController.m
=====================================
@@ -52,6 +52,7 @@
#import "library/VLCLibraryDataTypes.h"
#import "playqueue/VLCPlayQueueTableCellView.h"
#import "views/VLCPlaybackEndViewController.h"
+#import "windows/video/VLCMainVideoViewController.h"
static struct {
const char iso[6];
@@ -716,6 +717,8 @@ create_toolbar_item(NSString *itemIdent, NSString *name, NSString *desc, NSStrin
[self setupButton:_video_videodecoCheckbox forBoolValue: "video-deco"];
[self setupButton:_video_pauseWhenMinimizedCheckbox forBoolValue: "macosx-pause-minimized"];
[self setupButton:_video_resizeToNativeSizeCheckbox forBoolValue: "macosx-video-autoresize"];
+
+ self.video_useClassicLayoutCheckbox.state = [defaults boolForKey:VLCUseClassicVideoPlayerLayoutKey] ? NSControlStateValueOn : NSControlStateValueOff;
[_video_devicePopup removeAllItems];
i = 0;
@@ -1027,6 +1030,9 @@ static inline void save_string_list(intf_thread_t * p_intf, id object, const cha
config_PutInt("macosx-pause-minimized", [_video_pauseWhenMinimizedCheckbox state]);
config_PutInt("macosx-video-autoresize", [_video_resizeToNativeSizeCheckbox state]);
+
+ [NSUserDefaults.standardUserDefaults setBool:self.video_useClassicLayoutCheckbox.state == NSControlStateValueOn
+ forKey:VLCUseClassicVideoPlayerLayoutKey];
config_PutInt("embedded-video", [_video_embeddedCheckbox state]);
config_PutInt("macosx-nativefullscreenmode", [_video_nativeFullscreenCheckbox state]);
=====================================
modules/gui/macosx/windows/video/VLCMainVideoViewController.h
=====================================
@@ -31,6 +31,8 @@
NS_ASSUME_NONNULL_BEGIN
+extern NSString * const VLCUseClassicVideoPlayerLayoutKey;
+
@interface VLCMainVideoViewController : NSViewController
@property (readwrite, strong) IBOutlet NSView *voutContainingView;
@@ -47,6 +49,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (readwrite, strong) IBOutlet NSLayoutConstraint *returnButtonLeadingConstraint;
@property (readwrite, strong) IBOutlet NSLayoutConstraint *playQueueButtonTopConstraint;
@property (readwrite, strong) IBOutlet NSLayoutConstraint *playQueueButtonTrailingConstraint;
+ at property (readwrite, strong) IBOutlet NSLayoutConstraint *videoViewBottomConstraint;
@property (readwrite, strong) IBOutlet NSVisualEffectView *fakeTitleBar;
@property (readwrite, strong) IBOutlet NSLayoutConstraint *fakeTitleBarHeightConstraint;
@property (readwrite, strong) IBOutlet NSProgressIndicator *loadingIndicator;
@@ -58,6 +61,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (readwrite, strong) IBOutlet NSLayoutConstraint *centerButtonStackInViewConstraint;
@property (readonly) NSLayoutConstraint *bottomButtonStackViewConstraint;
+ at property (readonly) NSLayoutConstraint *videoViewBottomToViewConstraint;
@property (readonly, strong) VLCMainVideoViewAudioMediaDecorativeView *audioDecorativeView;
@property (readwrite, nonatomic) BOOL autohideControls;
=====================================
modules/gui/macosx/windows/video/VLCMainVideoViewController.m
=====================================
@@ -52,6 +52,8 @@
#import "private/PIPSPI.h"
+NSString * const VLCUseClassicVideoPlayerLayoutKey = @"VLCUseClassicVideoPlayerLayoutKey";
+
@interface PIPVoutViewController : NSViewController
@property (nonatomic) NSRect previousBounds;
@property (nonatomic, copy) void (^boundsChangeHandler)(void);
@@ -110,15 +112,22 @@
}
@property NSWindow *retainedWindow;
+ at property (readonly) BOOL classic;
+ at property (readwrite) BOOL voutTaken;
+
@end
@implementation VLCMainVideoViewController
- (instancetype)init
{
- self = [super initWithNibName:@"VLCMainVideoView" bundle:nil];
+ const BOOL classic = [NSUserDefaults.standardUserDefaults boolForKey:VLCUseClassicVideoPlayerLayoutKey];
+ NSString * const nibName = classic ? @"VLCClassicMainVideoView" : @"VLCMainVideoView";
+ self = [super initWithNibName:nibName bundle:nil];
if (self) {
+ _classic = classic;
_isFadingIn = NO;
+ _voutTaken = NO;
NSNotificationCenter * const notificationCenter = NSNotificationCenter.defaultCenter;
[notificationCenter addObserver:self
@@ -159,8 +168,11 @@
_audioDecorativeView = [VLCMainVideoViewAudioMediaDecorativeView fromNibWithOwner:self];
_audioDecorativeView.translatesAutoresizingMaskIntoConstraints = NO;
- _bottomButtonStackViewConstraint =
- [self.bottomBarView.topAnchor constraintEqualToAnchor:self.centralControlsStackView.bottomAnchor];
+ if (!self.classic) {
+ // Only set up button constraints for standard layout
+ _bottomButtonStackViewConstraint =
+ [self.bottomBarView.topAnchor constraintEqualToAnchor:self.centralControlsStackView.bottomAnchor];
+ }
VLCPlayerController * const controller =
VLCMain.sharedInstance.playQueueController.playerController;
@@ -207,6 +219,19 @@
[self setupAudioDecorativeView];
[self.controlsBar update];
[self updateFloatOnTopIndicator];
+
+ // For classic layout, create constraint for video view to fill main view when controls are hidden
+ if (self.classic) {
+ _videoViewBottomToViewConstraint = [self.voutContainingView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor];
+ self.videoViewBottomToViewConstraint.active = NO;
+
+ NSVisualEffectView * const controlsBackgroundView = [[NSVisualEffectView alloc] initWithFrame:self.bottomBarView.frame];
+ controlsBackgroundView.translatesAutoresizingMaskIntoConstraints = NO;
+ controlsBackgroundView.blendingMode = NSVisualEffectBlendingModeWithinWindow;
+ controlsBackgroundView.material = NSVisualEffectMaterialTitlebar;
+ [self.bottomBarView addSubview:controlsBackgroundView positioned:NSWindowBelow relativeTo:self.bottomBarView.subviews.firstObject];
+ [controlsBackgroundView applyConstraintsToFillSuperview];
+ }
}
- (BOOL)isVisualizationActive
@@ -371,6 +396,10 @@
- (void)hideControls
{
+ if (self.voutTaken) {
+ return;
+ }
+
[self stopAutohideTimer];
NSPoint mousePos = [self.view.window mouseLocationOutsideOfEventStream];
@@ -380,6 +409,11 @@
return;
}
+ if (self.classic) {
+ self.videoViewBottomConstraint.active = NO;
+ self.videoViewBottomToViewConstraint.active = YES;
+ }
+
[NSAnimationContext runAnimationGroup:^(NSAnimationContext * _Nonnull context) {
[context setDuration:VLCLibraryUIUnits.controlsFadeAnimationDuration];
[self->_mainControlsView.animator setAlphaValue:0.0f];
@@ -408,12 +442,21 @@
- (void)showControls
{
+ if (self.voutTaken) {
+ return;
+ }
+
[self stopAutohideTimer];
[self updatePlayQueueToggleState];
[self updateLibraryControls];
+ if (self.classic) {
+ self.videoViewBottomToViewConstraint.active = NO;
+ self.videoViewBottomConstraint.active = YES;
+ }
+
if (!_autohideControls) {
- _mainControlsView.alphaValue = 1.0f;
+ _mainControlsView.alphaValue = 1.0f;
return;
}
@@ -627,6 +670,10 @@
- (nullable NSView *)acquireVideoView
{
+ if (self.voutTaken) {
+ return nil;
+ }
+ self.voutTaken = YES;
[self.voutContainingView removeFromSuperview];
return self.voutContainingView;
}
@@ -638,8 +685,29 @@
[self.view addSubview:videoView
positioned:NSWindowBelow
relativeTo:self.mainControlsView];
- [videoView applyConstraintsToFillSuperview];
+
+ if (self.classic) {
+ videoView.translatesAutoresizingMaskIntoConstraints = NO;
+ [NSLayoutConstraint activateConstraints:@[
+ [videoView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
+ [videoView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
+ [videoView.topAnchor constraintEqualToAnchor:self.view.topAnchor]
+ ]];
+
+ // Create constraint for video view bottom to main view bottom (for when controls are hidden)
+ _videoViewBottomToViewConstraint = [videoView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor];
+ _videoViewBottomConstraint = [videoView.bottomAnchor constraintEqualToAnchor:self.bottomBarView.topAnchor];
+
+ // The videoViewBottomConstraint outlet connects video bottom to controls top (for when controls are visible)
+ // Start with controls visible, so activate the XIB constraint
+ self.videoViewBottomConstraint.active = YES;
+ self.videoViewBottomToViewConstraint.active = NO;
+ } else {
+ [videoView applyConstraintsToFillSuperview];
+ }
+
[self applyAudioDecorativeViewForegroundCoverArtViewConstraints];
+ self.voutTaken = NO;
}
- (void)displayPlaybackEndView
=====================================
modules/gui/macosx/windows/video/VLCVideoWindowCommon.m
=====================================
@@ -130,7 +130,6 @@ NSString *VLCWindowShouldShowController = @"VLCWindowShouldShowController";
[o_temp_view setAutoresizingMask:NSViewHeightSizable | NSViewWidthSizable];
_playerController = VLCMain.sharedInstance.playQueueController.playerController;
- _videoViewController = [[VLCMainVideoViewController alloc] init];
[self mediaMetadataChanged:nil];
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/5bdb5a590476886a009e7b3657f7956e368230b9...4f9f26909c5efd32a0b8b08b8a45b16d60d234a7
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/5bdb5a590476886a009e7b3657f7956e368230b9...4f9f26909c5efd32a0b8b08b8a45b16d60d234a7
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance
More information about the vlc-commits
mailing list