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 (22)
......@@ -108,6 +108,7 @@
539BA79F298C726200918C36 /* VLCAspectRatioRetainingVideoWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 539BA79E298C726200918C36 /* VLCAspectRatioRetainingVideoWindow.m */; };
539F114B29E83A4200F13460 /* VLCLibraryTwoPaneSplitViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 539F114A29E83A4200F13460 /* VLCLibraryTwoPaneSplitViewDelegate.m */; };
539F116D29F9785C00F13460 /* VLCMainVideoViewAudioMediaDecorativeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 539F116C29F9785C00F13460 /* VLCMainVideoViewAudioMediaDecorativeView.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 /* VLCLibraryVideoCollectionViewContainerViewDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 53B447ED293BB47A00857588 /* VLCLibraryVideoCollectionViewContainerViewDataSource.m */; };
......@@ -331,6 +332,9 @@
539F116A29F9756000F13460 /* VLCMainVideoViewAudioMediaDecorativeView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VLCMainVideoViewAudioMediaDecorativeView.xib; sourceTree = "<group>"; };
539F116B29F9785C00F13460 /* VLCMainVideoViewAudioMediaDecorativeView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCMainVideoViewAudioMediaDecorativeView.h; sourceTree = "<group>"; };
539F116C29F9785C00F13460 /* VLCMainVideoViewAudioMediaDecorativeView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCMainVideoViewAudioMediaDecorativeView.m; sourceTree = "<group>"; };
53B40FD42AA7618000C814E4 /* VLCLibraryHeroView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = VLCLibraryHeroView.xib; sourceTree = "<group>"; };
53B40FD52AA878E400C814E4 /* VLCLibraryHeroView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryHeroView.h; sourceTree = "<group>"; };
53B40FD62AA878E400C814E4 /* VLCLibraryHeroView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryHeroView.m; sourceTree = "<group>"; };
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>"; };
......@@ -1216,6 +1220,8 @@
7DFBDCA72269E77500B700A5 /* VLCLibraryController.m */,
7DFBDCB2226CD00900B700A5 /* VLCLibraryDataTypes.h */,
7DFBDCB3226CD00900B700A5 /* VLCLibraryDataTypes.m */,
53B40FD52AA878E400C814E4 /* VLCLibraryHeroView.h */,
53B40FD62AA878E400C814E4 /* VLCLibraryHeroView.m */,
7D92AF1F23DDCA8D00D81EA3 /* VLCLibraryImageCache.h */,
7D92AF2023DDCA8D00D81EA3 /* VLCLibraryImageCache.m */,
7DFBDCAF226A518400B700A5 /* VLCLibraryMenuController.h */,
......@@ -1843,6 +1849,7 @@
536283FB2911476A00640C15 /* VLCLibraryCollectionViewAudioGroupSupplementaryDetailView.xib */,
7D0F64052202047900FDB91F /* VLCLibraryCollectionViewItem.xib */,
536283FC2911476A00640C15 /* VLCLibraryCollectionViewMediaItemSupplementaryDetailView.xib */,
53B40FD42AA7618000C814E4 /* VLCLibraryHeroView.xib */,
536283FA2911476A00640C15 /* VLCLibrarySongTableCellView.xib */,
7DE2F0482282D7980040DD0A /* VLCLibraryTableCellView.xib */,
7D713D332201BB130042BEB7 /* VLCLibraryWindow.xib */,
......@@ -1942,6 +1949,7 @@
7DFBDCA82269E77500B700A5 /* VLCLibraryController.m in Sources */,
1CCC88F12078A3D500E5626F /* AddonManager.xib in Sources */,
7DFBDCC1226DC16200B700A5 /* VLCInputItem.m in Sources */,
53B40FD72AA878E400C814E4 /* VLCLibraryHeroView.m in Sources */,
537976BA2A4319330036827E /* VLCSettingTextField.m in Sources */,
1CCC88F22078A3D500E5626F /* AudioEffects.xib in Sources */,
1CCC88F32078A3D500E5626F /* VideoEffects.xib in Sources */,
......
......@@ -110,6 +110,8 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/library/VLCLibraryController.m \
gui/macosx/library/VLCLibraryDataTypes.h \
gui/macosx/library/VLCLibraryDataTypes.m \
gui/macosx/library/VLCLibraryHeroView.h \
gui/macosx/library/VLCLibraryHeroView.m \
gui/macosx/library/VLCLibraryImageCache.h \
gui/macosx/library/VLCLibraryImageCache.m \
gui/macosx/library/VLCLibraryMenuController.h \
......@@ -410,6 +412,7 @@ libmacosx_plugin_la_XIB_SOURCES = \
gui/macosx/UI/VLCLibraryCollectionViewAlbumSupplementaryDetailView.xib \
gui/macosx/UI/VLCLibraryCollectionViewAudioGroupSupplementaryDetailView.xib \
gui/macosx/UI/VLCLibraryCollectionViewMediaItemSupplementaryDetailView.xib \
gui/macosx/UI/VLCLibraryHeroView.xib \
gui/macosx/UI/VLCLibrarySongTableCellView.xib \
gui/macosx/UI/VLCMainVideoView.xib \
gui/macosx/UI/VLCMainVideoViewAudioMediaDecorativeView.xib \
......
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21701"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner"/>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView wantsLayer="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LPV-K6-7AE" customClass="VLCLibraryHeroView">
<rect key="frame" x="0.0" y="0.0" width="833" height="357"/>
<subviews>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="qdP-As-qZ0" customClass="VLCImageView">
<rect key="frame" x="0.0" y="0.0" width="833" height="357"/>
<constraints>
<constraint firstAttribute="height" constant="357" id="y7Y-rw-LCu"/>
</constraints>
</customView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="GoN-QI-mru">
<rect key="frame" x="18" y="309" width="155" height="28"/>
<shadow key="shadow" blurRadius="20">
<color key="color" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
</shadow>
<textFieldCell key="cell" lineBreakMode="clipping" title="Last watched" id="Ggw-iA-v2x">
<font key="font" metaFont="systemBold" size="24"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<stackView distribution="fill" orientation="vertical" alignment="leading" spacing="5" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="U3j-Zx-fFf">
<rect key="frame" x="20" y="20" width="250" height="86"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kFW-i6-3hg">
<rect key="frame" x="-2" y="58" width="103" height="28"/>
<shadow key="shadow" blurRadius="20">
<color key="color" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</shadow>
<textFieldCell key="cell" controlSize="large" alignment="left" title="Item title" id="0Cs-Ex-sMn">
<font key="font" metaFont="systemBold" size="24"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="aVp-p4-DHX">
<rect key="frame" x="-2" y="33" width="139" height="20"/>
<shadow key="shadow" blurRadius="20">
<color key="color" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</shadow>
<textFieldCell key="cell" controlSize="large" title="Item detail string" id="P7c-bg-dPX">
<font key="font" metaFont="systemSemibold" size="17"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="1000" verticalCompressionResistancePriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="5zZ-VM-Lb9">
<rect key="frame" x="-3" y="-4" width="256" height="35"/>
<buttonCell key="cell" type="bevel" title=" Resume playing" bezelStyle="regularSquare" image="play.circle.fill" catalog="system" imagePosition="leading" alignment="left" controlSize="large" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="639-6i-zsD">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="systemSemibold" size="17"/>
</buttonCell>
<color key="bezelColor" name="VLCAccentColor"/>
<color key="contentTintColor" name="VLCAccentColor"/>
<connections>
<action selector="playRepresentedItem:" target="LPV-K6-7AE" id="fGM-xi-Y8E"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="5zZ-VM-Lb9" secondAttribute="trailing" id="2eF-oY-rR1"/>
<constraint firstItem="5zZ-VM-Lb9" firstAttribute="leading" secondItem="U3j-Zx-fFf" secondAttribute="leading" id="8fY-R2-NIT"/>
<constraint firstAttribute="bottom" secondItem="5zZ-VM-Lb9" secondAttribute="bottom" id="yDI-oU-4c7"/>
</constraints>
<visibilityPriorities>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
</subviews>
<constraints>
<constraint firstAttribute="width" secondItem="LPV-K6-7AE" secondAttribute="height" multiplier="21:9" id="2HS-zo-d22"/>
<constraint firstItem="qdP-As-qZ0" firstAttribute="top" secondItem="LPV-K6-7AE" secondAttribute="top" id="9aA-Ma-Vvy"/>
<constraint firstItem="U3j-Zx-fFf" firstAttribute="leading" secondItem="LPV-K6-7AE" secondAttribute="leading" constant="20" symbolic="YES" id="A9P-6v-TYB"/>
<constraint firstItem="U3j-Zx-fFf" firstAttribute="width" secondItem="LPV-K6-7AE" secondAttribute="width" multiplier="0.3" id="CkN-iH-QJd"/>
<constraint firstAttribute="bottom" secondItem="U3j-Zx-fFf" secondAttribute="bottom" constant="20" id="GKS-hS-EhI"/>
<constraint firstItem="GoN-QI-mru" firstAttribute="leading" secondItem="LPV-K6-7AE" secondAttribute="leading" constant="20" id="UTF-IS-5xp"/>
<constraint firstItem="U3j-Zx-fFf" firstAttribute="top" relation="greaterThanOrEqual" secondItem="GoN-QI-mru" secondAttribute="bottom" constant="20" id="ZCB-XT-8xc"/>
<constraint firstAttribute="bottom" secondItem="qdP-As-qZ0" secondAttribute="bottom" id="lyx-Ea-nZ1"/>
<constraint firstItem="qdP-As-qZ0" firstAttribute="leading" secondItem="LPV-K6-7AE" secondAttribute="leading" id="p3I-zN-Dxs"/>
<constraint firstItem="GoN-QI-mru" firstAttribute="top" secondItem="LPV-K6-7AE" secondAttribute="top" constant="20" id="xOv-2n-nx5"/>
<constraint firstAttribute="trailing" secondItem="qdP-As-qZ0" secondAttribute="trailing" id="yrR-6i-uoU"/>
</constraints>
<connections>
<outlet property="detailTextField" destination="aVp-p4-DHX" id="OZu-HX-Re8"/>
<outlet property="explanationTextField" destination="GoN-QI-mru" id="ynd-Jb-Vmn"/>
<outlet property="largeImageView" destination="qdP-As-qZ0" id="sD5-PT-ggF"/>
<outlet property="playButton" destination="5zZ-VM-Lb9" id="quv-CP-87R"/>
<outlet property="titleTextField" destination="kFW-i6-3hg" id="TXW-Kf-ZRh"/>
</connections>
<point key="canvasLocation" x="260" y="95"/>
</customView>
</objects>
<resources>
<image name="play.circle.fill" catalog="system" width="15" height="15"/>
<namedColor name="VLCAccentColor">
<color red="1" green="0.37999999523162842" blue="0.039999999105930328" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>
</resources>
</document>
/*****************************************************************************
* VLCLibraryHeroView.h: MacOS X interface module
*****************************************************************************
* Copyright (C) 2023 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>
NS_ASSUME_NONNULL_BEGIN
@class VLCImageView;
@protocol VLCMediaLibraryItemProtocol;
@interface VLCLibraryHeroView : NSView
@property (readwrite) IBOutlet VLCImageView *largeImageView;
@property (readwrite) IBOutlet NSTextField *explanationTextField;
@property (readwrite) IBOutlet NSTextField *titleTextField;
@property (readwrite) IBOutlet NSTextField *detailTextField;
@property (readwrite) IBOutlet NSButton *playButton;
@property (readwrite, nonatomic) id<VLCMediaLibraryItemProtocol> representedItem;
+ (instancetype)fromNibWithOwner:(id)owner;
- (IBAction)playRepresentedItem:(id)sender;
- (void)setOptimalRepresentedItem;
@end
NS_ASSUME_NONNULL_END
/*****************************************************************************
* VLCLibraryHeroView.m: MacOS X interface module
*****************************************************************************
* Copyright (C) 2023 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 "VLCLibraryHeroView.h"
#import "extensions/NSString+Helpers.h"
#import "extensions/NSView+VLCAdditions.h"
#import "library/VLCLibraryController.h"
#import "library/VLCLibraryDataTypes.h"
#import "library/VLCLibraryImageCache.h"
#import "library/VLCLibraryModel.h"
#import "main/VLCMain.h"
#import "views/VLCImageView.h"
@interface VLCLibraryHeroView ()
@property (readonly) VLCMediaLibraryMediaItem *randomItem;
@property (readonly) VLCMediaLibraryMediaItem *latestPartiallyPlayedItem;
@end
@implementation VLCLibraryHeroView
+ (instancetype)fromNibWithOwner:(id)owner
{
return (VLCLibraryHeroView*)[NSView fromNibNamed:@"VLCLibraryHeroView"
withClass:VLCLibraryHeroView.class
withOwner:owner];
}
- (void)awakeFromNib
{
self.largeImageView.contentGravity = VLCImageViewContentGravityResizeAspectFill;
}
- (void)updateRepresentedItem
{
NSAssert(self.representedItem != nil, @"Should not update nil represented item!");
self.largeImageView.image = [VLCLibraryImageCache thumbnailForLibraryItem:self.representedItem];
self.titleTextField.stringValue = self.representedItem.displayString;
self.detailTextField.stringValue = self.representedItem.detailString;
}
- (void)setRepresentedItem:(id<VLCMediaLibraryItemProtocol>)representedItem
{
NSParameterAssert(representedItem != nil);
if (representedItem == self.representedItem) {
return;
}
_representedItem = representedItem;
[self updateRepresentedItem];
}
- (VLCMediaLibraryMediaItem *)randomItem
{
VLCLibraryModel * const libraryModel = VLCMain.sharedInstance.libraryController.libraryModel;
const size_t videoCount = libraryModel.numberOfVideoMedia;
const uint32_t randIdx = arc4random_uniform((uint32_t)(videoCount - 1));
return [libraryModel.listOfVideoMedia objectAtIndex:randIdx];
}
- (VLCMediaLibraryMediaItem *)latestPartiallyPlayedItem
{
VLCLibraryModel * const libraryModel = VLCMain.sharedInstance.libraryController.libraryModel;
NSArray<VLCMediaLibraryMediaItem *> * const recentMedia = libraryModel.listOfRecentMedia;
const NSUInteger firstPartialPlayItemIdx = [recentMedia indexOfObjectPassingTest:^BOOL(VLCMediaLibraryMediaItem *testedItem, NSUInteger idx, BOOL *stop) {
const float playProgress = testedItem.progress;
return playProgress > 0 && playProgress < 100;
}];
if (firstPartialPlayItemIdx == NSNotFound) {
return nil;
}
return [recentMedia objectAtIndex:firstPartialPlayItemIdx];
}
- (void)setOptimalRepresentedItem
{
VLCMediaLibraryMediaItem * const latestPartialPlayItem = self.latestPartiallyPlayedItem;
if (latestPartialPlayItem != nil) {
self.representedItem = latestPartialPlayItem;
self.explanationTextField.stringValue = _NS("Last watched");
self.playButton.title = _NS("Resume playing");
return;
}
VLCMediaLibraryMediaItem * const randomItem = self.randomItem;
if (randomItem != nil) {
self.representedItem = randomItem;
self.explanationTextField.stringValue = _NS("From your library");
self.playButton.title = _NS("Play now");
return;
}
NSLog(@"Could not find a food media item for hero view!");
}
- (IBAction)playRepresentedItem:(id)sender
{
VLCLibraryController * const libraryController = VLCMain.sharedInstance.libraryController;
[libraryController appendItemToPlaylist:self.representedItem playImmediately:YES];
}
@end
......@@ -26,15 +26,15 @@ NS_ASSUME_NONNULL_BEGIN
@class VLCInputItem;
@class VLCPlaylistItem;
@class VLCAbstractMediaLibraryItem;
@protocol VLCMediaLibraryItemProtocol;
@interface VLCLibraryImageCache : NSObject
+ (nullable NSImage *)thumbnailForLibraryItem:(VLCAbstractMediaLibraryItem*)libraryItem;
+ (nullable NSImage *)thumbnailForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem;
+ (nullable NSImage *)thumbnailForInputItem:(VLCInputItem*)inputItem;
+ (nullable NSImage *)thumbnailForPlaylistItem:(VLCPlaylistItem*)playlistItem;
+ (void)thumbnailForLibraryItem:(VLCAbstractMediaLibraryItem *)libraryItem
+ (void)thumbnailForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem
withCompletion:(void(^)(const NSImage *))completionHandler;
+ (void)thumbnailForInputItem:(VLCInputItem *)inputItem
withCompletion:(void(^)(const NSImage *))completionHandler;
......
......@@ -64,12 +64,12 @@ float kVLCDefaultThumbnailPosition = .15;
return sharedImageCache;
}
+ (NSImage *)thumbnailForLibraryItem:(VLCAbstractMediaLibraryItem*)libraryItem
+ (NSImage *)thumbnailForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem
{
return [[VLCLibraryImageCache sharedImageCache] imageForLibraryItem:libraryItem];
}
- (NSImage *)imageForLibraryItem:(VLCAbstractMediaLibraryItem*)libraryItem
- (NSImage *)imageForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem
{
NSImage *cachedImage = [_imageCache objectForKey:libraryItem.smallArtworkMRL];
if (cachedImage) {
......@@ -78,7 +78,7 @@ float kVLCDefaultThumbnailPosition = .15;
return [self smallThumbnailForLibraryItem:libraryItem];
}
- (NSImage *)smallThumbnailForLibraryItem:(VLCAbstractMediaLibraryItem*)libraryItem
- (NSImage *)smallThumbnailForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem
{
NSImage *image;
NSString * const artworkMRL = libraryItem.smallArtworkMRL;
......@@ -157,7 +157,7 @@ float kVLCDefaultThumbnailPosition = .15;
return [VLCLibraryImageCache.sharedImageCache imageForInputItem:playlistItem.inputItem];
}
+ (void)thumbnailForLibraryItem:(VLCAbstractMediaLibraryItem *)libraryItem
+ (void)thumbnailForLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem
withCompletion:(void(^)(const NSImage *))completionHandler
{
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
......
......@@ -24,6 +24,8 @@
NS_ASSUME_NONNULL_BEGIN
@class VLCLibraryHeroView;
@interface VLCLibraryVideoCollectionViewsStackViewController : NSObject
@property (readwrite, assign, nonatomic) NSSize collectionViewItemSize;
......@@ -34,6 +36,8 @@ NS_ASSUME_NONNULL_BEGIN
@property (readwrite, assign, nonatomic) NSStackView *collectionsStackView;
@property (readwrite, assign, nonatomic) NSScrollView *collectionsStackViewScrollView;
@property (readonly) VLCLibraryHeroView *heroView;
- (void)reloadData;
@end
......
......@@ -26,6 +26,7 @@
#import "library/VLCLibraryCollectionViewFlowLayout.h"
#import "library/VLCLibraryCollectionViewSupplementaryElementView.h"
#import "library/VLCLibraryController.h"
#import "library/VLCLibraryHeroView.h"
#import "library/VLCLibraryModel.h"
#import "library/VLCLibraryUIUnits.h"
......@@ -40,6 +41,7 @@
@interface VLCLibraryVideoCollectionViewsStackViewController()
{
NSArray *_collectionViewContainers;
NSUInteger _leadingContainerCount;
}
@end
......@@ -66,9 +68,19 @@
name:VLCLibraryModelRecentsMediaItemDeleted
object:nil];
_leadingContainerCount = 0;
[self generateCustomContainers];
[self generateCollectionViewContainers];
}
- (void)generateCustomContainers
{
_heroView = [VLCLibraryHeroView fromNibWithOwner:self];
_leadingContainerCount += 1;
[self addView:self.heroView toStackView:self.collectionsStackView];
[self.heroView setOptimalRepresentedItem];
}
- (BOOL)recentMediaPresent
{
VLCLibraryModel * const model = VLCMain.sharedInstance.libraryController.libraryModel;
......@@ -94,7 +106,8 @@
containerView.videoGroup = VLCLibraryVideoRecentsGroup;
[mutableContainers insertObject:containerView atIndex:0];
[_collectionsStackView insertArrangedSubview:containerView atIndex:0];
// Insert at top after leading containers, hence _leadingContainerCount
[_collectionsStackView insertArrangedSubview:containerView atIndex:_leadingContainerCount];
[self setupContainerView:containerView forStackView:_collectionsStackView];
} else {
[mutableContainers removeObjectAtIndex:recentsContainerIndex];
......@@ -125,21 +138,23 @@
{
dispatch_async(dispatch_get_main_queue(), ^{
for (VLCLibraryVideoCollectionViewContainerView *containerView in self->_collectionViewContainers) {
[self.heroView setOptimalRepresentedItem];
[containerView.collectionView reloadData];
}
});
}
- (void)setupContainerView:(VLCLibraryVideoCollectionViewContainerView *)containerView
forStackView:(NSStackView *)stackView
- (NSArray<NSLayoutConstraint*> *)setupViewConstraints:(NSView *)view
forStackView:(NSStackView *)stackView
{
if (containerView == nil || stackView == nil) {
return;
if (view == nil || stackView == nil) {
return @[];
}
containerView.translatesAutoresizingMaskIntoConstraints = NO;
view.translatesAutoresizingMaskIntoConstraints = NO;
NSArray<NSLayoutConstraint*> * const constraintsWithSuperview = @[
[NSLayoutConstraint constraintWithItem:containerView
[NSLayoutConstraint constraintWithItem:view
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:stackView
......@@ -147,7 +162,7 @@
multiplier:1
constant:0
],
[NSLayoutConstraint constraintWithItem:containerView
[NSLayoutConstraint constraintWithItem:view
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:stackView
......@@ -156,8 +171,31 @@
constant:0
],
];
containerView.constraintsWithSuperview = constraintsWithSuperview;
[stackView addConstraints:constraintsWithSuperview];
return constraintsWithSuperview;
}
- (void)setupContainerView:(VLCLibraryVideoCollectionViewContainerView *)containerView
forStackView:(NSStackView *)stackView
{
if (containerView == nil || stackView == nil) {
return;
}
NSArray<NSLayoutConstraint*> * const constraintsWithSuperview = [self setupViewConstraints:containerView forStackView:stackView];
containerView.constraintsWithSuperview = constraintsWithSuperview;
}
- (void)addView:(NSView *)view
toStackView:(NSStackView *)stackView
{
if (view == nil || stackView == nil) {
return;
}
[stackView addArrangedSubview:view];
[self setupViewConstraints:view forStackView:stackView];
}
- (void)addContainerView:(VLCLibraryVideoCollectionViewContainerView *)containerView
......@@ -192,6 +230,9 @@
forOrientation:NSLayoutConstraintOrientationVertical];
[self addView:self.heroView toStackView:_collectionsStackView];
[self.heroView setOptimalRepresentedItem];
for (VLCLibraryVideoCollectionViewContainerView * const containerView in _collectionViewContainers) {
[self addContainerView:containerView toStackView:_collectionsStackView];
}
......@@ -235,7 +276,7 @@
}
}
- (void) setCollectionViewMinimumInteritemSpacing:(CGFloat)collectionViewMinimumInteritemSpacing
- (void)setCollectionViewMinimumInteritemSpacing:(CGFloat)collectionViewMinimumInteritemSpacing
{
_collectionViewMinimumInteritemSpacing = collectionViewMinimumInteritemSpacing;
......