[vlc-commits] [Git][videolan/vlc][master] 2 commits: macosx: Add method to get media library item from current player item
Felix Paul Kühne (@fkuehne)
gitlab at videolan.org
Thu Jul 3 05:00:57 UTC 2025
Felix Paul Kühne pushed to branch master at VideoLAN / VLC
Commits:
531bec49 by Claudio Cambra at 2025-07-02T13:54:55+00:00
macosx: Add method to get media library item from current player item
Signed-off-by: Claudio Cambra <developer at claudiocambra.com>
- - - - -
0659b095 by Claudio Cambra at 2025-07-02T13:54:55+00:00
macosx: Add favorite toggle button to main library window controls bar
Signed-off-by: Claudio Cambra <developer at claudiocambra.com>
- - - - -
8 changed files:
- modules/gui/macosx/UI/VLCLibraryWindow.xib
- modules/gui/macosx/library/VLCLibraryCollectionViewMediaItemSupplementaryDetailView.m
- modules/gui/macosx/library/VLCLibraryDataTypes.h
- modules/gui/macosx/library/VLCLibraryDataTypes.m
- modules/gui/macosx/playqueue/VLCPlayerController.h
- modules/gui/macosx/playqueue/VLCPlayerController.m
- modules/gui/macosx/windows/controlsbar/VLCMainWindowControlsBar.h
- modules/gui/macosx/windows/controlsbar/VLCMainWindowControlsBar.m
Changes:
=====================================
modules/gui/macosx/UI/VLCLibraryWindow.xib
=====================================
@@ -258,16 +258,29 @@
<constraint firstItem="zOB-QJ-TUy" firstAttribute="leading" secondItem="SM6-nx-NKD" secondAttribute="trailing" constant="4" id="wML-fX-wuF"/>
</constraints>
</customView>
- <stackView distribution="fill" orientation="horizontal" alignment="centerY" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="S1K-Lp-DVO">
+ <stackView distribution="fillEqually" orientation="horizontal" alignment="centerY" spacing="5" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="S1K-Lp-DVO">
<rect key="frame" x="692" y="4" width="188" height="40"/>
<subviews>
+ <button horizontalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="Bt8-jQ-hUr">
+ <rect key="frame" x="0.0" y="13.5" width="16" height="14"/>
+ <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="heart" catalog="system" imagePosition="only" alignment="center" alternateImage="heart.fill" imageScaling="proportionallyUpOrDown" inset="2" id="Y7l-9o-1h7">
+ <behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <constraints>
+ <constraint firstAttribute="width" constant="16" id="cLo-3L-cvG"/>
+ </constraints>
+ <connections>
+ <action selector="toggleFavorite:" target="Uzf-Tf-H8x" id="5n0-gl-qS6"/>
+ </connections>
+ </button>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="i42-vp-ih7">
- <rect key="frame" x="0.0" y="0.0" width="164" height="40"/>
+ <rect key="frame" x="21" y="0.0" width="146" height="40"/>
<subviews>
<slider verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="noz-yJ-oH4" customClass="VLCVolumeSlider">
- <rect key="frame" x="56" y="12" width="52" height="17"/>
+ <rect key="frame" x="6" y="12" width="126" height="17"/>
<constraints>
- <constraint firstAttribute="width" constant="48" id="EM2-Hh-lqK"/>
+ <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="48" id="EM2-Hh-lqK"/>
</constraints>
<sliderCell key="cell" controlSize="mini" continuous="YES" alignment="left" maxValue="512" doubleValue="251.95348837209303" tickMarkPosition="above" sliderType="linear" id="IIu-VN-bEm" customClass="VLCVolumeSliderCell"/>
<connections>
@@ -306,10 +319,11 @@
<constraints>
<constraint firstItem="75c-FF-mgb" firstAttribute="leading" secondItem="noz-yJ-oH4" secondAttribute="trailing" constant="4" id="2Ot-bs-v7Q"/>
<constraint firstItem="75c-FF-mgb" firstAttribute="centerY" secondItem="noz-yJ-oH4" secondAttribute="centerY" id="9Oz-v1-KwH"/>
- <constraint firstItem="noz-yJ-oH4" firstAttribute="centerX" secondItem="i42-vp-ih7" secondAttribute="centerX" id="KPm-J8-zuC"/>
<constraint firstItem="IAy-58-UPp" firstAttribute="centerY" secondItem="noz-yJ-oH4" secondAttribute="centerY" id="PGM-ud-0Wk"/>
+ <constraint firstAttribute="trailing" secondItem="75c-FF-mgb" secondAttribute="trailing" id="TKa-Ng-Pti"/>
+ <constraint firstItem="IAy-58-UPp" firstAttribute="leading" secondItem="i42-vp-ih7" secondAttribute="leading" id="g8p-sN-yd5"/>
<constraint firstItem="noz-yJ-oH4" firstAttribute="centerY" secondItem="i42-vp-ih7" secondAttribute="centerY" id="jfV-of-CoU"/>
- <constraint firstItem="IAy-58-UPp" firstAttribute="trailing" secondItem="noz-yJ-oH4" secondAttribute="leading" constant="-4" id="nMU-2d-pO9"/>
+ <constraint firstItem="IAy-58-UPp" firstAttribute="trailing" secondItem="noz-yJ-oH4" secondAttribute="leading" constant="4" id="nMU-2d-pO9"/>
</constraints>
</customView>
<button translatesAutoresizingMaskIntoConstraints="NO" id="dwM-Uz-pAw" userLabel="Full Screen Button">
@@ -330,10 +344,12 @@
<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>
@@ -593,6 +609,7 @@
<outlet property="backwardButton" destination="jGc-Xw-GYI" id="0AG-44-SN3"/>
<outlet property="bottomBarView" destination="vUy-jt-gjY" id="WqX-SW-mpv"/>
<outlet property="dropView" destination="MQH-bI-Zdh" id="Wz9-NB-wtE"/>
+ <outlet property="favoriteButton" destination="Bt8-jQ-hUr" id="Ouv-od-xpR"/>
<outlet property="forwardButton" destination="dPD-MZ-5oT" id="btH-v5-s7F"/>
<outlet property="fullscreenButton" destination="dwM-Uz-pAw" id="gXA-WS-Gig"/>
<outlet property="jumpBackwardButton" destination="72A-6S-lpR" id="YRk-DB-K28"/>
@@ -1670,6 +1687,8 @@
<image name="arrow.up.arrow.down" catalog="system" width="18" height="15"/>
<image name="fullscreen-one-button" width="29" height="23"/>
<image name="fullscreen-one-button-pressed" width="29" height="23"/>
+ <image name="heart" catalog="system" width="16" height="14"/>
+ <image name="heart.fill" catalog="system" width="16" height="14"/>
<image name="libraryPlay" width="64" height="64"/>
<image name="list.triangle" catalog="system" width="16" height="12"/>
<image name="sidebar.left" catalog="system" width="18" height="14"/>
=====================================
modules/gui/macosx/library/VLCLibraryCollectionViewMediaItemSupplementaryDetailView.m
=====================================
@@ -233,20 +233,12 @@ NSCollectionViewSupplementaryElementKind const VLCLibraryCollectionViewMediaItem
- (IBAction)favoriteAction:(id)sender
{
VLCMediaLibraryMediaItem * const mediaItem = self.representedItem.item;
- const int64_t mediaItemId = mediaItem.libraryID;
- const bool b_favorite = mediaItem.favorited;
- vlc_medialibrary_t * const p_ml = vlc_ml_instance_get(getIntf());
- const int result = vlc_ml_media_set_favorite(p_ml, mediaItemId, !b_favorite);
-
- if (result == VLC_SUCCESS) {
+ if ([mediaItem toggleFavorite] == VLC_SUCCESS) {
VLCMediaLibraryMediaItem * const updatedItem =
- [VLCMediaLibraryMediaItem mediaItemForLibraryID:mediaItemId];
+ [VLCMediaLibraryMediaItem mediaItemForLibraryID:mediaItem.libraryID];
self.representedItem =
[[VLCLibraryRepresentedItem alloc] initWithItem:updatedItem
parentType:self.representedItem.parentType];
-
- } else {
- NSLog(@"Unable to set favorite status of media item: %lli", mediaItemId);
}
}
=====================================
modules/gui/macosx/library/VLCLibraryDataTypes.h
=====================================
@@ -335,6 +335,8 @@ typedef NS_ENUM(NSUInteger, VLCMediaLibraryParentGroupType) {
@property (readonly) int trackNumber;
@property (readonly) int discNumber;
+- (int)toggleFavorite;
+
@end
@interface VLCMediaLibraryEntryPoint : NSObject
=====================================
modules/gui/macosx/library/VLCLibraryDataTypes.m
=====================================
@@ -1576,6 +1576,19 @@ static NSString *genreArrayDisplayString(NSArray<VLCMediaLibraryGenre *> * const
return self.internalLabels;
}
+- (int)toggleFavorite
+{
+ const int64_t mediaItemId = self.libraryID;
+ const bool b_favorite = self.favorited;
+ vlc_medialibrary_t * const p_ml = vlc_ml_instance_get(getIntf());
+ const int result = vlc_ml_media_set_favorite(p_ml, mediaItemId, !b_favorite);
+ if (result == VLC_SUCCESS)
+ _favorited = !_favorited;
+ else
+ NSLog(@"Unable to set favorite status of media item: %lli", mediaItemId);
+ return result;
+}
+
@end
@implementation VLCMediaLibraryShow
=====================================
modules/gui/macosx/playqueue/VLCPlayerController.h
=====================================
@@ -30,6 +30,7 @@ NS_ASSUME_NONNULL_BEGIN
@class VLCPlayerTitle;
@class VLCProgramMetaData;
@class VLCInputItem;
+ at class VLCMediaLibraryMediaItem;
extern NSString *VLCPlayerElementaryStreamID;
extern NSString *VLCTick;
@@ -318,6 +319,12 @@ extern const CGFloat VLCVolumeDefault;
*/
@property (readonly, nullable) VLCInputItem *currentMedia;
+/**
+ * get the relevant media library item for the current media item
+ * @return the current media library media, NULL if no current input item OR is not an ML item
+ */
+ at property (readonly, nullable) VLCMediaLibraryMediaItem *currentMediaLibraryItem;
+
/**
* returns the duration of the current media in vlc ticks
*/
=====================================
modules/gui/macosx/playqueue/VLCPlayerController.m
=====================================
@@ -753,6 +753,12 @@ static int BossCallback(vlc_object_t *p_this,
return _currentMedia;
}
+- (nullable VLCMediaLibraryMediaItem *)currentMediaLibraryItem
+{
+ NSURL * const url = [NSURL URLWithString:self.currentMedia.MRL];
+ return [VLCMediaLibraryMediaItem mediaItemForURL:url];
+}
+
- (int)interpolateTime:(vlc_tick_t)system_now
{
vlc_tick_t new_time;
=====================================
modules/gui/macosx/windows/controlsbar/VLCMainWindowControlsBar.h
=====================================
@@ -37,16 +37,16 @@
@interface VLCMainWindowControlsBar : VLCControlsBarCommon
@property (readwrite, strong) IBOutlet NSButton *stopButton;
-
@property (readwrite, strong) IBOutlet NSButton *prevButton;
@property (readwrite, strong) IBOutlet NSButton *nextButton;
-
@property (readwrite, strong) IBOutlet NSButton *volumeUpButton;
+ at property (readwrite, strong) IBOutlet NSButton *favoriteButton;
@property (readwrite, strong) IBOutlet VLCTrackingView *thumbnailTrackingView;
@property (readwrite, strong) IBOutlet NSView *openMainVideoViewButtonOverlay;
- (IBAction)stop:(id)sender;
+- (IBAction)toggleFavorite:(id)sender;
@end
=====================================
modules/gui/macosx/windows/controlsbar/VLCMainWindowControlsBar.m
=====================================
@@ -201,6 +201,18 @@
self.prevButton.enabled = b_seekable || _playQueueController.hasPreviousPlayQueueItem;
self.nextButton.enabled = b_seekable || _playQueueController.hasNextPlayQueueItem;
[self updateCurrentItemDisplayControls:notification];
+
+ VLCMediaLibraryMediaItem * const currentMlItem = _playerController.currentMediaLibraryItem;
+ self.favoriteButton.hidden = currentMlItem == nil;
+ self.favoriteButton.state = currentMlItem.favorited ? NSControlStateValueOn : NSControlStateValueOff;
+}
+
+- (void)toggleFavorite:(id)sender
+{
+ const NSControlStateValue buttonStartState = self.favoriteButton.state;
+ VLCMediaLibraryMediaItem * const mediaItem = [_playerController currentMediaLibraryItem];
+ if (mediaItem == nil || [mediaItem toggleFavorite] != VLC_SUCCESS)
+ self.favoriteButton.state = buttonStartState;
}
@end
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/acb1d6ed9fcff651cdcba62252a1248dc78c096e...0659b09534ccc81525aaac20445e3ec2e68a6154
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/acb1d6ed9fcff651cdcba62252a1248dc78c096e...0659b09534ccc81525aaac20445e3ec2e68a6154
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