[vlc-commits] [Git][videolan/vlc][master] 14 commits: macosx: Add starter VLCMainVideoViewAudioMediaDecorativeView

Felix Paul Kühne (@fkuehne) gitlab at videolan.org
Thu May 4 07:00:42 UTC 2023



Felix Paul Kühne pushed to branch master at VideoLAN / VLC


Commits:
a0ea2ded by Claudio Cambra at 2023-05-04T06:45:58+00:00
macosx: Add starter VLCMainVideoViewAudioMediaDecorativeView

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
495ef22a by Claudio Cambra at 2023-05-04T06:45:58+00:00
macosx: Add starter VLCMainViewViewAudioMediaDecorativeView class

Signed-off-by: Claudio Cambra <claudio.cambra at nextcloud.com>

- - - - -
41684b74 by Claudio Cambra at 2023-05-04T06:45:58+00:00
macosx: Add cover art image view and background to VLCMainVideoViewAudioMediaDecorativeView

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
a1725fe1 by Claudio Cambra at 2023-05-04T06:45:58+00:00
macosx: Add easy nib instantiator function for VLCMainVideoViewAudioMediaDecorativeView

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
acc6a644 by Claudio Cambra at 2023-05-04T06:45:58+00:00
macosx: Instantiate audio decorative view within VLCMainVideoViewController

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
d6982a8d by Claudio Cambra at 2023-05-04T06:45:58+00:00
macosx: Display audio decorative view over voutview under main video view controller when audio playing

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
57062fed by Claudio Cambra at 2023-05-04T06:45:58+00:00
macosx: Add background artwork image with visual effect view overlaid for VLCMainVideoViewAudioMediaDecorativeView

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
cfd2b8ff by Claudio Cambra at 2023-05-04T06:45:58+00:00
macosx: Don't autohide controls when displaying audio decorative view in VLCMainVideoViewController

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
9236d28c by Claudio Cambra at 2023-05-04T06:45:58+00:00
macosx: Don't hide window controls in VLCFullVideoViewWindow when the VLVMainVideoViewController has autohiding controls disabled

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
e2604b12 by Claudio Cambra at 2023-05-04T06:45:58+00:00
macosx: Connect decorative view XIB components to outlets

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
26d5dd2e by Claudio Cambra at 2023-05-04T06:45:58+00:00
macosx: Add convenience method to set cover arts of VLCMainVideoViewAudioMediaDecorativeView

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
93efb9e6 by Claudio Cambra at 2023-05-04T06:45:58+00:00
macosx: Automatically set cover art on current media item switch in VLCMainVideoViewAudioMediaDecorativeView

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
91fad1c2 by Claudio Cambra at 2023-05-04T06:45:58+00:00
macosx: Don't prevent opening main video view when audio media is playing

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -
3900ca14 by Claudio Cambra at 2023-05-04T06:45:58+00:00
macosx: Retain video view open when playback switches to audio, but close when playback is generally over

Signed-off-by: Claudio Cambra <developer at claudiocambra.com>

- - - - -


9 changed files:

- extras/package/macosx/VLC.xcodeproj/project.pbxproj
- modules/gui/macosx/Makefile.am
- + modules/gui/macosx/UI/VLCMainVideoViewAudioMediaDecorativeView.xib
- modules/gui/macosx/library/VLCLibraryWindow.m
- modules/gui/macosx/windows/video/VLCFullVideoViewWindow.m
- + modules/gui/macosx/windows/video/VLCMainVideoViewAudioMediaDecorativeView.h
- + modules/gui/macosx/windows/video/VLCMainVideoViewAudioMediaDecorativeView.m
- modules/gui/macosx/windows/video/VLCMainVideoViewController.h
- modules/gui/macosx/windows/video/VLCMainVideoViewController.m


Changes:

=====================================
extras/package/macosx/VLC.xcodeproj/project.pbxproj
=====================================
@@ -101,6 +101,7 @@
 		53903D3A29576ED500D0B308 /* VLCLibraryAudioGroupDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 53903D3929576ED500D0B308 /* VLCLibraryAudioGroupDataSource.m */; };
 		539BA79F298C726200918C36 /* VLCAspectRatioRetainingVideoWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 539BA79E298C726200918C36 /* VLCAspectRatioRetainingVideoWindow.m */; };
 		539F114B29E83A4200F13460 /* VLCLibraryTwoPaneSplitViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 539F114A29E83A4200F13460 /* VLCLibraryTwoPaneSplitViewDelegate.m */; };
