Jean-Baptiste Kempf pushed to branch master at VideoLAN / VLC


Commits:
c4d0ef83 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Add a VLCLibraryAudioTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
3f07a9c2 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Add table item view delegation to VLCLibraryAudioTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
77ee38d4 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Add tableViewSelectionDidChange handling in 
VLCLibraryAudioTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
5d83c720 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Replace audio data source table view delegation with new 
VLCLibraryAudioTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
acdc5a79 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Add a VLCLibraryAudioGroupTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
083c3f8e by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Add heightOfRow method to VLCLibraryAudioGroupTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
f2b92efe by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Implement viewForTableColum in VLCLibraryAudioGroupTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
902fbc52 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Implement heightOfRow for VLCLibraryAudioGroupTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
41afb1b5 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Replace all audio group table views' delegation using 
VLCLibraryAudioGroupDataSource with VLCLibraryAudioGroupTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
71a06b68 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Add VLCLibraryAlbumTracksTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
63bd60ec by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Implement viewForTableColumn in VLCLibraryAlbumTracksTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
c8351209 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Replace album tracks table views delegation use of 
VLCLibraryAlbumTracksDataSource with VLCLibraryAlbumTracksTableViewDelegate

- - - - -
69e09d04 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Add VLCLibraryVideoTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
7f28c752 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Implement viewForTableColumn in VLCLibraryVideoTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
e1d5ba08 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Implement tableViewSelectionDidChange in 
VLCLibraryVideoTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
80da84b0 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Replace table view delegation for video view tables using 
VLCLibraryVideoTableViewDataSource with VLCLibraryVideoTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
9669442a by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Add VLCLibraryTableCellViewProtocol

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
c5ec7f73 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Adapt various table cell views to conform to 
VLCLibraryTableCellViewProtocol

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
27b0bf84 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Add VLCLibraryTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
f50f8114 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Provide cellViewType in VLCLibraryTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
5fc3a7f4 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Add base viewForTableColumn implementation in 
VLCLibraryTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
500d3506 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Remove unneeded VLCLibraryAlbumTracksTableViewDelegate method in favour 
of just using VLCLibraryTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
ccfe32b3 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Simplify VLCLibraryAudioGroupTableViewDelegate by using super method

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
8af7ebc1 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Remove need for custom cellview by using super method in 
VLCLibraryAudioTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
e5578407 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Use the super method for most common path to generate cellview in 
VLCLibraryVideoTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -
3faaa1e1 by Claudio Cambra at 2023-03-25T13:04:59+00:00
macosx: Cover case where table cell view not registered in table view in 
VLCLibraryTableViewDelegate

Signed-off-by: Claudio Cambra <develo...@claudiocambra.com>

- - - - -


30 changed files:

- extras/package/macosx/VLC.xcodeproj/project.pbxproj
- modules/gui/macosx/Makefile.am
- modules/gui/macosx/library/VLCLibraryTableCellView.h
- + modules/gui/macosx/library/VLCLibraryTableCellViewProtocol.h
- + modules/gui/macosx/library/VLCLibraryTableViewDelegate.h
- + modules/gui/macosx/library/VLCLibraryTableViewDelegate.m
- modules/gui/macosx/library/audio-library/VLCLibraryAlbumTableCellView.h
- modules/gui/macosx/library/audio-library/VLCLibraryAlbumTableCellView.m
- modules/gui/macosx/library/audio-library/VLCLibraryAlbumTracksDataSource.h
- modules/gui/macosx/library/audio-library/VLCLibraryAlbumTracksDataSource.m
- + 
modules/gui/macosx/library/audio-library/VLCLibraryAlbumTracksTableViewDelegate.h
- + 
modules/gui/macosx/library/audio-library/VLCLibraryAlbumTracksTableViewDelegate.m
- modules/gui/macosx/library/audio-library/VLCLibraryAudioDataSource.h
- modules/gui/macosx/library/audio-library/VLCLibraryAudioDataSource.m
- modules/gui/macosx/library/audio-library/VLCLibraryAudioGroupDataSource.h
- modules/gui/macosx/library/audio-library/VLCLibraryAudioGroupDataSource.m
- + 
modules/gui/macosx/library/audio-library/VLCLibraryAudioGroupTableViewDelegate.h
- + 
modules/gui/macosx/library/audio-library/VLCLibraryAudioGroupTableViewDelegate.m
- + modules/gui/macosx/library/audio-library/VLCLibraryAudioTableViewDelegate.h
- + modules/gui/macosx/library/audio-library/VLCLibraryAudioTableViewDelegate.m
- modules/gui/macosx/library/audio-library/VLCLibraryAudioViewController.m
- 
modules/gui/macosx/library/audio-library/VLCLibraryCollectionViewAlbumSupplementaryDetailView.m
- 
modules/gui/macosx/library/audio-library/VLCLibraryCollectionViewAudioGroupSupplementaryDetailView.m
- modules/gui/macosx/library/audio-library/VLCLibrarySongTableCellView.h
- modules/gui/macosx/library/audio-library/VLCLibrarySongTableCellView.m
- modules/gui/macosx/library/video-library/VLCLibraryVideoTableViewDataSource.h
- modules/gui/macosx/library/video-library/VLCLibraryVideoTableViewDataSource.m
- + modules/gui/macosx/library/video-library/VLCLibraryVideoTableViewDelegate.h
- + modules/gui/macosx/library/video-library/VLCLibraryVideoTableViewDelegate.m
- modules/gui/macosx/library/video-library/VLCLibraryVideoViewController.m


Changes:

=====================================
extras/package/macosx/VLC.xcodeproj/project.pbxproj
=====================================
@@ -104,6 +104,11 @@
                53B447F8293BB47B00857588 /* 
VLCLibraryVideoCollectionViewsStackViewController.m in Sources */ = {isa = 
PBXBuildFile; fileRef = 53B447EF293BB47A00857588 /* 
VLCLibraryVideoCollectionViewsStackViewController.m */; };
                53B447F9293BB47B00857588 /* 
VLCLibraryVideoTableViewDataSource.m in Sources */ = {isa = PBXBuildFile; 
fileRef = 53B447F3293BB47A00857588 /* VLCLibraryVideoTableViewDataSource.m */; 
};
                53B447FA293BB47B00857588 /* VLCLibraryVideoGroupDescriptor.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 53B447F4293BB47A00857588 /* 
VLCLibraryVideoGroupDescriptor.m */; };
+               53ED472329C74D1F00795DB1 /* VLCLibraryAudioTableViewDelegate.m 
in Sources */ = {isa = PBXBuildFile; fileRef = 53ED472229C74D1F00795DB1 /* 
VLCLibraryAudioTableViewDelegate.m */; };
+               53ED472629C78FE700795DB1 /* 
VLCLibraryAudioGroupTableViewDelegate.m in Sources */ = {isa = PBXBuildFile; 
fileRef = 53ED472529C78FE700795DB1 /* VLCLibraryAudioGroupTableViewDelegate.m 
*/; };
+               53ED472B29C8FF9D00795DB1 /* 
VLCLibraryAlbumTracksTableViewDelegate.m in Sources */ = {isa = PBXBuildFile; 
fileRef = 53ED472A29C8FF9D00795DB1 /* VLCLibraryAlbumTracksTableViewDelegate.m 
*/; };
+               53ED472E29C907C200795DB1 /* VLCLibraryVideoTableViewDelegate.m 
in Sources */ = {isa = PBXBuildFile; fileRef = 53ED472D29C907C200795DB1 /* 
VLCLibraryVideoTableViewDelegate.m */; };
+               53ED473629CA4F3400795DB1 /* VLCLibraryTableViewDelegate.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 53ED473529CA4F3400795DB1 /* 
VLCLibraryTableViewDelegate.m */; };
                53F0E92D299B002300491D49 /* VLCInputNodePathControlItem.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 53F0E92C299B002300491D49 /* 
VLCInputNodePathControlItem.m */; };
                53F0E930299B17DF00491D49 /* VLCInputNodePathControl.m in 
Sources */ = {isa = PBXBuildFile; fileRef = 53F0E92F299B17DF00491D49 /* 
VLCInputNodePathControl.m */; };
                6B0292E61F43256300A50082 /* VLCBottomBarView.m in Sources */ = 
{isa = PBXBuildFile; fileRef = 6B0292E51F43256300A50082 /* VLCBottomBarView.m 
*/; };
@@ -307,6 +312,17 @@
                53B447F3293BB47A00857588 /* 
VLCLibraryVideoTableViewDataSource.m */ = {isa = PBXFileReference; fileEncoding 
= 4; lastKnownFileType = sourcecode.c.objc; path = 
VLCLibraryVideoTableViewDataSource.m; sourceTree = "<group>"; };
                53B447F4293BB47A00857588 /* VLCLibraryVideoGroupDescriptor.m */ 
