You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

228 lines
7.1 KiB

/*****************************************************************************
* VLCMediaSourceDataSource.m: MacOS X interface module
*****************************************************************************
* Copyright (C) 2019 VLC authors and VideoLAN
*
* Authors: Felix Paul Kühne <fkuehne # videolan -dot- org>
*
* 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 "VLCMediaSourceDataSource.h"
#import "VLCMediaSourceCollectionViewItem.h"
#import "VLCMediaSource.h"
#import "extensions/NSString+Helpers.h"
#import "library/VLCInputItem.h"
#import "library/VLCInputNodePathControl.h"
#import "library/VLCInputNodePathControlItem.h"
#import "library/VLCLibraryNavigationStack.h"
#import "library/VLCLibraryTableCellView.h"
#import "library/VLCLibraryUIUnits.h"
#import "library/VLCLibraryWindow.h"
#import "main/VLCMain.h"
#import "playlist/VLCPlaylistController.h"
#import "views/VLCImageView.h"
@interface VLCMediaSourceDataSource()
{
VLCInputItem *_childRootInput;
}
@end
@implementation VLCMediaSourceDataSource
- (void)setNodeToDisplay:(nonnull VLCInputNode*)nodeToDisplay
{
NSAssert(nodeToDisplay, @"Nil node to display, will not set");
_nodeToDisplay = nodeToDisplay;
[self reloadData];
}
- (void)setupViews
{
[self.tableView setDoubleAction:@selector(tableViewAction:)];
[self.tableView setTarget:self];
}
#pragma mark - collection view data source and delegation
- (NSInteger)numberOfSectionsInCollectionView:(NSCollectionView *)collectionView
{
return 1;
}
- (NSInteger)collectionView:(NSCollectionView *)collectionView
numberOfItemsInSection:(NSInteger)section
{
if (_nodeToDisplay) {
return _nodeToDisplay.numberOfChildren;
}
return 0;
}
- (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView
itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath
{
VLCMediaSourceCollectionViewItem *viewItem = [collectionView makeItemWithIdentifier:VLCMediaSourceCellIdentifier forIndexPath:indexPath];
VLCInputNode *rootNode = _nodeToDisplay;
NSArray *nodeChildren = rootNode.children;
VLCInputNode *childNode = nodeChildren[indexPath.item];
VLCInputItem *childRootInput = childNode.inputItem;
viewItem.representedInputItem = childRootInput;
return viewItem;
}
- (void)collectionView:(NSCollectionView *)collectionView didSelectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths
{
NSIndexPath *indexPath = indexPaths.anyObject;
if (!indexPath) {
return;
}
VLCInputNode *rootNode = self.nodeToDisplay;
NSArray *nodeChildren = rootNode.children;
VLCInputNode *childNode = nodeChildren[indexPath.item];
[self performActionForNode:childNode allowPlayback:YES];
}
- (NSSize)collectionView:(NSCollectionView *)collectionView
layout:(NSCollectionViewLayout *)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
VLCLibraryCollectionViewFlowLayout *collectionViewFlowLayout = (VLCLibraryCollectionViewFlowLayout*)collectionViewLayout;
NSAssert(collectionViewLayout, @"This should be a flow layout and thus a valid pointer");
return [VLCLibraryUIUnits adjustedCollectionViewItemSizeForCollectionView:collectionView
withLayout:collectionViewFlowLayout
withItemsAspectRatio:VLCLibraryCollectionViewItemAspectRatioDefaultItem];
}
#pragma mark - table view data source and delegation
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
if (_nodeToDisplay) {
return _nodeToDisplay.numberOfChildren;
}
return 0;
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
VLCLibraryTableCellView *cellView = [tableView makeViewWithIdentifier:@"VLCMediaSourceTableViewCellIdentifier" owner:self];
if (cellView == nil) {
cellView = [VLCLibraryTableCellView fromNibWithOwner:self];
cellView.identifier = @"VLCMediaSourceTableViewCellIdentifier";
}
cellView.representedInputItem = [self mediaSourceInputItemAtRow:row];
return cellView;
}
- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
NSInteger selectedIndex = self.tableView.selectedRow;
if (selectedIndex < 0) {
return;
}
VLCInputNode *childNode = [self mediaSourceInputNodeAtRow:selectedIndex];
[self performActionForNode:childNode allowPlayback:NO];
}
- (void)tableViewAction:(id)sender
{
NSInteger selectedIndex = self.tableView.selectedRow;
if (selectedIndex < 0) {
return;
}
VLCInputNode *childNode = [self mediaSourceInputNodeAtRow:selectedIndex];
[self performActionForNode:childNode allowPlayback:YES];
}
- (VLCInputNode*)mediaSourceInputNodeAtRow:(NSInteger)tableViewRow
{
if (_nodeToDisplay == nil) {
return nil;
}
VLCInputNode *rootNode = _nodeToDisplay;
NSArray *nodeChildren = rootNode.children;
if (nodeChildren == nil || nodeChildren.count == 0) {
return nil;
}
return nodeChildren[tableViewRow];
}
- (VLCInputItem*)mediaSourceInputItemAtRow:(NSInteger)tableViewRow
{
VLCInputNode *childNode = [self mediaSourceInputNodeAtRow:tableViewRow];
if (childNode == nil) {
return nil;
}
return childNode.inputItem;
}
#pragma mark - generic actions
- (void)performActionForNode:(VLCInputNode *)node allowPlayback:(BOOL)allowPlayback
{
if(node == nil || node.inputItem == nil) {
return;
}
VLCInputItem *childRootInput = node.inputItem;
if (childRootInput.inputType == ITEM_TYPE_DIRECTORY || childRootInput.inputType == ITEM_TYPE_NODE) {
VLCInputNodePathControlItem *nodePathItem = [[VLCInputNodePathControlItem alloc] initWithInputNode:node];
[self.pathControl appendInputNodePathControlItem:nodePathItem];
[self.displayedMediaSource preparseInputNodeWithinTree:node];
self.nodeToDisplay = node;
[[VLCMain sharedInstance].libraryWindow.navigationStack appendCurrentLibraryState];
} else if (childRootInput.inputType == ITEM_TYPE_FILE && allowPlayback) {
[[[VLCMain sharedInstance] playlistController] addInputItem:childRootInput.vlcInputItem atPosition:-1 startPlayback:YES];
}
}
- (void)reloadData
{
if (!_collectionView.hidden) {
[_collectionView reloadData];
}
if(!_tableView.hidden) {
[_tableView reloadData];
}
}
@end