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
  • abdsaber000/vlc
  • falbrechtskirchinger/vlc
405 results
Show changes
Commits on Source (53)
Showing
with 570 additions and 157 deletions
......@@ -78,6 +78,8 @@
5307A6F52967859F001E0C6A /* NSImage+VLCAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 5307A6F42967859F001E0C6A /* NSImage+VLCAdditions.m */; };
5307A6F82969904D001E0C6A /* VLCLibraryMediaSourceViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5307A6F72969904D001E0C6A /* VLCLibraryMediaSourceViewController.m */; };
53088E152AD7802C00C21358 /* VLCLibraryCarouselViewItemView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53088E142AD7802C00C21358 /* VLCLibraryCarouselViewItemView.m */; };
5310AFB12B4FE72700E75F9A /* NSArray+VLCAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 5310AFB02B4FE72700E75F9A /* NSArray+VLCAdditions.m */; };
5310AFB52B53EC4F00E75F9A /* iCarousel.m in Sources */ = {isa = PBXBuildFile; fileRef = 5310AFB32B53EC4E00E75F9A /* iCarousel.m */; };
5317FE04294E3DD3001702F0 /* VLCLibraryCollectionViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5317FE03294E3DD3001702F0 /* VLCLibraryCollectionViewDelegate.m */; };
5325C57D29302E6800B2B63A /* VLCLibraryAudioViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5325C57B29302E6800B2B63A /* VLCLibraryAudioViewController.m */; };
533B5D2C29CF94C6003DE887 /* VLCBookmarksTableViewDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 533B5D2B29CF94C6003DE887 /* VLCBookmarksTableViewDataSource.m */; };
......@@ -87,6 +89,9 @@
5350E4EE2B1B21A700F276CB /* VLCLibraryHomeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5350E4ED2B1B21A700F276CB /* VLCLibraryHomeViewController.m */; };
5352B37329DF29BF0011CE03 /* VLCMainVideoViewControlsBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 5352B37229DF29BF0011CE03 /* VLCMainVideoViewControlsBar.m */; };
5352B37629E149AC0011CE03 /* VLCLibraryWindowPersistentPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 5352B37529E149AC0011CE03 /* VLCLibraryWindowPersistentPreferences.m */; };
535F1BBA2B47ACCE00C78D98 /* VLCLibraryHomeViewVideoContainerViewDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 535F1BB92B47ACCD00C78D98 /* VLCLibraryHomeViewVideoContainerViewDataSource.m */; };
535F1BC02B4892A200C78D98 /* VLCLibraryHomeViewAudioCarouselContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 535F1BBF2B4892A200C78D98 /* VLCLibraryHomeViewAudioCarouselContainerView.m */; };
535F1BC32B4979D300C78D98 /* VLCLibraryHomeViewBaseCarouselContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 535F1BC22B4979D300C78D98 /* VLCLibraryHomeViewBaseCarouselContainerView.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 */; };
......@@ -114,11 +119,10 @@
53A1F1172AB7168000686BAA /* VLCLibraryAllAudioGroupsMediaLibraryItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A1F1162AB7168000686BAA /* VLCLibraryAllAudioGroupsMediaLibraryItem.m */; };
53B40FD72AA878E400C814E4 /* VLCLibraryHeroView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B40FD62AA878E400C814E4 /* VLCLibraryHeroView.m */; };
53B447CA2939823E00857588 /* VLCLibrarySongsTableViewSongPlayingTableCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B447C92939823E00857588 /* VLCLibrarySongsTableViewSongPlayingTableCellView.m */; };
53B447F6293BB47B00857588 /* VLCLibraryVideoCollectionViewContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B447EC293BB47A00857588 /* VLCLibraryVideoCollectionViewContainerView.m */; };
53B447F7293BB47B00857588 /* VLCLibraryVideoContainerViewDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B447ED293BB47A00857588 /* VLCLibraryVideoContainerViewDataSource.m */; };
53B447F8293BB47B00857588 /* VLCLibraryVideoCollectionViewsStackViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B447EF293BB47A00857588 /* VLCLibraryVideoCollectionViewsStackViewController.m */; };
53B447F9293BB47B00857588 /* VLCLibraryVideoDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B447F3293BB47A00857588 /* VLCLibraryVideoDataSource.m */; };
53B447FA293BB47B00857588 /* VLCLibraryVideoGroupDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B447F4293BB47A00857588 /* VLCLibraryVideoGroupDescriptor.m */; };
53C1EF8B2B466B13001AEEF5 /* VLCLibraryHomeViewVideoGridContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53C1EF852B466B13001AEEF5 /* VLCLibraryHomeViewVideoGridContainerView.m */; };
53C1EF8C2B466B13001AEEF5 /* VLCLibraryHomeViewStackViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53C1EF862B466B13001AEEF5 /* VLCLibraryHomeViewStackViewController.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 */; };
......@@ -127,7 +131,7 @@
53ED473C29CBC64200795DB1 /* NSPasteboardItem+VLCAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 53ED473B29CBC64200795DB1 /* NSPasteboardItem+VLCAdditions.m */; };
53F0E92D299B002300491D49 /* VLCInputNodePathControlItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 53F0E92C299B002300491D49 /* VLCInputNodePathControlItem.m */; };
53F0E930299B17DF00491D49 /* VLCInputNodePathControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 53F0E92F299B17DF00491D49 /* VLCInputNodePathControl.m */; };
53F399802AC6D6B400B86241 /* VLCLibraryVideoCarouselViewContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53F3997F2AC6D6B400B86241 /* VLCLibraryVideoCarouselViewContainerView.m */; };
53F399802AC6D6B400B86241 /* VLCLibraryHomeViewVideoCarouselContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 53F3997F2AC6D6B400B86241 /* VLCLibraryHomeViewVideoCarouselContainerView.m */; };
6B0292E61F43256300A50082 /* VLCBottomBarView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B0292E51F43256300A50082 /* VLCBottomBarView.m */; };
6B0AB0F01F1AC8B3003A1B4E /* VLCSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B0AB0ED1F1AC8B3003A1B4E /* VLCSlider.m */; };
6B0AB0F11F1AC8B3003A1B4E /* VLCSliderCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B0AB0EF1F1AC8B3003A1B4E /* VLCSliderCell.m */; };
......@@ -270,6 +274,10 @@
53088E122AD6EADF00C21358 /* VLCLibraryCarouselViewItemView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = VLCLibraryCarouselViewItemView.xib; sourceTree = "<group>"; };
53088E132AD7802C00C21358 /* VLCLibraryCarouselViewItemView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryCarouselViewItemView.h; sourceTree = "<group>"; };
53088E142AD7802C00C21358 /* VLCLibraryCarouselViewItemView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryCarouselViewItemView.m; sourceTree = "<group>"; };
5310AFAF2B4FE72700E75F9A /* NSArray+VLCAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSArray+VLCAdditions.h"; sourceTree = "<group>"; };
5310AFB02B4FE72700E75F9A /* NSArray+VLCAdditions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSArray+VLCAdditions.m"; sourceTree = "<group>"; };
5310AFB32B53EC4E00E75F9A /* iCarousel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iCarousel.m; sourceTree = "<group>"; };
5310AFB42B53EC4E00E75F9A /* iCarousel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iCarousel.h; sourceTree = "<group>"; };
5317FE02294E3DD3001702F0 /* VLCLibraryCollectionViewDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryCollectionViewDelegate.h; sourceTree = "<group>"; };
5317FE03294E3DD3001702F0 /* VLCLibraryCollectionViewDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryCollectionViewDelegate.m; sourceTree = "<group>"; };
5317FE05294E8D1A001702F0 /* VLCLibraryCollectionViewDataSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryCollectionViewDataSource.h; sourceTree = "<group>"; };
......@@ -290,6 +298,12 @@
5352B37229DF29BF0011CE03 /* VLCMainVideoViewControlsBar.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCMainVideoViewControlsBar.m; sourceTree = "<group>"; };
5352B37429E149AC0011CE03 /* VLCLibraryWindowPersistentPreferences.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryWindowPersistentPreferences.h; sourceTree = "<group>"; };
5352B37529E149AC0011CE03 /* VLCLibraryWindowPersistentPreferences.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryWindowPersistentPreferences.m; sourceTree = "<group>"; };
535F1BB82B47ACCD00C78D98 /* VLCLibraryHomeViewVideoContainerViewDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryHomeViewVideoContainerViewDataSource.h; sourceTree = "<group>"; };
535F1BB92B47ACCD00C78D98 /* VLCLibraryHomeViewVideoContainerViewDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryHomeViewVideoContainerViewDataSource.m; sourceTree = "<group>"; };
535F1BBE2B4892A200C78D98 /* VLCLibraryHomeViewAudioCarouselContainerView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryHomeViewAudioCarouselContainerView.h; sourceTree = "<group>"; };
535F1BBF2B4892A200C78D98 /* VLCLibraryHomeViewAudioCarouselContainerView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryHomeViewAudioCarouselContainerView.m; sourceTree = "<group>"; };
535F1BC12B4979D300C78D98 /* VLCLibraryHomeViewBaseCarouselContainerView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryHomeViewBaseCarouselContainerView.h; sourceTree = "<group>"; };
535F1BC22B4979D300C78D98 /* VLCLibraryHomeViewBaseCarouselContainerView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryHomeViewBaseCarouselContainerView.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>"; };
......@@ -351,17 +365,16 @@
53B40FD62AA878E400C814E4 /* VLCLibraryHeroView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryHeroView.m; sourceTree = "<group>"; };
53B447C82939823E00857588 /* VLCLibrarySongsTableViewSongPlayingTableCellView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibrarySongsTableViewSongPlayingTableCellView.h; sourceTree = "<group>"; };
53B447C92939823E00857588 /* VLCLibrarySongsTableViewSongPlayingTableCellView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibrarySongsTableViewSongPlayingTableCellView.m; sourceTree = "<group>"; };
53B447EC293BB47A00857588 /* VLCLibraryVideoCollectionViewContainerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryVideoCollectionViewContainerView.m; sourceTree = "<group>"; };
53B447ED293BB47A00857588 /* VLCLibraryVideoContainerViewDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryVideoContainerViewDataSource.m; sourceTree = "<group>"; };
53B447EE293BB47A00857588 /* VLCLibraryVideoDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryVideoDataSource.h; sourceTree = "<group>"; };
53B447EF293BB47A00857588 /* VLCLibraryVideoCollectionViewsStackViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryVideoCollectionViewsStackViewController.m; sourceTree = "<group>"; };
53B447F0293BB47A00857588 /* VLCLibraryVideoGroupDescriptor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryVideoGroupDescriptor.h; sourceTree = "<group>"; };
53B447F1293BB47A00857588 /* VLCLibraryVideoCollectionViewContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryVideoCollectionViewContainerView.h; sourceTree = "<group>"; };
53B447F2293BB47A00857588 /* VLCLibraryVideoContainerViewDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryVideoContainerViewDataSource.h; sourceTree = "<group>"; };
53B447F3293BB47A00857588 /* VLCLibraryVideoDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryVideoDataSource.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>"; };
53BFB1E02A6A72160065EA7A /* VLCLibraryAudioGroupHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = VLCLibraryAudioGroupHeaderView.xib; sourceTree = "<group>"; };
53C1EF842B466B13001AEEF5 /* VLCLibraryHomeViewContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryHomeViewContainerView.h; sourceTree = "<group>"; };
53C1EF852B466B13001AEEF5 /* VLCLibraryHomeViewVideoGridContainerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryHomeViewVideoGridContainerView.m; sourceTree = "<group>"; };
53C1EF862B466B13001AEEF5 /* VLCLibraryHomeViewStackViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryHomeViewStackViewController.m; sourceTree = "<group>"; };
53C1EF882B466B13001AEEF5 /* VLCLibraryHomeViewVideoGridContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryHomeViewVideoGridContainerView.h; sourceTree = "<group>"; };
53C1EF8A2B466B13001AEEF5 /* VLCLibraryHomeViewStackViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryHomeViewStackViewController.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>"; };
......@@ -379,9 +392,9 @@
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>"; };
53F0E92F299B17DF00491D49 /* VLCInputNodePathControl.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCInputNodePathControl.m; sourceTree = "<group>"; };
53F3997D2AC6D50500B86241 /* VLCLibraryVideoViewContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryVideoViewContainerView.h; sourceTree = "<group>"; };
53F3997E2AC6D67F00B86241 /* VLCLibraryVideoCarouselViewContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryVideoCarouselViewContainerView.h; sourceTree = "<group>"; };
53F3997F2AC6D6B400B86241 /* VLCLibraryVideoCarouselViewContainerView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryVideoCarouselViewContainerView.m; sourceTree = "<group>"; };
53F3997D2AC6D50500B86241 /* VLCLibraryHomeViewVideoContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryHomeViewVideoContainerView.h; sourceTree = "<group>"; };
53F3997E2AC6D67F00B86241 /* VLCLibraryHomeViewVideoCarouselContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCLibraryHomeViewVideoCarouselContainerView.h; sourceTree = "<group>"; };
53F3997F2AC6D6B400B86241 /* VLCLibraryHomeViewVideoCarouselContainerView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryHomeViewVideoCarouselContainerView.m; sourceTree = "<group>"; };
5CCED71014C0D4A90057F8D1 /* VLCExtensionsDialogProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCExtensionsDialogProvider.h; sourceTree = "<group>"; };
5CCED71114C0D4A90057F8D1 /* VLCExtensionsDialogProvider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCExtensionsDialogProvider.m; sourceTree = "<group>"; };
5CCED71214C0D4A90057F8D1 /* VLCExtensionsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCExtensionsManager.h; sourceTree = "<group>"; };
......@@ -1008,6 +1021,7 @@
1C1ED5062204AB7C00811EC0 /* views */ = {
isa = PBXGroup;
children = (
5310AFB22B53EC4E00E75F9A /* iCarousel */,
536283FE291147C500640C15 /* VLCBasicView.h */,
536283FF291147C500640C15 /* VLCBasicView.m */,
6B0292E41F43256300A50082 /* VLCBottomBarView.h */,
......@@ -1176,28 +1190,30 @@
1C1ED5112204B08E00811EC0 /* extensions */ = {
isa = PBXGroup;
children = (
6B4D50A51E7AB52C004479B5 /* NSScreen+VLCAdditions.h */,
6B4D50A61E7AB52C004479B5 /* NSScreen+VLCAdditions.m */,
6B397C4D216C8EB200403ED0 /* NSString+Helpers.h */,
6B397C4E216C8EB200403ED0 /* NSString+Helpers.m */,
7DE7232C22A51F8C00D72616 /* VLCPositionFormatter.h */,
7DE7232D22A51F8D00D72616 /* VLCPositionFormatter.m */,
6B7F1FDD1F07DA920002BDD8 /* VLCHexNumberFormatter.h */,
6B7F1FDE1F07DA920002BDD8 /* VLCHexNumberFormatter.m */,
5310AFAF2B4FE72700E75F9A /* NSArray+VLCAdditions.h */,
5310AFB02B4FE72700E75F9A /* NSArray+VLCAdditions.m */,
7D28E6342275B4820098D30E /* NSColor+VLCAdditions.h */,
7D28E6352275B4820098D30E /* NSColor+VLCAdditions.m */,
7D28E6372275B7340098D30E /* NSFont+VLCAdditions.h */,
7D28E6382275B7340098D30E /* NSFont+VLCAdditions.m */,
7D404ABD2281892C00B28EF4 /* NSView+VLCAdditions.h */,
7D404ABE2281892C00B28EF4 /* NSView+VLCAdditions.m */,
7DF0994D23E71E5B007CA6EE /* NSMenu+VLCAdditions.h */,
7DF0994E23E71E76007CA6EE /* NSMenu+VLCAdditions.m */,
5307A6F32967859F001E0C6A /* NSImage+VLCAdditions.h */,
5307A6F42967859F001E0C6A /* NSImage+VLCAdditions.m */,
7DF0994D23E71E5B007CA6EE /* NSMenu+VLCAdditions.h */,
7DF0994E23E71E76007CA6EE /* NSMenu+VLCAdditions.m */,
53ED473A29CBC64200795DB1 /* NSPasteboardItem+VLCAdditions.h */,
53ED473B29CBC64200795DB1 /* NSPasteboardItem+VLCAdditions.m */,
6B4D50A51E7AB52C004479B5 /* NSScreen+VLCAdditions.h */,
6B4D50A61E7AB52C004479B5 /* NSScreen+VLCAdditions.m */,
6B397C4D216C8EB200403ED0 /* NSString+Helpers.h */,
6B397C4E216C8EB200403ED0 /* NSString+Helpers.m */,
7D404ABD2281892C00B28EF4 /* NSView+VLCAdditions.h */,
7D404ABE2281892C00B28EF4 /* NSView+VLCAdditions.m */,
5387FFF32A15127100A3A70A /* NSWindow+VLCAdditions.h */,
5387FFF42A15127100A3A70A /* NSWindow+VLCAdditions.m */,
6B7F1FDD1F07DA920002BDD8 /* VLCHexNumberFormatter.h */,
6B7F1FDE1F07DA920002BDD8 /* VLCHexNumberFormatter.m */,
7DE7232C22A51F8C00D72616 /* VLCPositionFormatter.h */,
7DE7232D22A51F8D00D72616 /* VLCPositionFormatter.m */,
);
path = extensions;
sourceTree = "<group>";
......@@ -1401,6 +1417,15 @@
path = renderers;
sourceTree = "<group>";
};
5310AFB22B53EC4E00E75F9A /* iCarousel */ = {
isa = PBXGroup;
children = (
5310AFB32B53EC4E00E75F9A /* iCarousel.m */,
5310AFB42B53EC4E00E75F9A /* iCarousel.h */,
);
path = iCarousel;
sourceTree = "<group>";
};
5325C5742930026600B2B63A /* audio-library */ = {
isa = PBXGroup;
children = (
......@@ -1452,8 +1477,22 @@
5350E4EB2B1B210E00F276CB /* home-library */ = {
isa = PBXGroup;
children = (
535F1BBE2B4892A200C78D98 /* VLCLibraryHomeViewAudioCarouselContainerView.h */,
535F1BBF2B4892A200C78D98 /* VLCLibraryHomeViewAudioCarouselContainerView.m */,
535F1BC12B4979D300C78D98 /* VLCLibraryHomeViewBaseCarouselContainerView.h */,
535F1BC22B4979D300C78D98 /* VLCLibraryHomeViewBaseCarouselContainerView.m */,
53C1EF842B466B13001AEEF5 /* VLCLibraryHomeViewContainerView.h */,
5350E4EC2B1B21A700F276CB /* VLCLibraryHomeViewController.h */,
5350E4ED2B1B21A700F276CB /* VLCLibraryHomeViewController.m */,
53C1EF8A2B466B13001AEEF5 /* VLCLibraryHomeViewStackViewController.h */,
53C1EF862B466B13001AEEF5 /* VLCLibraryHomeViewStackViewController.m */,
53F3997D2AC6D50500B86241 /* VLCLibraryHomeViewVideoContainerView.h */,
535F1BB82B47ACCD00C78D98 /* VLCLibraryHomeViewVideoContainerViewDataSource.h */,
535F1BB92B47ACCD00C78D98 /* VLCLibraryHomeViewVideoContainerViewDataSource.m */,
53F3997E2AC6D67F00B86241 /* VLCLibraryHomeViewVideoCarouselContainerView.h */,
53F3997F2AC6D6B400B86241 /* VLCLibraryHomeViewVideoCarouselContainerView.m */,
53C1EF882B466B13001AEEF5 /* VLCLibraryHomeViewVideoGridContainerView.h */,
53C1EF852B466B13001AEEF5 /* VLCLibraryHomeViewVideoGridContainerView.m */,
);
path = "home-library";
sourceTree = "<group>";
......@@ -1463,21 +1502,12 @@
children = (
536EFC37295E521600F4CB13 /* VLCLibraryVideoViewController.h */,
536EFC38295E521600F4CB13 /* VLCLibraryVideoViewController.m */,
53F3997E2AC6D67F00B86241 /* VLCLibraryVideoCarouselViewContainerView.h */,
53F3997F2AC6D6B400B86241 /* VLCLibraryVideoCarouselViewContainerView.m */,
53B447F1293BB47A00857588 /* VLCLibraryVideoCollectionViewContainerView.h */,
53B447EC293BB47A00857588 /* VLCLibraryVideoCollectionViewContainerView.m */,
53B447F2293BB47A00857588 /* VLCLibraryVideoContainerViewDataSource.h */,
53B447ED293BB47A00857588 /* VLCLibraryVideoContainerViewDataSource.m */,
53B447F5293BB47B00857588 /* VLCLibraryVideoCollectionViewsStackViewController.h */,
53B447EF293BB47A00857588 /* VLCLibraryVideoCollectionViewsStackViewController.m */,
53B447F0293BB47A00857588 /* VLCLibraryVideoGroupDescriptor.h */,
53B447F4293BB47A00857588 /* VLCLibraryVideoGroupDescriptor.m */,
53B447EE293BB47A00857588 /* VLCLibraryVideoDataSource.h */,
53B447F3293BB47A00857588 /* VLCLibraryVideoDataSource.m */,
53ED472C29C907C200795DB1 /* VLCLibraryVideoTableViewDelegate.h */,
53ED472D29C907C200795DB1 /* VLCLibraryVideoTableViewDelegate.m */,
53F3997D2AC6D50500B86241 /* VLCLibraryVideoViewContainerView.h */,
);
path = "video-library";
sourceTree = "<group>";
......@@ -1984,6 +2014,7 @@
536283F5291146BC00640C15 /* VLCLibraryCollectionViewSupplementaryDetailView.m in Sources */,
1CCC88F02078A3D500E5626F /* About.xib in Sources */,
7DFBDCA82269E77500B700A5 /* VLCLibraryController.m in Sources */,
535F1BC32B4979D300C78D98 /* VLCLibraryHomeViewBaseCarouselContainerView.m in Sources */,
1CCC88F12078A3D500E5626F /* AddonManager.xib in Sources */,
7DFBDCC1226DC16200B700A5 /* VLCInputItem.m in Sources */,
53088E152AD7802C00C21358 /* VLCLibraryCarouselViewItemView.m in Sources */,
......@@ -2007,6 +2038,7 @@
1CCC88F72078A3D500E5626F /* ConvertAndSave.xib in Sources */,
1CCC88F82078A3D500E5626F /* CoreDialogs.xib in Sources */,
1CCC88FA2078A3D500E5626F /* ErrorPanel.xib in Sources */,
53C1EF8B2B466B13001AEEF5 /* VLCLibraryHomeViewVideoGridContainerView.m in Sources */,
1CCC88FB2078A3D500E5626F /* Help.xib in Sources */,
1CCC88FC2078A3D500E5626F /* LogMessageWindow.xib in Sources */,
1CCC88FD2078A3D500E5626F /* Open.xib in Sources */,
......@@ -2079,6 +2111,7 @@
6B0AB0F01F1AC8B3003A1B4E /* VLCSlider.m in Sources */,
7D28E6362275B4820098D30E /* NSColor+VLCAdditions.m in Sources */,
6BF5C5041EFE66EF008A9C12 /* VLCHUDTableView.m in Sources */,
535F1BBA2B47ACCE00C78D98 /* VLCLibraryHomeViewVideoContainerViewDataSource.m in Sources */,
53B447FA293BB47B00857588 /* VLCLibraryVideoGroupDescriptor.m in Sources */,
6BBB05E01EEFF165003A1019 /* VLCHUDTableCornerView.m in Sources */,
1C31139D1E508C6900D4DD76 /* VLCControlsBarCommon.m in Sources */,
......@@ -2088,6 +2121,7 @@
5352B37629E149AC0011CE03 /* VLCLibraryWindowPersistentPreferences.m in Sources */,
7DBB7639227F3FBC002649E1 /* VLCLibraryCollectionViewSupplementaryElementView.m in Sources */,
1C3113A31E508C6900D4DD76 /* VLCCoreDialogProvider.m in Sources */,
5310AFB52B53EC4F00E75F9A /* iCarousel.m in Sources */,
6B2EFC631F281A0900F3C0EA /* VLCVolumeSliderCell.m in Sources */,
5387FFF52A15127100A3A70A /* NSWindow+VLCAdditions.m in Sources */,
1C3113A71E508C6900D4DD76 /* VLCLogWindowController.m in Sources */,
......@@ -2117,14 +2151,13 @@
6B0292E61F43256300A50082 /* VLCBottomBarView.m in Sources */,
5350E4EE2B1B21A700F276CB /* VLCLibraryHomeViewController.m in Sources */,
1C3113C71E508C6900D4DD76 /* VLCOpenWindowController.m in Sources */,
53B447F8293BB47B00857588 /* VLCLibraryVideoCollectionViewsStackViewController.m in Sources */,
7D0F64062202047900FDB91F /* VLCLibraryCollectionViewItem.m in Sources */,
7D713D322201AE350042BEB7 /* VLCLibraryWindow.m in Sources */,
7D22A8F422BC14F80063ECD2 /* VLCLibrarySortingMenuController.m in Sources */,
1C3113C91E508C6900D4DD76 /* VLCOutput.m in Sources */,
1C1C62011F8260A90052DD4F /* VLCWrappableTextField.m in Sources */,
53B447F6293BB47B00857588 /* VLCLibraryVideoCollectionViewContainerView.m in Sources */,
6BBB05DA1EEFEA29003A1019 /* VLCHUDOutlineView.m in Sources */,
535F1BC02B4892A200C78D98 /* VLCLibraryHomeViewAudioCarouselContainerView.m in Sources */,
7D445D842202524D00263D34 /* VLCPlaylistItem.m in Sources */,
1C3113CF1E508C6900D4DD76 /* prefs_widgets.m in Sources */,
539F114B29E83A4200F13460 /* VLCLibraryTwoPaneSplitViewDelegate.m in Sources */,
......@@ -2138,7 +2171,6 @@
536283F8291146BC00640C15 /* VLCLibrarySongTableCellView.m in Sources */,
1C3113D51E508C6900D4DD76 /* VLCTextfieldPanelController.m in Sources */,
53628403291147C500640C15 /* VLCSubScrollView.m in Sources */,
53B447F7293BB47B00857588 /* VLCLibraryVideoContainerViewDataSource.m in Sources */,
1C3113D71E508C6900D4DD76 /* VLCPopupPanelController.m in Sources */,
7DF0994F23E71E76007CA6EE /* NSMenu+VLCAdditions.m in Sources */,
7D445D8B22032B9200263D34 /* VLCPlaylistTableView.m in Sources */,
......@@ -2146,10 +2178,12 @@
1C3113D91E508C6900D4DD76 /* VLCSimplePrefsController.m in Sources */,
7DFBDCC4226E445500B700A5 /* VLCMediaSourceBaseDataSource.m in Sources */,
6B2EFC601F2819F700F3C0EA /* VLCVolumeSlider.m in Sources */,
53F399802AC6D6B400B86241 /* VLCLibraryVideoCarouselViewContainerView.m in Sources */,
53F399802AC6D6B400B86241 /* VLCLibraryHomeViewVideoCarouselContainerView.m in Sources */,
7DE2F0472282D5D10040DD0A /* VLCLibraryTableCellView.m in Sources */,
53C1EF8C2B466B13001AEEF5 /* VLCLibraryHomeViewStackViewController.m in Sources */,
538A7EDA29A63EE40068AD4F /* VLCFullVideoViewWindow.m in Sources */,
7D2E0EDB20CD204D0033A221 /* VLCWindow.m in Sources */,
5310AFB12B4FE72700E75F9A /* NSArray+VLCAdditions.m in Sources */,
6B4D50A71E7AB52C004479B5 /* NSScreen+VLCAdditions.m in Sources */,
1C3113DD1E508C6900D4DD76 /* VLCTrackSynchronizationWindowController.m in Sources */,
7D0F5A9B2264EB410009C48A /* VLCHotkeysController.m in Sources */,
......
......@@ -59,6 +59,8 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/coreinteraction/VLCHotkeysController.m \
gui/macosx/coreinteraction/VLCVideoFilterHelper.h \
gui/macosx/coreinteraction/VLCVideoFilterHelper.m \
gui/macosx/extensions/NSArray+VLCAdditions.h \
gui/macosx/extensions/NSArray+VLCAdditions.m \
gui/macosx/extensions/NSGradient+VLCAdditions.h \
gui/macosx/extensions/NSGradient+VLCAdditions.m \
gui/macosx/extensions/NSColor+VLCAdditions.h \
......@@ -147,25 +149,30 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/library/VLCLibraryWindowController.m \
gui/macosx/library/VLCLibraryWindowPersistentPreferences.h \
gui/macosx/library/VLCLibraryWindowPersistentPreferences.m \
gui/macosx/library/home-library/VLCLibraryHomeViewAudioCarouselContainerView.h \
gui/macosx/library/home-library/VLCLibraryHomeViewAudioCarouselContainerView.m \
gui/macosx/library/home-library/VLCLibraryHomeViewBaseCarouselContainerView.h \
gui/macosx/library/home-library/VLCLibraryHomeViewBaseCarouselContainerView.m \
gui/macosx/library/home-library/VLCLibraryHomeViewStackViewController.h \
gui/macosx/library/home-library/VLCLibraryHomeViewStackViewController.m \
gui/macosx/library/home-library/VLCLibraryHomeViewContainerView.h \
gui/macosx/library/home-library/VLCLibraryHomeViewController.h \
gui/macosx/library/home-library/VLCLibraryHomeViewController.m \
gui/macosx/library/video-library/VLCLibraryVideoCarouselViewContainerView.h \
gui/macosx/library/video-library/VLCLibraryVideoCarouselViewContainerView.m \
gui/macosx/library/home-library/VLCLibraryHomeViewVideoContainerView.h \
gui/macosx/library/home-library/VLCLibraryHomeViewVideoCarouselContainerView.h \
gui/macosx/library/home-library/VLCLibraryHomeViewVideoCarouselContainerView.m \
gui/macosx/library/home-library/VLCLibraryHomeViewVideoContainerViewDataSource.h \
gui/macosx/library/home-library/VLCLibraryHomeViewVideoContainerViewDataSource.m \
gui/macosx/library/home-library/VLCLibraryHomeViewVideoGridContainerView.h \
gui/macosx/library/home-library/VLCLibraryHomeViewVideoGridContainerView.m \
gui/macosx/library/video-library/VLCLibraryVideoViewController.h \
gui/macosx/library/video-library/VLCLibraryVideoViewController.m \
gui/macosx/library/video-library/VLCLibraryVideoCollectionViewsStackViewController.h \
gui/macosx/library/video-library/VLCLibraryVideoCollectionViewsStackViewController.m \
gui/macosx/library/video-library/VLCLibraryVideoCollectionViewContainerView.h \
gui/macosx/library/video-library/VLCLibraryVideoCollectionViewContainerView.m \
gui/macosx/library/video-library/VLCLibraryVideoContainerViewDataSource.h \
gui/macosx/library/video-library/VLCLibraryVideoContainerViewDataSource.m \
gui/macosx/library/video-library/VLCLibraryVideoGroupDescriptor.h \
gui/macosx/library/video-library/VLCLibraryVideoGroupDescriptor.m \
gui/macosx/library/video-library/VLCLibraryVideoDataSource.h \
gui/macosx/library/video-library/VLCLibraryVideoDataSource.m \
gui/macosx/library/video-library/VLCLibraryVideoTableViewDelegate.h \
gui/macosx/library/video-library/VLCLibraryVideoTableViewDelegate.m \
gui/macosx/library/video-library/VLCLibraryVideoViewContainerView.h \
gui/macosx/library/audio-library/VLCLibraryAlbumTableCellView.h \
gui/macosx/library/audio-library/VLCLibraryAlbumTableCellView.m \
gui/macosx/library/audio-library/VLCLibraryAlbumTracksDataSource.h \
......
/*****************************************************************************
* NSArray+VLCAdditions.h: MacOS X interface module
*****************************************************************************
* Copyright (C) 2024 VLC authors and VideoLAN
*
* 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
* 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 <Foundation/Foundation.h>
#import <vlc_media_library.h>
#import "library/VLCLibraryDataTypes.h"
NS_ASSUME_NONNULL_BEGIN
@interface NSArray (VLCAdditions)
+ (NSArray<VLCMediaLibraryMediaItem *> *)arrayFromVlcMediaList:(vlc_ml_media_list_t *)p_media_list;
@end
NS_ASSUME_NONNULL_END
/*****************************************************************************
* NSArray+VLCAdditions.m: MacOS X interface module
*****************************************************************************
* Copyright (C) 2024 VLC authors and VideoLAN
*
* 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
* 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 "NSArray+VLCAdditions.h"
@implementation NSArray (VLCAdditions)
+ (NSArray<VLCMediaLibraryMediaItem *> *)arrayFromVlcMediaList:(vlc_ml_media_list_t *)p_media_list
{
if (p_media_list == NULL) {
return nil;
}
NSMutableArray * const mutableArray = [[NSMutableArray alloc] initWithCapacity:p_media_list->i_nb_items];
for (size_t x = 0; x < p_media_list->i_nb_items; x++) {
VLCMediaLibraryMediaItem * const mediaItem = [[VLCMediaLibraryMediaItem alloc] initWithMediaItem:&p_media_list->p_items[x]];
if (mediaItem != nil) {
[mutableArray addObject:mediaItem];
}
}
return mutableArray.copy;
}
@end
......@@ -31,6 +31,7 @@ NS_ASSUME_NONNULL_BEGIN
- (id<VLCMediaLibraryItemProtocol>)libraryItemAtIndexPath:(NSIndexPath *)indexPath
forCollectionView:(NSCollectionView *)collectionView;
- (NSIndexPath *)indexPathForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem;
- (void)reloadData;
@end
......
......@@ -30,7 +30,7 @@
#import "library/audio-library/VLCLibraryCollectionViewAlbumSupplementaryDetailView.h"
#import "library/audio-library/VLCLibraryCollectionViewAudioGroupSupplementaryDetailView.h"
#import "library/video-library/VLCLibraryVideoContainerViewDataSource.h"
#import "library/home-library/VLCLibraryHomeViewVideoContainerViewDataSource.h"
#pragma mark - Private data
static const NSUInteger kAnimationSteps = 32;
......@@ -265,9 +265,9 @@ static CVReturn detailViewAnimationCallback(CVDisplayLinkRef displayLink,
} else if ([self.collectionView.dataSource isKindOfClass:[VLCLibraryAudioGroupDataSource class]]) {
[layoutAttributesArray addObject:[self layoutAttributesForSupplementaryViewOfKind:VLCLibraryCollectionViewAlbumSupplementaryDetailViewKind atIndexPath:self.selectedIndexPath]];
} else if ([self.collectionView.dataSource isKindOfClass:[VLCLibraryVideoContainerViewDataSource class]]) {
VLCLibraryVideoContainerViewDataSource *videoDataSource = (VLCLibraryVideoContainerViewDataSource *)self.collectionView.dataSource;
} else if ([self.collectionView.dataSource isKindOfClass:[VLCLibraryHomeViewVideoContainerViewDataSource class]]) {
VLCLibraryHomeViewVideoContainerViewDataSource *videoDataSource = (VLCLibraryHomeViewVideoContainerViewDataSource *)self.collectionView.dataSource;
[layoutAttributesArray addObject:[self layoutAttributesForSupplementaryViewOfKind:VLCLibraryCollectionViewMediaItemSupplementaryDetailViewKind atIndexPath:self.selectedIndexPath]];
}
......
......@@ -51,6 +51,7 @@ typedef NS_ENUM(NSUInteger, VLCMediaLibraryParentGroupType) {
VLCMediaLibraryParentGroupTypePlaylist = VLC_ML_PARENT_PLAYLIST,
// Additional types over vlc_ml_parent_type below
VLCMediaLibraryParentGroupTypeAudioLibrary,
VLCMediaLibraryParentGroupTypeRecentAudios,
// Video library-specific entries.
// Please define these in the order the are expected to be presented
VLCMediaLibraryParentGroupTypeRecentVideos,
......
......@@ -33,19 +33,21 @@ NS_ASSUME_NONNULL_BEGIN
@class VLCMediaLibraryEntryPoint;
@protocol VLCMediaLibraryItemProtocol;
extern NSString * const VLCLibraryModelArtistListUpdated;
extern NSString * const VLCLibraryModelAlbumListUpdated;
extern NSString * const VLCLibraryModelGenreListUpdated;
extern NSString * const VLCLibraryModelArtistListReset;
extern NSString * const VLCLibraryModelAlbumListReset;
extern NSString * const VLCLibraryModelGenreListReset;
extern NSString * const VLCLibraryModelListOfMonitoredFoldersUpdated;
extern NSString * const VLCLibraryModelMediaItemThumbnailGenerated;
extern NSString * const VLCLibraryModelAudioMediaListReset;
extern NSString * const VLCLibraryModelVideoMediaListReset;
extern NSString * const VLCLibraryModelRecentsMediaListReset;
extern NSString * const VLCLibraryModelRecentAudioMediaListReset;
extern NSString * const VLCLibraryModelAudioMediaItemDeleted;
extern NSString * const VLCLibraryModelVideoMediaItemDeleted;
extern NSString * const VLCLibraryModelRecentsMediaItemDeleted;
extern NSString * const VLCLibraryModelRecentAudioMediaItemDeleted;
extern NSString * const VLCLibraryModelAlbumDeleted;
extern NSString * const VLCLibraryModelArtistDeleted;
extern NSString * const VLCLibraryModelGenreDeleted;
......@@ -53,6 +55,7 @@ extern NSString * const VLCLibraryModelGenreDeleted;
extern NSString * const VLCLibraryModelAudioMediaItemUpdated;
extern NSString * const VLCLibraryModelVideoMediaItemUpdated;
extern NSString * const VLCLibraryModelRecentsMediaItemUpdated;
extern NSString * const VLCLibraryModelRecentAudioMediaItemUpdated;
extern NSString * const VLCLibraryModelAlbumUpdated;
extern NSString * const VLCLibraryModelArtistUpdated;
extern NSString * const VLCLibraryModelGenreUpdated;
......@@ -82,6 +85,10 @@ extern NSString * const VLCLibraryModelGenreUpdated;
@property (readonly) size_t numberOfRecentMedia;
@property (readonly) NSArray <VLCMediaLibraryMediaItem *> *listOfRecentMedia;
@property (readwrite) uint32_t recentAudioMediaLimit;
@property (readonly) size_t numberOfRecentAudioMedia;
@property (readonly) NSArray <VLCMediaLibraryMediaItem *> *listOfRecentAudioMedia;
@property (readonly) NSArray <VLCMediaLibraryEntryPoint *> *listOfMonitoredFolders;
@property (readonly) NSDictionary<NSNumber *, NSString *> *albumDict;
......
......@@ -23,21 +23,24 @@
#import "VLCLibraryModel.h"
#import "main/VLCMain.h"
#import "extensions/NSArray+VLCAdditions.h"
#import "extensions/NSString+Helpers.h"
NSString * const VLCLibraryModelArtistListUpdated = @"VLCLibraryModelArtistListUpdated";
NSString * const VLCLibraryModelAlbumListUpdated = @"VLCLibraryModelAlbumListUpdated";
NSString * const VLCLibraryModelGenreListUpdated = @"VLCLibraryModelGenreListUpdated";
NSString * const VLCLibraryModelArtistListReset = @"VLCLibraryModelArtistListReset";
NSString * const VLCLibraryModelAlbumListReset = @"VLCLibraryModelAlbumListReset";
NSString * const VLCLibraryModelGenreListReset = @"VLCLibraryModelGenreListReset";
NSString * const VLCLibraryModelListOfMonitoredFoldersUpdated = @"VLCLibraryModelListOfMonitoredFoldersUpdated";
NSString * const VLCLibraryModelMediaItemThumbnailGenerated = @"VLCLibraryModelMediaItemThumbnailGenerated";
NSString * const VLCLibraryModelAudioMediaListReset = @"VLCLibraryModelAudioMediaListReset";
NSString * const VLCLibraryModelVideoMediaListReset = @"VLCLibraryModelVideoMediaListReset";
NSString * const VLCLibraryModelRecentsMediaListReset = @"VLCLibraryModelRecentsMediaListReset";
NSString * const VLCLibraryModelRecentAudioMediaListReset = @"VLCLibraryModelRecentAudioMediaListReset";
NSString * const VLCLibraryModelAudioMediaItemDeleted = @"VLCLibraryModelAudioMediaItemDeleted";
NSString * const VLCLibraryModelVideoMediaItemDeleted = @"VLCLibraryModelVideoMediaItemDeleted";
NSString * const VLCLibraryModelRecentsMediaItemDeleted = @"VLCLibraryModelRecentsMediaItemDeleted";
NSString * const VLCLibraryModelRecentAudioMediaItemDeleted = @"VLCLibraryModelRecentAudioMediaItemDeleted";
NSString * const VLCLibraryModelAlbumDeleted = @"VLCLibraryModelAlbumDeleted";
NSString * const VLCLibraryModelArtistDeleted = @"VLCLibraryModelArtistDeleted";
NSString * const VLCLibraryModelGenreDeleted = @"VLCLibraryModelGenreDeleted";
......@@ -45,6 +48,7 @@ NSString * const VLCLibraryModelGenreDeleted = @"VLCLibraryModelGenreDeleted";
NSString * const VLCLibraryModelAudioMediaItemUpdated = @"VLCLibraryModelAudioMediaItemUpdated";
NSString * const VLCLibraryModelVideoMediaItemUpdated = @"VLCLibraryModelVideoMediaItemUpdated";
NSString * const VLCLibraryModelRecentsMediaItemUpdated = @"VLCLibraryModelRecentsMediaItemUpdated";
NSString * const VLCLibraryModelRecentAudioMediaItemUpdated = @"VLCLibraryModelRecentAudioMediaItemUpdated";
NSString * const VLCLibraryModelAlbumUpdated = @"VLCLibraryModelAlbumUpdated";
NSString * const VLCLibraryModelArtistUpdated = @"VLCLibraryModelArtistUpdated";
NSString * const VLCLibraryModelGenreUpdated = @"VLCLibraryModelGenreUpdated";
......@@ -66,6 +70,7 @@ NSString * const VLCLibraryModelGenreUpdated = @"VLCLibraryModelGenreUpdated";
size_t _initialArtistCount;
size_t _initialGenreCount;
size_t _initialRecentsCount;
size_t _initialRecentAudioCount;
dispatch_queue_t _mediaItemCacheModificationQueue;
dispatch_queue_t _albumCacheModificationQueue;
......@@ -79,6 +84,7 @@ NSString * const VLCLibraryModelGenreUpdated = @"VLCLibraryModelGenreUpdated";
@property (readwrite, atomic) NSArray *cachedGenres;
@property (readwrite, atomic) NSArray *cachedVideoMedia;
@property (readwrite, atomic) NSArray *cachedRecentMedia;
@property (readwrite, atomic) NSArray *cachedRecentAudioMedia;
@property (readwrite, atomic) NSArray *cachedListOfMonitoredFolders;
- (void)resetCachedMediaItemLists;
......@@ -212,6 +218,7 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
self->_initialArtistCount = vlc_ml_count_artists(self->_p_mediaLibrary, &queryParameters, true);
self->_initialGenreCount = vlc_ml_count_genres(self->_p_mediaLibrary, &queryParameters);
self->_initialRecentsCount = vlc_ml_count_history_by_type(self->_p_mediaLibrary, &((vlc_ml_query_params_t){ .i_nbResults = self->_recentMediaLimit }), VLC_ML_MEDIA_TYPE_VIDEO);
self->_initialRecentAudioCount = vlc_ml_count_history_by_type(self->_p_mediaLibrary, &((vlc_ml_query_params_t){ .i_nbResults = self->_recentMediaLimit }), VLC_ML_MEDIA_TYPE_AUDIO);
});
}
return self;
......@@ -257,21 +264,14 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
{
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
const vlc_ml_query_params_t queryParams = [self queryParams];
vlc_ml_media_list_t *p_media_list = vlc_ml_list_audio_media(self->_p_mediaLibrary, &queryParams);
if (!p_media_list) {
vlc_ml_media_list_t * const p_media_list = vlc_ml_list_audio_media(self->_p_mediaLibrary, &queryParams);
NSArray * const mediaArray = [NSArray arrayFromVlcMediaList:p_media_list];
if (mediaArray == nil) {
return;
}
NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_media_list->i_nb_items];
for (size_t x = 0; x < p_media_list->i_nb_items; x++) {
VLCMediaLibraryMediaItem *mediaItem = [[VLCMediaLibraryMediaItem alloc] initWithMediaItem:&p_media_list->p_items[x]];
if (mediaItem != nil) {
[mutableArray addObject:mediaItem];
}
}
vlc_ml_media_list_release(p_media_list);
dispatch_async(dispatch_get_main_queue(), ^{
self.cachedAudioMedia = [mutableArray copy];
self.cachedAudioMedia = mediaArray;
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelAudioMediaListReset object:self];
});
});
......@@ -318,7 +318,7 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
dispatch_async(dispatch_get_main_queue(), ^{
self.cachedArtists = mutableArtistArray.copy;
self->_artistDict = mutableArtistDict.copy;
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelArtistListUpdated object:self];
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelArtistListReset object:self];
});
});
}
......@@ -361,7 +361,7 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
dispatch_async(dispatch_get_main_queue(), ^{
self.cachedAlbums = mutableAlbumArray.copy;
self->_albumDict = mutableAlbumDict.copy;
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelAlbumListUpdated object:self];
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelAlbumListReset object:self];
});
});
}
......@@ -404,7 +404,7 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
dispatch_async(dispatch_get_main_queue(), ^{
self.cachedGenres = mutableGenreArray.copy;
self->_genreDict = mutableGenreDict.copy;
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelGenreListUpdated object:self];
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelGenreListReset object:self];
});
});
}
......@@ -459,31 +459,35 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
return _cachedVideoMedia;
}
- (void)resetCachedListOfRecentMedia
- (void)getListOfRecentMediaOfType:(vlc_ml_media_type_t)type
withCountLimit:(size_t)countLimit
withCompletion:(void (^)(NSArray *recentMediaArray))completionHandler
{
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
const vlc_ml_query_params_t queryParameters = { .i_nbResults = self->_recentMediaLimit };
const vlc_ml_query_params_t queryParameters = { .i_nbResults = countLimit };
// we don't set the sorting criteria here as they are not applicable to history
// we only show videos for recents
vlc_ml_media_list_t *p_media_list = vlc_ml_list_history_by_type(self->_p_mediaLibrary, &queryParameters, VLC_ML_MEDIA_TYPE_VIDEO);
if (p_media_list == NULL) {
vlc_ml_media_list_t *p_media_list = vlc_ml_list_history_by_type(self->_p_mediaLibrary, &queryParameters, type);
NSArray * const mediaArray = [NSArray arrayFromVlcMediaList:p_media_list];
if (mediaArray == nil) {
return;
}
NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:p_media_list->i_nb_items];
for (size_t x = 0; x < p_media_list->i_nb_items; x++) {
VLCMediaLibraryMediaItem *mediaItem = [[VLCMediaLibraryMediaItem alloc] initWithMediaItem:&p_media_list->p_items[x]];
if (mediaItem != nil) {
[mutableArray addObject:mediaItem];
}
}
vlc_ml_media_list_release(p_media_list);
dispatch_async(dispatch_get_main_queue(), ^{
self.cachedRecentMedia = [mutableArray copy];
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelRecentsMediaListReset object:self];
completionHandler(mediaArray);
});
});
}
- (void)resetCachedListOfRecentMedia
{
[self getListOfRecentMediaOfType:VLC_ML_MEDIA_TYPE_VIDEO
withCountLimit:_recentMediaLimit
withCompletion:^(NSArray * const mediaArray) {
self.cachedRecentMedia = mediaArray;
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelRecentsMediaListReset object:self];
}];
}
- (size_t)numberOfRecentMedia
{
if (!_cachedRecentMedia) {
......@@ -502,9 +506,38 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
return _cachedRecentMedia;
}
- (void)resetCachedListOfRecentAudioMedia
{
[self getListOfRecentMediaOfType:VLC_ML_MEDIA_TYPE_AUDIO
withCountLimit:_recentAudioMediaLimit
withCompletion:^(NSArray * const mediaArray) {
self.cachedRecentAudioMedia = mediaArray;
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelRecentAudioMediaListReset object:self];
}];
}
- (size_t)numberOfRecentAudioMedia
{
if (!_cachedRecentAudioMedia) {
[self resetCachedListOfRecentAudioMedia];
// Return initial count here, otherwise it will return 0 on the first time
return _initialRecentAudioCount;
}
return _cachedRecentAudioMedia.count;
}
- (NSArray<VLCMediaLibraryMediaItem *> *)listOfRecentAudioMedia
{
if (!_cachedRecentAudioMedia) {
[self resetCachedListOfRecentAudioMedia];
}
return _cachedRecentAudioMedia;
}
- (void)resetCachedMediaItemLists
{
[self resetCachedListOfRecentMedia];
[self resetCachedListOfRecentAudioMedia];
[self resetCachedListOfAudioMedia];
[self resetCachedListOfVideoMedia];
}
......@@ -622,10 +655,15 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
_cachedArtists = nil;
_cachedAudioMedia = nil;
_cachedRecentMedia = nil;
_cachedRecentAudioMedia = nil;
[_defaultNotificationCenter postNotificationName:VLCLibraryModelVideoMediaListReset object:self];
[_defaultNotificationCenter postNotificationName:VLCLibraryModelAlbumListReset object:self];
[_defaultNotificationCenter postNotificationName:VLCLibraryModelGenreListReset object:self];
[_defaultNotificationCenter postNotificationName:VLCLibraryModelArtistListReset object:self];
[_defaultNotificationCenter postNotificationName:VLCLibraryModelAudioMediaListReset object:self];
[_defaultNotificationCenter postNotificationName:VLCLibraryModelRecentsMediaListReset object:self];
[_defaultNotificationCenter postNotificationName:VLCLibraryModelRecentAudioMediaListReset object:self];
}
- (void)performActionOnMediaItemInCache:(const int64_t)libraryId action:(void (^)(const NSMutableArray*, const NSUInteger, const NSMutableArray*, const NSUInteger))action
......@@ -637,28 +675,32 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
};
// Recents can contain media items the other two do
NSMutableArray * const recentsMutable = [self.cachedRecentMedia mutableCopy];
NSMutableArray * const recentsMutable = self.cachedRecentMedia.mutableCopy;
const NSUInteger recentsIndex = [recentsMutable indexOfObjectPassingTest:idCheckBlock];
BOOL isInRecents = recentsIndex != NSNotFound;
const BOOL isInRecents = recentsIndex != NSNotFound;
NSMutableArray * const videoMutable = [self.cachedVideoMedia mutableCopy];
NSMutableArray * const videoMutable = self.cachedVideoMedia.mutableCopy;
const NSUInteger videoIndex = [videoMutable indexOfObjectPassingTest:idCheckBlock];
if (videoIndex != NSNotFound) {
dispatch_sync(dispatch_get_main_queue(), ^{
action(videoMutable, videoIndex, recentsMutable, recentsIndex);
self.cachedVideoMedia = [videoMutable copy];
self.cachedRecentMedia = [recentsMutable copy];
self.cachedVideoMedia = videoMutable.copy;
self.cachedRecentMedia = recentsMutable.copy;
});
return;
}
NSMutableArray * const audioMutable = [self.cachedAudioMedia mutableCopy];
NSMutableArray * const recentAudiosMutable = self.cachedRecentAudioMedia.mutableCopy;
const NSUInteger recentAudiosIndex = [recentAudiosMutable indexOfObjectPassingTest:idCheckBlock];
const BOOL isInRecentAudios = recentAudiosIndex != NSNotFound;
NSMutableArray * const audioMutable = self.cachedAudioMedia.mutableCopy;
const NSUInteger audioIndex = [self.cachedAudioMedia indexOfObjectPassingTest:idCheckBlock];
if (audioIndex != NSNotFound) {
dispatch_sync(dispatch_get_main_queue(), ^{
action(audioMutable, audioIndex, recentsMutable, recentsIndex);
self.cachedAudioMedia = [audioMutable copy];
self.cachedRecentMedia = [recentsMutable copy];
action(audioMutable, audioIndex, recentAudiosMutable, recentAudiosIndex);
self.cachedAudioMedia = audioMutable.copy;
self.cachedRecentAudioMedia = recentsMutable.copy;
});
return;
}
......@@ -691,7 +733,17 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
if (recentMediaArray != nil && recentMediaIndex != NSNotFound) {
[cachedMediaArray replaceObjectAtIndex:recentMediaIndex withObject:mediaItem];
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelRecentsMediaItemUpdated object:mediaItem];
switch (mediaItem.mediaType) {
case VLC_ML_MEDIA_TYPE_VIDEO:
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelRecentsMediaItemUpdated object:mediaItem];
break;
case VLC_ML_MEDIA_TYPE_AUDIO:
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelRecentAudioMediaItemUpdated object:mediaItem];
break;
case VLC_ML_MEDIA_TYPE_UNKNOWN:
NSLog(@"Unknown type of media type encountered, don't know what to do in deletion");
break;
}
}
switch (mediaItem.mediaType) {
......@@ -721,13 +773,23 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
return;
}
VLCMediaLibraryMediaItem * mediaItem = cachedMediaArray[cachedMediaIndex];
VLCMediaLibraryMediaItem * const mediaItem = cachedMediaArray[cachedMediaIndex];
// Notify what happened
[cachedMediaArray removeObjectAtIndex:cachedMediaIndex];
if (recentMediaArray != nil && recentMediaIndex != NSNotFound) {
[recentMediaArray removeObjectAtIndex:recentMediaIndex];
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelRecentsMediaItemDeleted object:mediaItem];
switch (mediaItem.mediaType) {
case VLC_ML_MEDIA_TYPE_VIDEO:
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelRecentsMediaItemDeleted object:mediaItem];
break;
case VLC_ML_MEDIA_TYPE_AUDIO:
[self->_defaultNotificationCenter postNotificationName:VLCLibraryModelRecentAudioMediaItemDeleted object:mediaItem];
break;
case VLC_ML_MEDIA_TYPE_UNKNOWN:
NSLog(@"Unknown type of media type encountered, don't know what to do in deletion");
break;
}
}
switch (mediaItem.mediaType) {
......
......@@ -34,7 +34,7 @@ NS_ASSUME_NONNULL_BEGIN
- (NSInteger)rowForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem;
- (id<VLCMediaLibraryItemProtocol>)libraryItemAtRow:(NSInteger)row
forTableView:(NSTableView *)tableView;
forTableView:(nullable NSTableView *)tableView;
@end
......
......@@ -54,8 +54,8 @@ NS_ASSUME_NONNULL_BEGIN
@property (class, readonly) const CGFloat collectionViewItemSpacing;
@property (class, readonly) const NSEdgeInsets collectionViewSectionInsets;
@property (class, readonly) const CGFloat carouselViewItemViewWidth;
@property (class, readonly) const CGFloat carouselViewVideoItemViewHeight;
@property (class, readonly) const CGFloat carouselViewVideoItemViewWidth;
@property (class, readonly) const CGFloat carouselViewItemViewHeight;
@property (class, readonly) const NSEdgeInsets libraryViewScrollViewContentInsets;
@property (class, readonly) const NSEdgeInsets libraryViewScrollViewScrollerInsets;
......
......@@ -149,14 +149,14 @@
return NSMakeSize(itemWidth, itemHeight);
}
+ (const CGFloat)carouselViewItemViewWidth
+ (const CGFloat)carouselViewVideoItemViewWidth
{
return 300;
return self.carouselViewItemViewHeight / 9 * 16;
}
+ (const CGFloat)carouselViewVideoItemViewHeight
+ (const CGFloat)carouselViewItemViewHeight
{
return VLCLibraryUIUnits.carouselViewItemViewWidth / 16 * 9;
return 180;
}
+ (const NSEdgeInsets)libraryViewScrollViewContentInsets
......
......@@ -47,7 +47,6 @@
#import "library/home-library/VLCLibraryHomeViewController.h"
#import "library/video-library/VLCLibraryVideoCollectionViewsStackViewController.h"
#import "library/video-library/VLCLibraryVideoDataSource.h"
#import "library/video-library/VLCLibraryVideoViewController.h"
......
......@@ -25,17 +25,21 @@
#import "library/VLCLibraryTableView.h"
#import "library/VLCLibraryCollectionViewDataSource.h"
#include "views/iCarousel/iCarousel.h"
NS_ASSUME_NONNULL_BEGIN
@class VLCLibraryModel;
@class VLCLibraryAudioGroupDataSource;
@class VLCMediaLibraryAlbum;
typedef NS_ENUM(NSUInteger, VLCAudioLibrarySegment) {
VLCAudioLibraryArtistsSegment = 0,
typedef NS_ENUM(NSInteger, VLCAudioLibrarySegment) {
VLCAudioLibraryUnknownSegment = -1,
VLCAudioLibraryArtistsSegment,
VLCAudioLibraryAlbumsSegment,
VLCAudioLibrarySongsSegment,
VLCAudioLibraryGenresSegment
VLCAudioLibraryGenresSegment,
VLCAudioLibraryRecentsSegment
};
extern NSString * const VLCLibrarySongsTableViewSongPlayingColumnIdentifier;
......@@ -56,13 +60,14 @@ extern NSString * const VLCLibraryYearSortDescriptorKey;
extern NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification;
@interface VLCLibraryAudioDataSource : NSObject <VLCLibraryTableViewDataSource, VLCLibraryCollectionViewDataSource>
@interface VLCLibraryAudioDataSource : NSObject <VLCLibraryTableViewDataSource, VLCLibraryCollectionViewDataSource, iCarouselDataSource>
@property (readwrite, assign) VLCLibraryModel *libraryModel;
@property (readwrite, assign) VLCLibraryAudioGroupDataSource *audioGroupDataSource;
@property (readwrite, assign) NSTableView *collectionSelectionTableView;
@property (readwrite, assign) NSTableView *songsTableView;
@property (readwrite, assign) NSCollectionView *collectionView;
@property (readwrite, assign) iCarousel *carouselView;
@property (readwrite, assign) NSTableView *gridModeListTableView;
@property (nonatomic, readwrite, assign) VLCAudioLibrarySegment audioLibrarySegment;
......
......@@ -25,6 +25,7 @@
#import "main/VLCMain.h"
#import "library/VLCInputItem.h"
#import "library/VLCLibraryCarouselViewItemView.h"
#import "library/VLCLibraryWindow.h"
#import "library/VLCLibraryModel.h"
#import "library/VLCLibraryController.h"
......@@ -35,6 +36,7 @@
#import "library/VLCLibraryCollectionViewFlowLayout.h"
#import "library/VLCLibraryCollectionViewMediaItemSupplementaryDetailView.h"
#import "library/VLCLibraryRepresentedItem.h"
#import "library/VLCLibraryUIUnits.h"
#import "library/audio-library/VLCLibraryAlbumTableCellView.h"
#import "library/audio-library/VLCLibraryAllAudioGroupsMediaLibraryItem.h"
......@@ -43,6 +45,8 @@
#import "library/audio-library/VLCLibraryCollectionViewAudioGroupSupplementaryDetailView.h"
#import "library/audio-library/VLCLibrarySongsTableViewSongPlayingTableCellView.h"
#import "library/home-library/VLCLibraryHomeViewBaseCarouselContainerView.h"
#import "extensions/NSString+Helpers.h"
#import "extensions/NSPasteboardItem+VLCAdditions.h"
......@@ -104,7 +108,7 @@ NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification
[notificationCenter addObserver:self
selector:@selector(libraryModelArtistsReset:)
name:VLCLibraryModelArtistListUpdated
name:VLCLibraryModelArtistListReset
object:nil];
[notificationCenter addObserver:self
selector:@selector(libraryModelArtistUpdated:)
......@@ -118,7 +122,7 @@ NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification
[notificationCenter addObserver:self
selector:@selector(libraryModelAlbumsReset:)
name:VLCLibraryModelAlbumListUpdated
name:VLCLibraryModelAlbumListReset
object:nil];
[notificationCenter addObserver:self
selector:@selector(libraryModelAlbumUpdated:)
......@@ -131,7 +135,7 @@ NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification
[notificationCenter addObserver:self
selector:@selector(libraryModelGenresReset:)
name:VLCLibraryModelGenreListUpdated
name:VLCLibraryModelGenreListReset
object:nil];
[notificationCenter addObserver:self
selector:@selector(libraryModelGenreUpdated:)
......@@ -180,6 +184,8 @@ NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification
switch(_currentParentType) {
case VLCMediaLibraryParentGroupTypeAudioLibrary:
return self.libraryModel.listOfAudioMedia;
case VLCMediaLibraryParentGroupTypeRecentAudios:
return self.libraryModel.listOfRecentAudioMedia;
case VLCMediaLibraryParentGroupTypeAlbum:
return self.libraryModel.listOfAlbums;
case VLCMediaLibraryParentGroupTypeArtist:
......@@ -203,7 +209,8 @@ NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification
- (void)libraryModelAudioMediaItemsReset:(NSNotification * const)aNotification
{
if (self.currentParentType != VLCMediaLibraryParentGroupTypeAudioLibrary) {
if (self.currentParentType != VLCMediaLibraryParentGroupTypeAudioLibrary
|| self.currentParentType != VLCMediaLibraryParentGroupTypeRecentAudios) {
return;
}
......@@ -252,7 +259,8 @@ NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification
- (void)libraryModelAudioMediaItemUpdated:(NSNotification * const)aNotification
{
if (self.currentParentType != VLCMediaLibraryParentGroupTypeAudioLibrary) {
if (self.currentParentType != VLCMediaLibraryParentGroupTypeAudioLibrary
|| self.currentParentType != VLCMediaLibraryParentGroupTypeRecentAudios) {
return;
}
......@@ -301,7 +309,8 @@ NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification
- (void)libraryModelAudioMediaItemDeleted:(NSNotification * const)aNotification
{
if (self.currentParentType != VLCMediaLibraryParentGroupTypeAudioLibrary) {
if (self.currentParentType != VLCMediaLibraryParentGroupTypeAudioLibrary
|| self.currentParentType != VLCMediaLibraryParentGroupTypeRecentAudios) {
return;
}
......@@ -514,6 +523,7 @@ NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification
[self.gridModeListTableView reloadData];
[self.collectionSelectionTableView reloadData];
[self.songsTableView reloadData];
[self.carouselView reloadData];
}];
[NSNotificationCenter.defaultCenter postNotificationName:VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification object:self];
......@@ -551,6 +561,8 @@ NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification
// Don't update gridModeListSelectionCollectionView, let its VLCLibraryAudioGroupDataSource do it.
// Also don't update collectionSelectionTableView, as this will only show artists/genres/albums
[self.carouselView reloadData];
}];
}
......@@ -573,6 +585,8 @@ NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification
[self.songsTableView removeRowsAtIndexes:rowIndexSet withAnimation:NSTableViewAnimationSlideUp];
// Comment in reloadDataForMediaLibraryItem will be informative
[self.carouselView reloadData];
}];
}
......@@ -595,6 +609,9 @@ NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification
case VLCAudioLibrarySongsSegment:
_currentParentType = VLCMediaLibraryParentGroupTypeAudioLibrary;
break;
case VLCAudioLibraryRecentsSegment:
_currentParentType = VLCMediaLibraryParentGroupTypeRecentAudios;
break;
case VLCAudioLibraryGenresSegment:
_currentParentType = VLCMediaLibraryParentGroupTypeGenre;
break;
......@@ -662,6 +679,7 @@ NSString * const VLCLibraryAudioDataSourceDisplayedCollectionChangedNotification
}
if (self.currentParentType == VLCMediaLibraryParentGroupTypeAudioLibrary ||
self.currentParentType == VLCMediaLibraryParentGroupTypeRecentAudios ||
selectedRow < 0 ||
self.displayedCollectionUpdating) {
self.audioGroupDataSource.representedAudioGroup = nil;
......@@ -835,4 +853,32 @@ viewForSupplementaryElementOfKind:(NSCollectionViewSupplementaryElementKind)kind
return [NSIndexPath indexPathForItem:libraryItemRow inSection:0];
}
// pragma mark: iCarouselDataSource methods
- (NSInteger)numberOfItemsInCarousel:(iCarousel *)carousel
{
return self.displayedCollection.count;
}
- (NSView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSInteger)index reusingView:(NSView *)view
{
VLCLibraryCarouselViewItemView *carouselItemView = (VLCLibraryCarouselViewItemView *)view;
if (carouselItemView == nil) {
const NSRect itemFrame = NSMakeRect(0,
0,
VLCLibraryUIUnits.carouselViewItemViewHeight,
VLCLibraryUIUnits.carouselViewItemViewHeight);
carouselItemView = [VLCLibraryCarouselViewItemView fromNibWithOwner:self];
carouselItemView.frame = itemFrame;
}
// TODO: Find a more elegant way to do this
VLCLibraryHomeViewBaseCarouselContainerView * const containerView = (VLCLibraryHomeViewBaseCarouselContainerView *)carousel.superview;
const id<VLCMediaLibraryItemProtocol> libraryItem = [self libraryItemAtRow:index forTableView:nil];
VLCLibraryRepresentedItem * const representedItem = [[VLCLibraryRepresentedItem alloc] initWithItem:libraryItem
parentType:self.currentParentType];
carouselItemView.representedItem = representedItem;
return carouselItemView;
}
@end
......@@ -119,7 +119,7 @@
}
}
- (void)reloadViews
- (void)reloadData
{
[self reloadTableViews];
[self reloadCollectionViews];
......@@ -140,7 +140,7 @@
}
dispatch_async(dispatch_get_main_queue(), ^{
[self reloadViews];
[self reloadData];
});
});
}
......
/*****************************************************************************
* VLCLibraryHomeViewAudioCarouselContainerView.h: MacOS X interface module
*****************************************************************************
* Copyright (C) 2024 VLC authors and VideoLAN
*
* 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
* 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/audio-library/VLCLibraryAudioDataSource.h"
#import "library/home-library/VLCLibraryHomeViewBaseCarouselContainerView.h"
NS_ASSUME_NONNULL_BEGIN
@interface VLCLibraryHomeViewAudioCarouselContainerView : VLCLibraryHomeViewBaseCarouselContainerView
@property (readwrite) VLCAudioLibrarySegment audioLibrarySegment;
@end
NS_ASSUME_NONNULL_END
/*****************************************************************************
* VLCLibraryHomeViewAudioCarouselContainerView.m: MacOS X interface module
*****************************************************************************
* Copyright (C) 2024 VLC authors and VideoLAN
*
* 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
* 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 "VLCLibraryHomeViewAudioCarouselContainerView.h"
#import "extensions/NSString+Helpers.h"
#import "library/VLCLibraryController.h"
#import "library/VLCLibraryModel.h"
#import "library/audio-library/VLCLibraryAudioDataSource.h"
#import "main/VLCMain.h"
@implementation VLCLibraryHomeViewAudioCarouselContainerView
@synthesize dataSource = _dataSource;
- (void)setup
{
[super setup];
[self setupDataSource];
}
- (void)setupDataSource
{
VLCLibraryAudioDataSource * const audioDataSource = [[VLCLibraryAudioDataSource alloc] init];
self.carouselView.dataSource = audioDataSource;
audioDataSource.libraryModel = VLCMain.sharedInstance.libraryController.libraryModel;
audioDataSource.carouselView = self.carouselView;
[audioDataSource setup];
_dataSource = audioDataSource;
}
- (VLCAudioLibrarySegment)audioLibrarySegment
{
return ((VLCLibraryAudioDataSource *)self.dataSource).audioLibrarySegment;
}
- (void)setAudioLibrarySegment:(VLCAudioLibrarySegment)audioLibrarySegment
{
if (audioLibrarySegment == self.audioLibrarySegment) {
return;
}
switch (audioLibrarySegment) {
case VLCAudioLibraryRecentsSegment:
self.titleView.stringValue = _NS("Recent music");
break;
case VLCAudioLibraryArtistsSegment:
self.titleView.stringValue = _NS("Artists");
break;
case VLCAudioLibraryAlbumsSegment:
self.titleView.stringValue = _NS("Albums");
break;
case VLCAudioLibrarySongsSegment:
self.titleView.stringValue = _NS("Songs");
break;
case VLCAudioLibraryGenresSegment:
self.titleView.stringValue = _NS("Genres");
break;
case VLCAudioLibraryUnknownSegment:
default:
self.titleView.stringValue = _NS("Unknown");
break;
}
((VLCLibraryAudioDataSource *)self.dataSource).audioLibrarySegment = audioLibrarySegment;
[self.carouselView reloadData];
}
@end
/*****************************************************************************
* VLCLibraryHomeViewBaseCarouselContainerView.h: MacOS X interface module
*****************************************************************************
* Copyright (C) 2024 VLC authors and VideoLAN
*
* 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
* 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 "VLCLibraryHomeViewContainerView.h"
#import "library/VLCLibraryCollectionViewDataSource.h"
#import "views/iCarousel/iCarousel.h"
NS_ASSUME_NONNULL_BEGIN
@interface VLCLibraryHomeViewBaseCarouselContainerView : NSView<VLCLibraryHomeViewContainerView, iCarouselDelegate>
@property (readonly) NSTextField *titleView;
@property (readonly) iCarousel *carouselView;
@property (readonly) NSObject<iCarouselDelegate> *delegate;
@property (readonly) NSObject<VLCLibraryCollectionViewDataSource, iCarouselDataSource> *dataSource;
// We want the carousel view to be packed tight around the actual items and not have excess space.
// To do this we need to be aware of the carousel view item height so we can resize the view.
// Changing this property DOES NOT affect the actual sie of the carousel view items, though!
// This is decided in the carousel view data sources' method:
// carousel:(iCarousel *)carousel viewForItemAtIndex:(NSInteger)index reusingView:(NSView *)view
@property (readwrite, nonatomic) CGFloat itemHeight;
- (void)setup;
@end
NS_ASSUME_NONNULL_END
/*****************************************************************************
* VLCLibraryVideoCarouselViewContainerView.m: MacOS X interface module
* VLCLibraryHomeViewBaseCarouselContainerView.m: MacOS X interface module
*****************************************************************************
* Copyright (C) 2023 VLC authors and VideoLAN
* Copyright (C) 2024 VLC authors and VideoLAN
*
* Authors: Claudio Cambra <developer@claudiocambra.com>
*
......@@ -20,7 +20,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import "VLCLibraryVideoCarouselViewContainerView.h"
#import "VLCLibraryHomeViewBaseCarouselContainerView.h"
#import "extensions/NSFont+VLCAdditions.h"
#import "extensions/NSString+Helpers.h"
......@@ -29,23 +29,19 @@
#import "library/VLCLibraryCarouselViewItemView.h"
#import "library/VLCLibraryUIUnits.h"
#import "library/video-library/VLCLibraryVideoContainerViewDataSource.h"
#import "views/iCarousel/iCarousel.h"
@interface VLCLibraryVideoCarouselViewContainerView ()
@interface VLCLibraryHomeViewBaseCarouselContainerView ()
{
CGFloat _itemHeight;
}
@property (readonly) NSLayoutConstraint *heightConstraint;
@property (readwrite) VLCLibraryCarouselViewItemView *selectedItemView;
@end
@implementation VLCLibraryVideoCarouselViewContainerView
@implementation VLCLibraryHomeViewBaseCarouselContainerView
@synthesize groupDescriptor = _groupDescriptor;
@synthesize videoGroup = _videoGroup;
@synthesize constraintsWithSuperview = _constraintsWithSuperview;
@synthesize dataSource = _dataSource;
- (instancetype)init
{
......@@ -83,7 +79,6 @@
- (void)setup
{
[self setupView];
[self setupDataSource];
}
- (void)setupView
......@@ -113,38 +108,24 @@
[self.bottomAnchor constraintEqualToAnchor:self.carouselView.bottomAnchor]
]];
const CGFloat viewHeight = self.titleView.frame.size.height +
VLCLibraryUIUnits.largeSpacing * 2 +
VLCLibraryUIUnits.carouselViewVideoItemViewHeight;
NSLayoutConstraint * const heightConstraint = [self.carouselView.heightAnchor constraintEqualToConstant:viewHeight];
heightConstraint.active = YES;
_itemHeight = VLCLibraryUIUnits.carouselViewItemViewHeight;
[self updateCarouselViewHeight];
[self updateCarouselOffset];
}
- (void)setupDataSource
{
_dataSource = [[VLCLibraryVideoContainerViewDataSource alloc] init];
self.dataSource.carouselView = self.carouselView;
[self.dataSource setup];
}
- (void)setGroupDescriptor:(VLCLibraryVideoCollectionViewGroupDescriptor *)groupDescriptor
- (void)updateCarouselViewHeight
{
_groupDescriptor = groupDescriptor;
_videoGroup = groupDescriptor.group;
self.dataSource.groupDescriptor = groupDescriptor;
self.titleView.stringValue = groupDescriptor.name;
}
const CGFloat viewHeight = self.titleView.frame.size.height +
VLCLibraryUIUnits.largeSpacing * 2 +
_itemHeight;
- (void)setVideoGroup:(VLCMediaLibraryParentGroupType)group
{
if (_groupDescriptor.group == group) {
return;
if (self.heightConstraint == nil) {
_heightConstraint = [self.carouselView.heightAnchor constraintEqualToConstant:viewHeight];
self.heightConstraint.active = YES;
} else {
self.heightConstraint.constant = viewHeight;
}
VLCLibraryVideoCollectionViewGroupDescriptor * const descriptor = [[VLCLibraryVideoCollectionViewGroupDescriptor alloc] initWithVLCVideoLibraryGroup:group];
[self setGroupDescriptor:descriptor];
}
- (void)updateCarouselOffset
......@@ -168,7 +149,6 @@
return;
}
const int64_t itemId = libraryItem.libraryID;
NSIndexPath * const itemIndexPath = [self.dataSource indexPathForLibraryItem:libraryItem];
if (itemIndexPath == nil) {
return;
......@@ -178,6 +158,21 @@
[self.carouselView scrollToItemAtIndex:itemIndex animated:YES];
}
- (CGFloat)itemHeight
{
return _itemHeight;
}
- (void)setItemHeight:(CGFloat)itemHeight
{
if (itemHeight == self.itemHeight) {
return;
}
_itemHeight = itemHeight;
[self updateCarouselViewHeight];
}
// pragma mark - iCarousel delegate methods
- (CGFloat)carousel:(iCarousel *)carousel
......