= {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = 
sourcecode.c.objc; path = VLCLibraryVideoGroupDescriptor.m; sourceTree = 
"<group>"; };
                53B447F5293BB47B00857588 /* 
VLCLibraryVideoCollectionViewsStackViewController.h */ = {isa = 
PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = 
VLCLibraryVideoCollectionViewsStackViewController.h; sourceTree = "<group>"; };
+               53ED472129C74D1F00795DB1 /* VLCLibraryAudioTableViewDelegate.h 
*/ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = 
VLCLibraryAudioTableViewDelegate.h; sourceTree = "<group>"; };
+               53ED472229C74D1F00795DB1 /* VLCLibraryAudioTableViewDelegate.m 
*/ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = 
VLCLibraryAudioTableViewDelegate.m; sourceTree = "<group>"; };
+               53ED472429C78FE700795DB1 /* 
VLCLibraryAudioGroupTableViewDelegate.h */ = {isa = PBXFileReference; 
lastKnownFileType = sourcecode.c.h; path = 
VLCLibraryAudioGroupTableViewDelegate.h; sourceTree = "<group>"; };
+               53ED472529C78FE700795DB1 /* 
VLCLibraryAudioGroupTableViewDelegate.m */ = {isa = PBXFileReference; 
lastKnownFileType = sourcecode.c.objc; path = 
VLCLibraryAudioGroupTableViewDelegate.m; sourceTree = "<group>"; };
+               53ED472929C8FF9D00795DB1 /* 
VLCLibraryAlbumTracksTableViewDelegate.h */ = {isa = PBXFileReference; 
lastKnownFileType = sourcecode.c.h; path = 
VLCLibraryAlbumTracksTableViewDelegate.h; sourceTree = "<group>"; };
+               53ED472A29C8FF9D00795DB1 /* 
VLCLibraryAlbumTracksTableViewDelegate.m */ = {isa = PBXFileReference; 
lastKnownFileType = sourcecode.c.objc; path = 
VLCLibraryAlbumTracksTableViewDelegate.m; sourceTree = "<group>"; };
+               53ED472C29C907C200795DB1 /* VLCLibraryVideoTableViewDelegate.h 
*/ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = 
VLCLibraryVideoTableViewDelegate.h; sourceTree = "<group>"; };
+               53ED472D29C907C200795DB1 /* VLCLibraryVideoTableViewDelegate.m 
*/ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = 
VLCLibraryVideoTableViewDelegate.m; sourceTree = "<group>"; };
+               53ED473729CAF67F00795DB1 /* VLCLibraryTableCellViewProtocol.h 
*/ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = 
VLCLibraryTableCellViewProtocol.h; sourceTree = "<group>"; };
+               53ED473429CA4F3400795DB1 /* VLCLibraryTableViewDelegate.h */ = 
{isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = 
VLCLibraryTableViewDelegate.h; sourceTree = "<group>"; };
+               53ED473529CA4F3400795DB1 /* VLCLibraryTableViewDelegate.m */ = 
{isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = 
VLCLibraryTableViewDelegate.m; sourceTree = "<group>"; };
                53F0E92B299B002300491D49 /* VLCInputNodePathControlItem.h */ = 
{isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = 
VLCInputNodePathControlItem.h; sourceTree = "<group>"; };
                53F0E92C299B002300491D49 /* VLCInputNodePathControlItem.m */ = 
{isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = 
VLCInputNodePathControlItem.m; sourceTree = "<group>"; };
                53F0E92E299B17DF00491D49 /* VLCInputNodePathControl.h */ = {isa 
= PBXFileReference; lastKnownFileType = sourcecode.c.h; path = 
VLCInputNodePathControl.h; sourceTree = "<group>"; };
@@ -1174,8 +1190,11 @@
                                7D22A8F322BC14F80063ECD2 /* 
VLCLibrarySortingMenuController.m */,
                                7DE2F0452282D5D10040DD0A /* 
VLCLibraryTableCellView.h */,
                                7DE2F0462282D5D10040DD0A /* 
VLCLibraryTableCellView.m */,
+                               53ED473729CAF67F00795DB1 /* 
VLCLibraryTableCellViewProtocol.h */,
                                536283E0291146BC00640C15 /* 
VLCLibraryTableView.h */,
                                536283DE291146BC00640C15 /* 
VLCLibraryTableView.m */,
+                               53ED473429CA4F3400795DB1 /* 
VLCLibraryTableViewDelegate.h */,
+                               53ED473529CA4F3400795DB1 /* 
VLCLibraryTableViewDelegate.m */,
                                7D713D302201AE350042BEB7 /* VLCLibraryWindow.h 
*/,
                                7D713D312201AE350042BEB7 /* VLCLibraryWindow.m 
*/,
                                5362550B293FD639005D64FA /* 
VLCLibraryWindowController.h */,
@@ -1319,10 +1338,16 @@
                                7DE82E7822843781002D341A /* 
VLCLibraryAlbumTableCellView.m */,
                                536283DC291146BC00640C15 /* 
VLCLibraryAlbumTracksDataSource.h */,
                                536283DF291146BC00640C15 /* 
VLCLibraryAlbumTracksDataSource.m */,
+                               53ED472929C8FF9D00795DB1 /* 
VLCLibraryAlbumTracksTableViewDelegate.h */,
+                               53ED472A29C8FF9D00795DB1 /* 
VLCLibraryAlbumTracksTableViewDelegate.m */,
                                7DE2F0422282C84A0040DD0A /* 
VLCLibraryAudioDataSource.h */,
                                7DE2F0432282C84A0040DD0A /* 
VLCLibraryAudioDataSource.m */,
                                53903D3829576ED500D0B308 /* 
VLCLibraryAudioGroupDataSource.h */,
                                53903D3929576ED500D0B308 /* 
VLCLibraryAudioGroupDataSource.m */,
+                               53ED472429C78FE700795DB1 /* 
VLCLibraryAudioGroupTableViewDelegate.h */,
+                               53ED472529C78FE700795DB1 /* 
VLCLibraryAudioGroupTableViewDelegate.m */,
+                               53ED472129C74D1F00795DB1 /* 
VLCLibraryAudioTableViewDelegate.h */,
+                               53ED472229C74D1F00795DB1 /* 
VLCLibraryAudioTableViewDelegate.m */,
                                536283E8291146BC00640C15 /* 
VLCLibraryCollectionViewAlbumSupplementaryDetailView.h */,
                                536283E1291146BC00640C15 /* 
VLCLibraryCollectionViewAlbumSupplementaryDetailView.m */,
                                536283E7291146BC00640C15 /* 
VLCLibraryCollectionViewAudioGroupSupplementaryDetailView.h */,
@@ -1350,6 +1375,8 @@
                                53B447F4293BB47A00857588 /* 
VLCLibraryVideoGroupDescriptor.m */,
                                53B447EE293BB47A00857588 /* 
VLCLibraryVideoTableViewDataSource.h */,
                                53B447F3293BB47A00857588 /* 
VLCLibraryVideoTableViewDataSource.m */,
+                               53ED472C29C907C200795DB1 /* 
VLCLibraryVideoTableViewDelegate.h */,
+                               53ED472D29C907C200795DB1 /* 
VLCLibraryVideoTableViewDelegate.m */,
                        );
                        path = "video-library";
                        sourceTree = "<group>";
@@ -1878,6 +1905,7 @@
                                1CCC89002078A3D500E5626F /* PopupPanel.xib in 
Sources */,
                                5317FE04294E3DD3001702F0 /* 
VLCLibraryCollectionViewDelegate.m in Sources */,
                                536EFC39295E521600F4CB13 /* 
VLCLibraryVideoViewController.m in Sources */,
+                               53ED472B29C8FF9D00795DB1 /* 
VLCLibraryAlbumTracksTableViewDelegate.m in Sources */,
                                53628402291147C500640C15 /* VLCBasicView.m in 
Sources */,
                                7DFBDCAB2269E77F00B700A5 /* VLCLibraryModel.m 
in Sources */,
                                1CCC89012078A3D500E5626F /* Preferences.xib in 
Sources */,
@@ -1900,6 +1928,7 @@
                                1CCC89062078A3D500E5626F /* 
TimeSelectionPanel.xib in Sources */,
                                5307A6F82969904D001E0C6A /* 
VLCLibraryMediaSourceViewController.m in Sources */,
                                6B81662C1EBFC38100C26F1B /* VLCUIWidgets.m in 
Sources */,
+                               53ED472329C74D1F00795DB1 /* 
VLCLibraryAudioTableViewDelegate.m in Sources */,
                                6B0AB0F11F1AC8B3003A1B4E /* VLCSliderCell.m in 
Sources */,
                                6B8166291EBFC34300C26F1B /* 
VLCDefaultValueSlider.m in Sources */,
                                6B81662A1EBFC34300C26F1B /* 
VLCDefaultValueSliderCell.m in Sources */,
@@ -1912,6 +1941,7 @@
                                1C3113EF1E508C7600D4DD76 /* 
VLCRendererDiscovery.m in Sources */,
                                1C3113F11E508C7600D4DD76 /* VLCRendererItem.m 
in Sources */,
                                1C3113F31E508C7600D4DD76 /* 
VLCRendererMenuController.m in Sources */,
+                               53ED473629CA4F3400795DB1 /* 
VLCLibraryTableViewDelegate.m in Sources */,
                                6B4D50931E7979CB004479B5 /* 
VLCSimplePrefsWindow.m in Sources */,
                                6B397C4F216C8EB200403ED0 /* NSString+Helpers.m 
in Sources */,
                                1C31138E1E508C6900D4DD76 /* 
VLCAboutWindowController.m in Sources */,
@@ -1931,6 +1961,7 @@
                                1C3113961E508C6900D4DD76 /* applescript.m in 
Sources */,
                                5325C57D29302E6800B2B63A /* 
VLCLibraryAudioViewController.m in Sources */,
                                1C3113981E508C6900D4DD76 /* 
VLCAudioEffectsWindowController.m in Sources */,
+                               53ED472629C78FE700795DB1 /* 
VLCLibraryAudioGroupTableViewDelegate.m in Sources */,
                                536283F9291146BC00640C15 /* 
VLCLibraryCollectionViewFlowLayout.m in Sources */,
                                6BBBF9851F7B257100B404CD /* VLCLogMessage.m in 
Sources */,
                                7D445D8E2203375100263D34 /* 
VLCPlaylistMenuController.m in Sources */,
@@ -2014,6 +2045,7 @@
                                1C3113E51E508C6900D4DD76 /* 
VLCInformationWindowController.m in Sources */,
                                6B7F1FDF1F07DA920002BDD8 /* 
VLCHexNumberFormatter.m in Sources */,
                                7DB40D2A20CBCEB500F63173 /* VLCMainMenu.m in 
Sources */,
+                               53ED472E29C907C200795DB1 /* 
VLCLibraryVideoTableViewDelegate.m in Sources */,
                                1C3113E91E508C6900D4DD76 /* 
VLCScrollingClipView.m in Sources */,
                                7DB40D2D20CBCEC200F63173 /* VLCStatusBarIcon.m 
in Sources */,
                                1C3113ED1E508C6900D4DD76 /* 
VLCTimeSelectionPanelController.m in Sources */,


