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.
223 lines
5.7 KiB
223 lines
5.7 KiB
/*****************************************************************************
|
|
* VLCApplianceController.m: Front Row plugin
|
|
*****************************************************************************
|
|
* Copyright (C) 2007 - 2008 the VideoLAN Team
|
|
* $Id$
|
|
*
|
|
* Authors: hyei
|
|
*
|
|
* 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 "VLCApplianceController.h"
|
|
|
|
#import <BackRow/BRListControl.h>
|
|
#import <BackRow/BRTextMenuItemLayer.h>
|
|
#import <BackRow/BRControllerStack.h>
|
|
|
|
#import "VLCPlayerController.h"
|
|
|
|
@interface VLCApplianceController ()
|
|
|
|
@property(retain, nonatomic) NSString * path;
|
|
|
|
@end
|
|
|
|
@implementation VLCApplianceController
|
|
|
|
@synthesize path=_path;
|
|
|
|
- initWithPath:(NSString*)path
|
|
{
|
|
self = [super init];
|
|
|
|
_contents = [[NSMutableArray alloc] init];
|
|
|
|
self.path = path;
|
|
|
|
[[self header] setTitle:[[NSFileManager defaultManager] displayNameAtPath:self.path]];
|
|
[[self list] setDatasource:self];
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
[_path release];
|
|
[_contents release];
|
|
[super dealloc];
|
|
}
|
|
|
|
- (void)setPath:(NSString*)path
|
|
{
|
|
if(path != _path) {
|
|
[_path release];
|
|
_path = [path retain];
|
|
|
|
[_contents removeAllObjects];
|
|
|
|
NSArray * contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:_path error:NULL];
|
|
|
|
for(NSString * name in contents) {
|
|
NSString * filepath = [path stringByAppendingPathComponent:name];
|
|
int ok = 0;
|
|
|
|
if([name hasPrefix:@"."]) {
|
|
ok = -1;
|
|
}
|
|
|
|
if(ok == 0) {
|
|
BOOL directory;
|
|
if(![[NSFileManager defaultManager] fileExistsAtPath:filepath isDirectory:&directory]) {
|
|
ok = -1;
|
|
}
|
|
else if(directory) {
|
|
ok = 1;
|
|
}
|
|
}
|
|
|
|
if(ok == 0) {
|
|
NSString * type = [[NSWorkspace sharedWorkspace] typeOfFile:filepath error:NULL];
|
|
if([[NSWorkspace sharedWorkspace] type:type conformsToType:(NSString*)kUTTypeMovie]) {
|
|
ok = 1;
|
|
}
|
|
}
|
|
|
|
if(ok == 0) {
|
|
static NSSet * additionalValidExtensions = nil;
|
|
if(additionalValidExtensions == nil) {
|
|
additionalValidExtensions = [[NSSet alloc] initWithObjects:
|
|
@"mkv",
|
|
nil];
|
|
}
|
|
|
|
NSString * extension = [[name pathExtension] lowercaseString];
|
|
if([additionalValidExtensions containsObject:extension]) {
|
|
ok = 1;
|
|
}
|
|
}
|
|
|
|
if(ok == 1) {
|
|
[_contents addObject:name];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)willBePushed
|
|
{
|
|
PRINT_ME();
|
|
}
|
|
|
|
- (void)willBePopped
|
|
{
|
|
PRINT_ME();
|
|
}
|
|
|
|
|
|
#pragma mark -
|
|
#pragma mark Utilities
|
|
|
|
- (NSString*)pathForRow:(NSInteger)row
|
|
{
|
|
NSString * name = [_contents objectAtIndex:row];
|
|
return [self.path stringByAppendingPathComponent:name];
|
|
}
|
|
|
|
- (BOOL)isDirectoryAtPath:(NSString*)path
|
|
{
|
|
NSDictionary * attributes = [[NSFileManager defaultManager] fileAttributesAtPath:path traverseLink:YES];
|
|
NSString * type = [attributes objectForKey:NSFileType];
|
|
return [type isEqualToString:NSFileTypeDirectory];
|
|
}
|
|
|
|
|
|
#pragma mark -
|
|
#pragma mark Data source
|
|
|
|
- (NSInteger)itemCount
|
|
{
|
|
return [_contents count];
|
|
}
|
|
|
|
- (CGFloat)heightForRow:(NSInteger)row
|
|
{
|
|
return 64.0;
|
|
}
|
|
|
|
- (BOOL)rowSelectable:(NSInteger)row
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
- (NSString*)titleForRow:(NSInteger)row
|
|
{
|
|
return [_contents objectAtIndex:row];
|
|
}
|
|
|
|
- (id)itemForRow:(NSInteger)row
|
|
{
|
|
NSString * path = [self pathForRow:row];
|
|
BOOL isDirectory = [self isDirectoryAtPath:path];
|
|
|
|
BRTextMenuItemLayer * item = nil;
|
|
|
|
if(isDirectory) {
|
|
item = [BRTextMenuItemLayer folderMenuItem];
|
|
}
|
|
else {
|
|
item = [BRTextMenuItemLayer menuItem];
|
|
}
|
|
|
|
[item setTitle:[self titleForRow:row]];
|
|
|
|
return item;
|
|
}
|
|
|
|
- (NSInteger)rowForTitle:(NSString *)title
|
|
{
|
|
return [_contents indexOfObject:title];
|
|
}
|
|
|
|
- (void)itemSelected:(NSInteger)row
|
|
{
|
|
NSString * path = [self pathForRow:row];
|
|
BOOL isDirectory = [self isDirectoryAtPath:path];
|
|
|
|
BRController * controller = nil;
|
|
|
|
if(isDirectory) {
|
|
controller = [[[VLCApplianceController alloc] initWithPath:path] autorelease];
|
|
}
|
|
else {
|
|
#ifdef FAKE
|
|
controller = [[[VLCAppPlayerController alloc] initWithPath:path] autorelease];
|
|
#else
|
|
static VLCPlayerController * playerController = nil;
|
|
if(playerController == nil) {
|
|
playerController = [[VLCPlayerController alloc] init];
|
|
}
|
|
|
|
playerController.media = [VLCMedia mediaWithPath:path];
|
|
controller = playerController;
|
|
#endif
|
|
}
|
|
|
|
if(controller != nil) {
|
|
[[self stack] pushController:controller];
|
|
}
|
|
}
|
|
|
|
@end
|
|
|