+		539F116D29F9785C00F13460 /* VLCMainVideoViewAudioMediaDecorativeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 539F116C29F9785C00F13460 /* VLCMainVideoViewAudioMediaDecorativeView.m */; };
 		53B447CA2939823E00857588 /* VLCLibrarySongsTableViewSongPlayingTableCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B447C92939823E00857588 /* VLCLibrarySongsTableViewSongPlayingTableCellView.m */; };
 		53B447F6293BB47B00857588 /* VLCLibraryVideoCollectionViewContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B447EC293BB47A00857588 /* VLCLibraryVideoCollectionViewContainerView.m */; };
 		53B447F7293BB47B00857588 /* VLCLibraryVideoCollectionViewContainerViewDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B447ED293BB47A00857588 /* VLCLibraryVideoCollectionViewContainerViewDataSource.m */; };
@@ -310,6 +311,9 @@
 		539BA79E298C726200918C36 /* VLCAspectRatioRetainingVideoWindow.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCAspectRatioRetainingVideoWindow.m; sourceTree = "<group>"; };
 		539F114929E83A4200F13460 /* VLCLibraryTwoPaneSplitViewDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryTwoPaneSplitViewDelegate.h; sourceTree = "<group>"; };
 		539F114A29E83A4200F13460 /* VLCLibraryTwoPaneSplitViewDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryTwoPaneSplitViewDelegate.m; sourceTree = "<group>"; };
+		539F116A29F9756000F13460 /* VLCMainVideoViewAudioMediaDecorativeView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VLCMainVideoViewAudioMediaDecorativeView.xib; sourceTree = "<group>"; };
+		539F116B29F9785C00F13460 /* VLCMainVideoViewAudioMediaDecorativeView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCMainVideoViewAudioMediaDecorativeView.h; sourceTree = "<group>"; };
+		539F116C29F9785C00F13460 /* VLCMainVideoViewAudioMediaDecorativeView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCMainVideoViewAudioMediaDecorativeView.m; sourceTree = "<group>"; };
 		53B447C82939823E00857588 /* VLCLibrarySongsTableViewSongPlayingTableCellView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibrarySongsTableViewSongPlayingTableCellView.h; sourceTree = "<group>"; };
 		53B447C92939823E00857588 /* VLCLibrarySongsTableViewSongPlayingTableCellView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibrarySongsTableViewSongPlayingTableCellView.m; sourceTree = "<group>"; };
 		53B447EC293BB47A00857588 /* VLCLibraryVideoCollectionViewContainerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryVideoCollectionViewContainerView.m; sourceTree = "<group>"; };
@@ -944,6 +948,8 @@
 			children = (
 				534E8E3829A06325009503F8 /* VLCMainVideoViewController.h */,
 				534E8E3929A06325009503F8 /* VLCMainVideoViewController.m */,
+				539F116B29F9785C00F13460 /* VLCMainVideoViewAudioMediaDecorativeView.h */,
+				539F116C29F9785C00F13460 /* VLCMainVideoViewAudioMediaDecorativeView.m */,
 				536BFD1729B181E100BD0776 /* VLCMainVideoViewOverlayView.h */,
 				536BFD1829B181E100BD0776 /* VLCMainVideoViewOverlayView.m */,
 				1CAC3EE720CD1B3B00613DB2 /* VLCVideoOutputProvider.h */,
@@ -1797,6 +1803,7 @@
 				7DFFF8FE23682CE400C8B0C9 /* VLCDetachedAudioWindow.xib */,
 				6B8224181E4D2A9000833BE1 /* VLCFullScreenPanel.xib */,
 				6B82240B1E4D2A9000833BE1 /* VLCInformationWindow.xib */,
+				539F116A29F9756000F13460 /* VLCMainVideoViewAudioMediaDecorativeView.xib */,
 				7DE82E7A228437AA002D341A /* VLCLibraryAlbumTableCellView.xib */,
 				536283FD2911476A00640C15 /* VLCLibraryCollectionViewAlbumSupplementaryDetailView.xib */,
 				536283FB2911476A00640C15 /* VLCLibraryCollectionViewAudioGroupSupplementaryDetailView.xib */,
@@ -1974,6 +1981,7 @@
 				1C3113921E508C6900D4DD76 /* VLCAddonListItem.m in Sources */,
 				7DFBDCB7226CDFD600B700A5 /* VLCImageView.m in Sources */,
 				7D404ABF2281892C00B28EF4 /* NSView+VLCAdditions.m in Sources */,
