#include <sys/mount.h>
#include <vlc_keys.h>
-#include "intf.h"
+#import "intf.h"
#import "wizard.h"
#import "bookmarks.h"
#import "playlistinfo.h"
-#include "playlist.h"
-#include "controls.h"
-#include "vlc_osd.h"
-#include "misc.h"
+#import "playlist.h"
+#import "controls.h"
+#import "vlc_osd.h"
+#import "misc.h"
+#import <vlc_interface.h>
/*****************************************************************************
- * VLCPlaylistView implementation
+ * VLCPlaylistView implementation
*****************************************************************************/
@implementation VLCPlaylistView
}
- (void)awakeFromNib
{
- playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t * p_playlist = pl_Yield( VLCIntf );
[o_outline_view setTarget: self];
[o_outline_view setDelegate: self];
[o_outline_view setDataSource: self];
- (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
{
int i_return = 0;
- playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( p_playlist == NULL )
- return 0;
+ playlist_item_t *p_item = NULL;
+ playlist_t * p_playlist = pl_Yield( VLCIntf );
if( outlineView != o_outline_view )
{
vlc_object_release( p_playlist );
if( item == nil )
{
/* root object */
- if( p_playlist->p_root_category )
- {
- i_return = p_playlist->p_root_category->i_children;
- }
+ p_item = p_playlist->p_root_category;
}
else
{
- playlist_item_t *p_item = (playlist_item_t *)[item pointerValue];
- if( p_item )
- i_return = p_item->i_children;
+ p_item = (playlist_item_t *)[item pointerValue];
}
+ if( p_item )
+ i_return = p_item->i_children;
vlc_object_release( p_playlist );
if( i_return <= 0 )
/* return the child at index for the Obj-C pointer item */ /* DONE */
- (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item
{
- playlist_item_t *p_return = NULL;
- playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_item_t *p_return = NULL, *p_item = NULL;
NSValue *o_value;
-
- if( p_playlist == NULL )
- return nil;
+ playlist_t * p_playlist = pl_Yield( VLCIntf );
if( item == nil )
{
/* root object */
- if( p_playlist->p_root_category )
- {
- p_return = p_playlist->p_root_category->pp_children[index];
- }
+ p_item = p_playlist->p_root_category;
}
else
{
- playlist_item_t *p_item = (playlist_item_t *)[item pointerValue];
- if( p_item && index < p_item->i_children && index >= 0 )
- p_return = p_item->pp_children[index];
+ p_item = (playlist_item_t *)[item pointerValue];
}
-
+ if( p_item && index < p_item->i_children && index >= 0 )
+ p_return = p_item->pp_children[index];
+
vlc_object_release( p_playlist );
o_value = [o_outline_dict objectForKey:[NSString stringWithFormat: @"%p", p_return]];
+
if( o_value == nil )
{
o_value = [[NSValue valueWithPointer: p_return] retain];
+ msg_Err( VLCIntf, "missing playlist item's pointer value" );
}
return o_value;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
{
int i_return = 0;
- playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( p_playlist == NULL )
- return NO;
+ playlist_t *p_playlist = pl_Yield( VLCIntf );
if( item == nil )
{
}
vlc_object_release( p_playlist );
- if( i_return <= 0 )
- return NO;
- else
- return YES;
+ return (i_return > 0);
}
/* retrieve the string values for the cells */
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)o_tc byItem:(id)item
{
id o_value = nil;
- intf_thread_t *p_intf = VLCIntf;
- playlist_t *p_playlist;
playlist_item_t *p_item;
-
- if( item == nil || ![item isKindOfClass: [NSValue class]] ) return( @"error" );
-
- p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( p_playlist == NULL )
+
+ /* For error handling */
+ static BOOL attempted_reload = NO;
+
+ if( item == nil || ![item isKindOfClass: [NSValue class]] )
{
- return( @"error" );
+ /* Attempt to fix the error by asking for a data redisplay
+ * This might cause infinite loop, so add a small check */
+ if( !attempted_reload )
+ {
+ attempted_reload = YES;
+ [outlineView reloadData];
+ }
+ return @"error" ;
}
-
+
p_item = (playlist_item_t *)[item pointerValue];
-
- if( p_item == NULL )
+ if( !p_item || !p_item->p_input )
{
- vlc_object_release( p_playlist );
- return( @"error");
+ /* Attempt to fix the error by asking for a data redisplay
+ * This might cause infinite loop, so add a small check */
+ if( !attempted_reload )
+ {
+ attempted_reload = YES;
+ [outlineView reloadData];
+ }
+ return @"error";
}
+
+ attempted_reload = NO;
if( [[o_tc identifier] isEqualToString:@"1"] )
{
- o_value = [NSString stringWithUTF8String:
- p_item->p_input->psz_name];
- if( o_value == NULL )
- o_value = [NSString stringWithCString:
- p_item->p_input->psz_name];
- }
- else if( [[o_tc identifier] isEqualToString:@"2"] )
- {
- char *psz_temp;
- psz_temp = vlc_input_item_GetInfo( p_item->p_input ,_("Meta-information"),_("Artist") );
-
- if( psz_temp == NULL )
- o_value = @"";
- else
+ /* sanity check to prevent the NSString class from crashing */
+ char *psz_title = input_item_GetTitle( p_item->p_input );
+ if( !EMPTY_STR( psz_title ) )
{
- o_value = [NSString stringWithUTF8String: psz_temp];
+ o_value = [NSString stringWithUTF8String: psz_title];
if( o_value == NULL )
+ o_value = [NSString stringWithCString: psz_title];
+ }
+ else
+ {
+ char *psz_name = input_item_GetName( p_item->p_input );
+ if( psz_name != NULL )
{
- o_value = [NSString stringWithCString: psz_temp];
+ o_value = [NSString stringWithUTF8String: psz_name];
+ if( o_value == NULL )
+ o_value = [NSString stringWithCString: psz_name];
}
- free( psz_temp );
+ free( psz_name );
}
+ free( psz_title );
}
- else if( [[o_tc identifier] isEqualToString:@"3"] )
+ else
{
- char psz_duration[MSTRTIME_MAX_SIZE];
- mtime_t dur = p_item->p_input->i_duration;
- if( dur != -1 )
+ char *psz_artist = input_item_GetArtist( p_item->p_input );
+ if( [[o_tc identifier] isEqualToString:@"2"] && !EMPTY_STR( psz_artist ) )
{
- secstotimestr( psz_duration, dur/1000000 );
- o_value = [NSString stringWithUTF8String: psz_duration];
+ o_value = [NSString stringWithUTF8String: psz_artist];
+ if( o_value == NULL )
+ o_value = [NSString stringWithCString: psz_artist];
}
- else
+ else if( [[o_tc identifier] isEqualToString:@"3"] )
{
- o_value = @"-:--:--";
+ char psz_duration[MSTRTIME_MAX_SIZE];
+ mtime_t dur = input_item_GetDuration( p_item->p_input );
+ if( dur != -1 )
+ {
+ secstotimestr( psz_duration, dur/1000000 );
+ o_value = [NSString stringWithUTF8String: psz_duration];
+ }
+ else
+ {
+ o_value = @"-:--:--";
+ }
}
+ free( psz_artist );
}
- vlc_object_release( p_playlist );
return( o_value );
}
@end
+/*****************************************************************************
+ * extension to NSOutlineView's interface to fix compilation warnings
+ * and let us access these 2 functions properly
+ * this uses a private Apple-API, but works fine on all current OSX releases
+ * keep checking for compatiblity with future releases though
+ *****************************************************************************/
+
+@interface NSOutlineView (UndocumentedSortImages)
++ (NSImage *)_defaultTableHeaderSortImage;
++ (NSImage *)_defaultTableHeaderReverseSortImage;
+@end
+
+
/*****************************************************************************
* VLCPlaylist implementation
*****************************************************************************/
- (void)awakeFromNib
{
- playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t * p_playlist = pl_Yield( VLCIntf );
vlc_list_t *p_list = vlc_list_find( p_playlist, VLC_OBJECT_MODULE,
FIND_ANYWHERE );
@"VLCPlaylistItemPboardType", nil]];
[o_outline_view setIntercellSpacing: NSMakeSize (0.0, 1.0)];
-/* We need to check whether _defaultTableHeaderSortImage exists, since it
-belongs to an Apple hidden private API, and then can "disapear" at any time*/
-
- if( [[NSOutlineView class] respondsToSelector:@selector(_defaultTableHeaderSortImage)] )
- {
- o_ascendingSortingImage = [[NSOutlineView class] _defaultTableHeaderSortImage];
- }
- else
- {
- o_ascendingSortingImage = nil;
- }
-
- if( [[NSOutlineView class] respondsToSelector:@selector(_defaultTableHeaderReverseSortImage)] )
- {
- o_descendingSortingImage = [[NSOutlineView class] _defaultTableHeaderReverseSortImage];
- }
- else
- {
- o_descendingSortingImage = nil;
- }
+ /* this uses private Apple API which works fine until 10.4,
+ * but keep checking in the future!
+ * These methods are being added artificially to NSOutlineView's interface above */
+ o_ascendingSortingImage = [[NSOutlineView class] _defaultTableHeaderSortImage];
+ o_descendingSortingImage = [[NSOutlineView class] _defaultTableHeaderReverseSortImage];
o_tc_sortColumn = nil;
for( i_index = 0; i_index < p_list->i_count; i_index++ )
{
- NSMenuItem * o_lmi;
- module_t * p_parser = (module_t *)p_list->p_values[i_index].p_object ;
+ vlc_bool_t b_enabled;
+ char *objectname;
+ NSMenuItem *o_lmi;
+ module_t *p_parser = (module_t *)p_list->p_values[i_index].p_object ;
if( !strcmp( p_parser->psz_capability, "services_discovery" ) )
{
- /* create the menu entries used in the playlist menu */
+ /* Check for submodules */
+ int i = -1;
+ while( p_parser->pp_shortcuts[++i] != NULL ); i--;
+
+ /* Check whether to enable these menuitems */
+ objectname = i>=0 ? (char *)p_parser->pp_shortcuts[i] : (char *)p_parser->psz_object_name;
+ b_enabled = playlist_IsServicesDiscoveryLoaded( p_playlist, objectname );
+
+ /* Create the menu entries used in the playlist menu */
o_lmi = [[o_mi_services submenu] addItemWithTitle:
[NSString stringWithUTF8String:
p_parser->psz_longname ? p_parser->psz_longname :
( p_parser->psz_shortname ? p_parser->psz_shortname:
- p_parser->psz_object_name)]
+ objectname)]
action: @selector(servicesChange:)
keyEquivalent: @""];
[o_lmi setTarget: self];
- [o_lmi setRepresentedObject:
- [NSString stringWithCString: p_parser->psz_object_name]];
- if( playlist_IsServicesDiscoveryLoaded( p_playlist,
- p_parser->psz_object_name ) )
- [o_lmi setState: NSOnState];
-
- /* create the menu entries for the main menu */
+ [o_lmi setRepresentedObject: [NSString stringWithCString: objectname]];
+ if( b_enabled ) [o_lmi setState: NSOnState];
+
+ /* Create the menu entries for the main menu */
o_lmi = [[o_mm_mi_services submenu] addItemWithTitle:
[NSString stringWithUTF8String:
p_parser->psz_longname ? p_parser->psz_longname :
( p_parser->psz_shortname ? p_parser->psz_shortname:
- p_parser->psz_object_name)]
+ objectname)]
action: @selector(servicesChange:)
keyEquivalent: @""];
[o_lmi setTarget: self];
- [o_lmi setRepresentedObject:
- [NSString stringWithCString: p_parser->psz_object_name]];
- if( playlist_IsServicesDiscoveryLoaded( p_playlist,
- p_parser->psz_object_name ) )
- [o_lmi setState: NSOnState];
+ [o_lmi setRepresentedObject: [NSString stringWithCString:objectname]];
+ if( b_enabled ) [o_lmi setState: NSOnState];
}
}
vlc_list_release( p_list );
[o_status_field setStringValue: [NSString stringWithFormat:
_NS("No items in the playlist")]];
- [o_random_ckb setTitle: _NS("Random")];
#if 0
[o_search_button setTitle: _NS("Search")];
#endif
[o_search_field setToolTip: _NS("Search in Playlist")];
- [[o_loop_popup itemAtIndex:0] setTitle: _NS("Standard Play")];
- [[o_loop_popup itemAtIndex:1] setTitle: _NS("Repeat One")];
- [[o_loop_popup itemAtIndex:2] setTitle: _NS("Repeat All")];
[o_mi_addNode setTitle: _NS("Add Folder to Playlist")];
[o_save_accessory_text setStringValue: _NS("File Format:")];
[[[[VLCMain sharedInstance] getWizard] getPlaylistWizard] reloadOutlineView];
[[[[VLCMain sharedInstance] getBookmarks] getDataTable] reloadData];
- playlist_t *p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if(! p_playlist )
- return;
+ playlist_t *p_playlist = pl_Yield( VLCIntf );
- if( p_playlist->i_size >= 2 )
+ if( playlist_CurrentSize( p_playlist ) >= 2 )
{
[o_status_field setStringValue: [NSString stringWithFormat:
- _NS("%i items in the playlist"), p_playlist->i_size]];
+ _NS("%i items in the playlist"),
+ playlist_CurrentSize( p_playlist )]];
}
else
{
- if( p_playlist->i_size == 0 )
- {
+ if( playlist_IsEmpty( p_playlist ) )
[o_status_field setStringValue: _NS("No items in the playlist")];
- }
else
- {
[o_status_field setStringValue: _NS("1 item in the playlist")];
- }
}
vlc_object_release( p_playlist );
}
- (void)playModeUpdated
{
- playlist_t *p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t *p_playlist = pl_Yield( VLCIntf );
vlc_value_t val, val2;
- if( p_playlist == NULL )
- {
- return;
- }
-
var_Get( p_playlist, "loop", &val2 );
var_Get( p_playlist, "repeat", &val );
if( val.b_bool == VLC_TRUE )
{
- [o_loop_popup selectItemAtIndex: 1];
+ [[[VLCMain sharedInstance] getControls] repeatOne];
}
else if( val2.b_bool == VLC_TRUE )
{
- [o_loop_popup selectItemAtIndex: 2];
+ [[[VLCMain sharedInstance] getControls] repeatAll];
}
else
{
- [o_loop_popup selectItemAtIndex: 0];
+ [[[VLCMain sharedInstance] getControls] repeatOff];
}
- var_Get( p_playlist, "random", &val );
- [o_random_ckb setState: val.b_bool];
+ [[[VLCMain sharedInstance] getControls] shuffle];
vlc_object_release( p_playlist );
}
int i_row;
unsigned int j;
- playlist_t *p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t *p_playlist = pl_Yield( VLCIntf );
playlist_item_t *p_item, *p_temp_item;
NSMutableArray *o_array = [NSMutableArray array];
- if( p_playlist == NULL )
- return;
-
p_item = p_playlist->status.p_item;
if( p_item == NULL )
{
[NSString stringWithFormat: @"%p",
[[o_array objectAtIndex:j] pointerValue]]] ) != nil )
{
- msg_Err( p_playlist, "o_item: %p", o_item );
[o_outline_view expandItem: o_item];
}
[o_outline_view selectRow: i_row byExtendingSelection: NO];
[o_outline_view scrollRowToVisible: i_row];
- vlc_object_release(p_playlist);
+ vlc_object_release( p_playlist );
/* update our info-panel to reflect the new item */
[[[VLCMain sharedInstance] getInfo] updatePanel];
checkItemExistence:(BOOL)b_check
{
- playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t * p_playlist = pl_Yield( VLCIntf );
playlist_item_t *p_temp_item = p_item;
- if( p_playlist == NULL )
- {
- return NO;
- }
-
if( p_node == p_item )
{
vlc_object_release(p_playlist);
/* Since outlineView: willDisplayCell:... may call this function with
p_items that don't exist anymore, first check if the item is still
in the playlist. Any cleaner solution welcomed. */
- for( i = 0; i < p_playlist->i_all_size; i++ )
+ for( i = 0; i < p_playlist->all_items.i_size; i++ )
{
- if( p_playlist->pp_all_items[i] == p_item ) break;
- else if ( i == p_playlist->i_all_size - 1 )
+ if( ARRAY_VAL( p_playlist->all_items, i) == p_item ) break;
+ else if ( i == p_playlist->all_items.i_size - 1 )
{
vlc_object_release( p_playlist );
vlc_mutex_unlock( &p_playlist->object_lock );
- (IBAction)savePlaylist:(id)sender
{
intf_thread_t * p_intf = VLCIntf;
- playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t * p_playlist = pl_Yield( p_intf );
NSSavePanel *o_save_panel = [NSSavePanel savePanel];
NSString * o_name = [NSString stringWithFormat: @"%@", _NS("Untitled")];
{
o_real_filename = o_filename;
}
- playlist_Export( p_playlist,
- [o_real_filename fileSystemRepresentation],
+ playlist_Export( p_playlist,
+ [o_real_filename fileSystemRepresentation],
p_playlist->p_local_category, "export-xspf" );
}
else
{
o_real_filename = o_filename;
}
- playlist_Export( p_playlist,
+ playlist_Export( p_playlist,
[o_real_filename fileSystemRepresentation],
p_playlist->p_local_category, "export-m3u" );
}
- (IBAction)playItem:(id)sender
{
intf_thread_t * p_intf = VLCIntf;
- playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t * p_playlist = pl_Yield( p_intf );
- if( p_playlist != NULL )
- {
- playlist_item_t *p_item;
- playlist_item_t *p_node = NULL;
+ playlist_item_t *p_item;
+ playlist_item_t *p_node = NULL;
- p_item = [[o_outline_view itemAtRow:[o_outline_view selectedRow]] pointerValue];
+ p_item = [[o_outline_view itemAtRow:[o_outline_view selectedRow]] pointerValue];
- if( p_item )
+ if( p_item )
+ {
+ if( p_item->i_children == -1 )
{
- if( p_item->i_children == -1 )
- {
- p_node = p_item->p_parent;
+ p_node = p_item->p_parent;
+ }
+ else
+ {
+ p_node = p_item;
+ if( p_node->i_children > 0 && p_node->pp_children[0]->i_children == -1 )
+ {
+ p_item = p_node->pp_children[0];
}
else
{
- p_node = p_item;
- if( p_node->i_children > 0 && p_node->pp_children[0]->i_children == -1 )
- {
- p_item = p_node->pp_children[0];
- }
- else
- {
- p_item = NULL;
- }
+ p_item = NULL;
}
- playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, 0, p_node, p_item );
}
- vlc_object_release( p_playlist );
+ playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, VLC_TRUE, p_node, p_item );
}
+ vlc_object_release( p_playlist );
}
/* When called retrieves the selected outlineview row and plays that node or item */
int i_count;
NSMutableArray *o_to_preparse;
intf_thread_t * p_intf = VLCIntf;
- playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
-
+ playlist_t * p_playlist = pl_Yield( p_intf );
+
o_to_preparse = [NSMutableArray arrayWithArray:[[o_outline_view selectedRowEnumerator] allObjects]];
i_count = [o_to_preparse count];
- if( p_playlist != NULL )
+ int i, i_row;
+ NSNumber *o_number;
+ playlist_item_t *p_item = NULL;
+
+ for( i = 0; i < i_count; i++ )
{
- int i, i_row;
- NSNumber *o_number;
- playlist_item_t *p_item = NULL;
+ o_number = [o_to_preparse lastObject];
+ i_row = [o_number intValue];
+ p_item = [[o_outline_view itemAtRow:i_row] pointerValue];
+ [o_to_preparse removeObject: o_number];
+ [o_outline_view deselectRow: i_row];
- for( i = 0; i < i_count; i++ )
+ if( p_item )
{
- o_number = [o_to_preparse lastObject];
- i_row = [o_number intValue];
- p_item = [[o_outline_view itemAtRow:i_row] pointerValue];
- [o_to_preparse removeObject: o_number];
- [o_outline_view deselectRow: i_row];
-
- if( p_item )
+ if( p_item->i_children == -1 )
{
- if( p_item->i_children == -1 )
- {
- playlist_PreparseEnqueue( p_playlist, p_item->p_input );
- }
- else
- {
- msg_Dbg( p_intf, "preparse of nodes not yet implemented" );
- }
+ playlist_PreparseEnqueue( p_playlist, p_item->p_input );
+ }
+ else
+ {
+ msg_Dbg( p_intf, "preparse of nodes not yet implemented" );
}
}
- vlc_object_release( p_playlist );
}
+ vlc_object_release( p_playlist );
[self playlistUpdated];
}
{
NSMenuItem *o_mi = (NSMenuItem *)sender;
NSString *o_string = [o_mi representedObject];
- playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( !playlist_IsServicesDiscoveryLoaded( p_playlist, [o_string cString] ) )
- playlist_ServicesDiscoveryAdd( p_playlist, [o_string cString] );
+ playlist_t * p_playlist = pl_Yield( VLCIntf );
+ if( !playlist_IsServicesDiscoveryLoaded( p_playlist, [o_string UTF8String] ) )
+ playlist_ServicesDiscoveryAdd( p_playlist, [o_string UTF8String] );
else
- playlist_ServicesDiscoveryRemove( p_playlist, [o_string cString] );
+ playlist_ServicesDiscoveryRemove( p_playlist, [o_string UTF8String] );
[o_mi setState: playlist_IsServicesDiscoveryLoaded( p_playlist,
- [o_string cString] ) ? YES : NO];
+ [o_string UTF8String] ) ? YES : NO];
vlc_object_release( p_playlist );
[self playlistUpdated];
playlist_t * p_playlist;
intf_thread_t * p_intf = VLCIntf;
- p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ p_playlist = pl_Yield( p_intf );
- if ( p_playlist == NULL )
- {
- return;
- }
o_to_delete = [NSMutableArray arrayWithArray:[[o_outline_view selectedRowEnumerator] allObjects]];
i_count = [o_to_delete count];
}
else
{
- playlist_LockDelete( p_playlist, p_item->i_id );
+ playlist_DeleteFromInput( p_playlist, p_item->p_input->i_id, VLC_FALSE );
}
}
[self playlistUpdated];
- (IBAction)sortNodeByAuthor:(id)sender
{
- [self sortNode: SORT_AUTHOR];
+ [self sortNode: SORT_ARTIST];
}
- (void)sortNode:(int)i_mode
{
- playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t * p_playlist = pl_Yield( VLCIntf );
playlist_item_t * p_item;
- if (p_playlist == NULL)
- {
- return;
- }
-
if( [o_outline_view selectedRow] > -1 )
{
p_item = [[o_outline_view itemAtRow: [o_outline_view selectedRow]]
- (input_item_t *)createItem:(NSDictionary *)o_one_item
{
intf_thread_t * p_intf = VLCIntf;
- playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t * p_playlist = pl_Yield( p_intf );
- if( p_playlist == NULL )
- {
- return NULL;
- }
input_item_t *p_input;
int i;
BOOL b_rem = FALSE, b_dir = FALSE;
{
for( i = 0; i < (int)[o_options count]; i++ )
{
- vlc_input_item_AddOption( p_input, strdup( [[o_options objectAtIndex:i] UTF8String] ) );
+ input_ItemAddOption( p_input, strdup( [[o_options objectAtIndex:i] UTF8String] ) );
}
}
- (void)appendArray:(NSArray*)o_array atPos:(int)i_position enqueue:(BOOL)b_enqueue
{
int i_item;
- playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( p_playlist == NULL )
- {
- return;
- }
+ playlist_t * p_playlist = pl_Yield( VLCIntf );
for( i_item = 0; i_item < (int)[o_array count]; i_item++ )
{
}
/* Add the item */
- playlist_PlaylistAddInput( p_playlist, p_input, PLAYLIST_INSERT,
- i_position == -1 ? PLAYLIST_END : i_position + i_item );
+ playlist_AddInput( p_playlist, p_input, PLAYLIST_INSERT,
+ i_position == -1 ? PLAYLIST_END : i_position + i_item, VLC_TRUE,
+ VLC_FALSE );
if( i_item == 0 && !b_enqueue )
{
playlist_item_t *p_item;
- p_item = playlist_ItemGetByInput( p_playlist, p_input );
- playlist_Control( p_playlist, PLAYLIST_ITEMPLAY, p_item );
+ p_item = playlist_ItemGetByInput( p_playlist, p_input, VLC_TRUE );
+ playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, VLC_TRUE, p_item );
}
else
{
playlist_item_t *p_item;
- p_item = playlist_ItemGetByInput( p_playlist, p_input );
- playlist_Control( p_playlist, PLAYLIST_PREPARSE, p_item );
+ p_item = playlist_ItemGetByInput( p_playlist, p_input, VLC_TRUE );
+ playlist_Control( p_playlist, PLAYLIST_SKIP, VLC_TRUE, p_item );
}
}
[self playlistUpdated];
- (void)appendNodeArray:(NSArray*)o_array inNode:(playlist_item_t *)p_node atPos:(int)i_position enqueue:(BOOL)b_enqueue
{
int i_item;
- playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( p_playlist == NULL )
- {
- return;
- }
+ playlist_t * p_playlist = pl_Yield( VLCIntf );
for( i_item = 0; i_item < (int)[o_array count]; i_item++ )
{
playlist_NodeAddInput( p_playlist, p_input, p_node,
PLAYLIST_INSERT,
i_position == -1 ?
- PLAYLIST_END : i_position + i_item );
+ PLAYLIST_END : i_position + i_item, VLC_FALSE );
if( i_item == 0 && !b_enqueue )
{
playlist_item_t *p_item;
- p_item = playlist_ItemGetByInput( p_playlist, p_input );
- playlist_Control( p_playlist, PLAYLIST_ITEMPLAY, p_item );
+ p_item = playlist_ItemGetByInput( p_playlist, p_input, VLC_TRUE );
+ playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, VLC_TRUE, p_item );
}
else
{
playlist_item_t *p_item;
- p_item = playlist_ItemGetByInput( p_playlist, p_input );
- playlist_Control( p_playlist, PLAYLIST_PREPARSE, p_item );
+ p_item = playlist_ItemGetByInput( p_playlist, p_input, VLC_TRUE );
+ playlist_Control( p_playlist, PLAYLIST_SKIP, VLC_TRUE, p_item );
}
}
[self playlistUpdated];
vlc_object_release( p_playlist );
}
-- (IBAction)handlePopUp:(id)sender
-
-{
- intf_thread_t * p_intf = VLCIntf;
- vlc_value_t val1,val2;
- playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( p_playlist == NULL )
- {
- return;
- }
-
- switch( [o_loop_popup indexOfSelectedItem] )
- {
- case 1:
-
- val1.b_bool = 0;
- var_Set( p_playlist, "loop", val1 );
- val1.b_bool = 1;
- var_Set( p_playlist, "repeat", val1 );
- vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat One" ) );
- break;
-
- case 2:
- val1.b_bool = 0;
- var_Set( p_playlist, "repeat", val1 );
- val1.b_bool = 1;
- var_Set( p_playlist, "loop", val1 );
- vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat All" ) );
- break;
-
- default:
- var_Get( p_playlist, "repeat", &val1 );
- var_Get( p_playlist, "loop", &val2 );
- if( val1.b_bool || val2.b_bool )
- {
- val1.b_bool = 0;
- var_Set( p_playlist, "repeat", val1 );
- var_Set( p_playlist, "loop", val1 );
- vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) );
- }
- break;
- }
- vlc_object_release( p_playlist );
- [self playlistUpdated];
-}
-
- (NSMutableArray *)subSearchItem:(playlist_item_t *)p_item
{
- playlist_t *p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t *p_playlist = pl_Yield( VLCIntf );
playlist_item_t *p_selected_item;
int i_current, i_selected_row;
- if( !p_playlist )
- return NULL;
-
i_selected_row = [o_outline_view selectedRow];
if (i_selected_row < 0)
i_selected_row = 0;
vlc_mutex_lock( &p_playlist->object_lock );
o_current_name = [NSString stringWithUTF8String:
p_item->pp_children[i_current]->p_input->psz_name];
- psz_temp = vlc_input_item_GetInfo( p_item->p_input ,
+ psz_temp = input_ItemGetInfo( p_item->p_input ,
_("Meta-information"),_("Artist") );
o_current_author = [NSString stringWithUTF8String: psz_temp];
free( psz_temp);
- (IBAction)searchItem:(id)sender
{
- playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t * p_playlist = pl_Yield( VLCIntf );
id o_result;
unsigned int i;
b_selected_item_met = NO;
- if( p_playlist == NULL )
- return;
-
/*First, only search after the selected item:*
*(b_selected_item_met = NO) */
o_result = [self subSearchItem:p_playlist->p_root_category];
int i_mode = 0, i_type;
intf_thread_t *p_intf = VLCIntf;
- playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( p_playlist == NULL )
- {
- return;
- }
+ playlist_t *p_playlist = pl_Yield( p_intf );
/* Check whether the selected table column header corresponds to a
sortable table column*/
}
else if( o_tc == o_tc_author )
{
- i_mode = SORT_AUTHOR;
+ i_mode = SORT_ARTIST;
}
if( b_isSortDescending )
forTableColumn:(NSTableColumn *)tableColumn
item:(id)item
{
- playlist_t *p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t *p_playlist = pl_Yield( VLCIntf );
id o_playing_item;
- if( !p_playlist ) return;
-
o_playing_item = [o_outline_dict objectForKey:
[NSString stringWithFormat:@"%p", p_playlist->status.p_item]];
- (IBAction)addNode:(id)sender
{
+ /* we have to create a new thread here because otherwise we would block the
+ * interface since the interaction-stuff and this code would run in the same
+ * thread */
+ [NSThread detachNewThreadSelector: @selector(addNodeThreadedly)
+ toTarget: self withObject:nil];
+ [self playlistUpdated];
+}
+
+- (void)addNodeThreadedly
+{
+ NSAutoreleasePool * ourPool = [[NSAutoreleasePool alloc] init];
+
/* simply adds a new node to the end of the playlist */
- playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( !p_playlist )
+ playlist_t * p_playlist = pl_Yield( VLCIntf );
+ vlc_thread_set_priority( p_playlist, VLC_THREAD_PRIORITY_LOW );
+
+ int ret_v;
+ char *psz_name = NULL;
+ playlist_item_t * p_item;
+ ret_v = intf_UserStringInput( p_playlist, _("New Node"),
+ _("Please enter a name for the new node."), &psz_name );
+
+ if( psz_name != NULL && psz_name != "" )
+ p_item = playlist_NodeCreate( p_playlist, psz_name,
+ p_playlist->p_local_category, 0 );
+ else if(! config_GetInt( p_playlist, "interact" ) )
{
- return;
+ /* in case that the interaction is disabled, just give it a bogus name */
+ p_item = playlist_NodeCreate( p_playlist, _("Empty Folder"),
+ p_playlist->p_local_category, 0 );
}
- playlist_item_t * p_item = playlist_NodeCreate( p_playlist,
- _("Empty Folder"), p_playlist->p_local_category );
-
if(! p_item )
- msg_Warn( VLCIntf, "node creation failed" );
+ msg_Warn( VLCIntf, "node creation failed or cancelled by user" );
vlc_object_release( p_playlist );
- [self playlistUpdated];
+ [ourPool release];
}
@end
- (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item
{
id o_value = [super outlineView: outlineView child: index ofItem: item];
- playlist_t *p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t *p_playlist = pl_Yield( VLCIntf );
- if( !p_playlist ) return nil;
-
- if( p_playlist->i_size >= 2 )
+ if( playlist_CurrentSize( p_playlist ) >= 2 )
{
[o_status_field setStringValue: [NSString stringWithFormat:
- _NS("%i items in the playlist"), p_playlist->i_size]];
+ _NS("%i items in the playlist"),
+ playlist_CurrentSize( p_playlist )]];
}
else
{
- if( p_playlist->i_size == 0 )
+ if( playlist_IsEmpty( p_playlist ) )
{
[o_status_field setStringValue: _NS("No items in the playlist")];
}
[o_outline_dict setObject:o_value forKey:[NSString stringWithFormat:@"%p",
[o_value pointerValue]]];
-
+ msg_Dbg( VLCIntf, "adding item %p", [o_value pointerValue] );
return o_value;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pboard
{
unsigned int i;
- playlist_t *p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t *p_playlist = pl_Yield( VLCIntf );
/* First remove the items that were moved during the last drag & drop
operation */
[o_items_array removeAllObjects];
[o_nodes_array removeAllObjects];
- if( !p_playlist ) return NO;
-
for( i = 0 ; i < [items count] ; i++ )
{
id o_item = [items objectAtIndex: i];
- (NSDragOperation)outlineView:(NSOutlineView *)outlineView validateDrop:(id <NSDraggingInfo>)info proposedItem:(id)item proposedChildIndex:(int)index
{
- playlist_t *p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t *p_playlist = pl_Yield( VLCIntf );
NSPasteboard *o_pasteboard = [info draggingPasteboard];
if( !p_playlist ) return NSDragOperationNone;
}
}
+ /* Don't allow on drop on playlist root element's child */
+ if( !item && index != NSOutlineViewDropOnItemIndex)
+ {
+ vlc_object_release( p_playlist );
+ return NSDragOperationNone;
+ }
+
/* We refuse to drop an item in anything else than a child of the General
Node. We still accept items that would be root nodes of the outlineview
however, to allow drop in an empty playlist. */
return NSDragOperationNone;
}
}
- vlc_object_release(p_playlist);
+ vlc_object_release( p_playlist );
return NSDragOperationMove;
}
/* Drop from the Finder */
else if( [[o_pasteboard types] containsObject: NSFilenamesPboardType] )
{
- vlc_object_release(p_playlist);
+ vlc_object_release( p_playlist );
return NSDragOperationGeneric;
}
- vlc_object_release(p_playlist);
+ vlc_object_release( p_playlist );
return NSDragOperationNone;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id <NSDraggingInfo>)info item:(id)item childIndex:(int)index
{
- playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
+ playlist_t * p_playlist = pl_Yield( VLCIntf );
NSPasteboard *o_pasteboard = [info draggingPasteboard];
- if( !p_playlist ) return NO;
-
/* Drag & Drop inside the playlist */
if( [[o_pasteboard types] containsObject: @"VLCPlaylistItemPboardType"] )
{
[o_outline_view selectRow: i_row byExtendingSelection: NO];
[o_outline_view scrollRowToVisible: i_row];
- vlc_object_release(p_playlist);
+ vlc_object_release( p_playlist );
return YES;
}