=====================================
modules/gui/macosx/Makefile.am
=====================================
@@ -122,8 +122,11 @@ libmacosx_plugin_la_SOURCES = \
        gui/macosx/library/VLCLibrarySortingMenuController.m \
        gui/macosx/library/VLCLibraryTableView.h \
        gui/macosx/library/VLCLibraryTableView.m \
+       gui/macosx/library/VLCLibraryTableViewDelegate.h \
+       gui/macosx/library/VLCLibraryTableViewDelegate.m \
        gui/macosx/library/VLCLibraryTableCellView.h \
        gui/macosx/library/VLCLibraryTableCellView.m \
+       gui/macosx/library/VLCLibraryTableCellViewProtocol.h \
        gui/macosx/library/VLCLibraryUIUnits.h \
        gui/macosx/library/VLCLibraryUIUnits.m \
        gui/macosx/library/VLCLibraryWindow.h \
@@ -142,14 +145,22 @@ libmacosx_plugin_la_SOURCES = \
        gui/macosx/library/video-library/VLCLibraryVideoGroupDescriptor.m \
        gui/macosx/library/video-library/VLCLibraryVideoTableViewDataSource.h \
        gui/macosx/library/video-library/VLCLibraryVideoTableViewDataSource.m \
+       gui/macosx/library/video-library/VLCLibraryVideoTableViewDelegate.h \
+       gui/macosx/library/video-library/VLCLibraryVideoTableViewDelegate.m \
        gui/macosx/library/audio-library/VLCLibraryAlbumTableCellView.h \
        gui/macosx/library/audio-library/VLCLibraryAlbumTableCellView.m \
        gui/macosx/library/audio-library/VLCLibraryAlbumTracksDataSource.h \
        gui/macosx/library/audio-library/VLCLibraryAlbumTracksDataSource.m \
+       
gui/macosx/library/audio-library/VLCLibraryAlbumTracksTableViewDelegate.h \
+       
gui/macosx/library/audio-library/VLCLibraryAlbumTracksTableViewDelegate.m \
        gui/macosx/library/audio-library/VLCLibraryAudioDataSource.h \
        gui/macosx/library/audio-library/VLCLibraryAudioDataSource.m \
        gui/macosx/library/audio-library/VLCLibraryAudioGroupDataSource.h \
        gui/macosx/library/audio-library/VLCLibraryAudioGroupDataSource.m \
+       
gui/macosx/library/audio-library/VLCLibraryAudioGroupTableViewDelegate.h \
+       
gui/macosx/library/audio-library/VLCLibraryAudioGroupTableViewDelegate.m \
+       gui/macosx/library/audio-library/VLCLibraryAudioTableViewDelegate.h \
+       gui/macosx/library/audio-library/VLCLibraryAudioTableViewDelegate.m \
        gui/macosx/library/audio-library/VLCLibraryAudioViewController.h \
        gui/macosx/library/audio-library/VLCLibraryAudioViewController.m \
        
gui/macosx/library/audio-library/VLCLibraryCollectionViewAlbumSupplementaryDetailView.h
 \


=====================================
modules/gui/macosx/library/VLCLibraryTableCellView.h
=====================================
@@ -22,6 +22,8 @@
 
 #import <Cocoa/Cocoa.h>
 
+#import "library/VLCLibraryTableCellViewProtocol.h"
+
 NS_ASSUME_NONNULL_BEGIN
 
 @class VLCImageView;
@@ -29,7 +31,7 @@ NS_ASSUME_NONNULL_BEGIN
 @protocol VLCMediaLibraryItemProtocol;
 @class VLCInputItem;
 
-@interface VLCLibraryTableCellView : NSTableCellView
+@interface VLCLibraryTableCellView : 
NSTableCellView<VLCLibraryTableCellViewProtocol>
 
 + (instancetype)fromNibWithOwner:(id)owner;
 