+				539F116D29F9785C00F13460 /* VLCMainVideoViewAudioMediaDecorativeView.m in Sources */,
 				7DE9C7DD220728420089108F /* VLCPlayerController.m in Sources */,
 				536283F4291146BC00640C15 /* VLCLibraryCollectionViewMediaItemSupplementaryDetailView.m in Sources */,
 				7D93D8FC2316C2DC001C0063 /* VLCCustomCropArWindowController.m in Sources */,


=====================================
modules/gui/macosx/Makefile.am
=====================================
@@ -360,6 +360,8 @@ libmacosx_plugin_la_SOURCES = \
 	gui/macosx/windows/video/VLCAspectRatioRetainingVideoWindow.m \
 	gui/macosx/windows/video/VLCFullVideoViewWindow.h \
 	gui/macosx/windows/video/VLCFullVideoViewWindow.m \
+	gui/macosx/windows/video/VLCMainVideoViewAudioMediaDecorativeView.h \
+	gui/macosx/windows/video/VLCMainVideoViewAudioMediaDecorativeView.m \
 	gui/macosx/windows/video/VLCMainVideoViewController.h \
 	gui/macosx/windows/video/VLCMainVideoViewController.m \
 	gui/macosx/windows/video/VLCMainVideoViewOverlayView.h \
@@ -400,6 +402,7 @@ libmacosx_plugin_la_XIB_SOURCES = \
 	gui/macosx/UI/VLCLibraryCollectionViewMediaItemSupplementaryDetailView.xib \
 	gui/macosx/UI/VLCLibrarySongTableCellView.xib \
 	gui/macosx/UI/VLCMainVideoView.xib \
+	gui/macosx/UI/VLCMainVideoViewAudioMediaDecorativeView.xib \
 	gui/macosx/UI/VLCMediaSourceCollectionViewItem.xib \
 	gui/macosx/UI/VLCMediaSourceDeviceCollectionViewItem.xib \
 	gui/macosx/UI/VLCInformationWindow.xib \


=====================================
modules/gui/macosx/UI/VLCMainVideoViewAudioMediaDecorativeView.xib
=====================================
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+    <dependencies>
+        <deployment version="101000" identifier="macosx"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21701"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner"/>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="WRu-Ic-lQK" customClass="VLCMainVideoViewAudioMediaDecorativeView">
+            <rect key="frame" x="0.0" y="0.0" width="720" height="480"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="cDv-dn-65H">
+                    <rect key="frame" x="0.0" y="0.0" width="720" height="480"/>
+                    <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="axesIndependently" image="noart" id="3lz-lJ-nIL"/>
+                </imageView>
+                <visualEffectView blendingMode="withinWindow" material="HUDWindow" state="active" translatesAutoresizingMaskIntoConstraints="NO" id="D1e-fS-bwO">
+                    <rect key="frame" x="0.0" y="0.0" width="720" height="480"/>
+                </visualEffectView>
+                <imageView wantsLayer="YES" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="40P-sL-Mzq">
+                    <rect key="frame" x="232" y="112" width="256" height="256"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="256" id="PdS-Zh-d9T"/>
+                        <constraint firstAttribute="width" secondItem="40P-sL-Mzq" secondAttribute="height" multiplier="1:1" id="dje-mE-ZfL"/>
+                    </constraints>
+                    <shadow key="shadow" blurRadius="20">
+                        <color key="color" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                    </shadow>
+                    <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyUpOrDown" image="noart" id="m7g-tH-8dl"/>
+                </imageView>
+            </subviews>
+            <constraints>
+                <constraint firstItem="40P-sL-Mzq" firstAttribute="centerX" secondItem="WRu-Ic-lQK" secondAttribute="centerX" id="4Ib-c0-egD"/>
+                <constraint firstAttribute="trailing" secondItem="D1e-fS-bwO" secondAttribute="trailing" id="J68-x2-cY5"/>
+                <constraint firstItem="D1e-fS-bwO" firstAttribute="leading" secondItem="WRu-Ic-lQK" secondAttribute="leading" id="KBI-Gr-tTT"/>
+                <constraint firstAttribute="bottom" secondItem="cDv-dn-65H" secondAttribute="bottom" id="Sv1-Hf-eCe"/>
+                <constraint firstItem="cDv-dn-65H" firstAttribute="leading" secondItem="WRu-Ic-lQK" secondAttribute="leading" id="bZL-GN-AAt"/>
+                <constraint firstItem="cDv-dn-65H" firstAttribute="top" secondItem="WRu-Ic-lQK" secondAttribute="top" id="dvc-kq-jk8"/>
+                <constraint firstItem="D1e-fS-bwO" firstAttribute="top" secondItem="WRu-Ic-lQK" secondAttribute="top" id="eDP-U6-Qt6"/>
+                <constraint firstAttribute="bottom" secondItem="D1e-fS-bwO" secondAttribute="bottom" id="toU-5j-lin"/>
+                <constraint firstAttribute="trailing" secondItem="cDv-dn-65H" secondAttribute="trailing" id="vEl-zP-vj9"/>
+                <constraint firstItem="40P-sL-Mzq" firstAttribute="centerY" secondItem="WRu-Ic-lQK" secondAttribute="centerY" id="yFl-gc-ITT"/>
+            </constraints>
+            <connections>
+                <outlet property="backgroundCoverArtView" destination="cDv-dn-65H" id="bw2-8i-Xg6"/>
+                <outlet property="backgroundVisualEffectView" destination="D1e-fS-bwO" id="Jkh-ep-Wyn"/>
+                <outlet property="foregroundCoverArtView" destination="40P-sL-Mzq" id="nVl-ga-BoM"/>
+            </connections>
+            <point key="canvasLocation" x="66" y="-232"/>
+        </customView>
+    </objects>
+    <resources>
+        <image name="noart" width="128" height="128"/>
+    </resources>
+</document>


