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 (80)
Showing
with 693 additions and 42 deletions
......@@ -98,6 +98,8 @@
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 */; };
5360E9A52C5BE5550046BA8B /* VLCLibraryMasterDetailViewTableViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5360E9A42C5BE5550046BA8B /* VLCLibraryMasterDetailViewTableViewDelegate.m */; };
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 */; };
......@@ -116,6 +118,8 @@
5377B15C2BD12EEE00D660B8 /* QuickLookThumbnailing.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5377B15B2BD12EEE00D660B8 /* QuickLookThumbnailing.framework */; };
5377B15E2BD12F2900D660B8 /* QuickLook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5377B15D2BD12F2900D660B8 /* QuickLook.framework */; };
537976BA2A4319330036827E /* VLCSettingTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 537976B82A4319330036827E /* VLCSettingTextField.m */; };
537BD6862C59216600446ED0 /* VLCLibraryGroupsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 537BD6852C59216600446ED0 /* VLCLibraryGroupsViewController.m */; };
537BD6892C59392300446ED0 /* VLCLibraryGroupsDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 537BD6882C59392300446ED0 /* VLCLibraryGroupsDataSource.m */; };
5387FFF52A15127100A3A70A /* NSWindow+VLCAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 5387FFF42A15127100A3A70A /* NSWindow+VLCAdditions.m */; };
538A7EDA29A63EE40068AD4F /* VLCFullVideoViewWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 538A7ED929A63EE40068AD4F /* VLCFullVideoViewWindow.m */; };
538DC4E32A6B69B50082DECD /* VLCLibraryAudioGroupHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 538DC4E22A6B69B50082DECD /* VLCLibraryAudioGroupHeaderView.m */; };
......@@ -328,6 +332,11 @@
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>"; };
5360E99F2C5BE01F0046BA8B /* VLCLibraryMasterDetailViewTableViewDataSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryMasterDetailViewTableViewDataSource.h; sourceTree = "<group>"; };
5360E9A32C5BE5550046BA8B /* VLCLibraryMasterDetailViewTableViewDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryMasterDetailViewTableViewDelegate.h; sourceTree = "<group>"; };
5360E9A42C5BE5550046BA8B /* VLCLibraryMasterDetailViewTableViewDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryMasterDetailViewTableViewDelegate.m; sourceTree = "<group>"; };
5360E9A62C5CF6270046BA8B /* VLCLibraryAbstractGroupingDataSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryAbstractGroupingDataSource.h; sourceTree = "<group>"; };
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>"; };
......@@ -366,6 +375,10 @@
5377B15D2BD12F2900D660B8 /* QuickLook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLook.framework; path = System/Library/Frameworks/QuickLook.framework; sourceTree = SDKROOT; };
537976B82A4319330036827E /* VLCSettingTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCSettingTextField.m; sourceTree = "<group>"; };
537976B92A4319330036827E /* VLCSettingTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCSettingTextField.h; sourceTree = "<group>"; };
537BD6842C59216600446ED0 /* VLCLibraryGroupsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryGroupsViewController.h; sourceTree = "<group>"; };
537BD6852C59216600446ED0 /* VLCLibraryGroupsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryGroupsViewController.m; sourceTree = "<group>"; };
537BD6872C59392300446ED0 /* VLCLibraryGroupsDataSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryGroupsDataSource.h; sourceTree = "<group>"; };
537BD6882C59392300446ED0 /* VLCLibraryGroupsDataSource.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryGroupsDataSource.m; sourceTree = "<group>"; };
5387FFF32A15127100A3A70A /* NSWindow+VLCAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSWindow+VLCAdditions.h"; sourceTree = "<group>"; };
5387FFF42A15127100A3A70A /* NSWindow+VLCAdditions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSWindow+VLCAdditions.m"; sourceTree = "<group>"; };
538A7ED829A63EE40068AD4F /* VLCFullVideoViewWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCFullVideoViewWindow.h; sourceTree = "<group>"; };
......@@ -1273,6 +1286,7 @@
isa = PBXGroup;
children = (
5325C5742930026600B2B63A /* audio-library */,
537BD6832C59212A00446ED0 /* groups-library */,
5350E4EB2B1B210E00F276CB /* home-library */,
7DFBDCB8226CED3700B700A5 /* media-source */,
53B447EB293BB47A00857588 /* video-library */,
......@@ -1282,6 +1296,8 @@
53F0E92F299B17DF00491D49 /* VLCInputNodePathControl.m */,
53F0E92B299B002300491D49 /* VLCInputNodePathControlItem.h */,
53F0E92C299B002300491D49 /* VLCInputNodePathControlItem.m */,
5360E9A62C5CF6270046BA8B /* VLCLibraryAbstractGroupingDataSource.h */,
5360E9A72C5CF6270046BA8B /* VLCLibraryAbstractGroupingDataSource.m */,
53088E132AD7802C00C21358 /* VLCLibraryCarouselViewItemView.h */,
53088E142AD7802C00C21358 /* VLCLibraryCarouselViewItemView.m */,
5317FE05294E8D1A001702F0 /* VLCLibraryCollectionViewDataSource.h */,
......@@ -1305,6 +1321,9 @@
53B40FD62AA878E400C814E4 /* VLCLibraryHeroView.m */,
7D92AF1F23DDCA8D00D81EA3 /* VLCLibraryImageCache.h */,
7D92AF2023DDCA8D00D81EA3 /* VLCLibraryImageCache.m */,
5360E99F2C5BE01F0046BA8B /* VLCLibraryMasterDetailViewTableViewDataSource.h */,
5360E9A32C5BE5550046BA8B /* VLCLibraryMasterDetailViewTableViewDelegate.h */,
5360E9A42C5BE5550046BA8B /* VLCLibraryMasterDetailViewTableViewDelegate.m */,
7DFBDCAF226A518400B700A5 /* VLCLibraryMenuController.h */,
7DFBDCB0226A518400B700A5 /* VLCLibraryMenuController.m */,
7DFBDCA92269E77F00B700A5 /* VLCLibraryModel.h */,
......@@ -1554,6 +1573,17 @@
path = "home-library";
sourceTree = "<group>";
};
537BD6832C59212A00446ED0 /* groups-library */ = {
isa = PBXGroup;
children = (
537BD6872C59392300446ED0 /* VLCLibraryGroupsDataSource.h */,
537BD6882C59392300446ED0 /* VLCLibraryGroupsDataSource.m */,
537BD6842C59216600446ED0 /* VLCLibraryGroupsViewController.h */,
537BD6852C59216600446ED0 /* VLCLibraryGroupsViewController.m */,
);
path = "groups-library";
sourceTree = "<group>";
};
53B447EB293BB47A00857588 /* video-library */ = {
isa = PBXGroup;
children = (
......@@ -2108,6 +2138,7 @@
1CCC88FC2078A3D500E5626F /* LogMessageWindow.xib in Sources */,
53F020A42A91D4A100E79705 /* VLCLibraryWindowToolbarDelegate.m in Sources */,
1CCC88FD2078A3D500E5626F /* Open.xib in Sources */,
537BD6892C59392300446ED0 /* VLCLibraryGroupsDataSource.m in Sources */,
1CCC88FE2078A3D500E5626F /* PlaylistAccessoryView.xib in Sources */,
1CCC89002078A3D500E5626F /* PopupPanel.xib in Sources */,
5317FE04294E3DD3001702F0 /* VLCLibraryCollectionViewDelegate.m in Sources */,
......@@ -2123,6 +2154,7 @@
534E8E3A29A06325009503F8 /* VLCMainVideoViewController.m in Sources */,
536EFBF5295BCB8300F4CB13 /* VLCLibraryUIUnits.m in Sources */,
1CCC89032078A3D500E5626F /* SimplePreferences.xib in Sources */,
537BD6862C59216600446ED0 /* VLCLibraryGroupsViewController.m in Sources */,
7DE82E7922843781002D341A /* VLCLibraryAlbumTableCellView.m in Sources */,
7D67318622C8F4060000AD40 /* VLCMediaSourceCollectionViewItem.m in Sources */,
536283F0291146BC00640C15 /* VLCLibraryTableView.m in Sources */,
......@@ -2183,6 +2215,7 @@
53D8ED9A2B583AAF00142EAD /* VLCLibraryModelChangeDelegate.m in Sources */,
53B447FA293BB47B00857588 /* VLCLibraryVideoGroupDescriptor.m in Sources */,
6BBB05E01EEFF165003A1019 /* VLCHUDTableCornerView.m in Sources */,
5360E9A82C5CF6270046BA8B /* VLCLibraryAbstractGroupingDataSource.m in Sources */,
1C31139D1E508C6900D4DD76 /* VLCControlsBarCommon.m in Sources */,
7DD2F5C52081B73B007EE187 /* VLCRemoteControlService.m in Sources */,
1C31139F1E508C6900D4DD76 /* VLCMainWindowControlsBar.m in Sources */,
......@@ -2245,6 +2278,7 @@
1C3113D51E508C6900D4DD76 /* VLCTextfieldPanelController.m in Sources */,
53628403291147C500640C15 /* VLCSubScrollView.m in Sources */,
1C3113D71E508C6900D4DD76 /* VLCPopupPanelController.m in Sources */,
5360E9A52C5BE5550046BA8B /* VLCLibraryMasterDetailViewTableViewDelegate.m in Sources */,
7DF0994F23E71E76007CA6EE /* NSMenu+VLCAdditions.m in Sources */,
7D445D8B22032B9200263D34 /* VLCPlaylistTableView.m in Sources */,
536283F3291146BC00640C15 /* VLCLibraryNavigationStack.m in Sources */,
......
......@@ -98,6 +98,8 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/library/VLCInputNodePathControl.m \
gui/macosx/library/VLCInputNodePathControlItem.h \
gui/macosx/library/VLCInputNodePathControlItem.m \
gui/macosx/library/VLCLibraryAbstractGroupingDataSource.h \
gui/macosx/library/VLCLibraryAbstractGroupingDataSource.m \
gui/macosx/library/VLCLibraryCarouselViewItemView.h \
gui/macosx/library/VLCLibraryCarouselViewItemView.m \
gui/macosx/library/VLCLibraryCollectionViewDataSource.h \
......@@ -121,6 +123,9 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/library/VLCLibraryHeroView.m \
gui/macosx/library/VLCLibraryImageCache.h \
gui/macosx/library/VLCLibraryImageCache.m \
gui/macosx/library/VLCLibraryMasterDetailViewTableViewDataSource.h \
gui/macosx/library/VLCLibraryMasterDetailViewTableViewDelegate.h \
gui/macosx/library/VLCLibraryMasterDetailViewTableViewDelegate.m \
gui/macosx/library/VLCLibraryMenuController.h \
gui/macosx/library/VLCLibraryMenuController.m \
gui/macosx/library/VLCLibraryModel.h \
......@@ -167,6 +172,10 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/library/VLCLibraryWindowSplitViewController.m \
gui/macosx/library/VLCLibraryWindowToolbarDelegate.h \
gui/macosx/library/VLCLibraryWindowToolbarDelegate.m \
gui/macosx/library/groups-library/VLCLibraryGroupsDataSource.h \
gui/macosx/library/groups-library/VLCLibraryGroupsDataSource.m \
gui/macosx/library/groups-library/VLCLibraryGroupsViewController.h \
gui/macosx/library/groups-library/VLCLibraryGroupsViewController.m \
gui/macosx/library/home-library/VLCLibraryHomeViewAudioCarouselContainerView.h \
gui/macosx/library/home-library/VLCLibraryHomeViewAudioCarouselContainerView.m \
gui/macosx/library/home-library/VLCLibraryHomeViewBaseCarouselContainerView.h \
......
/*****************************************************************************
* VLCLibraryAbstractGroupingDataSource.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 <Cocoa/Cocoa.h>
#import "library/VLCLibraryCollectionViewDataSource.h"
#import "library/VLCLibraryMasterDetailViewTableViewDataSource.h"
NS_ASSUME_NONNULL_BEGIN
@protocol VLCMediaLibraryItemProtocol;
@interface VLCLibraryAbstractGroupingDataSource : NSObject<VLCLibraryMasterDetailViewTableViewDataSource, VLCLibraryCollectionViewDataSource>
@property (readonly) NSArray<id<VLCMediaLibraryItemProtocol>> *backingArray;
@property (readwrite) NSCollectionView *collectionView;
@property (readwrite) NSTableView *masterTableView;
@property (readwrite) NSTableView *detailTableView;
- (void)reloadData;
@end
NS_ASSUME_NONNULL_END
/*****************************************************************************
* VLCLibraryAbstractGroupingDataSource.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 "VLCLibraryAbstractGroupingDataSource.h"
#import "extensions/NSPasteboardItem+VLCAdditions.h"
#import "library/VLCLibraryCollectionViewFlowLayout.h"
#import "library/VLCLibraryCollectionViewItem.h"
#import "library/VLCLibraryCollectionViewMediaItemSupplementaryDetailView.h"
#import "library/VLCLibraryCollectionViewSupplementaryElementView.h"
#import "library/VLCLibraryDataTypes.h"
#import "library/VLCLibraryRepresentedItem.h"
@implementation VLCLibraryAbstractGroupingDataSource
- (NSArray<id<VLCMediaLibraryItemProtocol>> *)backingArray
{
[self doesNotRecognizeSelector:_cmd];
return nil;
}
- (VLCMediaLibraryParentGroupType)currentParentType
{
[self doesNotRecognizeSelector:_cmd];
return VLCMediaLibraryParentGroupTypeUnknown;
}
- (void)reloadData
{
[(VLCLibraryCollectionViewFlowLayout *)self.collectionView.collectionViewLayout resetLayout];
[self.masterTableView reloadData];
[self.detailTableView reloadData];
[self.collectionView reloadData];
}
- (NSUInteger)indexOfMediaItem:(const NSUInteger)libraryId inArray:(NSArray const *)array
{
return [array indexOfObjectPassingTest:^BOOL(const id<VLCMediaLibraryItemProtocol> findItem,
const NSUInteger idx,
BOOL * const stop) {
NSAssert(findItem != nil, @"Collection should not contain nil items");
return findItem.libraryID == libraryId;
}];
}
#pragma mark - table view data source and delegation
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
if (tableView == self.masterTableView) {
return self.backingArray.count;
}
const NSInteger selectedMasterRow = self.masterTableView.selectedRow;
if (tableView == self.detailTableView && selectedMasterRow > -1) {
return self.backingArray[selectedMasterRow].mediaItems.count;
}
return 0;
}
- (id<NSPasteboardWriting>)tableView:(NSTableView *)tableView pasteboardWriterForRow:(NSInteger)row
{
const id<VLCMediaLibraryItemProtocol> libraryItem = [self libraryItemAtRow:row
forTableView:tableView];
return [NSPasteboardItem pasteboardItemWithLibraryItem:libraryItem];
}
- (id<VLCMediaLibraryItemProtocol>)libraryItemAtRow:(NSInteger)row
forTableView:(NSTableView *)tableView
{
if (tableView == self.masterTableView) {
return self.backingArray[row];
}
const NSInteger selectedMasterRow = self.masterTableView.selectedRow;
if (tableView == self.detailTableView && selectedMasterRow > -1) {
const id<VLCMediaLibraryItemProtocol> item = self.backingArray[selectedMasterRow];
return item.mediaItems[row];
}
return nil;
}
- (NSInteger)rowForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem
{
if (libraryItem == nil) {
return NSNotFound;
}
return [self indexOfMediaItem:libraryItem.libraryID inArray:self.backingArray];
}
# pragma mark - collection view data source and delegation
- (NSInteger)numberOfSectionsInCollectionView:(NSCollectionView *)collectionView
{
return self.backingArray.count;
}
- (NSInteger)collectionView:(NSCollectionView *)collectionView
numberOfItemsInSection:(NSInteger)section
{
return self.backingArray[section].mediaItems.count;
}
- (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView
itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath
{
VLCLibraryCollectionViewItem * const viewItem =
[collectionView makeItemWithIdentifier:VLCLibraryCellIdentifier forIndexPath:indexPath];
const id<VLCMediaLibraryItemProtocol> item =
[self libraryItemAtIndexPath:indexPath forCollectionView:collectionView];
VLCLibraryRepresentedItem * const representedItem =
[[VLCLibraryRepresentedItem alloc] initWithItem:item parentType:self.currentParentType];
viewItem.representedItem = representedItem;
return viewItem;
}
- (NSView *)collectionView:(NSCollectionView *)collectionView
viewForSupplementaryElementOfKind:(NSCollectionViewSupplementaryElementKind)kind
atIndexPath:(NSIndexPath *)indexPath
{
if([kind isEqualToString:NSCollectionElementKindSectionHeader]) {
VLCLibraryCollectionViewSupplementaryElementView * const sectionHeadingView =
[collectionView makeSupplementaryViewOfKind:kind
withIdentifier:VLCLibrarySupplementaryElementViewIdentifier
forIndexPath:indexPath];
const id<VLCMediaLibraryItemProtocol> item = self.backingArray[indexPath.section];
sectionHeadingView.stringValue = item.displayString;
return sectionHeadingView;
} else if ([kind isEqualToString:VLCLibraryCollectionViewMediaItemSupplementaryDetailViewKind]) {
NSString * const viewIdentifier =
VLCLibraryCollectionViewMediaItemSupplementaryDetailViewIdentifier;
VLCLibraryCollectionViewMediaItemSupplementaryDetailView * const mediaItemDetailView =
[collectionView makeSupplementaryViewOfKind:kind
withIdentifier:viewIdentifier
forIndexPath:indexPath];
const id<VLCMediaLibraryItemProtocol> item = [self libraryItemAtIndexPath:indexPath
forCollectionView:collectionView];
VLCLibraryRepresentedItem * const representedItem =
[[VLCLibraryRepresentedItem alloc] initWithItem:item parentType:self.currentParentType];
mediaItemDetailView.representedItem = representedItem;
mediaItemDetailView.selectedItem = [collectionView itemAtIndexPath:indexPath];
return mediaItemDetailView;
}
return nil;
}
- (id<VLCMediaLibraryItemProtocol>)libraryItemAtIndexPath:(NSIndexPath *)indexPath
forCollectionView:(NSCollectionView *)collectionView
{
const id<VLCMediaLibraryItemProtocol> item = self.backingArray[indexPath.section];
return item.mediaItems[indexPath.item];
}
- (NSIndexPath *)indexPathForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem
{
if ([libraryItem isKindOfClass:self.backingArray.firstObject.class]) {
const NSInteger itemIndex = [self indexOfMediaItem:libraryItem.libraryID
inArray:self.backingArray];
return itemIndex != NSNotFound ? [NSIndexPath indexPathForItem:0 inSection:itemIndex] : nil;
}
__block NSInteger itemInternalMediaItemIndex = NSNotFound;
const NSInteger itemIndex =
[self.backingArray indexOfObjectPassingTest:^BOOL(const id<VLCMediaLibraryItemProtocol> item,
const NSUInteger idx,
BOOL * const stop) {
itemInternalMediaItemIndex =
[self indexOfMediaItem:libraryItem.libraryID inArray:item.mediaItems];
return itemInternalMediaItemIndex != NSNotFound;
}];
return itemIndex != NSNotFound
? [NSIndexPath indexPathForItem:itemInternalMediaItemIndex inSection:itemIndex]
: nil;
}
- (NSArray<VLCLibraryRepresentedItem *> *)representedItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
forCollectionView:(NSCollectionView *)collectionView
{
NSMutableArray<VLCLibraryRepresentedItem *> * const representedItems =
[NSMutableArray arrayWithCapacity:indexPaths.count];
for (NSIndexPath * const indexPath in indexPaths) {
const id<VLCMediaLibraryItemProtocol> libraryItem =
[self libraryItemAtIndexPath:indexPath forCollectionView:collectionView];
VLCLibraryRepresentedItem * const representedItem =
[[VLCLibraryRepresentedItem alloc] initWithItem:libraryItem
parentType:self.currentParentType];
[representedItems addObject:representedItem];
}
return representedItems;
}
- (NSString *)supplementaryDetailViewKind
{
return VLCLibraryCollectionViewMediaItemSupplementaryDetailViewKind;
}
@end
......@@ -29,6 +29,8 @@ NS_ASSUME_NONNULL_BEGIN
@protocol VLCLibraryCollectionViewDataSource <NSCollectionViewDataSource>
@property (readonly) NSString *supplementaryDetailViewKind;
- (id<VLCMediaLibraryItemProtocol>)libraryItemAtIndexPath:(NSIndexPath *)indexPath
forCollectionView:(NSCollectionView *)collectionView;
- (NSIndexPath *)indexPathForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem;
......
......@@ -22,18 +22,12 @@
#import "VLCLibraryCollectionViewFlowLayout.h"
#import "library/VLCLibraryCollectionViewDataSource.h"
#import "library/VLCLibraryCollectionViewMediaItemSupplementaryDetailView.h"
#import "library/VLCLibraryUIUnits.h"
#import "library/audio-library/VLCLibraryAudioDataSource.h"
#import "library/audio-library/VLCLibraryAudioGroupDataSource.h"
#import "library/audio-library/VLCLibraryCollectionViewAlbumSupplementaryDetailView.h"
#import "library/home-library/VLCLibraryHomeViewVideoContainerViewDataSource.h"
#import "library/video-library/VLCLibraryShowsDataSource.h"
#import "library/video-library/VLCLibraryVideoDataSource.h"
#pragma mark - Private data
static const NSUInteger kAnimationSteps = 32;
static const NSUInteger kWrapAroundValue = (NSUInteger)-1;
......@@ -262,29 +256,16 @@ static CVReturn detailViewAnimationCallback(CVDisplayLinkRef displayLink,
layoutAttributesArray[i] = attributes;
}
const id<NSCollectionViewDataSource> dataSource = self.collectionView.dataSource;
if ([dataSource isKindOfClass:VLCLibraryAudioDataSource.class]) {
VLCLibraryAudioDataSource * const audioDataSource = (VLCLibraryAudioDataSource *)dataSource;
// Add detail view to the attributes set -- detail view about to be shown
switch(audioDataSource.audioLibrarySegment) {
case VLCAudioLibraryArtistsSegment:
case VLCAudioLibraryGenresSegment:
break;
case VLCAudioLibraryAlbumsSegment:
[layoutAttributesArray addObject:[self layoutAttributesForSupplementaryViewOfKind:VLCLibraryCollectionViewAlbumSupplementaryDetailViewKind atIndexPath:self.selectedIndexPath]];
break;
case VLCAudioLibrarySongsSegment:
default:
[layoutAttributesArray addObject:[self layoutAttributesForSupplementaryViewOfKind:VLCLibraryCollectionViewMediaItemSupplementaryDetailViewKind atIndexPath:self.selectedIndexPath]];
break;
if ([self.collectionView.dataSource conformsToProtocol:@protocol(VLCLibraryCollectionViewDataSource)]) {
id<VLCLibraryCollectionViewDataSource> const libraryDataSource =
(id<VLCLibraryCollectionViewDataSource>)self.collectionView.dataSource;
NSString * const supplementaryDetailViewKind = libraryDataSource.supplementaryDetailViewKind;
if (supplementaryDetailViewKind != nil && supplementaryDetailViewKind.length > 0) {
NSCollectionViewLayoutAttributes * const supplementaryDetailViewLayoutAttributes =
[self layoutAttributesForSupplementaryViewOfKind:supplementaryDetailViewKind
atIndexPath:self.selectedIndexPath];
[layoutAttributesArray addObject:supplementaryDetailViewLayoutAttributes];
}
} else if ([dataSource isKindOfClass:VLCLibraryAudioGroupDataSource.class]) {
[layoutAttributesArray addObject:[self layoutAttributesForSupplementaryViewOfKind:VLCLibraryCollectionViewAlbumSupplementaryDetailViewKind atIndexPath:self.selectedIndexPath]];
} else if ([dataSource isKindOfClass:VLCLibraryHomeViewVideoContainerViewDataSource.class] ||
[dataSource isKindOfClass:VLCLibraryVideoDataSource.class] ||
[dataSource isKindOfClass:VLCLibraryShowsDataSource.class]) {
[layoutAttributesArray addObject:[self layoutAttributesForSupplementaryViewOfKind:VLCLibraryCollectionViewMediaItemSupplementaryDetailViewKind atIndexPath:self.selectedIndexPath]];
}
return layoutAttributesArray;
......
......@@ -230,6 +230,27 @@ typedef NS_ENUM(NSUInteger, VLCMediaLibraryParentGroupType) {
@end
@interface VLCMediaLibraryGroup : VLCAbstractMediaLibraryItem
- (instancetype)initWithGroup:(struct vlc_ml_group_t *)p_group;
@property (readonly) NSString *name;
@property (readonly) NSUInteger numberOfTotalItems;
@property (readonly) NSUInteger numberOfVideoItems;
@property (readonly) NSUInteger numberOfAudioItems;
@property (readonly) NSUInteger numberOfUnknownItems;
@property (readonly) NSUInteger numberOfPresentTotalItems;
@property (readonly) NSUInteger numberOfPresentVideoItems;
@property (readonly) NSUInteger numberOfPresentAudioItems;
@property (readonly) NSUInteger numberOfPresentUnknownItems;
@property (readonly) NSUInteger numberOfSeenItems;
@property (readonly) NSUInteger numberOfPresentSeenItems;
@property (readonly) NSInteger duration; // milliseconds
@property (readonly) NSDate *creationDate;
@property (readonly) NSDate *lastModificationDate;
@end
@interface VLCMediaLibraryMediaItem : NSObject<VLCMediaLibraryItemProtocol>
+ (nullable instancetype)mediaItemForLibraryID:(int64_t)libraryID;
......
......@@ -739,12 +739,75 @@ static NSString *genreArrayDisplayString(NSArray<VLCMediaLibraryGenre *> * const
@end
@interface VLCMediaLibraryMediaItem ()
@interface VLCMediaLibraryGroup ()
@property (readwrite, nullable) NSArray<VLCMediaLibraryMediaItem *> *groupMediaItems;
@end
@implementation VLCMediaLibraryGroup
@synthesize primaryActionableDetailLibraryItem = _primaryActionableDetailLibraryItem;
@synthesize secondaryActionableDetailLibraryItem = _secondaryActionableDetailLibraryItem;
- (instancetype)initWithGroup:(struct vlc_ml_group_t *)p_group
{
NSParameterAssert(p_group != NULL);
self = [super init];
if (self) {
self.libraryID = p_group->i_id;
_name = toNSStr(p_group->psz_name);
_numberOfTotalItems = p_group->i_nb_total_media;
_numberOfVideoItems = p_group->i_nb_video;
_numberOfAudioItems = p_group->i_nb_audio;
_numberOfUnknownItems = p_group->i_nb_unknown;
_numberOfPresentTotalItems = p_group->i_nb_present_media;
_numberOfPresentVideoItems = p_group->i_nb_present_video;
_numberOfPresentAudioItems = p_group->i_nb_present_audio;
_numberOfPresentUnknownItems = p_group->i_nb_present_unknown;
_numberOfSeenItems = p_group->i_nb_seen;
_numberOfPresentSeenItems = p_group->i_nb_present_seen;
_duration = p_group->i_duration;
_creationDate = [NSDate dateWithTimeIntervalSince1970:p_group->i_creation_date];
_lastModificationDate =
[NSDate dateWithTimeIntervalSince1970:p_group->i_last_modification_date];
}
return self;
}
- (NSString *)displayString
{
return self.name.length == 0 ? _NS("Unknown Group") : self.name;
}
- (VLCMediaLibraryMediaItem *)firstMediaItem
{
return self.mediaItems.firstObject;
}
- (NSArray<VLCMediaLibraryMediaItem *> *)mediaItems
{
NSString *_primaryDetailString;
NSString *_secondaryDetailString;
if (self.numberOfTotalItems == 0) {
return @[];
} else if (self.groupMediaItems == nil ||
self.groupMediaItems.count != self.numberOfTotalItems) {
self.groupMediaItems =
fetchMediaItemsForLibraryItem(vlc_ml_list_group_media, self.libraryID);
}
return self.groupMediaItems;
}
- (void)iterateMediaItemsWithBlock:(void (^)(VLCMediaLibraryMediaItem*))mediaItemBlock;
{
for (VLCMediaLibraryMediaItem * const item in self.mediaItems) {
[item iterateMediaItemsWithBlock:mediaItemBlock];
}
}
@end
@interface VLCMediaLibraryMediaItem ()
@property (readwrite, assign) vlc_medialibrary_t *p_mediaLibrary;
@end
......@@ -754,6 +817,8 @@ static NSString *genreArrayDisplayString(NSArray<VLCMediaLibraryGenre *> * const
@synthesize libraryID = _libraryID;
@synthesize smallArtworkGenerated = _smallArtworkGenerated;
@synthesize smallArtworkMRL = _smallArtworkMRL;
@synthesize primaryDetailString = _primaryDetailString;
@synthesize secondaryDetailString = _secondaryDetailString;
@synthesize primaryActionableDetail = _primaryActionableDetail;
@synthesize secondaryActionableDetail = _secondaryActionableDetail;
@synthesize primaryActionableDetailLibraryItem = _primaryActionableDetailLibraryItem;
......
/*****************************************************************************
* VLCLibraryMasterDetailViewTableViewDataSource.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/VLCLibraryTableViewDataSource.h"
NS_ASSUME_NONNULL_BEGIN
@protocol VLCLibraryMasterDetailViewTableViewDataSource <VLCLibraryTableViewDataSource>
@property (readwrite) NSTableView *masterTableView;
@property (readwrite) NSTableView *detailTableView;
@end
NS_ASSUME_NONNULL_END
/*****************************************************************************
* VLCLibraryVideoTableViewDelegate.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/VLCLibraryTableViewDelegate.h"
NS_ASSUME_NONNULL_BEGIN
@interface VLCLibraryMasterDetailViewTableViewDelegate : VLCLibraryTableViewDelegate
@end
NS_ASSUME_NONNULL_END
/*****************************************************************************
* VLCLibraryMasterDetailViewTableViewDelegate.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 "VLCLibraryMasterDetailViewTableViewDelegate.h"
#import "library/VLCLibraryMasterDetailViewTableViewDataSource.h"
@implementation VLCLibraryMasterDetailViewTableViewDelegate
- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
NSParameterAssert(notification);
NSTableView * const tableView = (NSTableView *)notification.object;
NSAssert(tableView, @"Must be a valid table view");
const NSInteger selectedRow = tableView.selectedRow;
if (![tableView.dataSource conformsToProtocol:@protocol(VLCLibraryMasterDetailViewTableViewDataSource)]) {
return;
}
NSObject<VLCLibraryMasterDetailViewTableViewDataSource> * const masterDetailViewDataSource =
(NSObject<VLCLibraryMasterDetailViewTableViewDataSource> *)tableView.dataSource;
if (tableView == masterDetailViewDataSource.masterTableView) {
[masterDetailViewDataSource.detailTableView reloadData];
}
}
@end
......@@ -38,6 +38,7 @@ extern NSString * const VLCLibraryModelVideoMediaListReset;
extern NSString * const VLCLibraryModelRecentsMediaListReset;
extern NSString * const VLCLibraryModelRecentAudioMediaListReset;
extern NSString * const VLCLibraryModelListOfShowsReset;
extern NSString * const VLCLibraryModelListOfGroupsReset;
extern NSString * const VLCLibraryModelAudioMediaItemDeleted;
extern NSString * const VLCLibraryModelVideoMediaItemDeleted;
......@@ -89,6 +90,9 @@ extern NSString * const VLCLibraryModelGenreUpdated;
@property (readonly) size_t numberOfShows;
@property (readonly) NSArray <VLCMediaLibraryShow *> *listOfShows;
@property (readonly) size_t numberOfGroups;
@property (readonly) NSArray <VLCMediaLibraryGroup *> *listOfGroups;
@property (readonly) NSArray <VLCMediaLibraryEntryPoint *> *listOfMonitoredFolders;
@property (readonly) NSDictionary<NSNumber *, NSString *> *albumDict;
......
......@@ -38,6 +38,7 @@ NSString * const VLCLibraryModelVideoMediaListReset = @"VLCLibraryModelVideoMedi
NSString * const VLCLibraryModelRecentsMediaListReset = @"VLCLibraryModelRecentsMediaListReset";
NSString * const VLCLibraryModelRecentAudioMediaListReset = @"VLCLibraryModelRecentAudioMediaListReset";
NSString * const VLCLibraryModelListOfShowsReset = @"VLCLibraryModelListOfShowsReset";
NSString * const VLCLibraryModelListOfGroupsReset = @"VLCLibraryModelListOfGroupsReset";
NSString * const VLCLibraryModelAudioMediaItemDeleted = @"VLCLibraryModelAudioMediaItemDeleted";
NSString * const VLCLibraryModelVideoMediaItemDeleted = @"VLCLibraryModelVideoMediaItemDeleted";
......@@ -71,6 +72,7 @@ NSString * const VLCLibraryModelGenreUpdated = @"VLCLibraryModelGenreUpdated";
size_t _initialArtistCount;
size_t _initialGenreCount;
size_t _initialShowCount;
size_t _initialGroupCount;
size_t _initialRecentsCount;
size_t _initialRecentAudioCount;
......@@ -86,6 +88,7 @@ NSString * const VLCLibraryModelGenreUpdated = @"VLCLibraryModelGenreUpdated";
@property (readwrite, atomic) NSArray *cachedGenres;
@property (readwrite, atomic) NSArray *cachedVideoMedia;
@property (readwrite, atomic) NSArray *cachedListOfShows;
@property (readwrite, atomic) NSArray *cachedListOfGroups;
@property (readwrite, atomic) NSArray *cachedRecentMedia;
@property (readwrite, atomic) NSArray *cachedRecentAudioMedia;
@property (readwrite, atomic) NSArray *cachedListOfMonitoredFolders;
......@@ -95,6 +98,7 @@ NSString * const VLCLibraryModelGenreUpdated = @"VLCLibraryModelGenreUpdated";
- (void)resetCachedListOfAlbums;
- (void)resetCachedListOfGenres;
- (void)resetCachedListOfShows;
- (void)resetCachedListOfGroups;
- (void)resetCachedListOfMonitoredFolders;
- (void)mediaItemThumbnailGenerated:(VLCMediaLibraryMediaItem *)mediaItem;
- (void)handleMediaItemDeletionEvent:(const vlc_ml_event_t * const)p_event;
......@@ -167,6 +171,11 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
case VLC_ML_EVENT_GENRE_DELETED:
[libraryModel handleGenreDeletionEvent:p_event];
break;
case VLC_ML_EVENT_GROUP_ADDED:
case VLC_ML_EVENT_GROUP_UPDATED:
case VLC_ML_EVENT_GROUP_DELETED:
[libraryModel resetCachedListOfGroups]; // TODO: Handle each event granularly
break;
case VLC_ML_EVENT_FOLDER_ADDED:
case VLC_ML_EVENT_FOLDER_UPDATED:
case VLC_ML_EVENT_FOLDER_DELETED:
......@@ -226,6 +235,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->_initialShowCount = vlc_ml_count_shows(self->_p_mediaLibrary, &queryParameters);
self->_initialGroupCount = vlc_ml_count_groups(self->_p_mediaLibrary, &queryParameters);
queryParameters.i_nbResults = self->_recentMediaLimit;
self->_initialRecentsCount = vlc_ml_count_video_history(self->_p_mediaLibrary, &queryParameters);
......@@ -592,6 +602,48 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
return _cachedListOfShows;
}
- (size_t)numberOfGroups
{
if (!_cachedListOfGroups) {
[self resetCachedListOfGroups];
// Return initial count here, otherwise it will return 0 on the first time
return _initialGroupCount;
}
return _cachedListOfGroups.count;
}
- (NSArray<VLCMediaLibraryGroup *> *)listOfGroups
{
if (!_cachedListOfGroups) {
[self resetCachedListOfGroups];
}
return _cachedListOfGroups;
}
- (void)resetCachedListOfGroups
{
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
vlc_ml_group_list_t * const p_group_list = vlc_ml_list_groups(self->_p_mediaLibrary, NULL);
if (p_group_list == NULL) {
return;
}
const size_t itemCount = p_group_list->i_nb_items;
NSMutableArray * const mutableArray = [[NSMutableArray alloc] initWithCapacity:itemCount];
for (size_t x = 0; x < p_group_list->i_nb_items; x++) {
vlc_ml_group_t * const p_vlc_group = &p_group_list->p_items[x];
VLCMediaLibraryGroup * const group = [[VLCMediaLibraryGroup alloc] initWithGroup:p_vlc_group];
if (group) {
[mutableArray addObject:group];
}
}
vlc_ml_group_list_release(p_group_list);
dispatch_async(dispatch_get_main_queue(), ^{
self.cachedListOfGroups = mutableArray.copy;
[self.changeDelegate notifyChange:VLCLibraryModelListOfGroupsReset withObject:self];
});
});
}
- (void)resetCachedMediaItemLists
{
[self resetCachedListOfRecentMedia];
......
......@@ -40,6 +40,8 @@ typedef NS_ENUM(NSInteger, VLCLibrarySegmentType) {
VLCLibraryBrowseSegment,
VLCLibraryBrowseBookmarkedLocationSubSegment,
VLCLibraryStreamsSegment,
VLCLibraryGroupsSegment,
VLCLibraryGroupsGroupSubSegment,
VLCLibraryHighSentinelSegment,
};
......
......@@ -25,11 +25,15 @@
#import "extensions/NSString+Helpers.h"
#import "library/VLCInputItem.h"
#import "library/VLCLibraryController.h"
#import "library/VLCLibraryModel.h"
#import "library/VLCLibrarySegmentBookmarkedLocation.h"
#import "library/media-source/VLCMediaSource.h"
#import "library/media-source/VLCMediaSourceProvider.h"
#import "main/VLCMain.h"
NSString * const VLCLibraryBookmarkedLocationsKey = @"VLCLibraryBookmarkedLocations";
NSString * const VLCLibraryBookmarkedLocationsChanged = @"VLCLibraryBookmarkedLocationsChanged";
......@@ -43,6 +47,7 @@ NSString * const VLCLibraryBookmarkedLocationsChanged = @"VLCLibraryBookmarkedLo
[VLCLibrarySegment segmentWithSegmentType:VLCLibraryMusicSegment],
[VLCLibrarySegment segmentWithSegmentType:VLCLibraryBrowseSegment],
[VLCLibrarySegment segmentWithSegmentType:VLCLibraryStreamsSegment],
[VLCLibrarySegment segmentWithSegmentType:VLCLibraryGroupsSegment]
];
}
......@@ -67,6 +72,8 @@ NSString * const VLCLibraryBookmarkedLocationsChanged = @"VLCLibraryBookmarkedLo
VLCLibrarySegmentBookmarkedLocation * const descriptor =
(VLCLibrarySegmentBookmarkedLocation *)modelObject;
segmentValue = descriptor.segmentType;
} else if ([modelObject isKindOfClass:VLCMediaLibraryGroup.class]) {
segmentValue = VLCLibraryGroupsGroupSubSegment;
}
NSAssert(segmentValue > VLCLibraryLowSentinelSegment &&
......@@ -116,6 +123,25 @@ NSString * const VLCLibraryBookmarkedLocationsChanged = @"VLCLibraryBookmarkedLo
}
return bookmarkedLocationNodes.copy;
} else if (self.segmentType == VLCLibraryGroupsSegment) {
VLCLibraryModel * const libraryModel =
VLCMain.sharedInstance.libraryController.libraryModel;
const NSUInteger groupCount = libraryModel.numberOfGroups;
if (groupCount == 0) {
return nil;
}
NSArray<VLCMediaLibraryGroup *> * const groups = libraryModel.listOfGroups;
NSMutableArray<VLCLibrarySegment *> * const groupNodes =
[NSMutableArray arrayWithCapacity:groupCount];
for (VLCMediaLibraryGroup * const group in groups) {
VLCLibrarySegment * const node =
[VLCLibrarySegment treeNodeWithRepresentedObject:group];
[groupNodes addObject:node];
}
return groupNodes.copy;
}
return nil;
......@@ -166,9 +192,13 @@ NSString * const VLCLibraryBookmarkedLocationsChanged = @"VLCLibraryBookmarkedLo
case VLCLibraryBrowseSegment:
return _NS("Browse");
case VLCLibraryBrowseBookmarkedLocationSubSegment:
NSAssert(true, @"displayStringForType should not be called for this segment type");
NSAssert(NO, @"displayStringForType should not be called for this segment type");
case VLCLibraryStreamsSegment:
return _NS("Streams");
case VLCLibraryGroupsSegment:
return _NS("Groups");
case VLCLibraryGroupsGroupSubSegment:
NSAssert(NO, @"displayStringForType should not be called for this segment type");
case VLCLibraryLowSentinelSegment:
case VLCLibraryHighSentinelSegment:
default:
......@@ -196,6 +226,9 @@ NSString * const VLCLibraryBookmarkedLocationsChanged = @"VLCLibraryBookmarkedLo
return [NSImage imageNamed:@"NSFolder"];
case VLCLibraryStreamsSegment:
return [NSImage imageNamed:@"NSActionTemplate"];
case VLCLibraryGroupsSegment:
case VLCLibraryGroupsGroupSubSegment:
return [NSImage imageNamed:@"NSTouchBarTagIcon"];
default:
NSAssert(true, @"Invalid segment value");
return nil;
......@@ -239,6 +272,12 @@ NSString * const VLCLibraryBookmarkedLocationsChanged = @"VLCLibraryBookmarkedLo
case VLCLibraryStreamsSegment:
return [NSImage imageWithSystemSymbolName:@"antenna.radiowaves.left.and.right"
accessibilityDescription:@"Streams icon"];
case VLCLibraryGroupsSegment:
return [NSImage imageWithSystemSymbolName:@"rectangle.3.group"
accessibilityDescription:@"Groups icon"];
case VLCLibraryGroupsGroupSubSegment:
return [NSImage imageWithSystemSymbolName:@"play.rectangle"
accessibilityDescription:@"Group icon"];
default:
NSAssert(true, @"Invalid segment value");
return nil;
......@@ -267,6 +306,9 @@ NSString * const VLCLibraryBookmarkedLocationsChanged = @"VLCLibraryBookmarkedLo
VLCLibrarySegmentBookmarkedLocation * const descriptor =
(VLCLibrarySegmentBookmarkedLocation *)self.representedObject;
_displayString = descriptor.name;
} else if ([self.representedObject isKindOfClass:VLCMediaLibraryGroup.class]) {
VLCMediaLibraryGroup * const group = (VLCMediaLibraryGroup *)self.representedObject;
_displayString = group.displayString;
} else {
_displayString = [self displayStringForType:_segmentType];
}
......
......@@ -30,6 +30,16 @@
@implementation VLCLibraryTableViewDelegate
- (instancetype)init
{
self = [super init];
if (self) {
self.cellViewIdentifier = @"VLCLibraryTableViewCellIdentifier";
self.cellViewClass = [VLCLibraryTableCellView class];
}
return self;
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
if (![tableView.dataSource conformsToProtocol:@protocol(VLCLibraryTableViewDataSource)]) {
......@@ -47,12 +57,12 @@
}
NSObject<VLCMediaLibraryItemProtocol> * const libraryItem = [vlcDataSource libraryItemAtRow:row forTableView:tableView];
if (libraryItem == nil) {
return nil;
if (libraryItem != nil) {
VLCLibraryRepresentedItem * const representedItem =
[[VLCLibraryRepresentedItem alloc] initWithItem:libraryItem
parentType:vlcDataSource.currentParentType];
[cellView setRepresentedItem:representedItem];
}
VLCLibraryRepresentedItem * const representedItem = [[VLCLibraryRepresentedItem alloc] initWithItem:libraryItem parentType:vlcDataSource.currentParentType];
[cellView setRepresentedItem:representedItem];
return cellView;
}
......
......@@ -35,7 +35,9 @@ NS_ASSUME_NONNULL_BEGIN
@class VLCLibraryMediaSourceViewController;
@class VLCLibraryVideoViewController;
@class VLCLibraryHomeViewController;
@class VLCLibraryGroupsViewController;
@class VLCLibrarySortingMenuController;
@class VLCMediaLibraryGroup;
@class VLCPlaylistController;
@class VLCCustomEmptyLibraryBrowseButton;
@class VLCLibraryWindowSplitViewController;
......@@ -123,6 +125,7 @@ extern const NSUserInterfaceItemIdentifier VLCLibraryWindowIdentifier;
@property (readonly) VLCLibraryMediaSourceViewController *libraryMediaSourceViewController;
@property (readonly) VLCLibraryVideoViewController *libraryVideoViewController;
@property (readonly) VLCLibraryHomeViewController *libraryHomeViewController;
@property (readonly) VLCLibraryGroupsViewController *libraryGroupsViewController;
@property (readonly) VLCLibrarySortingMenuController *librarySortingMenuController;
@property (readonly) VLCPlaylistController *playlistController;
......
......@@ -51,6 +51,8 @@
#import "library/VLCLibraryWindowSplitViewController.h"
#import "library/VLCLibraryWindowToolbarDelegate.h"
#import "library/groups-library/VLCLibraryGroupsViewController.h"
#import "library/home-library/VLCLibraryHomeViewController.h"
#import "library/video-library/VLCLibraryVideoDataSource.h"
......@@ -182,6 +184,7 @@ static void addShadow(NSImageView *__unsafe_unretained imageView)
_libraryVideoViewController = [[VLCLibraryVideoViewController alloc] initWithLibraryWindow:self];
_libraryAudioViewController = [[VLCLibraryAudioViewController alloc] initWithLibraryWindow:self];
_libraryMediaSourceViewController = [[VLCLibraryMediaSourceViewController alloc] initWithLibraryWindow:self];
_libraryGroupsViewController = [[VLCLibraryGroupsViewController alloc] initWithLibraryWindow:self];
[self setViewForSelectedSegment];
}
......@@ -238,6 +241,10 @@ static void addShadow(NSImageView *__unsafe_unretained imageView)
case VLCLibraryStreamsSegment:
_currentSelectedViewModeSegment = preferences.streamLibraryViewMode;
break;
case VLCLibraryGroupsSegment:
case VLCLibraryGroupsGroupSubSegment:
_currentSelectedViewModeSegment = preferences.groupsLibraryViewMode;
break;
default:
break;
}
......@@ -269,6 +276,9 @@ static void addShadow(NSImageView *__unsafe_unretained imageView)
case VLCLibraryStreamsSegment:
[self showMediaSourceLibrary];
break;
case VLCLibraryGroupsSegment:
case VLCLibraryGroupsGroupSubSegment:
[self showGroupsLibrary];
default:
break;
}
......@@ -327,6 +337,10 @@ static void addShadow(NSImageView *__unsafe_unretained imageView)
case VLCLibraryStreamsSegment:
preferences.streamLibraryViewMode = _currentSelectedViewModeSegment;
break;
case VLCLibraryGroupsSegment:
case VLCLibraryGroupsGroupSubSegment:
preferences.groupsLibraryViewMode = _currentSelectedViewModeSegment;
break;
default:
break;
}
......@@ -372,6 +386,12 @@ static void addShadow(NSImageView *__unsafe_unretained imageView)
}
}
- (void)showGroupsLibrary
{
[self.toolbarDelegate layoutForSegment:self.librarySegmentType];
[_libraryGroupsViewController presentGroupsView];
}
- (void)presentAudioLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem
{
[self showAudioLibrary];
......@@ -384,6 +404,12 @@ static void addShadow(NSImageView *__unsafe_unretained imageView)
[self.libraryVideoViewController presentLibraryItem:libraryItem];
}
- (void)presentGroup:(VLCMediaLibraryGroup *)group
{
[self showGroupsLibrary];
[self.libraryGroupsViewController presentGroup:group];
}
- (void)presentLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem
{
const BOOL isAudioGroup = [libraryItem isKindOfClass:VLCMediaLibraryAlbum.class] ||
......@@ -393,6 +419,9 @@ static void addShadow(NSImageView *__unsafe_unretained imageView)
if (isAudioGroup) {
[self presentAudioLibraryItem:libraryItem];
return;
} else if ([libraryItem isKindOfClass:VLCMediaLibraryGroup.class]) {
[self presentGroup:(VLCMediaLibraryGroup *)libraryItem];
return;
}
VLCMediaLibraryMediaItem * const mediaItem = (VLCMediaLibraryMediaItem *)libraryItem;
......
......@@ -22,10 +22,12 @@
#import "VLCLibraryWindowNavigationSidebarViewController.h"
#import "library/VLCLibraryWindow.h"
#import "library/VLCLibraryWindowNavigationSidebarOutlineView.h"
#import "library/VLCLibraryDataTypes.h"
#import "library/VLCLibraryModel.h"
#import "library/VLCLibrarySegment.h"
#import "library/VLCLibrarySegmentBookmarkedLocation.h"
#import "library/VLCLibraryWindow.h"
#import "library/VLCLibraryWindowNavigationSidebarOutlineView.h"
// This needs to match whatever identifier has been set in the library window XIB
static NSString * const VLCLibrarySegmentCellIdentifier = @"VLCLibrarySegmentCellIdentifier";
......@@ -73,12 +75,16 @@ static NSString * const VLCLibrarySegmentCellIdentifier = @"VLCLibrarySegmentCel
NSNotificationCenter * const defaultCenter = NSNotificationCenter.defaultCenter;
[defaultCenter addObserver:self
selector:@selector(bookmarkedLocationsChanged:)
selector:@selector(internalNodesChanged:)
name:VLCLibraryBookmarkedLocationsChanged
object:nil];
[defaultCenter addObserver:self
selector:@selector(internalNodesChanged:)
name:VLCLibraryModelListOfGroupsReset
object:nil];
}
- (void)bookmarkedLocationsChanged:(NSNotification *)notification
- (void)internalNodesChanged:(NSNotification *)notification
{
const VLCLibrarySegmentType currentSegmentType = self.libraryWindow.librarySegmentType;
......@@ -138,6 +144,8 @@ static NSString * const VLCLibrarySegmentCellIdentifier = @"VLCLibrarySegmentCel
} else if (segmentType >= VLCLibraryBrowseSegment &&
segmentType <= VLCLibraryBrowseBookmarkedLocationSubSegment) {
[self.outlineView expandItem:[self nodeForSegmentType:VLCLibraryBrowseSegment]];
} else if (segmentType == VLCLibraryGroupsGroupSubSegment) {
[self.outlineView expandItem:[self nodeForSegmentType:VLCLibraryGroupsSegment]];
}
NSTreeNode * const targetNode = [self nodeForSegmentType:segmentType];
......@@ -194,6 +202,8 @@ static NSString * const VLCLibrarySegmentCellIdentifier = @"VLCLibrarySegmentCel
(VLCLibrarySegmentBookmarkedLocation *)representedObject;
self.libraryWindow.librarySegmentType = bookmarkedLocation.segmentType;
[self.libraryWindow goToLocalFolderMrl:bookmarkedLocation.mrl];
} else if ([representedObject isKindOfClass:VLCMediaLibraryGroup.class]) {
[self.libraryWindow presentLibraryItem:(VLCMediaLibraryGroup *)representedObject];
}
}
......
......@@ -39,6 +39,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (readwrite, nonatomic) VLCLibraryViewModeSegment artistLibraryViewMode;
@property (readwrite, nonatomic) VLCLibraryViewModeSegment browseLibraryViewMode;
@property (readwrite, nonatomic) VLCLibraryViewModeSegment streamLibraryViewMode;
@property (readwrite, nonatomic) VLCLibraryViewModeSegment groupsLibraryViewMode;
@end
......