=====================================
modules/gui/macosx/library/VLCLibraryTableCellViewProtocol.h
=====================================
@@ -0,0 +1,31 @@
+/*****************************************************************************
+ * VLCLibraryTableCellViewProtocol.h: MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2023 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <develo...@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 "VLCLibraryTableCellViewProtocol.h"
+
+@protocol VLCMediaLibraryItemProtocol;
+
+@protocol VLCLibraryTableCellViewProtocol<NSObject>
+
+- (void)setRepresentedItem:(id<VLCMediaLibraryItemProtocol>)libraryItem;
+
+@end


=====================================
modules/gui/macosx/library/VLCLibraryTableViewDelegate.h
=====================================
@@ -0,0 +1,34 @@
+/*****************************************************************************
+ * VLCLibraryTableViewDelegate.h: MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2023 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <develo...@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
+
+@interface VLCLibraryTableViewDelegate : NSObject <NSTableViewDelegate>
+
+@property (readwrite, assign) NSString *cellViewIdentifier;
+@property (readwrite, assign) Class cellViewClass;
+
+@end
+
+NS_ASSUME_NONNULL_END


=====================================
modules/gui/macosx/library/VLCLibraryTableViewDelegate.m
=====================================
@@ -0,0 +1,52 @@
+/*****************************************************************************
+ * VLCLibraryTableViewDelegate.m: MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2023 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <develo...@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 "VLCLibraryTableViewDelegate.h"
+
+#import "library/VLCLibraryTableCellView.h"
+#import "library/VLCLibraryTableCellViewProtocol.h"
+#import "library/VLCLibraryTableView.h"
+#import "library/VLCLibraryDataTypes.h"
+
+@implementation VLCLibraryTableViewDelegate
+
+- (NSView *)tableView:(NSTableView *)tableView 
viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
+{
+    if (![tableView.dataSource 
conformsToProtocol:@protocol(VLCLibraryTableViewDataSource)]) {
+        return nil;
+    }
+
+    NSObject<VLCLibraryTableViewDataSource> * const vlcDataSource = 
(NSObject<VLCLibraryTableViewDataSource>*)tableView.dataSource;
+    NSAssert(vlcDataSource != nil, @"Should be a valid data source");
+
+    NSView<VLCLibraryTableCellViewProtocol> * cellView = 
(NSView<VLCLibraryTableCellViewProtocol> *)[tableView 
makeViewWithIdentifier:self.cellViewIdentifier owner:self];
+
+    if (cellView == nil && [self.cellViewClass 
respondsToSelector:@selector(fromNibWithOwner:)]) {
+        cellView = [self.cellViewClass fromNibWithOwner:self];
+        cellView.identifier = self.cellViewIdentifier;
+    }
+
+    [cellView setRepresentedItem:[vlcDataSource libraryItemAtRow:row 
forTableView:tableView]];
+    return cellView;
+}
+
+@end


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAlbumTableCellView.h
=====================================
@@ -22,13 +22,15 @@
 
 #import <Cocoa/Cocoa.h>
 
+#import "library/VLCLibraryTableCellViewProtocol.h"
+
 NS_ASSUME_NONNULL_BEGIN
 
 @class VLCImageView;
 @class VLCTrackingView;
 @class VLCMediaLibraryAlbum;
 
-@interface VLCLibraryAlbumTableCellView : NSTableCellView
+@interface VLCLibraryAlbumTableCellView : 
NSTableCellView<VLCLibraryTableCellViewProtocol>
 
 extern NSString *VLCAudioLibraryCellIdentifier;
 extern NSString *VLCLibraryAlbumTableCellTableViewColumnIdentifier;


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAlbumTableCellView.m
=====================================
@@ -39,6 +39,7 @@
 #import "library/VLCLibraryUIUnits.h"
 
 #import "library/audio-library/VLCLibraryAlbumTracksDataSource.h"
+#import "library/audio-library/VLCLibraryAlbumTracksTableViewDelegate.h"
 
 NSString *VLCAudioLibraryCellIdentifier = @"VLCAudioLibraryCellIdentifier";
 NSString *VLCLibraryAlbumTableCellTableViewColumnIdentifier = 
@"VLCLibraryAlbumTableCellTableViewColumnIdentifier";
@@ -48,6 +49,7 @@ const CGFloat VLCLibraryAlbumTableCellViewDefaultHeight = 
168.;
 {
     VLCLibraryController *_libraryController;
     VLCLibraryAlbumTracksDataSource *_tracksDataSource;
+    VLCLibraryAlbumTracksTableViewDelegate *_tracksTableViewDelegate;
     VLCLibraryTableView *_tracksTableView;
     NSTableColumn *_column;
 }
@@ -141,8 +143,9 @@ const CGFloat VLCLibraryAlbumTableCellViewDefaultHeight = 
168.;
     _tracksTableView.backgroundColor = [NSColor clearColor];
 
     _tracksDataSource = [[VLCLibraryAlbumTracksDataSource alloc] init];
+    _tracksTableViewDelegate = [[VLCLibraryAlbumTracksTableViewDelegate alloc] 
init];
     _tracksTableView.dataSource = _tracksDataSource;
-    _tracksTableView.delegate = _tracksDataSource;
+    _tracksTableView.delegate = _tracksTableViewDelegate;
     _tracksTableView.doubleAction = 
@selector(tracksTableViewDoubleClickAction:);
     _tracksTableView.target = self;
 
@@ -232,6 +235,14 @@ const CGFloat VLCLibraryAlbumTableCellViewDefaultHeight = 
168.;
     [_tracksTableView reloadData];
 }
 
+- (void)setRepresentedItem:(id<VLCMediaLibraryItemProtocol>)libraryItem
+{
+    VLCMediaLibraryAlbum * const album = (VLCMediaLibraryAlbum *)libraryItem;
+    if (album != nil) {
+        [self setRepresentedAlbum:album];
+    }
+}
+
 - (void)tracksTableViewDoubleClickAction:(id)sender
 {
     if (!_libraryController) {


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAlbumTracksDataSource.h
=====================================
@@ -28,7 +28,7 @@ NS_ASSUME_NONNULL_BEGIN
 
 @class VLCMediaLibraryAlbum;
 
-@interface VLCLibraryAlbumTracksDataSource : NSObject 
<VLCLibraryTableViewDataSource, NSTableViewDelegate>
+@interface VLCLibraryAlbumTracksDataSource : NSObject 
<VLCLibraryTableViewDataSource>
 
 extern const CGFloat VLCLibraryTracksRowHeight;
 


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAlbumTracksDataSource.m
=====================================
@@ -22,17 +22,7 @@
 
 #import "VLCLibraryAlbumTracksDataSource.h"
 
-#import "extensions/NSFont+VLCAdditions.h"
-#import "extensions/NSString+Helpers.h"
-#import "views/VLCImageView.h"
-#import "views/VLCTrackingView.h"
-#import "main/VLCMain.h"
-#import "library/VLCLibraryController.h"
 #import "library/VLCLibraryDataTypes.h"
-#import "library/VLCLibraryTableCellView.h"
-#import "library/VLCLibraryTableView.h"
-#import "library/audio-library/VLCLibraryAlbumTracksDataSource.h"
-#import "library/audio-library/VLCLibrarySongTableCellView.h"
 
 const CGFloat VLCLibraryTracksRowHeight = 40.;
 
@@ -59,20 +49,6 @@ const CGFloat VLCLibraryTracksRowHeight = 40.;
     return 0;
 }
 
-- (NSView *)tableView:(NSTableView *)tableView 
viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
-{
-    VLCLibrarySongTableCellView *cellView = [tableView 
makeViewWithIdentifier:VLCAudioLibrarySongCellIdentifier owner:self];
-
-    if (cellView == nil) {
-        cellView = [VLCLibrarySongTableCellView fromNibWithOwner:self];
-        cellView.identifier = VLCAudioLibrarySongCellIdentifier;
-    }
-
-    cellView.representedMediaItem = (VLCMediaLibraryMediaItem *)[self 
libraryItemAtRow:row
-                                                                          
forTableView:tableView];
-    return cellView;
-}
-
 - (id<VLCMediaLibraryItemProtocol>)libraryItemAtRow:(NSInteger)row
                                        forTableView:(NSTableView *)tableView
 {


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAlbumTracksTableViewDelegate.h
=====================================
@@ -0,0 +1,33 @@
+/*****************************************************************************
+ * VLCLibraryAlbumTracksTableViewDelegate.h: MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2023 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <develo...@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>
+
+#import "library/VLCLibraryTableViewDelegate.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface VLCLibraryAlbumTracksTableViewDelegate : VLCLibraryTableViewDelegate
+
+@end
+
+NS_ASSUME_NONNULL_END


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAlbumTracksTableViewDelegate.m
=====================================
@@ -0,0 +1,40 @@
+/*****************************************************************************
+ * VLCLibraryAlbumTracksTableViewDelegate.m: MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2023 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <develo...@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 "VLCLibraryAlbumTracksTableViewDelegate.h"
+
+#import "library/audio-library/VLCLibrarySongTableCellView.h"
+
+@implementation VLCLibraryAlbumTracksTableViewDelegate
+
+- (instancetype)init
+{
+    self = [super init];
+    if (self) {
+        self.cellViewIdentifier = VLCAudioLibrarySongCellIdentifier;
+        self.cellViewClass = [VLCLibrarySongTableCellView class];
+    }
+    return self;
+}
+
+
+@end


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAudioDataSource.h
=====================================
@@ -38,7 +38,23 @@ typedef NS_ENUM(NSUInteger, VLCAudioLibrarySegment) {
     VLCAudioLibraryGenresSegment
 };
 
-@interface VLCLibraryAudioDataSource : NSObject 
<VLCLibraryTableViewDataSource, NSTableViewDelegate, 
VLCLibraryCollectionViewDataSource>
+extern NSString * const VLCLibrarySongsTableViewSongPlayingColumnIdentifier;
+extern NSString * const VLCLibrarySongsTableViewTitleColumnIdentifier;
+extern NSString * const VLCLibrarySongsTableViewDurationColumnIdentifier;
+extern NSString * const VLCLibrarySongsTableViewArtistColumnIdentifier;
+extern NSString * const VLCLibrarySongsTableViewAlbumColumnIdentifier;
+extern NSString * const VLCLibrarySongsTableViewGenreColumnIdentifier;
+extern NSString * const VLCLibrarySongsTableViewPlayCountColumnIdentifier;
+extern NSString * const VLCLibrarySongsTableViewYearColumnIdentifier;
+
+extern NSString * const VLCLibraryTitleSortDescriptorKey;
+extern NSString * const VLCLibraryDurationSortDescriptorKey;
+extern NSString * const VLCLibraryArtistSortDescriptorKey;
+extern NSString * const VLCLibraryAlbumSortDescriptorKey;
+extern NSString * const VLCLibraryPlayCountSortDescriptorKey;
+extern NSString * const VLCLibraryYearSortDescriptorKey;
+
+@interface VLCLibraryAudioDataSource : NSObject 
<VLCLibraryTableViewDataSource, VLCLibraryCollectionViewDataSource>
 
 @property (readwrite, assign) VLCLibraryModel *libraryModel;
 @property (readwrite, assign) VLCLibraryAudioGroupDataSource 
*audioGroupDataSource;
@@ -53,7 +69,10 @@ typedef NS_ENUM(NSUInteger, VLCAudioLibrarySegment) {
 
 - (void)setup;
 - (void)setupCollectionView:(NSCollectionView *)collectionView;
+
 - (void)reloadData;
+- (void)tableView:(NSTableView * const)tableView selectRow:(NSInteger)row;
+
 
 @end
 


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAudioDataSource.m
=====================================
@@ -50,21 +50,21 @@
 #import "views/VLCImageView.h"
 #import "views/VLCSubScrollView.h"
 
-static NSString *VLCLibrarySongsTableViewSongPlayingColumnIdentifier = 
@"VLCLibrarySongsTableViewSongPlayingColumnIdentifier";
-static NSString *VLCLibrarySongsTableViewTitleColumnIdentifier = 
@"VLCLibrarySongsTableViewTitleColumnIdentifier";
-static NSString *VLCLibrarySongsTableViewDurationColumnIdentifier = 
@"VLCLibrarySongsTableViewDurationColumnIdentifier";
-static NSString *VLCLibrarySongsTableViewArtistColumnIdentifier = 
@"VLCLibrarySongsTableViewArtistColumnIdentifier";
-static NSString *VLCLibrarySongsTableViewAlbumColumnIdentifier = 
@"VLCLibrarySongsTableViewAlbumColumnIdentifier";
-static NSString *VLCLibrarySongsTableViewGenreColumnIdentifier = 
@"VLCLibrarySongsTableViewGenreColumnIdentifier";
-static NSString *VLCLibrarySongsTableViewPlayCountColumnIdentifier = 
@"VLCLibrarySongsTableViewPlayCountColumnIdentifier";
-static NSString *VLCLibrarySongsTableViewYearColumnIdentifier = 
@"VLCLibrarySongsTableViewYearColumnIdentifier";
-
-static NSString *VLCLibraryTitleSortDescriptorKey = 
@"VLCLibraryTitleSortDescriptorKey";
-static NSString *VLCLibraryDurationSortDescriptorKey = 
@"VLCLibraryDurationSortDescriptorKey";
-static NSString *VLCLibraryArtistSortDescriptorKey = 
@"VLCLibraryArtistSortDescriptorKey";
-static NSString *VLCLibraryAlbumSortDescriptorKey = 
@"VLCLibraryAlbumSortDescriptorKey";
-static NSString *VLCLibraryPlayCountSortDescriptorKey = 
@"VLCLibraryPlayCountSortDescriptorKey";
-static NSString *VLCLibraryYearSortDescriptorKey = 
@"VLCLibraryYearSortDescriptorKey";
+NSString * const VLCLibrarySongsTableViewSongPlayingColumnIdentifier = 
@"VLCLibrarySongsTableViewSongPlayingColumnIdentifier";
+NSString * const VLCLibrarySongsTableViewTitleColumnIdentifier = 
@"VLCLibrarySongsTableViewTitleColumnIdentifier";
+NSString * const VLCLibrarySongsTableViewDurationColumnIdentifier = 
@"VLCLibrarySongsTableViewDurationColumnIdentifier";
+NSString * const VLCLibrarySongsTableViewArtistColumnIdentifier = 
@"VLCLibrarySongsTableViewArtistColumnIdentifier";
+NSString * const VLCLibrarySongsTableViewAlbumColumnIdentifier = 
@"VLCLibrarySongsTableViewAlbumColumnIdentifier";
+NSString * const VLCLibrarySongsTableViewGenreColumnIdentifier = 
@"VLCLibrarySongsTableViewGenreColumnIdentifier";
+NSString * const VLCLibrarySongsTableViewPlayCountColumnIdentifier = 
@"VLCLibrarySongsTableViewPlayCountColumnIdentifier";
+NSString * const VLCLibrarySongsTableViewYearColumnIdentifier = 
@"VLCLibrarySongsTableViewYearColumnIdentifier";
+
+NSString * const VLCLibraryTitleSortDescriptorKey = 
@"VLCLibraryTitleSortDescriptorKey";
+NSString * const VLCLibraryDurationSortDescriptorKey = 
@"VLCLibraryDurationSortDescriptorKey";
+NSString * const VLCLibraryArtistSortDescriptorKey = 
@"VLCLibraryArtistSortDescriptorKey";
+NSString * const VLCLibraryAlbumSortDescriptorKey = 
@"VLCLibraryAlbumSortDescriptorKey";
+NSString * const VLCLibraryPlayCountSortDescriptorKey = 
@"VLCLibraryPlayCountSortDescriptorKey";
+NSString * const VLCLibraryYearSortDescriptorKey = 
@"VLCLibraryYearSortDescriptorKey";
 // TODO: Add sorting by genre
 
 @interface VLCLibraryAudioDataSource ()
@@ -495,73 +495,6 @@ static NSString *VLCLibraryYearSortDescriptorKey = 
@"VLCLibraryYearSortDescripto
     return [self displayAllArtistsGenresTableEntry] ? numItems + 1 : numItems;
 }
 
-- (NSView *)tableView:(NSTableView *)tableView
-   viewForTableColumn:(NSTableColumn *)tableColumn
-                  row:(NSInteger)row
-{
-    // The table view for songs in the list view mode of the audio library is 
different from the other audio groupings
-    // and we use a vanilla NSTableView created in the VLCLibraryWindow XIB 
for it
-    if ([tableView.identifier 
isEqualToString:@"VLCLibrarySongsTableViewIdentifier"] &&
-        _currentParentType == VLC_ML_PARENT_UNKNOWN) {
-        const NSString * const columnIdentifier = tableColumn.identifier;
-        const VLCMediaLibraryMediaItem * const mediaItem = [self 
libraryItemAtRow:row forTableView:tableView];
-
-        if (!mediaItem) {
-            return nil;
-        }
-
-        const VLCMediaLibraryAlbum * const album = [VLCMediaLibraryAlbum 
albumWithID:mediaItem.albumID];
-        const VLCMediaLibraryGenre * const genre = [VLCMediaLibraryGenre 
genreWithID:mediaItem.genreID];
-
-        NSString *cellText = @"";
-        NSString *cellIdentifier = @"";
-
-        if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewSongPlayingColumnIdentifier]) {
-            VLCLibrarySongsTableViewSongPlayingTableCellView *cellView = 
(VLCLibrarySongsTableViewSongPlayingTableCellView*)[tableView 
makeViewWithIdentifier:@"VLCLibrarySongsTableViewSongPlayingTableCellViewIdentifier"
 owner:self];
-            NSAssert(cellView, @"Unexpectedly received null cellview");
-            cellView.representedMediaItem = (VLCMediaLibraryMediaItem 
*)mediaItem;
-            return cellView;
-        } else if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewTitleColumnIdentifier]) {
-            cellIdentifier = 
@"VLCLibrarySongsTableViewTitleTableCellViewIdentifier";
-            cellText = mediaItem.title;
-        } else if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewDurationColumnIdentifier]) {
-            cellIdentifier = 
@"VLCLibrarySongsTableViewDurationTableCellViewIdentifier";
-            cellText = mediaItem.durationString;
-        } else if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewArtistColumnIdentifier]) {
-            cellIdentifier = 
@"VLCLibrarySongsTableViewArtistTableCellViewIdentifier";
-            cellText = album.artistName.length == 0 ? @"" : album.artistName;
-        } else if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewAlbumColumnIdentifier]) {
-            cellIdentifier = 
@"VLCLibrarySongsTableViewAlbumTableCellViewIdentifier";
-            cellText = album.title.length == 0 ? @"" : album.title;
-        } else if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewGenreColumnIdentifier]) {
-            cellIdentifier = 
@"VLCLibrarySongsTableViewGenreTableCellViewIdentifier";
-            cellText = genre.name.length == 0 ? @"" : genre.name;
-        } else if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewPlayCountColumnIdentifier]) {
-            cellIdentifier = 
@"VLCLibrarySongsTableViewPlayCountTableCellViewIdentifier";
-            cellText = [@(mediaItem.playCount) stringValue];
-        } else if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewYearColumnIdentifier]) {
-            cellIdentifier = 
@"VLCLibrarySongsTableViewYearTableCellViewIdentifier";
-            cellText = [@(mediaItem.year) stringValue];
-        } else {
-            NSAssert(true, @"Received unknown column identifier %@", 
columnIdentifier);
-        }
-
-        NSTableCellView *cellView = [tableView 
makeViewWithIdentifier:cellIdentifier owner:self];
-        cellView.textField.stringValue = cellText;
-        return cellView;
-    }
-
-    VLCLibraryTableCellView *cellView = [tableView 
makeViewWithIdentifier:VLCAudioLibraryCellIdentifier owner:self];
-
-    if (cellView == nil) {
-        cellView = [VLCLibraryTableCellView fromNibWithOwner:self];
-        cellView.identifier = VLCAudioLibraryCellIdentifier;
-    }
-
-    [cellView setRepresentedItem:[self libraryItemAtRow:row 
forTableView:tableView]];
-    return cellView;
-}
-
 - (id<VLCMediaLibraryItemProtocol>)libraryItemAtRow:(NSInteger)row
                                        forTableView:(NSTableView *)tableView
 {
@@ -581,14 +514,21 @@ static NSString *VLCLibraryYearSortDescriptorKey = 
@"VLCLibraryYearSortDescripto
     return _displayedCollection[row];
 }
 
-- (void)tableViewSelectionDidChange:(NSNotification *)notification
+- (void)tableView:(NSTableView * const)tableView selectRow:(NSInteger)row
 {
-    NSParameterAssert(notification);
-    NSTableView *tableView = (NSTableView *)notification.object;
-    NSAssert(tableView, @"Must be a valid table view");
-    NSInteger selectedRow = tableView.selectedRow;
-    BOOL showingAllItemsEntry = [self displayAllArtistsGenresTableEntry];
-    NSInteger libraryItemIndex = showingAllItemsEntry ? selectedRow - 1 : 
selectedRow;
+    NSParameterAssert(tableView);
+    
+    if (tableView != _collectionSelectionTableView && tableView != 
_groupSelectionTableView && tableView != _gridModeListTableView) {
+        return;
+    }
+
+    if (tableView.selectedRow != row) {
+        [tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:row] 
byExtendingSelection:NO];
+    }
+
+    const NSInteger selectedRow = tableView.selectedRow;
+    const BOOL showingAllItemsEntry = [self displayAllArtistsGenresTableEntry];
+    const NSInteger libraryItemIndex = showingAllItemsEntry ? selectedRow - 1 
: selectedRow;
 
     if (libraryItemIndex < 0 && showingAllItemsEntry) {
         _audioGroupDataSource.representedListOfAlbums = 
_libraryModel.listOfAlbums;


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAudioGroupDataSource.h
=====================================
@@ -31,7 +31,7 @@ NS_ASSUME_NONNULL_BEGIN
 @class VLCLibraryAudioGroupDataSource;
 @class VLCMediaLibraryAlbum;
 
-@interface VLCLibraryAudioGroupDataSource : NSObject 
<VLCLibraryTableViewDataSource, NSTableViewDelegate, 
VLCLibraryCollectionViewDataSource>
+@interface VLCLibraryAudioGroupDataSource : NSObject 
<VLCLibraryTableViewDataSource, VLCLibraryCollectionViewDataSource>
 
 @property (readwrite, retain, nullable) NSArray <VLCMediaLibraryAlbum *> 
*representedListOfAlbums;
 


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAudioGroupDataSource.m
=====================================
@@ -45,38 +45,12 @@
     return 0;
 }
 
-- (NSView *)tableView:(NSTableView *)tableView 
viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
-{
-    VLCLibraryAlbumTableCellView *cellView = [tableView 
makeViewWithIdentifier:VLCAudioLibraryCellIdentifier owner:self];
-
-    if (cellView == nil) {
-        cellView = [VLCLibraryAlbumTableCellView fromNibWithOwner:self];
-        cellView.identifier = VLCAudioLibraryCellIdentifier;
-    }
-
-    cellView.representedAlbum = (VLCMediaLibraryAlbum *)[self 
libraryItemAtRow:row forTableView:tableView];
-    return cellView;
-}
-
 - (id<VLCMediaLibraryItemProtocol>)libraryItemAtRow:(NSInteger)row
                                        forTableView:(NSTableView *)tableView
 {
     return _representedListOfAlbums[row];
 }
 
-- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
-{
-    VLCLibraryAlbumTableCellView *cellView = (VLCLibraryAlbumTableCellView 
*)[self tableView:tableView viewForTableColumn:[[NSTableColumn alloc] 
initWithIdentifier:VLCLibraryAlbumTableCellTableViewColumnIdentifier] row:row];
-    return cellView == nil ? -1 : cellView.height;
-}
-
-- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)rowIndex
-{
-    // We use this with nested table views, since the table view cell is the 
VLCLibraryAlbumTableCellView.
-    // We don't want to select the outer cell, only the inner cells in the 
album view's table.
-    return NO;
-}
-
 - (NSInteger)collectionView:(NSCollectionView *)collectionView
      numberOfItemsInSection:(NSInteger)section
 {


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAudioGroupTableViewDelegate.h
=====================================
@@ -0,0 +1,33 @@
+/*****************************************************************************
+ * VLCLibraryAudioGroupTableViewDelegate.h: MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2023 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <develo...@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>
+
+#import "library/VLCLibraryTableViewDelegate.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface VLCLibraryAudioGroupTableViewDelegate : VLCLibraryTableViewDelegate
+
+@end
+
+NS_ASSUME_NONNULL_END


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAudioGroupTableViewDelegate.m
=====================================
@@ -0,0 +1,58 @@
+/*****************************************************************************
+ * VLCLibraryAudioGroupTableViewDelegate.m: MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2023 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <develo...@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 "VLCLibraryAudioGroupTableViewDelegate.h"
+
+#import "VLCLibraryAlbumTableCellView.h"
+#import "VLCLibraryAudioDataSource.h"
+
+#import "library/VLCLibraryTableCellView.h"
+
+@implementation VLCLibraryAudioGroupTableViewDelegate
+
+- (instancetype)init
+{
+    self = [super init];
+    if (self) {
+        self.cellViewIdentifier = VLCAudioLibraryCellIdentifier;
+        self.cellViewClass = [VLCLibraryAlbumTableCellView class];
+    }
+    return self;
+}
+
+- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)rowIndex
+{
+    // We use this with nested table views, since the table view cell is the 
VLCLibraryAlbumTableCellView.
+    // We don't want to select the outer cell, only the inner cells in the 
album view's table.
+    return NO;
+}
+
+- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
+{
+    NSTableColumn *column = [[NSTableColumn alloc] 
initWithIdentifier:VLCLibraryAlbumTableCellTableViewColumnIdentifier];
+    VLCLibraryAlbumTableCellView *cellView = (VLCLibraryAlbumTableCellView 
*)[self tableView:tableView
+                                                                          
viewForTableColumn:column
+                                                                               
          row:row];
+    return cellView == nil ? -1 : cellView.height;
+}
+
+@end


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAudioTableViewDelegate.h
=====================================
@@ -0,0 +1,33 @@
+/*****************************************************************************
+ * VLCLibraryAudioTableViewDelegate.h: MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2023 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <develo...@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>
+
+#import "library/VLCLibraryTableViewDelegate.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface VLCLibraryAudioTableViewDelegate : VLCLibraryTableViewDelegate
+
+@end
+
+NS_ASSUME_NONNULL_END


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAudioTableViewDelegate.m
=====================================
@@ -0,0 +1,136 @@
+/*****************************************************************************
+ * VLCLibraryAudioTableViewDelegate.m: MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2023 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <develo...@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 "VLCLibraryAudioTableViewDelegate.h"
+
+#import "VLCLibraryAlbumTableCellView.h"
+#import "VLCLibraryAudioDataSource.h"
+#import "VLCLibrarySongTableCellView.h"
+#import "VLCLibrarySongsTableViewSongPlayingTableCellView.h"
+
+#import "library/VLCLibraryDataTypes.h"
+#import "library/VLCLibraryTableCellView.h"
+
+@implementation VLCLibraryAudioTableViewDelegate
+
+- (instancetype)init
+{
+    self = [super init];
+    if (self) {
+        self.cellViewIdentifier = VLCAudioLibraryCellIdentifier;
+        self.cellViewClass = [VLCLibraryTableCellView class];
+    }
+    return self;
+}
+
+- (NSView *)tableView:(NSTableView *)tableView
+   viewForTableColumn:(NSTableColumn *)tableColumn
+                  row:(NSInteger)row
+{
+    if (![tableView.dataSource 
conformsToProtocol:@protocol(VLCLibraryTableViewDataSource)]) {
+        return nil;
+    }
+
+    NSObject<VLCLibraryTableViewDataSource> * const vlcDataSource = 
(NSObject<VLCLibraryTableViewDataSource>*)tableView.dataSource;
+    NSAssert(vlcDataSource != nil, @"Should be a valid data source");
+
+    const id<VLCMediaLibraryItemProtocol> libraryItem = [vlcDataSource 
libraryItemAtRow:row forTableView:tableView];
+
+    // The table view for songs in the list view mode of the audio library is 
different from the other audio groupings
+    // and we use a vanilla NSTableView created in the VLCLibraryWindow XIB 
for it
+    if ([tableView.identifier 
isEqualToString:@"VLCLibrarySongsTableViewIdentifier"]) {
+        const NSString * const columnIdentifier = tableColumn.identifier;
+
+        if (![libraryItem isKindOfClass:[VLCMediaLibraryMediaItem class]]) {
+            return nil;
+        }
+
+        const VLCMediaLibraryMediaItem * const mediaItem = 
(VLCMediaLibraryMediaItem *)libraryItem;
+
+        if (!mediaItem) {
+            return nil;
+        }
+
+        const VLCMediaLibraryAlbum * const album = [VLCMediaLibraryAlbum 
albumWithID:mediaItem.albumID];
+        const VLCMediaLibraryGenre * const genre = [VLCMediaLibraryGenre 
genreWithID:mediaItem.genreID];
+
+        NSString *cellText = @"";
+        NSString *cellIdentifier = @"";
+
+        if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewSongPlayingColumnIdentifier]) {
+            VLCLibrarySongsTableViewSongPlayingTableCellView *cellView = 
(VLCLibrarySongsTableViewSongPlayingTableCellView*)[tableView 
makeViewWithIdentifier:@"VLCLibrarySongsTableViewSongPlayingTableCellViewIdentifier"
 owner:self];
+            NSAssert(cellView, @"Unexpectedly received null cellview");
+            cellView.representedMediaItem = (VLCMediaLibraryMediaItem 
*)mediaItem;
+            return cellView;
+        } else if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewTitleColumnIdentifier]) {
+            cellIdentifier = 
@"VLCLibrarySongsTableViewTitleTableCellViewIdentifier";
+            cellText = mediaItem.title;
+        } else if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewDurationColumnIdentifier]) {
+            cellIdentifier = 
@"VLCLibrarySongsTableViewDurationTableCellViewIdentifier";
+            cellText = mediaItem.durationString;
+        } else if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewArtistColumnIdentifier]) {
+            cellIdentifier = 
@"VLCLibrarySongsTableViewArtistTableCellViewIdentifier";
+            cellText = album.artistName.length == 0 ? @"" : album.artistName;
+        } else if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewAlbumColumnIdentifier]) {
+            cellIdentifier = 
@"VLCLibrarySongsTableViewAlbumTableCellViewIdentifier";
+            cellText = album.title.length == 0 ? @"" : album.title;
+        } else if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewGenreColumnIdentifier]) {
+            cellIdentifier = 
@"VLCLibrarySongsTableViewGenreTableCellViewIdentifier";
+            cellText = genre.name.length == 0 ? @"" : genre.name;
+        } else if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewPlayCountColumnIdentifier]) {
+            cellIdentifier = 
@"VLCLibrarySongsTableViewPlayCountTableCellViewIdentifier";
+            cellText = [@(mediaItem.playCount) stringValue];
+        } else if ([columnIdentifier 
isEqualToString:VLCLibrarySongsTableViewYearColumnIdentifier]) {
+            cellIdentifier = 
@"VLCLibrarySongsTableViewYearTableCellViewIdentifier";
+            cellText = [@(mediaItem.year) stringValue];
+        } else {
+            NSAssert(true, @"Received unknown column identifier %@", 
columnIdentifier);
+        }
+
+        NSTableCellView *cellView = [tableView 
makeViewWithIdentifier:cellIdentifier owner:self];
+        cellView.textField.stringValue = cellText;
+        return cellView;
+    }
+
+    return [super tableView:tableView viewForTableColumn:tableColumn row:row];
+}
+
+- (void)tableViewSelectionDidChange:(NSNotification *)notification
+{
+    NSParameterAssert(notification);
+    NSTableView *tableView = (NSTableView *)notification.object;
+    NSAssert(tableView, @"Must be a valid table view");
+    NSInteger selectedRow = tableView.selectedRow;
+
+    if (![tableView.dataSource 
conformsToProtocol:@protocol(VLCLibraryTableViewDataSource)]) {
+        return;
+    }
+
+    NSObject<VLCLibraryTableViewDataSource> * const vlcDataSource = 
(NSObject<VLCLibraryTableViewDataSource>*)tableView.dataSource;
+    NSAssert(vlcDataSource != nil, @"Should be a valid data source");
+
+    if ([vlcDataSource isKindOfClass:[VLCLibraryAudioDataSource class]]) {
+        [(VLCLibraryAudioDataSource*)vlcDataSource tableView:tableView 
selectRow:selectedRow];
+    }
+}
+
+@end


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryAudioViewController.m
=====================================
@@ -34,6 +34,8 @@
 #import "library/audio-library/VLCLibraryAlbumTableCellView.h"
 #import "library/audio-library/VLCLibraryAudioDataSource.h"
 #import "library/audio-library/VLCLibraryAudioGroupDataSource.h"
+#import "library/audio-library/VLCLibraryAudioGroupTableViewDelegate.h"
+#import "library/audio-library/VLCLibraryAudioTableViewDelegate.h"
 
 #import "library/video-library/VLCLibraryVideoViewController.h"
 
@@ -50,6 +52,8 @@ NSString *VLCLibraryPlaceholderAudioViewIdentifier = 
@"VLCLibraryPlaceholderAudi
     NSArray<NSString *> *_placeholderLabelStrings;
 
     VLCLibraryCollectionViewDelegate *_audioLibraryCollectionViewDelegate;
+    VLCLibraryAudioTableViewDelegate *_audioLibraryTableViewDelegate;
+    VLCLibraryAudioGroupTableViewDelegate *_audioGroupLibraryTableViewDelegate;
 }
 @end
 
@@ -66,6 +70,8 @@ NSString *VLCLibraryPlaceholderAudioViewIdentifier = 
@"VLCLibraryPlaceholderAudi
         [self setupAudioDataSource];
 
         _audioLibraryCollectionViewDelegate = 
[[VLCLibraryCollectionViewDelegate alloc] init];
+        _audioLibraryTableViewDelegate = [[VLCLibraryAudioTableViewDelegate 
alloc] init];
+        _audioGroupLibraryTableViewDelegate = 
[[VLCLibraryAudioGroupTableViewDelegate alloc] init];
 
         [self setupAudioCollectionView];
         [self setupGridModeSplitView];
@@ -152,23 +158,23 @@ NSString *VLCLibraryPlaceholderAudioViewIdentifier = 
@"VLCLibraryPlaceholderAudi
 - (void)setupAudioTableViews
 {
     _audioCollectionSelectionTableView.dataSource = _audioDataSource;
-    _audioCollectionSelectionTableView.delegate = _audioDataSource;
+    _audioCollectionSelectionTableView.delegate = 
_audioLibraryTableViewDelegate;
 
     _audioGroupSelectionTableView.dataSource = _audioGroupDataSource;
-    _audioGroupSelectionTableView.delegate = _audioGroupDataSource;
+    _audioGroupSelectionTableView.delegate = 
_audioGroupLibraryTableViewDelegate;
 
     if(@available(macOS 11.0, *)) {
         _audioGroupSelectionTableView.style = NSTableViewStyleFullWidth;
     }
 
     _audioSongTableView.dataSource = _audioDataSource;
-    _audioSongTableView.delegate = _audioDataSource;
+    _audioSongTableView.delegate = _audioLibraryTableViewDelegate;
 }
 
 - (void)setupGridModeSplitView
 {
     _audioLibraryGridModeSplitViewListTableView.dataSource = _audioDataSource;
-    _audioLibraryGridModeSplitViewListTableView.delegate = _audioDataSource;
+    _audioLibraryGridModeSplitViewListTableView.delegate = 
_audioLibraryTableViewDelegate;
 
     _audioLibraryGridModeSplitViewListSelectionCollectionView.dataSource = 
_audioGroupDataSource;
     _audioLibraryGridModeSplitViewListSelectionCollectionView.delegate = 
_audioLibraryCollectionViewDelegate;


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryCollectionViewAlbumSupplementaryDetailView.m
=====================================
@@ -35,6 +35,7 @@
 #import "extensions/NSView+VLCAdditions.h"
 
 #import "library/audio-library/VLCLibraryAlbumTracksDataSource.h"
+#import "library/audio-library/VLCLibraryAlbumTracksTableViewDelegate.h"
 #import "library/audio-library/VLCLibraryAlbumTableCellView.h"
 
 NSString *const VLCLibraryCollectionViewAlbumSupplementaryDetailViewIdentifier 
= @"VLCLibraryCollectionViewAlbumSupplementaryDetailViewIdentifier";
@@ -43,6 +44,7 @@ NSCollectionViewSupplementaryElementKind const 
VLCLibraryCollectionViewAlbumSupp
 @interface VLCLibraryCollectionViewAlbumSupplementaryDetailView () 
 {
     VLCLibraryAlbumTracksDataSource *_tracksDataSource;
+    VLCLibraryAlbumTracksTableViewDelegate *_tracksTableViewDelegate;
     VLCLibraryController *_libraryController;
 }
 
@@ -59,8 +61,10 @@ NSCollectionViewSupplementaryElementKind const 
VLCLibraryCollectionViewAlbumSupp
 - (void)awakeFromNib
 {
     _tracksDataSource = [[VLCLibraryAlbumTracksDataSource alloc] init];
+    _tracksTableViewDelegate = [[VLCLibraryAlbumTracksTableViewDelegate alloc] 
init];
+
     _albumTracksTableView.dataSource = _tracksDataSource;
-    _albumTracksTableView.delegate = _tracksDataSource;
+    _albumTracksTableView.delegate = _tracksTableViewDelegate;
     _albumTracksTableView.rowHeight = VLCLibraryTracksRowHeight;
     
     _albumTitleTextField.font = [NSFont 
VLCLibrarySupplementaryDetailViewTitleFont];


=====================================
modules/gui/macosx/library/audio-library/VLCLibraryCollectionViewAudioGroupSupplementaryDetailView.m
=====================================
@@ -26,6 +26,7 @@
 #import "extensions/NSFont+VLCAdditions.h"
 
 #import "library/audio-library/VLCLibraryAudioGroupDataSource.h"
+#import "library/audio-library/VLCLibraryAudioGroupTableViewDelegate.h"
 
 NSString *const 
VLCLibraryCollectionViewAudioGroupSupplementaryDetailViewIdentifier = 
@"VLCLibraryCollectionViewAudioGroupSupplementaryDetailViewIdentifier";
 NSCollectionViewSupplementaryElementKind const 
VLCLibraryCollectionViewAudioGroupSupplementaryDetailViewKind = 
@"VLCLibraryCollectionViewAudioGroupSupplementaryDetailViewIdentifier";
@@ -33,6 +34,7 @@ NSCollectionViewSupplementaryElementKind const 
VLCLibraryCollectionViewAudioGrou
 @interface VLCLibraryCollectionViewAudioGroupSupplementaryDetailView () 
 {
     VLCLibraryAudioGroupDataSource *_audioGroupAlbumsDataSource;
+    VLCLibraryAudioGroupTableViewDelegate *_audioGroupAlbumsTableViewDelegate;
 }
 
 @end
@@ -42,8 +44,10 @@ NSCollectionViewSupplementaryElementKind const 
VLCLibraryCollectionViewAudioGrou
 - (void)awakeFromNib
 {
     _audioGroupAlbumsDataSource = [[VLCLibraryAudioGroupDataSource alloc] 
init];
+    _audioGroupAlbumsTableViewDelegate = 
[[VLCLibraryAudioGroupTableViewDelegate alloc] init];
+
     _audioGroupAlbumsTableView.dataSource = _audioGroupAlbumsDataSource;
-    _audioGroupAlbumsTableView.delegate = _audioGroupAlbumsDataSource;
+    _audioGroupAlbumsTableView.delegate = _audioGroupAlbumsTableViewDelegate;
     
     _audioGroupNameTextField.font = [NSFont 
VLCLibrarySupplementaryDetailViewTitleFont];
 }


=====================================
modules/gui/macosx/library/audio-library/VLCLibrarySongTableCellView.h
=====================================
@@ -22,12 +22,14 @@
 
 #import <Cocoa/Cocoa.h>
 
+#import "library/VLCLibraryTableCellViewProtocol.h"
+
 NS_ASSUME_NONNULL_BEGIN
 
 @class VLCTrackingView;
 @class VLCMediaLibraryMediaItem;
 
-@interface VLCLibrarySongTableCellView : NSTableCellView
+@interface VLCLibrarySongTableCellView : 
NSTableCellView<VLCLibraryTableCellViewProtocol>
 
 extern NSString *VLCAudioLibrarySongCellIdentifier;
 


=====================================
modules/gui/macosx/library/audio-library/VLCLibrarySongTableCellView.m
=====================================
@@ -98,4 +98,12 @@ NSString *VLCAudioLibrarySongCellIdentifier = 
@"VLCAudioLibrarySongCellIdentifie
 
 }
 
+- (void)setRepresentedItem:(id<VLCMediaLibraryItemProtocol>)libraryItem
+{
+    VLCMediaLibraryMediaItem * const mediaItem = (VLCMediaLibraryMediaItem 
*)libraryItem;
+    if (mediaItem != nil) {
+        [self setRepresentedMediaItem:mediaItem];
+    }
+}
+
 @end


=====================================
modules/gui/macosx/library/video-library/VLCLibraryVideoTableViewDataSource.h
=====================================
@@ -28,13 +28,12 @@ NS_ASSUME_NONNULL_BEGIN
 
 @class VLCLibraryModel;
 
-@interface VLCLibraryVideoTableViewDataSource : NSObject 
<VLCLibraryTableViewDataSource, NSTableViewDelegate>
+@interface VLCLibraryVideoTableViewDataSource : NSObject 
<VLCLibraryTableViewDataSource>
 
 @property (readwrite, assign) VLCLibraryModel *libraryModel;
 @property (readwrite, assign) NSTableView *groupsTableView;
 @property (readwrite, assign) NSTableView *groupSelectionTableView;
 
-- (void)setup;
 - (void)reloadData;
 
 @end


=====================================
modules/gui/macosx/library/video-library/VLCLibraryVideoTableViewDataSource.m
=====================================
@@ -84,22 +84,6 @@
     });
 }
 
-- (void)setup
-{
-    [self setupTableViews];
-}
-
-- (void)setupTableViews
-{
-    _groupsTableView.dataSource = self;
-    _groupsTableView.delegate = self;
-    _groupsTableView.target = self;
-    
-    _groupSelectionTableView.dataSource = self;
-    _groupSelectionTableView.delegate = self;
-    _groupSelectionTableView.target = self;
-}
-
 #pragma mark - table view data source and delegation
 
 - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
@@ -121,41 +105,6 @@
     return 0;
 }
 
-- (NSView *)tableView:(NSTableView *)tableView 
viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
-{
-    VLCLibraryTableCellView *cellView = [tableView 
makeViewWithIdentifier:@"VLCVideoLibraryTableViewCellIdentifier" owner:self];
-    
-    if (!cellView) {
-        cellView = [VLCLibraryTableCellView fromNibWithOwner:self];
-        cellView.identifier = @"VLCVideoLibraryTableViewCellIdentifier";
-    }
-    
-    if (tableView == _groupsTableView) {
-        cellView.representedVideoLibrarySection = row;
-    } else if (tableView == _groupSelectionTableView && 
_groupsTableView.selectedRow > -1) {
-        switch(_groupsTableView.selectedRow + 1) { // Group 0 is invalid so 
add one
-            case VLCLibraryVideoRecentsGroup:
-                cellView.representedItem = _recentsArray[row];
-                break;
-            case VLCLibraryVideoLibraryGroup:
-                cellView.representedItem = _libraryArray[row];
-                break;
-            default:
-                NSAssert(1, @"Reached unreachable case for video library 
section");
-                break;
-        }
-    }
-    
-    return cellView;
-}
-
-- (void)tableViewSelectionDidChange:(NSNotification *)notification
-{
-    if(notification.object == _groupsTableView) {
-        [_groupSelectionTableView reloadData];
-    }
-}
-
 - (id<VLCMediaLibraryItemProtocol>)libraryItemAtRow:(NSInteger)row
                                        forTableView:(NSTableView *)tableView
 {


=====================================
modules/gui/macosx/library/video-library/VLCLibraryVideoTableViewDelegate.h
=====================================
@@ -0,0 +1,33 @@
+/*****************************************************************************
+ * VLCLibraryVideoTableViewDelegate.h MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2023 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <develo...@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>
+
+#import "library/VLCLibraryTableViewDelegate.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface VLCLibraryVideoTableViewDelegate : VLCLibraryTableViewDelegate
+
+@end
+
+NS_ASSUME_NONNULL_END


=====================================
modules/gui/macosx/library/video-library/VLCLibraryVideoTableViewDelegate.m
=====================================
@@ -0,0 +1,100 @@
+/*****************************************************************************
+ * VLCLibraryVideoTableViewDelegate.m MacOS X interface module
+ *****************************************************************************
+ * Copyright (C) 2023 VLC authors and VideoLAN
+ *
+ * Authors: Claudio Cambra <develo...@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 "VLCLibraryVideoTableViewDelegate.h"
+
+#import "VLCLibraryVideoTableViewDataSource.h"
+
+#import "library/VLCLibraryDataTypes.h"
+#import "library/VLCLibraryTableCellView.h"
+#import "library/VLCLibraryTableView.h"
+
+@implementation VLCLibraryVideoTableViewDelegate
+
+- (instancetype)init
+{
+    self = [super init];
+    if (self) {
+        self.cellViewIdentifier = @"VLCVideoLibraryTableViewCellIdentifier";
+        self.cellViewClass = [VLCLibraryTableCellView class];
+    }
+    return self;
+}
+
+- (NSView *)tableView:(NSTableView *)tableView 
viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
+{
+    if (![tableView.dataSource 
conformsToProtocol:@protocol(VLCLibraryTableViewDataSource)]) {
+        return nil;
+    }
+
+    NSObject<VLCLibraryTableViewDataSource> * const vlcDataSource = 
(NSObject<VLCLibraryTableViewDataSource>*)tableView.dataSource;
+    NSAssert(vlcDataSource != nil, @"Should be a valid data source");
+
+    const id<VLCMediaLibraryItemProtocol> mediaItem = [vlcDataSource 
libraryItemAtRow:row forTableView:tableView];
+    if (mediaItem != nil) {
+        return [super tableView:tableView viewForTableColumn:tableColumn 
row:row];
+    }
+
+    VLCLibraryTableCellView *cellView = [tableView 
makeViewWithIdentifier:self.cellViewIdentifier owner:self];
+
+    if (!cellView) {
+        cellView = [VLCLibraryTableCellView fromNibWithOwner:self];
+        cellView.identifier = @"VLCVideoLibraryTableViewCellIdentifier";
+    }
+
+    if ([vlcDataSource isKindOfClass:[VLCLibraryVideoTableViewDataSource 
class]]) {
+        VLCLibraryVideoTableViewDataSource * const videoTableViewDataSource = 
(VLCLibraryVideoTableViewDataSource *)vlcDataSource;
+        NSTableView * const groupsTableView = 
videoTableViewDataSource.groupsTableView;
+
+        if (tableView == groupsTableView) {
+            cellView.representedVideoLibrarySection = row;
+        }
+    }
+
+    return cellView;
+}
+
+- (void)tableViewSelectionDidChange:(NSNotification *)notification
+{
+    NSParameterAssert(notification);
+    NSTableView *tableView = (NSTableView *)notification.object;
+    NSAssert(tableView, @"Must be a valid table view");
+    NSInteger selectedRow = tableView.selectedRow;
+
+    if (![tableView.dataSource 
conformsToProtocol:@protocol(VLCLibraryTableViewDataSource)]) {
+        return;
+    }
+
+    NSObject<VLCLibraryTableViewDataSource> * const vlcDataSource = 
(NSObject<VLCLibraryTableViewDataSource>*)tableView.dataSource;
+    NSAssert(vlcDataSource != nil, @"Should be a valid data source");
+
+    if ([vlcDataSource isKindOfClass:[VLCLibraryVideoTableViewDataSource 
class]]) {
+        VLCLibraryVideoTableViewDataSource * const videoTableViewDataSource = 
(VLCLibraryVideoTableViewDataSource *)vlcDataSource;
+        NSTableView * const groupsTableView = 
videoTableViewDataSource.groupsTableView;
+
+        if (tableView == videoTableViewDataSource.groupsTableView) {
+            [videoTableViewDataSource.groupSelectionTableView reloadData];
+        }
+    }
+}
+
+@end


=====================================
modules/gui/macosx/library/video-library/VLCLibraryVideoViewController.m
=====================================
@@ -33,12 +33,19 @@
 
 #import 
"library/video-library/VLCLibraryVideoCollectionViewsStackViewController.h"
 #import "library/video-library/VLCLibraryVideoTableViewDataSource.h"
+#import "library/video-library/VLCLibraryVideoTableViewDelegate.h"
 
 #import "main/VLCMain.h"
 
 #import "windows/video/VLCVoutView.h"
 #import "windows/video/VLCMainVideoViewController.h"
 
+@interface VLCLibraryVideoViewController ()
+{
+    VLCLibraryVideoTableViewDelegate *_videoLibraryTableViewDelegate;
+}
+@end
+
 @implementation VLCLibraryVideoViewController
 
 - (instancetype)initWithLibraryWindow:(VLCLibraryWindow *)libraryWindow
@@ -46,8 +53,11 @@
     self = [super init];
 
     if(self) {
+        _videoLibraryTableViewDelegate = [[VLCLibraryVideoTableViewDelegate 
alloc] init];
+
         [self setupPropertiesFromLibraryWindow:libraryWindow];
         [self setupTableViewDataSource];
+        [self setupTableViews];
         [self setupGridViewController];
         [self setupVideoPlaceholderView];
         [self setupVideoLibraryViews];
@@ -89,8 +99,17 @@
     _libraryVideoTableViewDataSource.libraryModel = 
VLCMain.sharedInstance.libraryController.libraryModel;
     _libraryVideoTableViewDataSource.groupsTableView = 
_videoLibraryGroupsTableView;
     _libraryVideoTableViewDataSource.groupSelectionTableView = 
_videoLibraryGroupSelectionTableView;
+}
+
+- (void)setupTableViews
+{
+    _videoLibraryGroupsTableView.dataSource = _libraryVideoTableViewDataSource;
+    _videoLibraryGroupsTableView.target = _libraryVideoTableViewDataSource;
+    _videoLibraryGroupsTableView.delegate = _videoLibraryTableViewDelegate;
 
-    [_libraryVideoTableViewDataSource setup];
+    _videoLibraryGroupSelectionTableView.dataSource = 
_libraryVideoTableViewDataSource;
+    _videoLibraryGroupSelectionTableView.target = 
_libraryVideoTableViewDataSource;
+    _videoLibraryGroupSelectionTableView.delegate = 
_videoLibraryTableViewDelegate;
 }
 
 - (void)setupGridViewController



View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/d26d428d805dce4ef372bbc6368b2e12f223f572...3faaa1e109a543e17c0c378a2d7dd2769d695e28

-- 
View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/d26d428d805dce4ef372bbc6368b2e12f223f572...3faaa1e109a543e17c0c378a2d7dd2769d695e28
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance
_______________________________________________
vlc-commits mailing list
vlc-commits@videolan.org
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to