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
401 results
Show changes
Commits on Source (34)
Showing
with 198 additions and 556 deletions
......@@ -39,6 +39,8 @@ NS_ASSUME_NONNULL_BEGIN
@class VLCCustomEmptyLibraryBrowseButton;
@class VLCLibraryWindowSplitViewController;
@class VLCLibraryWindowToolbarDelegate;
@class VLCLoadingOverlayView;
@class VLCNoResultsLabel;
@protocol VLCMediaLibraryItemProtocol;
......@@ -113,6 +115,11 @@ extern const NSUserInterfaceItemIdentifier VLCLibraryWindowIdentifier;
@property (nonatomic, readwrite, strong) IBOutlet NSTextField *placeholderLabel;
@property (nonatomic, readwrite, strong) IBOutlet VLCCustomEmptyLibraryBrowseButton *placeholderGoToBrowseButton;
@property (readonly) VLCLoadingOverlayView *loadingOverlayView;
@property (readonly) NSArray<NSLayoutConstraint *> *loadingOverlayViewConstraints;
@property (readonly) NSArray<NSLayoutConstraint *> *placeholderImageViewConstraints;
@property (readonly) VLCNoResultsLabel *noResultsLabel;
@property (readwrite, nonatomic) NSInteger librarySegmentType;
@property (readwrite) BOOL nonembedded;
......@@ -130,7 +137,14 @@ extern const NSUserInterfaceItemIdentifier VLCLibraryWindowIdentifier;
- (void)updateGridVsListViewModeSegmentedControl;
- (void)updateFilterString;
- (void)clearFilterString;
- (void)showLoadingOverlay;
- (void)hideLoadingOverlay;
- (void)displayLibraryView:(NSView *)view;
- (void)displayLibraryPlaceholderViewWithImage:(NSImage *)image
usingConstraints:(NSArray<NSLayoutConstraint *> *)constraints
displayingMessage:(NSString *)message;
- (void)displayNoResultsMessage;
- (void)presentLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem;
- (void)goToLocalFolderMrl:(NSString *)mrl;
......
......@@ -71,6 +71,8 @@
#import "views/VLCBottomBarView.h"
#import "views/VLCCustomWindowButton.h"
#import "views/VLCDragDropView.h"
#import "views/VLCLoadingOverlayView.h"
#import "views/VLCNoResultsLabel.h"
#import "views/VLCRoundedCornerTextField.h"
#import "windows/controlsbar/VLCControlsBarCommon.h"
......@@ -186,6 +188,7 @@ static void addShadow(NSImageView *__unsafe_unretained imageView)
_libraryMediaSourceViewController = [[VLCLibraryMediaSourceViewController alloc] initWithLibraryWindow:self];
[self setViewForSelectedSegment];
[self setupLoadingOverlayView];
}
- (void)dealloc
......@@ -206,6 +209,42 @@ static void addShadow(NSImageView *__unsafe_unretained imageView)
[coder encodeInteger:_librarySegmentType forKey:@"macosx-library-selected-segment"];
}
- (void)setupLoadingOverlayView
{
_loadingOverlayView = [[VLCLoadingOverlayView alloc] init];
self.loadingOverlayView.translatesAutoresizingMaskIntoConstraints = NO;
_loadingOverlayViewConstraints = @[
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeTop
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeRight
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeBottom
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeLeft
multiplier:1
constant:0]
];
}
#pragma mark - misc. user interactions
- (void)updateGridVsListViewModeSegmentedControl
......@@ -449,6 +488,59 @@ static void addShadow(NSImageView *__unsafe_unretained imageView)
_librarySegmentViewController = lvc;
}
- (void)displayLibraryView:(NSView *)view
{
view.translatesAutoresizingMaskIntoConstraints = NO;
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
self.libraryTargetView.subviews = @[view, self.loadingOverlayView];
} else {
self.libraryTargetView.subviews = @[view];
}
[NSLayoutConstraint activateConstraints:@[
[view.topAnchor constraintEqualToAnchor:self.libraryTargetView.topAnchor],
[view.bottomAnchor constraintEqualToAnchor:self.libraryTargetView.bottomAnchor],
[view.leftAnchor constraintEqualToAnchor:self.libraryTargetView.leftAnchor],
[view.rightAnchor constraintEqualToAnchor:self.libraryTargetView.rightAnchor]
]];
}
- (void)displayLibraryPlaceholderViewWithImage:(NSImage *)image
usingConstraints:(NSArray<NSLayoutConstraint *> *)constraints
displayingMessage:(NSString *)message
{
for (NSLayoutConstraint * const constraint in self.placeholderImageViewConstraints) {
constraint.active = NO;
}
_placeholderImageViewConstraints = constraints;
for (NSLayoutConstraint * const constraint in constraints) {
constraint.active = YES;
}
[self displayLibraryView:self.emptyLibraryView];
self.placeholderImageView.image = image;
self.placeholderLabel.stringValue = message;
}
- (void)displayNoResultsMessage
{
if (self.noResultsLabel == nil) {
_noResultsLabel = [[VLCNoResultsLabel alloc] init];
_noResultsLabel.translatesAutoresizingMaskIntoConstraints = NO;
}
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
self.libraryTargetView.subviews = @[self.noResultsLabel, self.loadingOverlayView];
} else {
self.libraryTargetView.subviews = @[_noResultsLabel];
}
[NSLayoutConstraint activateConstraints:@[
[self.noResultsLabel.centerXAnchor constraintEqualToAnchor:self.libraryTargetView.centerXAnchor],
[self.noResultsLabel.centerYAnchor constraintEqualToAnchor:self.libraryTargetView.centerYAnchor]
]];
}
- (void)presentAudioLibraryItem:(id<VLCMediaLibraryItemProtocol>)libraryItem
{
[self showAudioLibrary];
......@@ -743,6 +835,48 @@ static void addShadow(NSImageView *__unsafe_unretained imageView)
self.splitViewController.multifunctionSidebarViewController.mainVideoModeEnabled = NO;
}
- (void)showLoadingOverlay
{
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
return;
}
self.loadingOverlayView.wantsLayer = YES;
self.loadingOverlayView.alphaValue = 0.0;
NSArray * const views = [self.libraryTargetView.subviews arrayByAddingObject:self.loadingOverlayView];
self.libraryTargetView.subviews = views;
[self.libraryTargetView addConstraints:self.loadingOverlayViewConstraints];
[NSAnimationContext runAnimationGroup:^(NSAnimationContext * const context) {
context.duration = 0.5;
self.loadingOverlayView.animator.alphaValue = 1.0;
} completionHandler:nil];
[self.loadingOverlayView.indicator startAnimation:self];
}
- (void)hideLoadingOverlay
{
if (![self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
return;
}
self.loadingOverlayView.wantsLayer = YES;
self.loadingOverlayView.alphaValue = 1.0;
[NSAnimationContext runAnimationGroup:^(NSAnimationContext * const context) {
context.duration = 1.0;
self.loadingOverlayView.animator.alphaValue = 0.0;
} completionHandler:^{
[self.libraryTargetView removeConstraints:self.loadingOverlayViewConstraints];
NSMutableArray * const views = self.libraryTargetView.subviews.mutableCopy;
[views removeObject:self.loadingOverlayView];
self.libraryTargetView.subviews = views.copy;
[self.loadingOverlayView.indicator stopAnimation:self];
}];
}
- (void)mouseMoved:(NSEvent *)o_event
{
if (!self.videoViewController.view.hidden) {
......
......@@ -27,7 +27,6 @@
@class VLCLibraryAudioDataSource;
@class VLCLibraryAudioGroupDataSource;
@class VLCLoadingOverlayView;
@class VLCLibraryWindow;
@protocol VLCMediaLibraryItemProtocol;
......@@ -52,8 +51,6 @@ NS_ASSUME_NONNULL_BEGIN
@property (readonly, weak) NSScrollView *audioLibraryGridModeSplitViewListSelectionCollectionViewScrollView;
@property (readonly, weak) NSCollectionView *audioLibraryGridModeSplitViewListSelectionCollectionView;
@property (readonly) VLCLoadingOverlayView *loadingOverlayView;
@property (readonly) VLCLibraryAudioDataSource *audioDataSource;
@property (readonly) VLCLibraryAudioGroupDataSource *audioGroupDataSource;
......
......@@ -51,9 +51,6 @@
#import "main/VLCMain.h"
#import "views/VLCLoadingOverlayView.h"
#import "views/VLCNoResultsLabel.h"
#import "windows/video/VLCVoutView.h"
#import "windows/video/VLCMainVideoViewController.h"
......@@ -71,10 +68,6 @@ NSString *VLCLibraryPlaceholderAudioViewIdentifier = @"VLCLibraryPlaceholderAudi
VLCLibraryAudioTableViewDelegate *_audioLibraryTableViewDelegate;
VLCLibraryAudioGroupTableViewDelegate *_audioGroupLibraryTableViewDelegate;
VLCLibraryTwoPaneSplitViewDelegate *_splitViewDelegate;
NSArray<NSLayoutConstraint *> *_loadingOverlayViewConstraints;
VLCNoResultsLabel *_noResultsLabel;
}
@end
......@@ -96,7 +89,6 @@ NSString *VLCLibraryPlaceholderAudioViewIdentifier = @"VLCLibraryPlaceholderAudi
_splitViewDelegate = [[VLCLibraryTwoPaneSplitViewDelegate alloc] init];
[self setupAudioPlaceholderView];
[self setupLoadingOverlayView];
[self setupAudioCollectionView];
[self setupGridModeSplitView];
[self setupAudioTableViews];
......@@ -261,42 +253,6 @@ NSString *VLCLibraryPlaceholderAudioViewIdentifier = @"VLCLibraryPlaceholderAudi
];
}
- (void)setupLoadingOverlayView
{
_loadingOverlayView = [[VLCLoadingOverlayView alloc] init];
self.loadingOverlayView.translatesAutoresizingMaskIntoConstraints = NO;
_loadingOverlayViewConstraints = @[
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeTop
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeRight
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeBottom
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeLeft
multiplier:1
constant:0]
];
}
- (void)setupAudioLibraryViews
{
_audioCollectionSelectionTableView.rowHeight = VLCLibraryUIUnits.mediumTableViewRowHeight;
......@@ -341,78 +297,18 @@ NSString *VLCLibraryPlaceholderAudioViewIdentifier = @"VLCLibraryPlaceholderAudi
- (void)presentAudioView
{
self.libraryTargetView.subviews = @[];
[self updatePresentedView];
}
- (void)presentPlaceholderAudioView
{
NSArray<NSLayoutConstraint *> * const oldViewPlaceholderConstraints =
self.libraryWindow.librarySegmentViewController.placeholderImageViewSizeConstraints;
for (NSLayoutConstraint * const constraint in oldViewPlaceholderConstraints) {
constraint.active = NO;
}
for (NSLayoutConstraint * const constraint in self.placeholderImageViewSizeConstraints) {
constraint.active = YES;
}
const NSInteger selectedLibrarySegment = self.audioDataSource.audioLibrarySegment;
NSAssert(selectedLibrarySegment != VLCAudioLibraryRecentsSegment &&
selectedLibrarySegment != VLCAudioLibraryUnknownSegment,
@"Received invalid audio library segment from audio data source!");
if(selectedLibrarySegment < _placeholderImageNames.count && selectedLibrarySegment >= 0) {
self.placeholderImageView.image = [NSImage imageNamed:_placeholderImageNames[selectedLibrarySegment]];
}
if(selectedLibrarySegment < _placeholderLabelStrings.count && selectedLibrarySegment >= 0) {
self.placeholderLabel.stringValue = _placeholderLabelStrings[selectedLibrarySegment];
}
self.emptyLibraryView.translatesAutoresizingMaskIntoConstraints = NO;
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
self.libraryTargetView.subviews = @[self.emptyLibraryView, self.loadingOverlayView];
} else {
self.libraryTargetView.subviews = @[self.emptyLibraryView];
}
NSView * const emptyLibraryView = self.emptyLibraryView;
NSDictionary * const dict = NSDictionaryOfVariableBindings(emptyLibraryView);
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[emptyLibraryView(>=572.)]|" options:0 metrics:0 views:dict]];
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[emptyLibraryView(>=444.)]|" options:0 metrics:0 views:dict]];
self.emptyLibraryView.identifier = VLCLibraryPlaceholderAudioViewIdentifier;
}
- (void)presentNoResultsView
{
if (_noResultsLabel == nil) {
_noResultsLabel = [[VLCNoResultsLabel alloc] init];
_noResultsLabel.translatesAutoresizingMaskIntoConstraints = NO;
}
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
self.libraryTargetView.subviews = @[_noResultsLabel, self.loadingOverlayView];
} else {
self.libraryTargetView.subviews = @[_noResultsLabel];
}
[NSLayoutConstraint activateConstraints:@[
[_noResultsLabel.centerXAnchor constraintEqualToAnchor:self.libraryTargetView.centerXAnchor],
[_noResultsLabel.centerYAnchor constraintEqualToAnchor:self.libraryTargetView.centerYAnchor]
]];
}
- (void)prepareAudioLibraryView
{
self.audioLibraryView.translatesAutoresizingMaskIntoConstraints = NO;
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
self.libraryTargetView.subviews = @[self.audioLibraryView, self.loadingOverlayView];
} else {
self.libraryTargetView.subviews = @[self.audioLibraryView];
}
NSDictionary *dict = NSDictionaryOfVariableBindings(_audioLibraryView);
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_audioLibraryView(>=572.)]|" options:0 metrics:0 views:dict]];
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_audioLibraryView(>=444.)]|" options:0 metrics:0 views:dict]];
[self.libraryWindow displayLibraryPlaceholderViewWithImage:[NSImage imageNamed:_placeholderImageNames[selectedLibrarySegment]]
usingConstraints:self.placeholderImageViewSizeConstraints
displayingMessage:_placeholderLabelStrings[selectedLibrarySegment]];
}
- (void)hideAllViews
......@@ -489,7 +385,7 @@ NSString *VLCLibraryPlaceholderAudioViewIdentifier = @"VLCLibraryPlaceholderAudi
const BOOL anyAudioMedia = self.audioDataSource.libraryModel.numberOfAudioMedia > 0;
if (anyAudioMedia) {
[self prepareAudioLibraryView];
[self.libraryWindow displayLibraryView:self.audioLibraryView];
[self hideAllViews];
const VLCLibraryViewModeSegment viewModeSegment = [self viewModeSegmentForCurrentLibrarySegment];
......@@ -504,7 +400,7 @@ NSString *VLCLibraryPlaceholderAudioViewIdentifier = @"VLCLibraryPlaceholderAudi
[VLCMain.sharedInstance.libraryWindow updateGridVsListViewModeSegmentedControl];
} else if (self.audioDataSource.libraryModel.filterString.length > 0) {
[self presentNoResultsView];
[self.libraryWindow displayNoResultsMessage];
} else {
[self presentPlaceholderAudioView];
}
......@@ -638,53 +534,22 @@ NSString *VLCLibraryPlaceholderAudioViewIdentifier = @"VLCLibraryPlaceholderAudi
- (void)libraryModelLongLoadStarted:(NSNotification *)notification
{
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
return;
}
if (self.connected) {
[self.audioDataSource disconnect];
[self.audioGroupDataSource disconnect];
}
self.loadingOverlayView.wantsLayer = YES;
self.loadingOverlayView.alphaValue = 0.0;
NSArray * const views = [self.libraryTargetView.subviews arrayByAddingObject:self.loadingOverlayView];
self.libraryTargetView.subviews = views;
[self.libraryTargetView addConstraints:_loadingOverlayViewConstraints];
[NSAnimationContext runAnimationGroup:^(NSAnimationContext * const context) {
context.duration = 0.5;
self.loadingOverlayView.animator.alphaValue = 1.0;
} completionHandler:nil];
[self.loadingOverlayView.indicator startAnimation:self];
[self.libraryWindow showLoadingOverlay];
}
- (void)libraryModelLongLoadFinished:(NSNotification *)notification
{
if (![self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
return;
}
if (self.connected) {
[self.audioDataSource connect];
[self.audioGroupDataSource connect];
}
self.loadingOverlayView.wantsLayer = YES;
self.loadingOverlayView.alphaValue = 1.0;
[NSAnimationContext runAnimationGroup:^(NSAnimationContext * const context) {
context.duration = 1.0;
self.loadingOverlayView.animator.alphaValue = 0.0;
} completionHandler:^{
[self.libraryTargetView removeConstraints:_loadingOverlayViewConstraints];
NSMutableArray * const views = self.libraryTargetView.subviews.mutableCopy;
[views removeObject:self.loadingOverlayView];
self.libraryTargetView.subviews = views.copy;
[self.loadingOverlayView.indicator stopAnimation:self];
}];
[self.libraryWindow hideLoadingOverlay];
}
@end
......@@ -230,51 +230,27 @@
- (void)presentPlaceholderGroupsView
{
NSArray<NSLayoutConstraint *> * const oldViewPlaceholderConstraints =
self.libraryWindow.librarySegmentViewController.placeholderImageViewSizeConstraints;
for (NSLayoutConstraint * const constraint in oldViewPlaceholderConstraints) {
constraint.active = NO;
}
for (NSLayoutConstraint *constraint in self.placeholderImageViewSizeConstraints) {
constraint.active = YES;
}
self.emptyLibraryView.translatesAutoresizingMaskIntoConstraints = NO;
self.libraryTargetView.subviews = @[self.emptyLibraryView];
NSView * const emptyLibraryView = self.emptyLibraryView;
NSDictionary * const dict = NSDictionaryOfVariableBindings(emptyLibraryView);
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[emptyLibraryView(>=572.)]|" options:0 metrics:0 views:dict]];
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[emptyLibraryView(>=444.)]|" options:0 metrics:0 views:dict]];
self.placeholderImageView.image = [NSImage imageNamed:@"placeholder-video"];
self.placeholderLabel.stringValue = _NS("Your favorite groups will appear here.");
[self.libraryWindow displayLibraryPlaceholderViewWithImage:[NSImage imageNamed:@"placeholder-video"]
usingConstraints:self.placeholderImageViewSizeConstraints
displayingMessage:_NS("Your favorite groups will appear here.")];
}
- (void)presentGroupsView
{
if (self.dataSource.libraryModel.numberOfGroups == 0) {
[self presentPlaceholderGroupsView];
return;
}
const VLCLibraryViewModeSegment viewModeSegment =
VLCLibraryWindowPersistentPreferences.sharedInstance.groupsLibraryViewMode;
NSView *viewToPresent = nil;
if (viewModeSegment == VLCLibraryGridViewModeSegment) {
viewToPresent = self.collectionViewScrollView;
if (self.dataSource.libraryModel.numberOfGroups > 0) {
if (viewModeSegment == VLCLibraryGridViewModeSegment) {
[self.libraryWindow displayLibraryView:self.collectionViewScrollView];
} else {
[self.libraryWindow displayLibraryView:self.listViewSplitView];
}
} else if (self.dataSource.libraryModel.filterString.length > 0) {
[self.libraryWindow displayNoResultsMessage];
} else {
viewToPresent = self.listViewSplitView;
[self presentPlaceholderGroupsView];
}
NSParameterAssert(viewToPresent != nil);
self.libraryTargetView.subviews = @[viewToPresent];
[NSLayoutConstraint activateConstraints:@[
[self.libraryTargetView.topAnchor constraintEqualToAnchor:viewToPresent.topAnchor],
[self.libraryTargetView.bottomAnchor constraintEqualToAnchor:viewToPresent.bottomAnchor],
[self.libraryTargetView.leadingAnchor constraintEqualToAnchor:viewToPresent.leadingAnchor],
[self.libraryTargetView.trailingAnchor constraintEqualToAnchor:viewToPresent.trailingAnchor]
]];
}
- (void)presentGroup:(VLCMediaLibraryGroup *)group
......
......@@ -24,7 +24,6 @@
#import "library/VLCLibraryAbstractSegmentViewController.h"
@class VLCLoadingOverlayView;
@class VLCLibraryWindow;
@class VLCLibraryHomeViewStackViewController;
......@@ -40,7 +39,6 @@ NS_ASSUME_NONNULL_BEGIN
@property (readonly, weak) NSScrollView *homeLibraryStackViewScrollView;
@property (readonly, weak) NSStackView *homeLibraryStackView;
@property (readonly) VLCLoadingOverlayView *loadingOverlayView;
@property (readonly) VLCLibraryHomeViewStackViewController *stackViewController;
- (instancetype)initWithLibraryWindow:(VLCLibraryWindow *)libraryWindow;
......
......@@ -43,15 +43,12 @@
#import "main/VLCMain.h"
#import "views/VLCLoadingOverlayView.h"
#import "windows/video/VLCMainVideoViewController.h"
@interface VLCLibraryHomeViewController ()
{
id<VLCMediaLibraryItemProtocol> _awaitingPresentingLibraryItem;
NSMutableSet<NSString *> *_ongoingLongLoadingNotifications;
NSArray<NSLayoutConstraint *> *_loadingOverlayViewConstraints;
NSArray<NSLayoutConstraint *> *_internalPlaceholderImageViewSizeConstraints;
}
@end
......@@ -64,7 +61,6 @@
if(self) {
[self setupPropertiesFromLibraryWindow:libraryWindow];
[self setupLoadingOverlayView];
[self setupGridViewController];
[self setupHomePlaceholderView];
[self setupHomeLibraryViews];
......@@ -110,42 +106,6 @@
_homeLibraryStackView = libraryWindow.homeLibraryStackView;
}
- (void)setupLoadingOverlayView
{
_loadingOverlayView = [[VLCLoadingOverlayView alloc] init];
self.loadingOverlayView.translatesAutoresizingMaskIntoConstraints = NO;
_loadingOverlayViewConstraints = @[
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeTop
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeRight
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeBottom
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeLeft
multiplier:1
constant:0]
];
}
- (void)setupGridViewController
{
_stackViewController = [[VLCLibraryHomeViewStackViewController alloc] init];
......@@ -201,51 +161,19 @@
- (void)presentHomeView
{
self.libraryTargetView.subviews = @[];
[self updatePresentedView];
}
- (void)presentPlaceholderHomeLibraryView
{
NSArray<NSLayoutConstraint *> * const oldViewPlaceholderConstraints =
self.libraryWindow.librarySegmentViewController.placeholderImageViewSizeConstraints;
for (NSLayoutConstraint * const constraint in oldViewPlaceholderConstraints) {
constraint.active = NO;
}
for (NSLayoutConstraint *constraint in self.placeholderImageViewSizeConstraints) {
constraint.active = YES;
}
self.emptyLibraryView.translatesAutoresizingMaskIntoConstraints = NO;
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
self.libraryTargetView.subviews = @[self.emptyLibraryView, self.loadingOverlayView];
} else {
self.libraryTargetView.subviews = @[self.emptyLibraryView];
}
NSView * const emptyLibraryView = self.emptyLibraryView;
NSDictionary * const dict = NSDictionaryOfVariableBindings(emptyLibraryView);
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[emptyLibraryView(>=572.)]|" options:0 metrics:0 views:dict]];
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[emptyLibraryView(>=444.)]|" options:0 metrics:0 views:dict]];
self.placeholderImageView.image = [NSImage imageNamed:@"placeholder-video"];
self.placeholderLabel.stringValue = _NS("Your favorite videos will appear here.\nGo to the Browse section to add videos you love.");
[self.libraryWindow displayLibraryPlaceholderViewWithImage:[NSImage imageNamed:@"placeholder-video"]
usingConstraints:self.placeholderImageViewSizeConstraints
displayingMessage:_NS("Your favorite videos will appear here.\nGo to the Browse section to add videos you love.")];
}
- (void)presentHomeLibraryView
{
self.homeLibraryView.translatesAutoresizingMaskIntoConstraints = NO;
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
self.libraryTargetView.subviews = @[self.homeLibraryView, self.loadingOverlayView];
} else {
self.libraryTargetView.subviews = @[self.homeLibraryView];
}
NSDictionary * const dict = NSDictionaryOfVariableBindings(_homeLibraryView);
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_homeLibraryView(>=572.)]|" options:0 metrics:0 views:dict]];
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_homeLibraryView(>=444.)]|" options:0 metrics:0 views:dict]];
const VLCLibraryViewModeSegment viewModeSegment = VLCLibraryWindowPersistentPreferences.sharedInstance.homeLibraryViewMode;
[self.libraryWindow displayLibraryView:self.homeLibraryView];
self.homeLibraryStackViewScrollView.hidden = NO;
[self.stackViewController reloadData];
}
......@@ -278,27 +206,10 @@
}
[_ongoingLongLoadingNotifications addObject:notification.name];
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
return;
}
if (self.connected) {
[self.stackViewController disconnectContainers];
}
self.loadingOverlayView.wantsLayer = YES;
self.loadingOverlayView.alphaValue = 0.0;
NSArray * const views = [self.libraryTargetView.subviews arrayByAddingObject:self.loadingOverlayView];
self.libraryTargetView.subviews = views;
[self.libraryTargetView addConstraints:_loadingOverlayViewConstraints];
[NSAnimationContext runAnimationGroup:^(NSAnimationContext * const context) {
context.duration = 0.5;
self.loadingOverlayView.animator.alphaValue = 1.0;
} completionHandler:nil];
[self.loadingOverlayView.indicator startAnimation:self];
[self.libraryWindow showLoadingOverlay];
}
- (void)libraryModelLongLoadFinished:(NSNotification *)notification
......@@ -307,28 +218,10 @@
if (_ongoingLongLoadingNotifications.count > 0) {
return;
}
if (![self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
return;
}
if (self.connected) {
[self.stackViewController connectContainers];
}
self.loadingOverlayView.wantsLayer = YES;
self.loadingOverlayView.alphaValue = 1.0;
[NSAnimationContext runAnimationGroup:^(NSAnimationContext * const context) {
context.duration = 1.0;
self.loadingOverlayView.animator.alphaValue = 0.0;
} completionHandler:^{
[self.libraryTargetView removeConstraints:_loadingOverlayViewConstraints];
NSMutableArray * const views = self.libraryTargetView.subviews.mutableCopy;
[views removeObject:self.loadingOverlayView];
self.libraryTargetView.subviews = views.copy;
[self.loadingOverlayView.indicator stopAnimation:self];
}];
[self.libraryWindow hideLoadingOverlay];
}
- (void)connect
......
......@@ -168,16 +168,7 @@
- (void)presentMediaSourceView:(VLCLibrarySegmentType)viewSegment
{
self.libraryTargetView.subviews = @[];
if (_mediaSourceView.superview == nil) {
_mediaSourceView.translatesAutoresizingMaskIntoConstraints = NO;
self.libraryTargetView.subviews = @[_mediaSourceView];
NSDictionary *dict = NSDictionaryOfVariableBindings(_mediaSourceView);
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_mediaSourceView(>=572.)]|" options:0 metrics:0 views:dict]];
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_mediaSourceView(>=444.)]|" options:0 metrics:0 views:dict]];
}
[self.libraryWindow displayLibraryView:self.mediaSourceView];
_baseDataSource.mediaSourceMode = viewSegment == VLCLibraryBrowseSegment ? VLCMediaSourceModeLAN : VLCMediaSourceModeInternet;
[_baseDataSource reloadViews];
}
......
......@@ -29,7 +29,6 @@
NS_ASSUME_NONNULL_BEGIN
@class VLCLibraryCollectionViewDelegate;
@class VLCLoadingOverlayView;
@class VLCLibraryMasterDetailViewTableViewDelegate;
@class VLCLibraryPlaylistDataSource;
@class VLCLibraryTableView;
......@@ -44,8 +43,6 @@ NS_ASSUME_NONNULL_BEGIN
@property (readonly) VLCLibraryTableView *detailTableView;
@property (readonly) NSScrollView *collectionViewScrollView;
@property (readonly) NSCollectionView *collectionView;
@property (readonly) VLCLoadingOverlayView *loadingOverlayView;
@property (readonly) NSArray<NSLayoutConstraint *> *loadingOverlayViewConstraints;
@property (readonly) VLCLibraryPlaylistDataSource *dataSource;
@property (readonly) VLCLibraryCollectionViewDelegate *collectionViewDelegate;
......
......@@ -43,7 +43,6 @@
#import "main/VLCMain.h"
#import "views/VLCLoadingOverlayView.h"
#import "windows/video/VLCMainVideoViewController.h"
......@@ -214,42 +213,6 @@
];
}
- (void)setupLoadingOverlayView
{
_loadingOverlayView = [[VLCLoadingOverlayView alloc] init];
self.loadingOverlayView.translatesAutoresizingMaskIntoConstraints = NO;
_loadingOverlayViewConstraints = @[
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeTop
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeRight
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeBottom
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeLeft
multiplier:1
constant:0]
];
}
- (NSArray<NSLayoutConstraint *> *)placeholderImageViewSizeConstraints
{
return _internalPlaceholderImageViewSizeConstraints;
......@@ -260,26 +223,8 @@
return self.dataSource;
}
// TODO: This is duplicated almost verbatim across all the library view
// controllers. Ideally we should have the placeholder view handle this
// itself, or move this into a common superclass
- (void)presentPlaceholderPlaylistLibraryView
{
NSArray<NSLayoutConstraint *> * const oldViewPlaceholderConstraints =
self.libraryWindow.librarySegmentViewController.placeholderImageViewSizeConstraints;
for (NSLayoutConstraint * const constraint in oldViewPlaceholderConstraints) {
constraint.active = NO;
}
for (NSLayoutConstraint * const constraint in self.placeholderImageViewSizeConstraints) {
constraint.active = YES;
}
self.libraryWindow.emptyLibraryView.translatesAutoresizingMaskIntoConstraints = NO;
self.libraryWindow.libraryTargetView.subviews = @[self.libraryWindow.emptyLibraryView];
NSDictionary * const dict = @{@"emptyLibraryView": self.libraryWindow.emptyLibraryView};
[self.libraryWindow.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[emptyLibraryView(>=572.)]|" options:0 metrics:0 views:dict]];
[self.libraryWindow.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[emptyLibraryView(>=444.)]|" options:0 metrics:0 views:dict]];
const vlc_ml_playlist_type_t playlistType = self.dataSource.playlistType;
NSString *placeholderPlaylistsString = nil;
switch (playlistType) {
......@@ -302,8 +247,9 @@
break;
}
self.libraryWindow.placeholderImageView.image = [NSImage imageNamed:@"placeholder-group2"];
self.libraryWindow.placeholderLabel.stringValue = placeholderPlaylistsString;
[self.libraryWindow displayLibraryPlaceholderViewWithImage:[NSImage imageNamed:@"placeholder-group2"]
usingConstraints:self.placeholderImageViewSizeConstraints
displayingMessage:placeholderPlaylistsString];
}
- (void)presentPlaylistLibraryView
......@@ -318,30 +264,24 @@
viewToPresent = self.listViewSplitView;
}
NSParameterAssert(viewToPresent != nil);
self.libraryTargetView.subviews = @[viewToPresent];
[NSLayoutConstraint activateConstraints:@[
[self.libraryTargetView.topAnchor constraintEqualToAnchor:viewToPresent.topAnchor],
[self.libraryTargetView.bottomAnchor constraintEqualToAnchor:viewToPresent.bottomAnchor],
[self.libraryTargetView.leadingAnchor constraintEqualToAnchor:viewToPresent.leadingAnchor],
[self.libraryTargetView.trailingAnchor constraintEqualToAnchor:viewToPresent.trailingAnchor]
]];
[self.libraryWindow displayLibraryView:viewToPresent];
}
- (void)updatePresentedView
{
const vlc_ml_playlist_type_t playlistType = self.dataSource.playlistType;
VLCLibraryModel * const libraryModel = VLCMain.sharedInstance.libraryController.libraryModel;
if ([libraryModel numberOfPlaylistsOfType:playlistType] <= 0) {
[self presentPlaceholderPlaylistLibraryView];
} else {
if ([libraryModel numberOfPlaylistsOfType:playlistType] > 0) {
[self presentPlaylistLibraryView];
} else if (self.dataSource.libraryModel.filterString.length > 0) {
[self.libraryWindow displayNoResultsMessage];
} else {
[self presentPlaceholderPlaylistLibraryView];
}
}
- (void)presentPlaylistsView
{
self.libraryWindow.libraryTargetView.subviews = @[];
[self updatePresentedView];
}
......@@ -368,54 +308,20 @@
}
}
// TODO: Duplicated a lot, move to abstract view controller?
- (void)libraryModelLongLoadStarted:(NSNotification *)notification
{
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
return;
}
if (self.connected) {
[self.dataSource disconnect];
}
self.loadingOverlayView.wantsLayer = YES;
self.loadingOverlayView.alphaValue = 0.0;
NSArray * const views = [self.libraryTargetView.subviews arrayByAddingObject:self.loadingOverlayView];
self.libraryTargetView.subviews = views;
[self.libraryTargetView addConstraints:_loadingOverlayViewConstraints];
[NSAnimationContext runAnimationGroup:^(NSAnimationContext * const context) {
context.duration = 0.5;
self.loadingOverlayView.animator.alphaValue = 1.0;
} completionHandler:nil];
[self.loadingOverlayView.indicator startAnimation:self];
[self.libraryWindow showLoadingOverlay];
}
- (void)libraryModelLongLoadFinished:(NSNotification *)notification
{
if (![self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
return;
}
if (self.connected) {
[self.dataSource connect];
}
self.loadingOverlayView.wantsLayer = YES;
self.loadingOverlayView.alphaValue = 1.0;
[NSAnimationContext runAnimationGroup:^(NSAnimationContext * const context) {
context.duration = 1.0;
self.loadingOverlayView.animator.alphaValue = 0.0;
} completionHandler:^{
[self.libraryTargetView removeConstraints:_loadingOverlayViewConstraints];
NSMutableArray * const views = self.libraryTargetView.subviews.mutableCopy;
[views removeObject:self.loadingOverlayView];
self.libraryTargetView.subviews = views.copy;
[self.loadingOverlayView.indicator stopAnimation:self];
}];
[self.libraryWindow hideLoadingOverlay];
}
#pragma mark - NSSplitViewDelegate
......
......@@ -24,7 +24,6 @@
#import "library/VLCLibraryAbstractSegmentViewController.h"
@class VLCLoadingOverlayView;
@class VLCLibraryWindow;
@class VLCLibraryVideoDataSource;
@class VLCLibraryShowsDataSource;
......@@ -46,8 +45,6 @@ NS_ASSUME_NONNULL_BEGIN
@property (readonly, weak) NSScrollView *videoLibraryGroupsTableViewScrollView;
@property (readonly, weak) NSTableView *videoLibraryGroupsTableView;
@property (readonly) VLCLoadingOverlayView *loadingOverlayView;
@property (readonly, nullable) VLCLibraryVideoDataSource *libraryVideoDataSource;
@property (readonly, nullable) VLCLibraryShowsDataSource *libraryShowsDataSource;
......
......@@ -50,9 +50,6 @@
#import "main/VLCMain.h"
#import "views/VLCLoadingOverlayView.h"
#import "views/VLCNoResultsLabel.h"
#import "windows/video/VLCVoutView.h"
#import "windows/video/VLCMainVideoViewController.h"
......@@ -66,9 +63,6 @@
id<VLCMediaLibraryItemProtocol> _awaitingPresentingLibraryItem;
NSArray<NSLayoutConstraint *> *_internalPlaceholderImageViewSizeConstraints;
NSArray<NSLayoutConstraint *> *_loadingOverlayViewConstraints;
VLCNoResultsLabel *_noResultsLabel;
}
@end
......@@ -87,7 +81,6 @@
[self setupCollectionView];
[self setupVideoPlaceholderView];
[self setupVideoLibraryViews];
[self setupLoadingOverlayView];
NSNotificationCenter *notificationCenter = NSNotificationCenter.defaultCenter;
[notificationCenter addObserver:self
......@@ -248,42 +241,6 @@
_videoLibraryGroupSelectionTableViewScrollView.scrollerInsets = scrollerInsets;
}
- (void)setupLoadingOverlayView
{
_loadingOverlayView = [[VLCLoadingOverlayView alloc] init];
self.loadingOverlayView.translatesAutoresizingMaskIntoConstraints = NO;
_loadingOverlayViewConstraints = @[
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeTop
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeRight
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeBottom
multiplier:1
constant:0],
[NSLayoutConstraint constraintWithItem:self.loadingOverlayView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.libraryTargetView
attribute:NSLayoutAttributeLeft
multiplier:1
constant:0]
];
}
#pragma mark - Show the video library view
- (NSArray<NSLayoutConstraint *> *)placeholderImageViewSizeConstraints
......@@ -324,7 +281,7 @@
const VLCLibraryViewModeSegment viewModeSegment = VLCLibraryWindowPersistentPreferences.sharedInstance.videoLibraryViewMode;
[self presentVideoLibraryView:viewModeSegment];
} else if (self.libraryVideoDataSource.libraryModel.filterString.length > 0) {
[self presentNoResultsView];
[self.libraryWindow displayNoResultsMessage];
} else {
[self presentPlaceholderVideoLibraryView];
}
......@@ -351,7 +308,7 @@
const VLCLibraryViewModeSegment viewModeSegment = VLCLibraryWindowPersistentPreferences.sharedInstance.showsLibraryViewMode;
[self presentVideoLibraryView:viewModeSegment];
} else if (self.libraryShowsDataSource.libraryModel.filterString.length > 0) {
[self presentNoResultsView];
[self.libraryWindow displayNoResultsMessage];
} else {
[self presentPlaceholderVideoLibraryView];
}
......@@ -359,80 +316,30 @@
- (void)presentVideoView
{
self.libraryTargetView.subviews = @[];
[self updatePresentedVideoLibraryView];
}
- (void)presentShowsView
{
self.libraryTargetView.subviews = @[];
[self updatePresentedShowsLibraryView];
}
- (void)presentPlaceholderVideoLibraryView
{
NSArray<NSLayoutConstraint *> * const oldViewPlaceholderConstraints =
self.libraryWindow.librarySegmentViewController.placeholderImageViewSizeConstraints;
for (NSLayoutConstraint * const constraint in oldViewPlaceholderConstraints) {
constraint.active = NO;
}
for (NSLayoutConstraint * const constraint in self.placeholderImageViewSizeConstraints) {
constraint.active = YES;
}
self.emptyLibraryView.translatesAutoresizingMaskIntoConstraints = NO;
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
self.libraryTargetView.subviews = @[self.emptyLibraryView, self.loadingOverlayView];
} else {
self.libraryTargetView.subviews = @[self.emptyLibraryView];
}
NSView * const emptyLibraryView = self.emptyLibraryView;
NSDictionary *dict = NSDictionaryOfVariableBindings(emptyLibraryView);
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[emptyLibraryView(>=572.)]|" options:0 metrics:0 views:dict]];
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[emptyLibraryView(>=444.)]|" options:0 metrics:0 views:dict]];
self.placeholderImageView.image = [NSImage imageNamed:@"placeholder-video"];
self.placeholderLabel.stringValue = _NS("Your favorite videos will appear here.\nGo to the Browse section to add videos you love.");
}
- (void)presentNoResultsView
{
if (_noResultsLabel == nil) {
_noResultsLabel = [[VLCNoResultsLabel alloc] init];
_noResultsLabel.translatesAutoresizingMaskIntoConstraints = NO;
}
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
self.libraryTargetView.subviews = @[_noResultsLabel, self.loadingOverlayView];
} else {
self.libraryTargetView.subviews = @[_noResultsLabel];
}
[NSLayoutConstraint activateConstraints:@[
[_noResultsLabel.centerXAnchor constraintEqualToAnchor:self.libraryTargetView.centerXAnchor],
[_noResultsLabel.centerYAnchor constraintEqualToAnchor:self.libraryTargetView.centerYAnchor]
]];
[self.libraryWindow displayLibraryPlaceholderViewWithImage:[NSImage imageNamed:@"placeholder-video"]
usingConstraints:self.placeholderImageViewSizeConstraints
displayingMessage:_NS("Your favorite videos will appear here.\nGo to the Browse section to add videos you love.")];
}
- (void)presentVideoLibraryView:(VLCLibraryViewModeSegment)viewModeSegment
{
_videoLibraryView.translatesAutoresizingMaskIntoConstraints = NO;
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
self.libraryTargetView.subviews = @[self.videoLibraryView, self.loadingOverlayView];
} else {
self.libraryTargetView.subviews = @[self.videoLibraryView];
}
NSDictionary *dict = NSDictionaryOfVariableBindings(_videoLibraryView);
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_videoLibraryView(>=572.)]|" options:0 metrics:0 views:dict]];
[self.libraryTargetView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_videoLibraryView(>=444.)]|" options:0 metrics:0 views:dict]];
[self.libraryWindow displayLibraryView:self.videoLibraryView];
if (viewModeSegment == VLCLibraryGridViewModeSegment) {
_videoLibrarySplitView.hidden = YES;
_videoLibraryCollectionViewScrollView.hidden = NO;
self.videoLibrarySplitView.hidden = YES;
self.videoLibraryCollectionViewScrollView.hidden = NO;
} else if (viewModeSegment == VLCLibraryListViewModeSegment) {
_videoLibrarySplitView.hidden = NO;
_videoLibraryCollectionViewScrollView.hidden = YES;
self.videoLibrarySplitView.hidden = NO;
self.videoLibraryCollectionViewScrollView.hidden = YES;
} else {
NSAssert(false, @"View mode must be grid or list mode");
}
......@@ -515,51 +422,18 @@
- (void)libraryModelLongLoadStarted:(NSNotification *)notification
{
if ([self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
return;
}
if (self.connected) {
[self.libraryVideoDataSource disconnect];
}
self.loadingOverlayView.wantsLayer = YES;
self.loadingOverlayView.alphaValue = 0.0;
NSArray * const views = [self.libraryTargetView.subviews arrayByAddingObject:self.loadingOverlayView];
self.libraryTargetView.subviews = views;
[self.libraryTargetView addConstraints:_loadingOverlayViewConstraints];
[NSAnimationContext runAnimationGroup:^(NSAnimationContext * const context) {
context.duration = 0.5;
self.loadingOverlayView.animator.alphaValue = 1.0;
} completionHandler:nil];
[self.loadingOverlayView.indicator startAnimation:self];
[self.libraryWindow showLoadingOverlay];
}
- (void)libraryModelLongLoadFinished:(NSNotification *)notification
{
if (![self.libraryTargetView.subviews containsObject:self.loadingOverlayView]) {
return;
}
if (self.connected) {
[self.libraryVideoDataSource connect];
}
self.loadingOverlayView.wantsLayer = YES;
self.loadingOverlayView.alphaValue = 1.0;
[NSAnimationContext runAnimationGroup:^(NSAnimationContext * const context) {
context.duration = 1.0;
self.loadingOverlayView.animator.alphaValue = 0.0;
} completionHandler:^{
[self.libraryTargetView removeConstraints:_loadingOverlayViewConstraints];
NSMutableArray * const views = self.libraryTargetView.subviews.mutableCopy;
[views removeObject:self.loadingOverlayView];
self.libraryTargetView.subviews = views.copy;
[self.loadingOverlayView.indicator stopAnimation:self];
}];
[self.libraryWindow hideLoadingOverlay];
}
@end