=====================================
modules/gui/macosx/library/VLCLibraryWindow.m
=====================================
@@ -786,7 +786,20 @@ static void addShadow(NSImageView *__unsafe_unretained imageView)
 - (void)setHasActiveVideo:(BOOL)hasActiveVideo
 {
     [super setHasActiveVideo:hasActiveVideo];
-    hasActiveVideo ? [self enableVideoPlaybackAppearance] : [self disableVideoPlaybackAppearance];
+    if (hasActiveVideo) {
+        [self enableVideoPlaybackAppearance];
+    } else if (!self.videoViewController.view.hidden) {
+        // If we are switching to audio media then keep the active main video view open
+        NSURL * const currentMediaUrl = _playlistController.playerController.URLOfCurrentMediaItem;
+        VLCMediaLibraryMediaItem * const mediaItem = [VLCMediaLibraryMediaItem mediaItemForURL:currentMediaUrl];
+        const BOOL decorativeViewVisible = mediaItem != nil && mediaItem.mediaType == VLC_ML_MEDIA_TYPE_AUDIO;
+
+        if (!decorativeViewVisible) {
+            [self disableVideoPlaybackAppearance];
+        }
+    } else {
+        [self disableVideoPlaybackAppearance];
+    }
 }
 
 - (void)playerStateChanged:(NSNotification *)notification
@@ -796,10 +809,6 @@ static void addShadow(NSImageView *__unsafe_unretained imageView)
         return;
     }
 
-    if(_playlistController.playerController.playerState == VLC_PLAYER_STATE_PLAYING) {
-        [self reopenVideoView];
-    }
-
     if (self.videoViewController.view.isHidden) {
         [self showControlsBar];
     }
@@ -808,16 +817,6 @@ static void addShadow(NSImageView *__unsafe_unretained imageView)
 // This handles reopening the video view when the user has closed it.
 - (void)reopenVideoView
 {
-    if(!self.hasActiveVideo) {
-        return;
-    }
-
-    VLCMediaLibraryMediaItem *mediaItem = [VLCMediaLibraryMediaItem mediaItemForURL:_playlistController.playerController.URLOfCurrentMediaItem];
-
-    if(mediaItem == nil || mediaItem.mediaType != VLC_ML_MEDIA_TYPE_VIDEO) {
-        return;
-    }
-
     [self enableVideoPlaybackAppearance];
 }
 


