Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (70)
Showing
with 635 additions and 116 deletions
......@@ -102,8 +102,8 @@
5360E9A82C5CF6270046BA8B /* VLCLibraryAbstractGroupingDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 5360E9A72C5CF6270046BA8B /* VLCLibraryAbstractGroupingDataSource.m */; };
5362550D293FD639005D64FA /* VLCLibraryWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5362550C293FD639005D64FA /* VLCLibraryWindowController.m */; };
536283F0291146BC00640C15 /* VLCLibraryTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 536283DE291146BC00640C15 /* VLCLibraryTableView.m */; };
536283F1291146BC00640C15 /* VLCLibraryAlbumTracksDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 536283DF291146BC00640C15 /* VLCLibraryAlbumTracksDataSource.m */; };
536283F2291146BC00640C15 /* VLCLibraryCollectionViewAlbumSupplementaryDetailView.m in Sources */ = {isa = PBXBuildFile; fileRef = 536283E1291146BC00640C15 /* VLCLibraryCollectionViewAlbumSupplementaryDetailView.m */; };
536283F1291146BC00640C15 /* VLCLibraryItemInternalMediaItemsDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 536283DF291146BC00640C15 /* VLCLibraryItemInternalMediaItemsDataSource.m */; };
536283F2291146BC00640C15 /* VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.m in Sources */ = {isa = PBXBuildFile; fileRef = 536283E1291146BC00640C15 /* VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.m */; };
536283F3291146BC00640C15 /* VLCLibraryNavigationStack.m in Sources */ = {isa = PBXBuildFile; fileRef = 536283E2291146BC00640C15 /* VLCLibraryNavigationStack.m */; };
536283F4291146BC00640C15 /* VLCLibraryCollectionViewMediaItemSupplementaryDetailView.m in Sources */ = {isa = PBXBuildFile; fileRef = 536283E3291146BC00640C15 /* VLCLibraryCollectionViewMediaItemSupplementaryDetailView.m */; };
536283F5291146BC00640C15 /* VLCLibraryCollectionViewSupplementaryDetailView.m in Sources */ = {isa = PBXBuildFile; fileRef = 536283E5291146BC00640C15 /* VLCLibraryCollectionViewSupplementaryDetailView.m */; };
......@@ -128,6 +128,8 @@
539F114B29E83A4200F13460 /* VLCLibraryTwoPaneSplitViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 539F114A29E83A4200F13460 /* VLCLibraryTwoPaneSplitViewDelegate.m */; };
539F116D29F9785C00F13460 /* VLCMainVideoViewAudioMediaDecorativeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 539F116C29F9785C00F13460 /* VLCMainVideoViewAudioMediaDecorativeView.m */; };
53A1F1172AB7168000686BAA /* VLCLibraryAllAudioGroupsMediaLibraryItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A1F1162AB7168000686BAA /* VLCLibraryAllAudioGroupsMediaLibraryItem.m */; };
53A8F9D12A7E1E6300BC11BF /* VLCLibraryPlaylistViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A8F9D02A7E1E6300BC11BF /* VLCLibraryPlaylistViewController.m */; };
53A8F9D42A7F815900BC11BF /* VLCLibraryPlaylistDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A8F9D32A7F815900BC11BF /* VLCLibraryPlaylistDataSource.m */; };
53B40FD72AA878E400C814E4 /* VLCLibraryHeroView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B40FD62AA878E400C814E4 /* VLCLibraryHeroView.m */; };
53B447CA2939823E00857588 /* VLCLibrarySongsTableViewSongPlayingTableCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B447C92939823E00857588 /* VLCLibrarySongsTableViewSongPlayingTableCellView.m */; };
53B447F9293BB47B00857588 /* VLCLibraryVideoDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B447F3293BB47A00857588 /* VLCLibraryVideoDataSource.m */; };
......@@ -339,18 +341,18 @@
5360E9A72C5CF6270046BA8B /* VLCLibraryAbstractGroupingDataSource.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryAbstractGroupingDataSource.m; sourceTree = "<group>"; };
5362550B293FD639005D64FA /* VLCLibraryWindowController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryWindowController.h; sourceTree = "<group>"; };
5362550C293FD639005D64FA /* VLCLibraryWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryWindowController.m; sourceTree = "<group>"; };
536283DC291146BC00640C15 /* VLCLibraryAlbumTracksDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryAlbumTracksDataSource.h; sourceTree = "<group>"; };
536283DC291146BC00640C15 /* VLCLibraryItemInternalMediaItemsDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryItemInternalMediaItemsDataSource.h; sourceTree = "<group>"; };
536283DD291146BC00640C15 /* VLCLibrarySongTableCellView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibrarySongTableCellView.h; sourceTree = "<group>"; };
536283DE291146BC00640C15 /* VLCLibraryTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryTableView.m; sourceTree = "<group>"; };
536283DF291146BC00640C15 /* VLCLibraryAlbumTracksDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryAlbumTracksDataSource.m; sourceTree = "<group>"; };
536283DF291146BC00640C15 /* VLCLibraryItemInternalMediaItemsDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryItemInternalMediaItemsDataSource.m; sourceTree = "<group>"; };
536283E0291146BC00640C15 /* VLCLibraryTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryTableView.h; sourceTree = "<group>"; };
536283E1291146BC00640C15 /* VLCLibraryCollectionViewAlbumSupplementaryDetailView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryCollectionViewAlbumSupplementaryDetailView.m; sourceTree = "<group>"; };
536283E1291146BC00640C15 /* VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.m; sourceTree = "<group>"; };
536283E2291146BC00640C15 /* VLCLibraryNavigationStack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryNavigationStack.m; sourceTree = "<group>"; };
536283E3291146BC00640C15 /* VLCLibraryCollectionViewMediaItemSupplementaryDetailView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryCollectionViewMediaItemSupplementaryDetailView.m; sourceTree = "<group>"; };
536283E4291146BC00640C15 /* VLCLibraryNavigationState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryNavigationState.h; sourceTree = "<group>"; };
536283E5291146BC00640C15 /* VLCLibraryCollectionViewSupplementaryDetailView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryCollectionViewSupplementaryDetailView.m; sourceTree = "<group>"; };
536283E6291146BC00640C15 /* VLCLibraryCollectionViewSupplementaryDetailView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryCollectionViewSupplementaryDetailView.h; sourceTree = "<group>"; };
536283E8291146BC00640C15 /* VLCLibraryCollectionViewAlbumSupplementaryDetailView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryCollectionViewAlbumSupplementaryDetailView.h; sourceTree = "<group>"; };
536283E8291146BC00640C15 /* VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.h; sourceTree = "<group>"; };
536283EA291146BC00640C15 /* VLCLibraryCollectionViewMediaItemSupplementaryDetailView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryCollectionViewMediaItemSupplementaryDetailView.h; sourceTree = "<group>"; };
536283EB291146BC00640C15 /* VLCLibraryNavigationState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryNavigationState.m; sourceTree = "<group>"; };
536283EC291146BC00640C15 /* VLCLibrarySongTableCellView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibrarySongTableCellView.m; sourceTree = "<group>"; };
......@@ -359,7 +361,7 @@
536283EF291146BC00640C15 /* VLCLibraryNavigationStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryNavigationStack.h; sourceTree = "<group>"; };
536283FA2911476A00640C15 /* VLCLibrarySongTableCellView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VLCLibrarySongTableCellView.xib; sourceTree = "<group>"; };
536283FC2911476A00640C15 /* VLCLibraryCollectionViewMediaItemSupplementaryDetailView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VLCLibraryCollectionViewMediaItemSupplementaryDetailView.xib; sourceTree = "<group>"; };
536283FD2911476A00640C15 /* VLCLibraryCollectionViewAlbumSupplementaryDetailView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VLCLibraryCollectionViewAlbumSupplementaryDetailView.xib; sourceTree = "<group>"; };
536283FD2911476A00640C15 /* VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.xib; sourceTree = "<group>"; };
536283FE291147C500640C15 /* VLCBasicView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCBasicView.h; sourceTree = "<group>"; };
536283FF291147C500640C15 /* VLCBasicView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCBasicView.m; sourceTree = "<group>"; };
53628400291147C500640C15 /* VLCSubScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCSubScrollView.m; sourceTree = "<group>"; };
......@@ -396,6 +398,10 @@
539F116C29F9785C00F13460 /* VLCMainVideoViewAudioMediaDecorativeView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCMainVideoViewAudioMediaDecorativeView.m; sourceTree = "<group>"; };
53A1F1152AB7168000686BAA /* VLCLibraryAllAudioGroupsMediaLibraryItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryAllAudioGroupsMediaLibraryItem.h; sourceTree = "<group>"; };
53A1F1162AB7168000686BAA /* VLCLibraryAllAudioGroupsMediaLibraryItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryAllAudioGroupsMediaLibraryItem.m; sourceTree = "<group>"; };
53A8F9CF2A7E1E6300BC11BF /* VLCLibraryPlaylistViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryPlaylistViewController.h; sourceTree = "<group>"; };
53A8F9D02A7E1E6300BC11BF /* VLCLibraryPlaylistViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryPlaylistViewController.m; sourceTree = "<group>"; };
53A8F9D22A7F815900BC11BF /* VLCLibraryPlaylistDataSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryPlaylistDataSource.h; sourceTree = "<group>"; };
53A8F9D32A7F815900BC11BF /* VLCLibraryPlaylistDataSource.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryPlaylistDataSource.m; sourceTree = "<group>"; };
53B40FD42AA7618000C814E4 /* VLCLibraryHeroView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = VLCLibraryHeroView.xib; sourceTree = "<group>"; };
53B40FD52AA878E400C814E4 /* VLCLibraryHeroView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryHeroView.h; sourceTree = "<group>"; };
53B40FD62AA878E400C814E4 /* VLCLibraryHeroView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryHeroView.m; sourceTree = "<group>"; };
......@@ -1289,6 +1295,7 @@
537BD6832C59212A00446ED0 /* groups-library */,
5350E4EB2B1B210E00F276CB /* home-library */,
7DFBDCB8226CED3700B700A5 /* media-source */,
53A8F9CE2A7E1DE900BC11BF /* playlist-library */,
53B447EB293BB47A00857588 /* video-library */,
7DFBDCBF226DC16200B700A5 /* VLCInputItem.h */,
7DFBDCC0226DC16200B700A5 /* VLCInputItem.m */,
......@@ -1309,6 +1316,8 @@
7D0F64042202047900FDB91F /* VLCLibraryCollectionViewItem.m */,
536283EA291146BC00640C15 /* VLCLibraryCollectionViewMediaItemSupplementaryDetailView.h */,
536283E3291146BC00640C15 /* VLCLibraryCollectionViewMediaItemSupplementaryDetailView.m */,
536283E8291146BC00640C15 /* VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.h */,
536283E1291146BC00640C15 /* VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.m */,
536283E6291146BC00640C15 /* VLCLibraryCollectionViewSupplementaryDetailView.h */,
536283E5291146BC00640C15 /* VLCLibraryCollectionViewSupplementaryDetailView.m */,
7DBB7637227F3FBC002649E1 /* VLCLibraryCollectionViewSupplementaryElementView.h */,
......@@ -1321,7 +1330,9 @@
53B40FD62AA878E400C814E4 /* VLCLibraryHeroView.m */,
7D92AF1F23DDCA8D00D81EA3 /* VLCLibraryImageCache.h */,
7D92AF2023DDCA8D00D81EA3 /* VLCLibraryImageCache.m */,
5360E99F2C5BE01F0046BA8B /* VLCLibraryMasterDetailViewTableViewDataSource.h */,
536283DC291146BC00640C15 /* VLCLibraryItemInternalMediaItemsDataSource.h */,
536283DF291146BC00640C15 /* VLCLibraryItemInternalMediaItemsDataSource.m */,
5360E99F2C5BE01F0046BA8B /* VLCLibraryMasterDetailViewTableViewDataSource.h */,
5360E9A32C5BE5550046BA8B /* VLCLibraryMasterDetailViewTableViewDelegate.h */,
5360E9A42C5BE5550046BA8B /* VLCLibraryMasterDetailViewTableViewDelegate.m */,
7DFBDCAF226A518400B700A5 /* VLCLibraryMenuController.h */,
......@@ -1513,8 +1524,6 @@
5325C57B29302E6800B2B63A /* VLCLibraryAudioViewController.m */,
7DE82E7722843781002D341A /* VLCLibraryAlbumTableCellView.h */,
7DE82E7822843781002D341A /* VLCLibraryAlbumTableCellView.m */,
536283DC291146BC00640C15 /* VLCLibraryAlbumTracksDataSource.h */,
536283DF291146BC00640C15 /* VLCLibraryAlbumTracksDataSource.m */,
53ED472929C8FF9D00795DB1 /* VLCLibraryAlbumTracksTableViewDelegate.h */,
53ED472A29C8FF9D00795DB1 /* VLCLibraryAlbumTracksTableViewDelegate.m */,
53A1F1152AB7168000686BAA /* VLCLibraryAllAudioGroupsMediaLibraryItem.h */,
......@@ -1527,8 +1536,6 @@
53ED472529C78FE700795DB1 /* VLCLibraryAudioGroupTableViewDelegate.m */,
53ED472129C74D1F00795DB1 /* VLCLibraryAudioTableViewDelegate.h */,
53ED472229C74D1F00795DB1 /* VLCLibraryAudioTableViewDelegate.m */,
536283E8291146BC00640C15 /* VLCLibraryCollectionViewAlbumSupplementaryDetailView.h */,
536283E1291146BC00640C15 /* VLCLibraryCollectionViewAlbumSupplementaryDetailView.m */,
536283DD291146BC00640C15 /* VLCLibrarySongTableCellView.h */,
536283EC291146BC00640C15 /* VLCLibrarySongTableCellView.m */,
53B447C82939823E00857588 /* VLCLibrarySongsTableViewSongPlayingTableCellView.h */,
......@@ -1582,6 +1589,17 @@
537BD6852C59216600446ED0 /* VLCLibraryGroupsViewController.m */,
);
path = "groups-library";
sourceTree = "<group>";
};
53A8F9CE2A7E1DE900BC11BF /* playlist-library */ = {
isa = PBXGroup;
children = (
53A8F9D22A7F815900BC11BF /* VLCLibraryPlaylistDataSource.h */,
53A8F9D32A7F815900BC11BF /* VLCLibraryPlaylistDataSource.m */,
53A8F9CF2A7E1E6300BC11BF /* VLCLibraryPlaylistViewController.h */,
53A8F9D02A7E1E6300BC11BF /* VLCLibraryPlaylistViewController.m */,
);
path = "playlist-library";
sourceTree = "<group>";
};
53B447EB293BB47A00857588 /* video-library */ = {
......@@ -2003,7 +2021,7 @@
7DE82E7A228437AA002D341A /* VLCLibraryAlbumTableCellView.xib */,
53BFB1E02A6A72160065EA7A /* VLCLibraryAudioGroupHeaderView.xib */,
53088E122AD6EADF00C21358 /* VLCLibraryCarouselViewItemView.xib */,
536283FD2911476A00640C15 /* VLCLibraryCollectionViewAlbumSupplementaryDetailView.xib */,
536283FD2911476A00640C15 /* VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.xib */,
7D0F64052202047900FDB91F /* VLCLibraryCollectionViewItem.xib */,
536283FC2911476A00640C15 /* VLCLibraryCollectionViewMediaItemSupplementaryDetailView.xib */,
53B40FD42AA7618000C814E4 /* VLCLibraryHeroView.xib */,
......@@ -2128,7 +2146,7 @@
5352B37329DF29BF0011CE03 /* VLCMainVideoViewControlsBar.m in Sources */,
7D445D812202524000263D34 /* VLCPlaylistController.m in Sources */,
7DFBDCBE226CED7200B700A5 /* VLCMediaSource.m in Sources */,
536283F2291146BC00640C15 /* VLCLibraryCollectionViewAlbumSupplementaryDetailView.m in Sources */,
536283F2291146BC00640C15 /* VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.m in Sources */,
6BAF886024DB1CEA001044C8 /* VLCSystemVolume.m in Sources */,
1CCC88F72078A3D500E5626F /* ConvertAndSave.xib in Sources */,
1CCC88F82078A3D500E5626F /* CoreDialogs.xib in Sources */,
......@@ -2159,7 +2177,7 @@
7D67318622C8F4060000AD40 /* VLCMediaSourceCollectionViewItem.m in Sources */,
536283F0291146BC00640C15 /* VLCLibraryTableView.m in Sources */,
536BFD1929B181E100BD0776 /* VLCMainVideoViewOverlayView.m in Sources */,
536283F1291146BC00640C15 /* VLCLibraryAlbumTracksDataSource.m in Sources */,
536283F1291146BC00640C15 /* VLCLibraryItemInternalMediaItemsDataSource.m in Sources */,
5307A6F52967859F001E0C6A /* NSImage+VLCAdditions.m in Sources */,
1CCC89042078A3D500E5626F /* StreamOutput.xib in Sources */,
536283F7291146BC00640C15 /* VLCLibraryNavigationState.m in Sources */,
......@@ -2238,6 +2256,7 @@
53D21A1F2BB465600085C71B /* VLCLibraryWindowPlaylistSidebarViewController.m in Sources */,
7D0F640C2202163E00FDB91F /* VLCPlaylistDataSource.m in Sources */,
1C3113AD1E508C6900D4DD76 /* VLCExtensionsManager.m in Sources */,
53A8F9D42A7F815900BC11BF /* VLCLibraryPlaylistDataSource.m in Sources */,
7DFBDCBB226CED6300B700A5 /* VLCMediaSourceProvider.m in Sources */,
7D66D4362200BC340040D04A /* VLCClickerManager.m in Sources */,
535053EE2B610C3400D7EAF2 /* VLCLoadingOverlayView.m in Sources */,
......@@ -2275,6 +2294,7 @@
538DC4E32A6B69B50082DECD /* VLCLibraryAudioGroupHeaderView.m in Sources */,
7DFBDCB1226A518400B700A5 /* VLCLibraryMenuController.m in Sources */,
536283F8291146BC00640C15 /* VLCLibrarySongTableCellView.m in Sources */,
53A8F9D12A7E1E6300BC11BF /* VLCLibraryPlaylistViewController.m in Sources */,
1C3113D51E508C6900D4DD76 /* VLCTextfieldPanelController.m in Sources */,
53628403291147C500640C15 /* VLCSubScrollView.m in Sources */,
1C3113D71E508C6900D4DD76 /* VLCPopupPanelController.m in Sources */,
......
......@@ -111,6 +111,8 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/library/VLCLibraryCollectionViewItem.m \
gui/macosx/library/VLCLibraryCollectionViewMediaItemSupplementaryDetailView.h \
gui/macosx/library/VLCLibraryCollectionViewMediaItemSupplementaryDetailView.m \
gui/macosx/library/VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.h \
gui/macosx/library/VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.m \
gui/macosx/library/VLCLibraryCollectionViewSupplementaryDetailView.h \
gui/macosx/library/VLCLibraryCollectionViewSupplementaryDetailView.m \
gui/macosx/library/VLCLibraryCollectionViewSupplementaryElementView.h \
......@@ -123,6 +125,8 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/library/VLCLibraryHeroView.m \
gui/macosx/library/VLCLibraryImageCache.h \
gui/macosx/library/VLCLibraryImageCache.m \
gui/macosx/library/VLCLibraryItemInternalMediaItemsDataSource.h \
gui/macosx/library/VLCLibraryItemInternalMediaItemsDataSource.m \
gui/macosx/library/VLCLibraryMasterDetailViewTableViewDataSource.h \
gui/macosx/library/VLCLibraryMasterDetailViewTableViewDelegate.h \
gui/macosx/library/VLCLibraryMasterDetailViewTableViewDelegate.m \
......@@ -204,8 +208,6 @@ libmacosx_plugin_la_SOURCES = \
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/VLCLibraryAllAudioGroupsMediaLibraryItem.h \
......@@ -222,8 +224,6 @@ libmacosx_plugin_la_SOURCES = \
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 \
gui/macosx/library/audio-library/VLCLibraryCollectionViewAlbumSupplementaryDetailView.m \
gui/macosx/library/audio-library/VLCLibrarySongTableCellView.h \
gui/macosx/library/audio-library/VLCLibrarySongTableCellView.m \
gui/macosx/library/audio-library/VLCLibrarySongsTableViewSongPlayingTableCellView.h \
......@@ -242,6 +242,10 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/library/media-source/VLCMediaSourceDeviceCollectionViewItem.m \
gui/macosx/library/media-source/VLCMediaSourceProvider.h \
gui/macosx/library/media-source/VLCMediaSourceProvider.m \
gui/macosx/library/playlist-library/VLCLibraryPlaylistDataSource.h \
gui/macosx/library/playlist-library/VLCLibraryPlaylistDataSource.m \
gui/macosx/library/playlist-library/VLCLibraryPlaylistViewController.h \
gui/macosx/library/playlist-library/VLCLibraryPlaylistViewController.m \
gui/macosx/main/CompatibilityFixes.h \
gui/macosx/main/CompatibilityFixes.m \
gui/macosx/main/VLCApplication.h \
......@@ -465,7 +469,7 @@ libmacosx_plugin_la_XIB_SOURCES = \
gui/macosx/UI/VLCPlaylistTableCellView.xib \
gui/macosx/UI/VLCLibraryCarouselViewItemView.xib \
gui/macosx/UI/VLCLibraryCollectionViewItem.xib \
gui/macosx/UI/VLCLibraryCollectionViewAlbumSupplementaryDetailView.xib \
gui/macosx/UI/VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.xib \
gui/macosx/UI/VLCLibraryCollectionViewMediaItemSupplementaryDetailView.xib \
gui/macosx/UI/VLCLibraryHeroView.xib \
gui/macosx/UI/VLCLibrarySongTableCellView.xib \
......
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="20037" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="20037"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22690"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="VLCLibraryCollectionViewAlbumSupplementaryDetailView"/>
<customObject id="-2" userLabel="File's Owner" customClass="VLCLibraryCollectionViewMediaItemListSupplementaryDetailView"/>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<view id="HAc-or-XD8" customClass="VLCLibraryCollectionViewAlbumSupplementaryDetailView">
<view id="HAc-or-XD8" customClass="VLCLibraryCollectionViewMediaItemListSupplementaryDetailView">
<rect key="frame" x="0.0" y="0.0" width="1071" height="312"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<subviews>
......@@ -142,7 +142,7 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES"/>
<clipView key="contentView" drawsBackground="NO" id="3V4-tX-owM">
<rect key="frame" x="0.0" y="0.0" width="699" height="198"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" tableStyle="fullWidth" columnReordering="NO" autosaveColumns="NO" rowHeight="50" viewBased="YES" id="eEJ-WA-0aM" customClass="VLCLibraryTableView">
<rect key="frame" x="0.0" y="0.0" width="699" height="188"/>
......@@ -226,18 +226,18 @@
<constraint firstAttribute="trailing" secondItem="FWp-yd-2Pm" secondAttribute="trailing" constant="10" id="cPm-6m-umY"/>
</constraints>
<connections>
<outlet property="albumArtworkImageView" destination="xZd-Hk-h2M" id="J8l-V9-P06"/>
<outlet property="albumPrimaryDetailTextButton" destination="o9Q-0s-xRU" id="At9-hH-CJa"/>
<outlet property="albumSecondaryDetailTextButton" destination="jNq-xn-yIp" id="ESO-jC-EfW"/>
<outlet property="albumTitleTextField" destination="nCe-dY-YMM" id="h3l-p0-w3e"/>
<outlet property="albumTracksTableView" destination="eEJ-WA-0aM" id="l8k-M9-a8e"/>
<outlet property="albumYearAndDurationTextField" destination="QuO-3G-BMT" id="y34-rD-uR"/>
<outlet property="artworkImageView" destination="xZd-Hk-h2M" id="J8l-V9-P06"/>
<outlet property="contentViewBottomConstraint" destination="bUH-jE-TQQ" id="T0p-C1-8jm"/>
<outlet property="contentViewLeftConstraint" destination="D62-3E-aDO" id="T0p-C1-a8j"/>
<outlet property="contentViewRightConstraint" destination="cPm-6m-umY" id="T0p-C1-a7l"/>
<outlet property="contentViewTopConstraint" destination="Mr1-w0-CQK" id="T0p-C1-1nv"/>
<outlet property="internalScrollView" destination="9ZS-oy-iP9" id="afa-6P-b12"/>
<outlet property="playAlbumButton" destination="ntd-VT-2KS" id="ah5-as-eqw"/>
<outlet property="playButton" destination="ntd-VT-2KS" id="ah5-as-eqw"/>
<outlet property="primaryDetailTextButton" destination="o9Q-0s-xRU" id="At9-hH-CJa"/>
<outlet property="secondaryDetailTextButton" destination="jNq-xn-yIp" id="ESO-jC-EfW"/>
<outlet property="tableView" destination="eEJ-WA-0aM" id="l8k-M9-a8e"/>
<outlet property="titleTextField" destination="nCe-dY-YMM" id="h3l-p0-w3e"/>
<outlet property="yearAndDurationTextField" destination="QuO-3G-BMT" id="y34-rD-uR"/>
</connections>
<point key="canvasLocation" x="-237.5" y="-284"/>
</view>
......
......@@ -26,6 +26,9 @@ NS_ASSUME_NONNULL_BEGIN
@interface VLCLibraryCollectionViewFlowLayout : NSCollectionViewFlowLayout
/// Creates new layout with standard insets and spacing
@property (class, readonly) VLCLibraryCollectionViewFlowLayout *standardLayout;
- (void)expandDetailSectionAtIndex:(NSIndexPath *)indexPath;
- (void)collapseDetailSectionAtIndex:(NSIndexPath *)indexPath;
- (void)resetLayout;
......
......@@ -24,9 +24,11 @@
#import "library/VLCLibraryCollectionViewDataSource.h"
#import "library/VLCLibraryCollectionViewMediaItemSupplementaryDetailView.h"
#import "library/VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.h"
#import "library/VLCLibraryUIUnits.h"
#import "library/audio-library/VLCLibraryCollectionViewAlbumSupplementaryDetailView.h"
#import "library/audio-library/VLCLibraryAudioDataSource.h"
#import "library/audio-library/VLCLibraryAudioGroupDataSource.h"
#pragma mark - Private data
static const NSUInteger kAnimationSteps = 32;
......@@ -79,6 +81,19 @@ static CVReturn detailViewAnimationCallback(CVDisplayLinkRef displayLink,
@implementation VLCLibraryCollectionViewFlowLayout
+ (instancetype)standardLayout
{
const CGFloat collectionItemSpacing = VLCLibraryUIUnits.collectionViewItemSpacing;
const NSEdgeInsets collectionViewSectionInset = VLCLibraryUIUnits.collectionViewSectionInsets;
VLCLibraryCollectionViewFlowLayout * const collectionViewLayout = [[VLCLibraryCollectionViewFlowLayout alloc] init];
collectionViewLayout.minimumLineSpacing = collectionItemSpacing;
collectionViewLayout.minimumInteritemSpacing = collectionItemSpacing;
collectionViewLayout.sectionInset = collectionViewSectionInset;
return collectionViewLayout;
}
- (instancetype)init
{
self = [super init];
......@@ -276,7 +291,7 @@ static CVReturn detailViewAnimationCallback(CVDisplayLinkRef displayLink,
{
BOOL isLibrarySupplementaryView = NO;
if ([elementKind isEqualToString:VLCLibraryCollectionViewAlbumSupplementaryDetailViewKind] ||
if ([elementKind isEqualToString:VLCLibraryCollectionViewMediaItemListSupplementaryDetailViewKind] ||
[elementKind isEqualToString:VLCLibraryCollectionViewMediaItemSupplementaryDetailViewKind]) {
isLibrarySupplementaryView = YES;
......@@ -321,7 +336,7 @@ static CVReturn detailViewAnimationCallback(CVDisplayLinkRef displayLink,
- (NSSet<NSIndexPath *> *)indexPathsToDeleteForSupplementaryViewOfKind:(NSString *)elementKind
{
if ([elementKind isEqualToString:VLCLibraryCollectionViewAlbumSupplementaryDetailViewKind] ||
if ([elementKind isEqualToString:VLCLibraryCollectionViewMediaItemListSupplementaryDetailViewKind] ||
[elementKind isEqualToString:VLCLibraryCollectionViewMediaItemSupplementaryDetailViewKind]) {
return [self.collectionView indexPathsForVisibleSupplementaryElementsOfKind:elementKind];
......
......@@ -216,18 +216,19 @@ const CGFloat VLCLibraryCollectionViewItemMaximumDisplayedProgress = 0.95;
NSAssert(self.representedItem != nil, @"no item assigned for collection view item", nil);
const id<VLCMediaLibraryItemProtocol> actualItem = self.representedItem.item;
_mediaTitleTextField.stringValue = actualItem.displayString;
_secondaryInfoTextField.stringValue = actualItem.primaryDetailString;
self.mediaTitleTextField.stringValue = actualItem.displayString;
self.secondaryInfoTextField.stringValue = actualItem.primaryDetailString;
[VLCLibraryImageCache thumbnailForLibraryItem:actualItem withCompletion:^(NSImage * const thumbnail) {
self->_mediaImageView.image = thumbnail;
[VLCLibraryImageCache thumbnailForLibraryItem:actualItem
withCompletion:^(NSImage * const thumbnail) {
self.mediaImageView.image = thumbnail;
}];
// TODO: Add handling for the other types
if([actualItem isKindOfClass:[VLCMediaLibraryMediaItem class]]) {
if ([actualItem isKindOfClass:VLCMediaLibraryMediaItem.class]) {
VLCMediaLibraryMediaItem * const mediaItem = (VLCMediaLibraryMediaItem *)actualItem;
if (mediaItem.mediaType == VLC_ML_MEDIA_TYPE_VIDEO || mediaItem.mediaType == VLC_ML_MEDIA_TYPE_UNKNOWN) {
if (mediaItem.mediaType == VLC_ML_MEDIA_TYPE_VIDEO ||
mediaItem.mediaType == VLC_ML_MEDIA_TYPE_UNKNOWN) {
VLCMediaLibraryTrack * const videoTrack = mediaItem.firstVideoTrack;
[self showVideoSizeIfNeededForWidth:videoTrack.videoWidth
andHeight:videoTrack.videoHeight];
......@@ -237,14 +238,18 @@ const CGFloat VLCLibraryCollectionViewItemMaximumDisplayedProgress = 0.95;
}
const CGFloat position = mediaItem.progress;
if (position > VLCLibraryCollectionViewItemMinimalDisplayedProgress && position < VLCLibraryCollectionViewItemMaximumDisplayedProgress) {
_progressIndicator.progress = position;
_progressIndicator.hidden = NO;
if (position > VLCLibraryCollectionViewItemMinimalDisplayedProgress &&
position < VLCLibraryCollectionViewItemMaximumDisplayedProgress) {
self.progressIndicator.progress = position;
self.progressIndicator.hidden = NO;
}
if (mediaItem.playCount == 0) {
[self setUnplayedIndicatorHidden:NO];
}
} else {
self.progressIndicator.hidden = YES;
_videoImageViewAspectRatioConstraint.active = NO;
}
}
......
/*****************************************************************************
* VLCLibraryCollectionViewAlbumSupplementaryDetailView.h: MacOS X interface module
* VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.h: MacOS X interface module
*****************************************************************************
* Copyright (C) 2022 VLC authors and VideoLAN
*
* Authors: Claudio Cambra <claudio.cambra@gmail.com>
* Authors: Claudio Cambra <developer@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
......@@ -29,18 +29,18 @@ NS_ASSUME_NONNULL_BEGIN
@class VLCLibraryRepresentedItem;
@class VLCImageView;
extern NSString *const VLCLibraryCollectionViewAlbumSupplementaryDetailViewIdentifier;
extern NSCollectionViewSupplementaryElementKind const VLCLibraryCollectionViewAlbumSupplementaryDetailViewKind;
extern NSString *const VLCLibraryCollectionViewMediaItemListSupplementaryDetailViewIdentifier;
extern NSCollectionViewSupplementaryElementKind const VLCLibraryCollectionViewMediaItemListSupplementaryDetailViewKind;
@interface VLCLibraryCollectionViewAlbumSupplementaryDetailView : VLCLibraryCollectionViewSupplementaryDetailView
@interface VLCLibraryCollectionViewMediaItemListSupplementaryDetailView : VLCLibraryCollectionViewSupplementaryDetailView
@property (readwrite, weak) IBOutlet NSTextField *albumTitleTextField;
@property (readwrite, weak) IBOutlet NSButton *albumPrimaryDetailTextButton;
@property (readwrite, weak) IBOutlet NSButton *albumSecondaryDetailTextButton;
@property (readwrite, weak) IBOutlet NSTextField *albumYearAndDurationTextField;
@property (readwrite, weak) IBOutlet VLCImageView *albumArtworkImageView;
@property (readwrite, weak) IBOutlet NSTableView *albumTracksTableView;
@property (readwrite, weak) IBOutlet NSButton *playAlbumButton;
@property (readwrite, weak) IBOutlet NSTextField *titleTextField;
@property (readwrite, weak) IBOutlet NSButton *primaryDetailTextButton;
@property (readwrite, weak) IBOutlet NSButton *secondaryDetailTextButton;
@property (readwrite, weak) IBOutlet NSTextField *yearAndDurationTextField;
@property (readwrite, weak) IBOutlet VLCImageView *artworkImageView;
@property (readwrite, weak) IBOutlet NSTableView *tableView;
@property (readwrite, weak) IBOutlet NSButton *playButton;
- (IBAction)playAction:(id)sender;
- (IBAction)enqueueAction:(id)sender;
......
/*****************************************************************************
* VLCLibraryCollectionViewAlbumSupplementaryDetailView.m: MacOS X interface module
* VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.m: MacOS X interface module
*****************************************************************************
* Copyright (C) 2021 VLC authors and VideoLAN
*
......@@ -21,7 +21,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import "VLCLibraryCollectionViewAlbumSupplementaryDetailView.h"
#import "VLCLibraryCollectionViewMediaItemListSupplementaryDetailView.h"
#import "extensions/NSString+Helpers.h"
#import "extensions/NSFont+VLCAdditions.h"
......@@ -31,111 +31,132 @@
#import "library/VLCLibraryController.h"
#import "library/VLCLibraryDataTypes.h"
#import "library/VLCLibraryImageCache.h"
#import "library/VLCLibraryItemInternalMediaItemsDataSource.h"
#import "library/VLCLibraryModel.h"
#import "library/VLCLibraryMenuController.h"
#import "library/VLCLibraryRepresentedItem.h"
#import "library/VLCLibraryWindow.h"
#import "library/audio-library/VLCLibraryAlbumTracksDataSource.h"
#import "library/audio-library/VLCLibraryAlbumTracksTableViewDelegate.h"
#import "library/audio-library/VLCLibraryAlbumTableCellView.h"
#import "main/VLCMain.h"
#import "views/VLCImageView.h"
NSString *const VLCLibraryCollectionViewAlbumSupplementaryDetailViewIdentifier = @"VLCLibraryCollectionViewAlbumSupplementaryDetailViewIdentifier";
NSCollectionViewSupplementaryElementKind const VLCLibraryCollectionViewAlbumSupplementaryDetailViewKind = @"VLCLibraryCollectionViewAlbumSupplementaryDetailViewIdentifier";
NSString * const VLCLibraryCollectionViewMediaItemListSupplementaryDetailViewIdentifier =
@"VLCLibraryCollectionViewMediaItemListSupplementaryDetailViewIdentifier";
NSCollectionViewSupplementaryElementKind const VLCLibraryCollectionViewMediaItemListSupplementaryDetailViewKind =
@"VLCLibraryCollectionViewMediaItemListSupplementaryDetailViewIdentifier";
@interface VLCLibraryCollectionViewAlbumSupplementaryDetailView ()
@interface VLCLibraryCollectionViewMediaItemListSupplementaryDetailView ()
{
VLCLibraryAlbumTracksDataSource *_tracksDataSource;
VLCLibraryItemInternalMediaItemsDataSource *_tracksDataSource;
VLCLibraryAlbumTracksTableViewDelegate *_tracksTableViewDelegate;
VLCLibraryController *_libraryController;
}
@end
@implementation VLCLibraryCollectionViewAlbumSupplementaryDetailView
@implementation VLCLibraryCollectionViewMediaItemListSupplementaryDetailView
- (void)awakeFromNib
{
_tracksDataSource = [[VLCLibraryAlbumTracksDataSource alloc] init];
_tracksDataSource = [[VLCLibraryItemInternalMediaItemsDataSource alloc] init];
_tracksTableViewDelegate = [[VLCLibraryAlbumTracksTableViewDelegate alloc] init];
_albumTracksTableView.dataSource = _tracksDataSource;
_albumTracksTableView.delegate = _tracksTableViewDelegate;
_albumTracksTableView.rowHeight = VLCLibraryTracksRowHeight;
self.tableView.dataSource = _tracksDataSource;
self.tableView.delegate = _tracksTableViewDelegate;
self.tableView.rowHeight = VLCLibraryInternalMediaItemRowHeight;
_albumTitleTextField.font = NSFont.VLCLibrarySubsectionHeaderFont;
self.albumPrimaryDetailTextButton.font = NSFont.VLCLibrarySubsectionSubheaderFont;
self.albumSecondaryDetailTextButton.font = NSFont.VLCLibrarySubsectionSubheaderFont;
self.titleTextField.font = NSFont.VLCLibrarySubsectionHeaderFont;
self.primaryDetailTextButton.font = NSFont.VLCLibrarySubsectionSubheaderFont;
self.secondaryDetailTextButton.font = NSFont.VLCLibrarySubsectionSubheaderFont;
self.albumPrimaryDetailTextButton.action = @selector(primaryDetailAction:);
self.albumSecondaryDetailTextButton.action = @selector(secondaryDetailAction:);
self.primaryDetailTextButton.action = @selector(primaryDetailAction:);
self.secondaryDetailTextButton.action = @selector(secondaryDetailAction:);
if (@available(macOS 10.14, *)) {
self.albumPrimaryDetailTextButton.contentTintColor = NSColor.VLCAccentColor;
self.albumSecondaryDetailTextButton.contentTintColor = NSColor.secondaryLabelColor;
self.primaryDetailTextButton.contentTintColor = NSColor.VLCAccentColor;
self.secondaryDetailTextButton.contentTintColor = NSColor.secondaryLabelColor;
}
if(@available(macOS 10.12.2, *)) {
_playAlbumButton.bezelColor = NSColor.VLCAccentColor;
self.playButton.bezelColor = NSColor.VLCAccentColor;
}
NSNotificationCenter * const notificationCenter = NSNotificationCenter.defaultCenter;
[notificationCenter addObserver:self
selector:@selector(handleAlbumUpdated:)
selector:@selector(handleItemUpdated:)
name:VLCLibraryModelAlbumUpdated
object:nil];
[notificationCenter addObserver:self
selector:@selector(handleItemUpdated:)
name:VLCLibraryModelArtistUpdated
object:nil];
[notificationCenter addObserver:self
selector:@selector(handleItemUpdated:)
name:VLCLibraryModelGenreUpdated
object:nil];
[notificationCenter addObserver:self
selector:@selector(handleItemUpdated:)
name:VLCLibraryModelPlaylistUpdated
object:nil];
}
- (void)handleAlbumUpdated:(NSNotification *)notification
- (void)handleItemUpdated:(NSNotification *)notification
{
NSParameterAssert(notification);
if (self.representedItem == nil) {
const id<VLCMediaLibraryItemProtocol> item = notification.object;
if (self.representedItem == nil ||
item == nil ||
![self.representedItem.item.class isKindOfClass:item.class] ||
self.representedItem.item.libraryID != item.libraryID) {
return;
}
VLCMediaLibraryAlbum * const album = (VLCMediaLibraryAlbum *)notification.object;
if (album == nil || self.representedItem.item.libraryID != album.libraryID) {
return;
}
VLCLibraryRepresentedItem * const representedItem = [[VLCLibraryRepresentedItem alloc] initWithItem:album parentType:self.representedItem.parentType];
VLCLibraryRepresentedItem * const representedItem =
[[VLCLibraryRepresentedItem alloc] initWithItem:item
parentType:self.representedItem.parentType];
self.representedItem = representedItem;
}
- (void)updateRepresentation
{
NSAssert(self.representedItem != nil, @"no media item assigned for collection view item", nil);
VLCMediaLibraryAlbum * const album = (VLCMediaLibraryAlbum *)self.representedItem.item;
NSAssert(album != nil, @"represented item is not an album", nil);
_albumTitleTextField.stringValue = album.displayString;
_albumPrimaryDetailTextButton.title = album.artistName;
_albumSecondaryDetailTextButton.title = album.genreString;
_albumYearAndDurationTextField.stringValue = [NSString stringWithFormat:@"%u · %@", album.year, album.durationString];
const BOOL primaryActionableDetail = album.primaryActionableDetail;
const BOOL secondaryActionableDetail = album.secondaryActionableDetail;
self.albumPrimaryDetailTextButton.enabled = primaryActionableDetail;
self.albumSecondaryDetailTextButton.enabled = secondaryActionableDetail;
const id<VLCMediaLibraryItemProtocol> item = self.representedItem.item;
self.titleTextField.stringValue = item.displayString;
self.primaryDetailTextButton.title = item.primaryDetailString;
self.secondaryDetailTextButton.title = item.secondaryDetailString;
if ([item isKindOfClass:VLCMediaLibraryAlbum.class]) {
self.yearAndDurationTextField.stringValue =
[NSString stringWithFormat:@"%u · %@", [(VLCMediaLibraryAlbum *)item year], item.durationString];
} else {
self.yearAndDurationTextField.stringValue = item.durationString;
}
const BOOL primaryActionableDetail = item.primaryActionableDetail;
const BOOL secondaryActionableDetail = item.secondaryActionableDetail;
self.primaryDetailTextButton.enabled = primaryActionableDetail;
self.secondaryDetailTextButton.enabled = secondaryActionableDetail;
if (@available(macOS 10.14, *)) {
self.albumPrimaryDetailTextButton.contentTintColor = primaryActionableDetail ? NSColor.VLCAccentColor : NSColor.secondaryLabelColor;
self.albumSecondaryDetailTextButton.contentTintColor = secondaryActionableDetail ? NSColor.secondaryLabelColor : NSColor.tertiaryLabelColor;
self.primaryDetailTextButton.contentTintColor =
primaryActionableDetail ? NSColor.VLCAccentColor : NSColor.secondaryLabelColor;
self.secondaryDetailTextButton.contentTintColor =
secondaryActionableDetail ? NSColor.secondaryLabelColor : NSColor.tertiaryLabelColor;
}
[VLCLibraryImageCache thumbnailForLibraryItem:album withCompletion:^(NSImage * const thumbnail) {
self->_albumArtworkImageView.image = thumbnail;
[VLCLibraryImageCache thumbnailForLibraryItem:item withCompletion:^(NSImage * const thumbnail) {
self.artworkImageView.image = thumbnail;
}];
__weak typeof(self) weakSelf = self; // Prevent retain cycle
[_tracksDataSource setRepresentedAlbum:album withCompletion:^{
[_tracksDataSource setRepresentedItem:item withCompletion:^{
__strong typeof(self) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf->_albumTracksTableView reloadData];
[strongSelf.tableView reloadData];
}
}];
}
......@@ -152,25 +173,25 @@ NSCollectionViewSupplementaryElementKind const VLCLibraryCollectionViewAlbumSupp
- (IBAction)primaryDetailAction:(id)sender
{
VLCMediaLibraryAlbum * const album = (VLCMediaLibraryAlbum *)self.representedItem.item;
if (album == nil || !album.primaryActionableDetail) {
const id<VLCMediaLibraryItemProtocol> item = self.representedItem.item;
if (item == nil || !item.primaryActionableDetail) {
return;
}
VLCLibraryWindow * const libraryWindow = VLCMain.sharedInstance.libraryWindow;
const id<VLCMediaLibraryItemProtocol> libraryItem = album.primaryActionableDetailLibraryItem;
const id<VLCMediaLibraryItemProtocol> libraryItem = item.primaryActionableDetailLibraryItem;
[libraryWindow presentLibraryItem:libraryItem];
}
- (IBAction)secondaryDetailAction:(id)sender
{
VLCMediaLibraryAlbum * const album = (VLCMediaLibraryAlbum *)self.representedItem.item;
if (album == nil || !album.secondaryActionableDetail) {
const id<VLCMediaLibraryItemProtocol> item = self.representedItem.item;
if (item == nil || !item.secondaryActionableDetail) {
return;
}
VLCLibraryWindow * const libraryWindow = VLCMain.sharedInstance.libraryWindow;
const id<VLCMediaLibraryItemProtocol> libraryItem = album.secondaryActionableDetailLibraryItem;
const id<VLCMediaLibraryItemProtocol> libraryItem = item.secondaryActionableDetailLibraryItem;
[libraryWindow presentLibraryItem:libraryItem];
}
......
......@@ -251,6 +251,34 @@ typedef NS_ENUM(NSUInteger, VLCMediaLibraryParentGroupType) {
@end
@interface VLCMediaLibraryPlaylist : VLCAbstractMediaLibraryItem<VLCMediaLibraryItemProtocol>
@property (readonly) NSString *MRL;
@property (readonly) NSArray<VLCMediaLibraryMediaItem *> *mediaItems;
@property (readonly) unsigned int numberOfMedia;
@property (readonly) uint32_t numberOfVideos;
@property (readonly) uint32_t numberOfAudios;
@property (readonly) uint32_t numberOfUnknowns;
@property (readonly) unsigned int numberOfPresentMedia;
@property (readonly) uint32_t numberOfPresentVideos;
@property (readonly) uint32_t numberOfPresentAudios;
@property (readonly) uint32_t numberOfPresentUnknowns;
@property (readonly) NSDate *creationDate;
@property (readonly) int64_t duration;
@property (readonly) uint32_t numberDurationUnknown;
@property (readonly) BOOL readOnly;
+ (instancetype)playlistForLibraryID:(int64_t)libraryID;
- (instancetype)initWithPlaylist:(struct vlc_ml_playlist_t *)p_playlist;
@end
@interface VLCMediaLibraryMediaItem : NSObject<VLCMediaLibraryItemProtocol>
+ (nullable instancetype)mediaItemForLibraryID:(int64_t)libraryID;
......
......@@ -806,6 +806,122 @@ static NSString *genreArrayDisplayString(NSArray<VLCMediaLibraryGenre *> * const
@end
@interface VLCMediaLibraryPlaylist ()
{
NSArray<VLCMediaLibraryMediaItem *> *_mediaItems;
}
@end
@implementation VLCMediaLibraryPlaylist
+ (instancetype)playlistForLibraryID:(int64_t)libraryID
{
vlc_medialibrary_t * const p_mediaLibrary = getMediaLibrary();
if(!p_mediaLibrary) {
return nil;
}
vlc_ml_playlist_t * const p_playlist = vlc_ml_get_playlist(p_mediaLibrary, libraryID);
if (p_playlist == NULL) {
return nil;
}
return [[VLCMediaLibraryPlaylist alloc] initWithPlaylist:p_playlist];
}
- (instancetype)initWithPlaylist:(struct vlc_ml_playlist_t *)p_playlist
{
self = [super init];
if (self && p_playlist != NULL) {
self.libraryID = p_playlist->i_id;
self.smallArtworkMRL = toNSStr(p_playlist->psz_artwork_mrl);
self.displayString = toNSStr(p_playlist->psz_name);
self.primaryDetailString = [NSString stringWithFormat:@"%u items", p_playlist->i_nb_media];
self.durationString = [NSString stringWithTime:p_playlist->i_duration / VLCMediaLibraryMediaItemDurationDenominator];
_MRL = toNSStr(p_playlist->psz_mrl);
_numberOfMedia = p_playlist->i_nb_media;
_numberOfAudios = p_playlist->i_nb_audio;
_numberOfVideos = p_playlist->i_nb_video;
_numberOfUnknowns = p_playlist->i_nb_unknown;
_numberOfPresentMedia = p_playlist->i_nb_present_media;
_numberOfPresentAudios = p_playlist->i_nb_present_audio;
_numberOfPresentVideos = p_playlist->i_nb_present_video;
_numberOfPresentUnknowns = p_playlist->i_nb_present_unknown;
_creationDate = [NSDate dateWithTimeIntervalSince1970:p_playlist->i_creation_date];
_duration = p_playlist->i_duration;
_numberDurationUnknown = p_playlist->i_nb_duration_unknown;
_readOnly = p_playlist->b_is_read_only;
}
return self;
}
- (void)fetchMediaItems
{
NSMutableArray<VLCMediaLibraryMediaItem *> * const fetchedMediaItems = NSMutableArray.array;
vlc_ml_media_list_t * const p_media_list = vlc_ml_list_playlist_media(getMediaLibrary(), NULL, self.libraryID);
for (NSUInteger i = 0; i < p_media_list->i_nb_items; ++i) {
vlc_ml_media_t p_media_item = p_media_list->p_items[i];
VLCMediaLibraryMediaItem * const item = [[VLCMediaLibraryMediaItem alloc] initWithMediaItem:&p_media_item];
[fetchedMediaItems addObject:item];
}
vlc_ml_media_list_release(p_media_list);
_mediaItems = fetchedMediaItems.copy;
}
- (NSArray<VLCMediaLibraryMediaItem *> *)mediaItems
{
if (_mediaItems == nil) {
[self fetchMediaItems];
}
return _mediaItems;
}
- (VLCMediaLibraryMediaItem *)firstMediaItem
{
if (self.mediaItems == nil) {
[self fetchMediaItems];
}
return self.mediaItems.firstObject;
}
- (void)moveToTrash
{
NSFileManager * const fileManager = NSFileManager.defaultManager;
NSURL * const URL = [NSURL URLWithString:_MRL];
[fileManager trashItemAtURL:URL
resultingItemURL:nil
error:nil];
}
- (void)revealInFinder
{
NSURL * const URL = [NSURL URLWithString:_MRL];
if (URL) {
[NSWorkspace.sharedWorkspace activateFileViewerSelectingURLs:@[URL]];
}
}
- (void)iterateMediaItemsWithBlock:(nonnull void (^)(VLCMediaLibraryMediaItem * _Nonnull))mediaItemBlock
{
if (self.mediaItems == nil) {
[self fetchMediaItems];
}
for(VLCMediaLibraryMediaItem * const item in self.mediaItems) {
mediaItemBlock(item);
}
}
@end
@interface VLCMediaLibraryMediaItem ()
@property (readwrite, assign) vlc_medialibrary_t *p_mediaLibrary;
......
......@@ -172,27 +172,25 @@ const NSUInteger kVLCCompositeImageDefaultCompositedGridItemCount = 4;
+ (void)thumbnailForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem
withCompletion:(void(^)(const NSImage *))completionHandler
{
if ([libraryItem isKindOfClass:VLCAbstractMediaLibraryAudioGroup.class] && ![libraryItem isKindOfClass:VLCMediaLibraryAlbum.class]) {
if (![libraryItem isKindOfClass:VLCMediaLibraryAlbum.class] &&
![libraryItem isKindOfClass:VLCMediaLibraryMediaItem.class]) {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
VLCAbstractMediaLibraryAudioGroup * const audioGroupItem = (VLCAbstractMediaLibraryAudioGroup *)libraryItem;
NSMutableArray<NSImage *> * const itemImages = NSMutableArray.array;
NSMutableSet<NSNumber *> * const itemAlbums = NSMutableSet.set;
NSMutableSet<NSImage *> * const itemImages = NSMutableArray.array;
[audioGroupItem iterateMediaItemsWithBlock:^(VLCMediaLibraryMediaItem * const item) {
NSNumber * const albumId = @(item.albumID);
if ([itemAlbums containsObject:albumId]) {
[libraryItem iterateMediaItemsWithBlock:^(VLCMediaLibraryMediaItem * const item) {
NSImage * const itemImage = [VLCLibraryImageCache thumbnailForLibraryItem:item];
if (itemImage == nil || [itemImages containsObject:itemImage]) {
return;
}
[itemAlbums addObject:albumId];
NSImage * const itemImage = [VLCLibraryImageCache thumbnailForLibraryItem:item];
[itemImages addObject:itemImage];
}];
const NSSize size = NSMakeSize(kVLCDesiredThumbnailWidth, kVLCDesiredThumbnailHeight);
NSArray<NSValue *> * const frames = [NSImage framesForCompositeImageSquareGridWithImages:itemImages size:size gridItemCount:kVLCCompositeImageDefaultCompositedGridItemCount];
NSImage * const compositeImage = [NSImage compositeImageWithImages:itemImages frames:frames size:size];
NSArray<NSValue *> * const frames =
[NSImage framesForCompositeImageSquareGridWithImages:itemImages size:size gridItemCount:kVLCCompositeImageDefaultCompositedGridItemCount];
NSImage * const compositeImage =
[NSImage compositeImageWithImages:itemImages frames:frames size:size];
dispatch_async(dispatch_get_main_queue(), ^{
completionHandler(compositeImage);
......
/*****************************************************************************
* VLCLibraryAlbumTracksDataSource.h: MacOS X interface module
* VLCLibraryItemInternalMediaItemsDataSource.h: MacOS X interface module
*****************************************************************************
* Copyright (C) 2022 VLC authors and VideoLAN
*
* Authors: Claudio Cambra <claudio.cambra@gmail.com>
* Authors: Claudio Cambra <developer@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
......@@ -26,16 +26,16 @@
NS_ASSUME_NONNULL_BEGIN
@class VLCMediaLibraryAlbum;
@protocol VLCMediaLibraryItemProtocol;
@interface VLCLibraryAlbumTracksDataSource : NSObject <VLCLibraryTableViewDataSource>
@interface VLCLibraryItemInternalMediaItemsDataSource : NSObject <VLCLibraryTableViewDataSource>
extern const CGFloat VLCLibraryTracksRowHeight;
extern const CGFloat VLCLibraryInternalMediaItemRowHeight;
@property (readwrite, retain, nonatomic, nullable) VLCMediaLibraryAlbum *representedAlbum;
@property (readwrite, retain, nonatomic, nullable) id<VLCMediaLibraryItemProtocol> representedItem;
- (void)setRepresentedAlbum:(VLCMediaLibraryAlbum*)album
withCompletion:(nullable void(^)(void))completionHandler;
- (void)setRepresentedItem:(id<VLCMediaLibraryItemProtocol>)item
withCompletion:(nullable void(^)(void))completionHandler;
@end
......
/*****************************************************************************
* VLCLibraryAlbumTracksDataSource.m: MacOS X interface module
* VLCLibraryItemInternalMediaItemsDataSource.m: MacOS X interface module
*****************************************************************************
* Copyright (C) 2019 VLC authors and VideoLAN
*
......@@ -20,42 +20,41 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import "VLCLibraryAlbumTracksDataSource.h"
#import "VLCLibraryItemInternalMediaItemsDataSource.h"
#import "extensions/NSPasteboardItem+VLCAdditions.h"
#import "library/VLCLibraryDataTypes.h"
#import "library/audio-library/VLCLibrarySongTableCellView.h"
const CGFloat VLCLibraryTracksRowHeight = 40.;
const CGFloat VLCLibraryInternalMediaItemRowHeight = 40.;
@interface VLCLibraryAlbumTracksDataSource ()
@interface VLCLibraryItemInternalMediaItemsDataSource ()
@property (readwrite, atomic) NSArray<VLCMediaLibraryMediaItem*> *tracks;
@property (readwrite, atomic) VLCMediaLibraryAlbum *internalAlbum;
@property (readwrite, atomic) id<VLCMediaLibraryItemProtocol> internalItem;
@property (readwrite, atomic) NSArray<VLCMediaLibraryMediaItem*> *internalMediaItems;
@end
@implementation VLCLibraryAlbumTracksDataSource
@implementation VLCLibraryItemInternalMediaItemsDataSource
// TODO: Connect to library model
- (VLCMediaLibraryAlbum*)representedAlbum
- (id<VLCMediaLibraryItemProtocol>)representedItem
{
return self.internalAlbum;
return self.internalItem;
}
- (void)setRepresentedAlbum:(VLCMediaLibraryAlbum *)representedAlbum
- (void)setRepresentedItem:(id<VLCMediaLibraryItemProtocol>)representedItem
{
[self setRepresentedAlbum:representedAlbum withCompletion:nil];
[self setRepresentedItem:representedItem withCompletion:nil];
}
- (void)setRepresentedAlbum:(id)album
withCompletion:(nullable void (^)(void))completionHandler
- (void)setRepresentedItem:(id<VLCMediaLibraryItemProtocol>)item
withCompletion:(nullable void (^)(void))completionHandler
{
self.internalAlbum = album;
self.internalItem = item;
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
self.tracks = self.representedAlbum.mediaItems;
self.internalMediaItems = item.mediaItems;
dispatch_async(dispatch_get_main_queue(), ^{
if (completionHandler != nil) {
......@@ -67,28 +66,24 @@ const CGFloat VLCLibraryTracksRowHeight = 40.;
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
if (self.representedAlbum != nil) {
return self.representedAlbum.numberOfTracks;
}
return 0;
return self.representedItem == nil ? 0 : self.internalMediaItems.count;
}
- (id<NSPasteboardWriting>)tableView:(NSTableView *)tableView pasteboardWriterForRow:(NSInteger)row
{
const id<VLCMediaLibraryItemProtocol> libraryItem = [self libraryItemAtRow:row forTableView:tableView];
const id<VLCMediaLibraryItemProtocol> libraryItem =
[self libraryItemAtRow:row forTableView:tableView];
return [NSPasteboardItem pasteboardItemWithLibraryItem:libraryItem];
}
- (id<VLCMediaLibraryItemProtocol>)libraryItemAtRow:(NSInteger)row
forTableView:(NSTableView *)tableView
{
if (row < 0 || row >= self.tracks.count) {
if (row < 0 || row >= self.internalMediaItems.count) {
return nil;
}
return self.tracks[row];
return self.internalMediaItems[row];
}
- (NSInteger)rowForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem
......@@ -97,17 +92,9 @@ const CGFloat VLCLibraryTracksRowHeight = 40.;
return NSNotFound;
}
NSArray<id<VLCMediaLibraryItemProtocol>> * const libraryItems = self.tracks;
const NSUInteger itemCount = libraryItems.count;
for (NSUInteger i = 0; i < itemCount; ++i) {
const id<VLCMediaLibraryItemProtocol> collectionItem = [libraryItems objectAtIndex:i];
if (collectionItem.libraryID == libraryItem.libraryID) {
return i;
}
}
return NSNotFound;
return [self.internalMediaItems indexOfObjectPassingTest:^BOOL(VLCMediaLibraryMediaItem * const item, NSUInteger index, BOOL * const stop) {
return item.libraryID == libraryItem.libraryID;
}];
}
- (VLCMediaLibraryParentGroupType)currentParentType
......
......@@ -30,6 +30,7 @@ NS_ASSUME_NONNULL_BEGIN
extern NSString * const VLCLibraryModelArtistListReset;
extern NSString * const VLCLibraryModelAlbumListReset;
extern NSString * const VLCLibraryModelGenreListReset;
extern NSString * const VLCLibraryModelPlaylistListReset;
extern NSString * const VLCLibraryModelListOfMonitoredFoldersUpdated;
extern NSString * const VLCLibraryModelMediaItemThumbnailGenerated;
......@@ -47,6 +48,7 @@ extern NSString * const VLCLibraryModelRecentAudioMediaItemDeleted;
extern NSString * const VLCLibraryModelAlbumDeleted;
extern NSString * const VLCLibraryModelArtistDeleted;
extern NSString * const VLCLibraryModelGenreDeleted;
extern NSString * const VLCLibraryModelPlaylistDeleted;
extern NSString * const VLCLibraryModelAudioMediaItemUpdated;
extern NSString * const VLCLibraryModelVideoMediaItemUpdated;
......@@ -55,6 +57,7 @@ extern NSString * const VLCLibraryModelRecentAudioMediaItemUpdated;
extern NSString * const VLCLibraryModelAlbumUpdated;
extern NSString * const VLCLibraryModelArtistUpdated;
extern NSString * const VLCLibraryModelGenreUpdated;
extern NSString * const VLCLibraryModelPlaylistUpdated;
@interface VLCLibraryModel : NSObject
......@@ -79,6 +82,9 @@ extern NSString * const VLCLibraryModelGenreUpdated;
@property (readonly) size_t numberOfVideoMedia;
@property (readonly) NSArray <VLCMediaLibraryMediaItem *> *listOfVideoMedia;
@property (readonly) size_t numberOfPlaylists;
@property (readonly) NSArray <VLCMediaLibraryPlaylist *> *listOfPlaylists;
@property (readwrite) uint32_t recentMediaLimit;
@property (readonly) size_t numberOfRecentMedia;
@property (readonly) NSArray <VLCMediaLibraryMediaItem *> *listOfRecentMedia;
......
......@@ -30,6 +30,7 @@
NSString * const VLCLibraryModelArtistListReset = @"VLCLibraryModelArtistListReset";
NSString * const VLCLibraryModelAlbumListReset = @"VLCLibraryModelAlbumListReset";
NSString * const VLCLibraryModelGenreListReset = @"VLCLibraryModelGenreListReset";
NSString * const VLCLibraryModelPlaylistListReset = @"VLCLibraryModelPlaylistListReset";
NSString * const VLCLibraryModelListOfMonitoredFoldersUpdated = @"VLCLibraryModelListOfMonitoredFoldersUpdated";
NSString * const VLCLibraryModelMediaItemThumbnailGenerated = @"VLCLibraryModelMediaItemThumbnailGenerated";
......@@ -47,6 +48,7 @@ NSString * const VLCLibraryModelRecentAudioMediaItemDeleted = @"VLCLibraryModelR
NSString * const VLCLibraryModelAlbumDeleted = @"VLCLibraryModelAlbumDeleted";
NSString * const VLCLibraryModelArtistDeleted = @"VLCLibraryModelArtistDeleted";
NSString * const VLCLibraryModelGenreDeleted = @"VLCLibraryModelGenreDeleted";
NSString * const VLCLibraryModelPlaylistDeleted = @"VLCLibraryModelPlaylistDeleted";
NSString * const VLCLibraryModelAudioMediaItemUpdated = @"VLCLibraryModelAudioMediaItemUpdated";
NSString * const VLCLibraryModelVideoMediaItemUpdated = @"VLCLibraryModelVideoMediaItemUpdated";
......@@ -55,6 +57,7 @@ NSString * const VLCLibraryModelRecentAudioMediaItemUpdated = @"VLCLibraryModelR
NSString * const VLCLibraryModelAlbumUpdated = @"VLCLibraryModelAlbumUpdated";
NSString * const VLCLibraryModelArtistUpdated = @"VLCLibraryModelArtistUpdated";
NSString * const VLCLibraryModelGenreUpdated = @"VLCLibraryModelGenreUpdated";
NSString * const VLCLibraryModelPlaylistUpdated = @"VLCLibraryModelPlaylistUpdated";
@interface VLCLibraryModel ()
{
......@@ -73,6 +76,7 @@ NSString * const VLCLibraryModelGenreUpdated = @"VLCLibraryModelGenreUpdated";
size_t _initialGenreCount;
size_t _initialShowCount;
size_t _initialGroupCount;
size_t _initialPlaylistCount;
size_t _initialRecentsCount;
size_t _initialRecentAudioCount;
......@@ -80,6 +84,7 @@ NSString * const VLCLibraryModelGenreUpdated = @"VLCLibraryModelGenreUpdated";
dispatch_queue_t _albumCacheModificationQueue;
dispatch_queue_t _artistCacheModificationQueue;
dispatch_queue_t _genreCacheModificationQueue;
dispatch_queue_t _playlistCacheModificationQueue;
}
@property (readwrite, atomic) NSArray *cachedAudioMedia;
......@@ -91,6 +96,7 @@ NSString * const VLCLibraryModelGenreUpdated = @"VLCLibraryModelGenreUpdated";
@property (readwrite, atomic) NSArray *cachedListOfGroups;
@property (readwrite, atomic) NSArray *cachedRecentMedia;
@property (readwrite, atomic) NSArray *cachedRecentAudioMedia;
@property (readwrite, atomic) NSArray *cachedPlaylists;
@property (readwrite, atomic) NSArray *cachedListOfMonitoredFolders;
- (void)resetCachedMediaItemLists;
......@@ -100,15 +106,18 @@ NSString * const VLCLibraryModelGenreUpdated = @"VLCLibraryModelGenreUpdated";
- (void)resetCachedListOfShows;
- (void)resetCachedListOfGroups;
- (void)resetCachedListOfMonitoredFolders;
- (void)resetCachedListOfPlaylists;
- (void)mediaItemThumbnailGenerated:(VLCMediaLibraryMediaItem *)mediaItem;
- (void)handleMediaItemDeletionEvent:(const vlc_ml_event_t * const)p_event;
- (void)handleAlbumDeletionEvent:(const vlc_ml_event_t * const)p_event;
- (void)handleArtistDeletionEvent:(const vlc_ml_event_t * const)p_event;
- (void)handleGenreDeletionEvent:(const vlc_ml_event_t * const)p_event;
- (void)handlePlaylistDeletionEvent:(const vlc_ml_event_t * const)p_event;
- (void)handleMediaItemUpdateEvent:(const vlc_ml_event_t * const)p_event;
- (void)handleAlbumUpdateEvent:(const vlc_ml_event_t * const)p_event;
- (void)handleArtistUpdateEvent:(const vlc_ml_event_t * const)p_event;
- (void)handleGenreUpdateEvent:(const vlc_ml_event_t * const)p_event;
- (void)handlePlaylistUpdateEvent:(const vlc_ml_event_t * const)p_event;
@end
......@@ -175,6 +184,14 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
case VLC_ML_EVENT_GROUP_UPDATED:
case VLC_ML_EVENT_GROUP_DELETED:
[libraryModel resetCachedListOfGroups]; // TODO: Handle each event granularly
case VLC_ML_EVENT_PLAYLIST_ADDED:
[libraryModel resetCachedListOfPlaylists];
break;
case VLC_ML_EVENT_PLAYLIST_UPDATED:
[libraryModel handlePlaylistUpdateEvent:p_event];
break;
case VLC_ML_EVENT_PLAYLIST_DELETED:
[libraryModel handlePlaylistDeletionEvent:p_event];
break;
case VLC_ML_EVENT_FOLDER_ADDED:
case VLC_ML_EVENT_FOLDER_UPDATED:
......@@ -218,6 +235,7 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
_albumCacheModificationQueue = dispatch_queue_create("albumCacheModificationQueue", 0);
_artistCacheModificationQueue = dispatch_queue_create("artistCacheModificationQueue", 0);
_genreCacheModificationQueue = dispatch_queue_create("genreCacheModificationQueue", 0);
_playlistCacheModificationQueue = dispatch_queue_create("playlistCacheModificationQueue", 0);
_defaultNotificationCenter = NSNotificationCenter.defaultCenter;
[_defaultNotificationCenter addObserver:self
......@@ -236,6 +254,8 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
self->_initialGenreCount = vlc_ml_count_genres(self->_p_mediaLibrary, &queryParameters);
self->_initialShowCount = vlc_ml_count_shows(self->_p_mediaLibrary, &queryParameters);
self->_initialGroupCount = vlc_ml_count_groups(self->_p_mediaLibrary, &queryParameters);
self->_initialPlaylistCount =
vlc_ml_count_playlists(self->_p_mediaLibrary, &queryParameters, VLC_ML_PLAYLIST_TYPE_ALL);
queryParameters.i_nbResults = self->_recentMediaLimit;
self->_initialRecentsCount = vlc_ml_count_video_history(self->_p_mediaLibrary, &queryParameters);
......@@ -653,6 +673,53 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
[self resetCachedListOfShows];
}
- (size_t)numberOfPlaylists
{
if (!_cachedPlaylists) {
[self resetCachedListOfPlaylists];
// Return initial count here, otherwise it will return 0 on the first time
return _initialPlaylistCount;
}
return _cachedPlaylists.count;
}
- (NSArray<VLCMediaLibraryPlaylist *> *)listOfPlaylists
{
if (!_cachedPlaylists) {
[self resetCachedListOfPlaylists];
}
return _cachedPlaylists;
}
- (void)resetCachedListOfPlaylists
{
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
const vlc_ml_query_params_t queryParameters = [self queryParams];
vlc_ml_playlist_list_t * const p_playlist_list = vlc_ml_list_playlists(self->_p_mediaLibrary, &queryParameters, VLC_ML_PLAYLIST_TYPE_ALL);
if (p_playlist_list == NULL) {
return;
}
NSMutableArray * const mutableArray = [[NSMutableArray alloc] initWithCapacity:p_playlist_list->i_nb_items];
for (size_t x = 0; x < p_playlist_list->i_nb_items; x++) {
VLCMediaLibraryPlaylist * const playlist = [[VLCMediaLibraryPlaylist alloc] initWithPlaylist:&p_playlist_list->p_items[x]];
if (playlist != nil) {
[mutableArray addObject:playlist];
}
}
vlc_ml_playlist_list_release(p_playlist_list);
dispatch_async(dispatch_get_main_queue(), ^{
self.cachedPlaylists = mutableArray.copy;
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelPlaylistListReset object:self];
});
});
}
- (void)resetCachedListOfMonitoredFolders
{
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
......@@ -1094,4 +1161,62 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
withNotificationName:VLCLibraryModelGenreDeleted];
}
- (void)handlePlaylistUpdateEvent:(const vlc_ml_event_t * const)p_event
{
NSParameterAssert(p_event != NULL);
const int64_t itemId = p_event->modification.i_entity_id;
VLCMediaLibraryPlaylist * const playlist = [VLCMediaLibraryPlaylist playlistForLibraryID:itemId];
if (playlist == nil) {
NSLog(@"Could not find a library playlist with this ID. Can't handle update.");
return;
}
dispatch_async(_mediaItemCacheModificationQueue, ^{
NSMutableArray * const mutablePlaylists = self.cachedPlaylists.mutableCopy;
const NSUInteger playlistIdx = [mutablePlaylists indexOfObjectPassingTest:^BOOL(VLCMediaLibraryPlaylist * const playlist, const NSUInteger idx, BOOL * const stop) {
NSAssert(playlist != nil, @"Cache list should not contain nil playlists");
return playlist.libraryID == itemId;
}];
if (playlistIdx == NSNotFound) {
NSLog(@"Could not handle deletion of playlist with id %lld in model", itemId);
return;
}
dispatch_sync(dispatch_get_main_queue(), ^{
[mutablePlaylists replaceObjectAtIndex:playlistIdx withObject:playlist];
self.cachedPlaylists = mutablePlaylists.copy;
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelPlaylistDeleted object:playlist];
});
});
}
- (void)handlePlaylistDeletionEvent:(const vlc_ml_event_t * const)p_event
{
NSParameterAssert(p_event != NULL);
const int64_t itemId = p_event->modification.i_entity_id;
dispatch_async(_mediaItemCacheModificationQueue, ^{
NSMutableArray * const mutablePlaylists = self.cachedPlaylists.mutableCopy;
const NSUInteger playlistIdx = [mutablePlaylists indexOfObjectPassingTest:^BOOL(VLCMediaLibraryPlaylist * const playlist, const NSUInteger idx, BOOL * const stop) {
NSAssert(playlist != nil, @"Cache list should not contain nil playlists");
return playlist.libraryID == itemId;
}];
if (playlistIdx == NSNotFound) {
NSLog(@"Could not handle deletion of playlist with id %lld in model", itemId);
return;
}
dispatch_sync(dispatch_get_main_queue(), ^{
VLCMediaLibraryPlaylist * const playlist = mutablePlaylists[playlistIdx];
[mutablePlaylists removeObjectAtIndex:playlistIdx];
self.cachedPlaylists = mutablePlaylists.copy;
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelPlaylistDeleted object:playlist];
});
});
}
@end
......@@ -32,7 +32,9 @@ NS_ASSUME_NONNULL_BEGIN
@interface VLCLibraryRepresentedItem : NSObject
@property (readonly) id<VLCMediaLibraryItemProtocol> item;
// Parent media array is lazy loaded
@property (readonly) NSArray<VLCMediaLibraryMediaItem *> *parentMediaArray;
// If unknown, will always default to individual play mode
@property (readonly) VLCMediaLibraryParentGroupType parentType;
@property (readonly) NSInteger itemIndexInParent;
......
......@@ -204,7 +204,8 @@
- (NSArray<VLCMediaLibraryMediaItem *> *)parentMediaArray
{
@synchronized(self) {
if (_parentMediaArray == nil || _parentMediaArray.count == 0) {
if (self.parentType != VLCMediaLibraryParentGroupTypeUnknown &&
(_parentMediaArray == nil || _parentMediaArray.count == 0)) {
_parentMediaArray = [self parentMediaArrayForItem:self.item];
}
......@@ -269,7 +270,7 @@
- (void)playImmediately:(BOOL)playImmediately
{
VLCPlaylistController * const playlistController = VLCMain.sharedInstance.playlistController;
if (playlistController.libraryPlaylistMode) {
if (playlistController.libraryPlaylistMode || self.parentType != VLCMediaLibraryParentGroupTypeUnknown) {
[self playLibraryModeImmediately:playImmediately];
} else {
[self playIndividualModeImmediately:playImmediately];
......
......@@ -37,6 +37,7 @@ typedef NS_ENUM(NSInteger, VLCLibrarySegmentType) {
VLCLibraryAlbumsMusicSubSegment,
VLCLibrarySongsMusicSubSegment,
VLCLibraryGenresMusicSubSegment,
VLCLibraryPlaylistsSegment,
VLCLibraryBrowseSegment,
VLCLibraryBrowseBookmarkedLocationSubSegment,
VLCLibraryStreamsSegment,
......
......@@ -45,6 +45,7 @@ NSString * const VLCLibraryBookmarkedLocationsChanged = @"VLCLibraryBookmarkedLo
[VLCLibrarySegment segmentWithSegmentType:VLCLibraryHomeSegment],
[VLCLibrarySegment segmentWithSegmentType:VLCLibraryVideoSegment],
[VLCLibrarySegment segmentWithSegmentType:VLCLibraryMusicSegment],
[VLCLibrarySegment segmentWithSegmentType:VLCLibraryPlaylistsSegment],
[VLCLibrarySegment segmentWithSegmentType:VLCLibraryBrowseSegment],
[VLCLibrarySegment segmentWithSegmentType:VLCLibraryStreamsSegment],
[VLCLibrarySegment segmentWithSegmentType:VLCLibraryGroupsSegment]
......@@ -189,6 +190,8 @@ NSString * const VLCLibraryBookmarkedLocationsChanged = @"VLCLibraryBookmarkedLo
return _NS("Videos");
case VLCLibraryShowsVideoSubSegment:
return _NS("Shows");
case VLCLibraryPlaylistsSegment:
return _NS("Playlists");
case VLCLibraryBrowseSegment:
return _NS("Browse");
case VLCLibraryBrowseBookmarkedLocationSubSegment:
......@@ -221,6 +224,8 @@ NSString * const VLCLibraryBookmarkedLocationsChanged = @"VLCLibraryBookmarkedLo
case VLCLibraryVideoSegment:
case VLCLibraryShowsVideoSubSegment:
return [NSImage imageNamed:@"sidebar-movie"];
case VLCLibraryPlaylistsSegment:
return [NSImage imageNamed:@"sidebar-music"];
case VLCLibraryBrowseSegment:
case VLCLibraryBrowseBookmarkedLocationSubSegment:
return [NSImage imageNamed:@"NSFolder"];
......@@ -263,6 +268,9 @@ NSString * const VLCLibraryBookmarkedLocationsChanged = @"VLCLibraryBookmarkedLo
case VLCLibraryShowsVideoSubSegment:
return [NSImage imageWithSystemSymbolName:@"tv"
accessibilityDescription:@"Shows icon"];
case VLCLibraryPlaylistsSegment:
return [NSImage imageWithSystemSymbolName:@"music.note.list"
accessibilityDescription:@"Playlists icon"];
case VLCLibraryBrowseSegment:
return [NSImage imageWithSystemSymbolName:@"folder"
accessibilityDescription:@"Browse icon"];
......
......@@ -30,9 +30,10 @@ NS_ASSUME_NONNULL_BEGIN
@class VLCDragDropView;
@class VLCRoundedCornerTextField;
@class VLCInputNodePathControl;
@class VLCLibraryNavigationStack;
@class VLCLibraryAudioViewController;
@class VLCLibraryMediaSourceViewController;
@class VLCLibraryNavigationStack;
@class VLCLibraryPlaylistViewController;
@class VLCLibraryVideoViewController;
@class VLCLibraryHomeViewController;
@class VLCLibraryGroupsViewController;
......@@ -126,6 +127,7 @@ extern const NSUserInterfaceItemIdentifier VLCLibraryWindowIdentifier;
@property (readonly) VLCLibraryVideoViewController *libraryVideoViewController;
@property (readonly) VLCLibraryHomeViewController *libraryHomeViewController;
@property (readonly) VLCLibraryGroupsViewController *libraryGroupsViewController;
@property (readonly) VLCLibraryPlaylistViewController *libraryPlaylistViewController;
@property (readonly) VLCLibrarySortingMenuController *librarySortingMenuController;
@property (readonly) VLCPlaylistController *playlistController;
......