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
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
|
|
|