=====================================
modules/gui/macosx/windows/video/VLCFullVideoViewWindow.m
=====================================
@@ -107,7 +107,8 @@
     if (self.videoViewController.mouseOnControls ||
         !_autohideTitlebar ||
         self.isInNativeFullscreen ||
-        self.videoViewController.view.hidden) {
+        self.videoViewController.view.hidden ||
+        !self.videoViewController.autohideControls) {
 
         [self showTitleBar];
         return;


=====================================
modules/gui/macosx/windows/video/VLCMainVideoViewAudioMediaDecorativeView.h
=====================================
@@ -0,0 +1,39 @@
+/*****************************************************************************
+ * VLCMainVideoViewAudioMediaDecorativeView.h: MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2023 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <developer at claudiocambra.com>
+ *
+ * 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
+
+ at interface VLCMainVideoViewAudioMediaDecorativeView : NSView
+
++ (instancetype)fromNibWithOwner:(id)owner;
+
+ at property (readwrite, strong) IBOutlet NSImageView *foregroundCoverArtView;
+ at property (readwrite, strong) IBOutlet NSImageView *backgroundCoverArtView;
+ at property (readwrite, strong) IBOutlet NSVisualEffectView *backgroundVisualEffectView;
+
+- (void)setCoverArt:(NSImage *)coverArtImage;
+
+ at end
+
+NS_ASSUME_NONNULL_END


=====================================
modules/gui/macosx/windows/video/VLCMainVideoViewAudioMediaDecorativeView.m
=====================================
@@ -0,0 +1,72 @@
+/*****************************************************************************
+ * VLCMainVideoViewAudioMediaDecorativeView.m: MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2023 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <developer at claudiocambra.com>
+ *
+ * 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 "VLCMainVideoViewAudioMediaDecorativeView.h"
+
+#import "extensions/NSView+VLCAdditions.h"
+
+#import "library/VLCLibraryDataTypes.h"
+#import "library/VLCLibraryImageCache.h"
+
+#import "playlist/VLCPlaylistController.h"
+#import "playlist/VLCPlayerController.h"
+
+ at implementation VLCMainVideoViewAudioMediaDecorativeView
+
++ (instancetype)fromNibWithOwner:(id)owner
+{
+    return (VLCMainVideoViewAudioMediaDecorativeView*)[NSView fromNibNamed:@"VLCMainVideoViewAudioMediaDecorativeView"
+                                                                 withClass:[VLCMainVideoViewAudioMediaDecorativeView class]
+                                                                 withOwner:owner];
+}
+
+- (void)awakeFromNib
+{
+    NSNotificationCenter * const notificationCenter = NSNotificationCenter.defaultCenter;
+    [notificationCenter addObserver:self
+                           selector:@selector(playerCurrentMediaItemChanged:)
+                               name:VLCPlayerCurrentMediaItemChanged
+                             object:nil];
+}
+
+- (void)playerCurrentMediaItemChanged:(NSNotification *)notification
+{
+    NSParameterAssert(notification);
+    VLCPlayerController * const controller = notification.object;
+    NSAssert(controller != nil, @"Player current media item changed notification should carry a valid player controller");
+
+    VLCInputItem * const currentInputItem = controller.currentMedia;
+    dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
+        NSImage * const image = [VLCLibraryImageCache thumbnailForInputItem:currentInputItem];
+        dispatch_async(dispatch_get_main_queue(), ^{
+            [self setCoverArt:image];
+        });
+    });
+}
+
+- (void)setCoverArt:(NSImage *)coverArtImage
+{
+    _backgroundCoverArtView.image = coverArtImage;
+    _foregroundCoverArtView.image = coverArtImage;
+}
+
+ at end


=====================================
modules/gui/macosx/windows/video/VLCMainVideoViewController.h
=====================================
@@ -26,6 +26,7 @@
 #import <windows/video/VLCVoutView.h>
 
 @class VLCMainVideoViewOverlayView;
+ at class VLCMainVideoViewAudioMediaDecorativeView;
 
 NS_ASSUME_NONNULL_BEGIN
 
@@ -34,6 +35,7 @@ NS_ASSUME_NONNULL_BEGIN
 @property (readwrite, strong) IBOutlet VLCVoutView *voutView;
 @property (readwrite, strong) IBOutlet NSBox *mainControlsView;
 @property (readwrite, strong) IBOutlet VLCMainVideoViewOverlayView *overlayView;
+ at property (readwrite, strong) IBOutlet VLCMainVideoViewAudioMediaDecorativeView *audioDecorativeView;
 @property (readwrite, strong) IBOutlet NSView *bottomBarView;
 @property (readwrite, strong) IBOutlet NSStackView *centralControlsStackView;
 @property (readwrite, strong) IBOutlet VLCControlsBarCommon *controlsBar;


=====================================
modules/gui/macosx/windows/video/VLCMainVideoViewController.m
=====================================
@@ -22,6 +22,7 @@
 
 #import "VLCMainVideoViewController.h"
 
+#import "library/VLCLibraryDataTypes.h"
 #import "library/VLCLibraryWindow.h"
 #import "library/VLCLibraryUIUnits.h"
 
@@ -32,6 +33,7 @@
 
 #import "views/VLCBottomBarView.h"
 
+#import "windows/video/VLCMainVideoViewAudioMediaDecorativeView.h"
 #import "windows/video/VLCMainVideoViewOverlayView.h"
 #import "windows/video/VLCVideoWindowCommon.h"
 
@@ -52,9 +54,61 @@
 - (instancetype)init
 {
     self = [super initWithNibName:@"VLCMainVideoView" bundle:nil];
+    if (self) {
+        _isFadingIn = NO;
+
+        NSNotificationCenter * const notificationCenter = NSNotificationCenter.defaultCenter;
+        [notificationCenter addObserver:self
+                               selector:@selector(playerCurrentMediaItemChanged:)
+                                   name:VLCPlayerCurrentMediaItemChanged
+                                 object:nil];
+    }
     return self;
 }
 
+- (void)setupAudioDecorativeView
+{
+    _audioDecorativeView = [VLCMainVideoViewAudioMediaDecorativeView fromNibWithOwner:self];
+    _audioDecorativeView.translatesAutoresizingMaskIntoConstraints = NO;
+    [self.view addConstraints:@[
+        [NSLayoutConstraint constraintWithItem:_audioDecorativeView
+                                     attribute:NSLayoutAttributeTop
+                                     relatedBy:NSLayoutRelationEqual
+                                        toItem:self.view
+                                     attribute:NSLayoutAttributeTop
+                                    multiplier:1.
+                                      constant:0.
+        ],
+        [NSLayoutConstraint constraintWithItem:_audioDecorativeView
+                                     attribute:NSLayoutAttributeBottom
+                                     relatedBy:NSLayoutRelationEqual
+                                        toItem:self.view
+                                     attribute:NSLayoutAttributeBottom
+                                    multiplier:1.
+                                      constant:0.
+        ],
+        [NSLayoutConstraint constraintWithItem:_audioDecorativeView
+                                     attribute:NSLayoutAttributeLeft
+                                     relatedBy:NSLayoutRelationEqual
+                                        toItem:self.view
+                                     attribute:NSLayoutAttributeLeft
+                                    multiplier:1.
+                                      constant:0.
+        ],
+        [NSLayoutConstraint constraintWithItem:_audioDecorativeView
+                                     attribute:NSLayoutAttributeRight
+                                     relatedBy:NSLayoutRelationEqual
+                                        toItem:self.view
+                                     attribute:NSLayoutAttributeRight
+                                    multiplier:1.
+                                      constant:0.
+        ],
+    ]];
+
+    [self.view addSubview:_audioDecorativeView positioned:NSWindowAbove relativeTo:_voutView];
+    _audioDecorativeView.hidden = YES;
+}
+
 - (void)viewDidLoad
 {
     _autohideControls = YES;
@@ -87,6 +141,26 @@
 
     _returnButtonBottomConstraint.active = NO;
     _playlistButtonBottomConstraint.active = NO;
+
+    [self setupAudioDecorativeView];
+}
+
+- (void)playerCurrentMediaItemChanged:(NSNotification *)notification
+{
+    NSParameterAssert(notification);
+    VLCPlayerController * const controller = notification.object;
+    NSAssert(controller != nil, @"Player current media item changed notification should carry a valid player controller");
+
+    VLCMediaLibraryMediaItem * const mediaItem = [VLCMediaLibraryMediaItem mediaItemForURL:controller.URLOfCurrentMediaItem];
+
+    const BOOL decorativeViewVisible = mediaItem != nil && mediaItem.mediaType == VLC_ML_MEDIA_TYPE_AUDIO;
+    _audioDecorativeView.hidden = !decorativeViewVisible;
+
+    if (decorativeViewVisible) {
+        [self setAutohideControls:NO];
+    } else {
+        [self setAutohideControls:YES];
+    }
 }
 
 - (BOOL)mouseOnControls



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/893fd450d52ac76ce832a22cb521068fb8f6e314...3900ca14b219900775d28b53999f1cf044cb103d

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/893fd450d52ac76ce832a22cb521068fb8f6e314...3900ca14b219900775d28b53999f1cf044cb103d
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