X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fplaylist.m;h=f3d62dd56f08d5f68b3038c120c05094c0666569;hb=93b2554ad95a5fec1d09909732bde5919be3b6b8;hp=269e513d5bdf5a42284bc6046f1adf6b68aab42b;hpb=7f12470415d98e9e0ac725f2bb96b5fa74ef27f1;p=vlc diff --git a/modules/gui/macosx/playlist.m b/modules/gui/macosx/playlist.m index 269e513d5b..f3d62dd56f 100644 --- a/modules/gui/macosx/playlist.m +++ b/modules/gui/macosx/playlist.m @@ -39,7 +39,6 @@ #include #include #include -#include #import "intf.h" #import "wizard.h" @@ -47,10 +46,14 @@ #import "playlistinfo.h" #import "playlist.h" #import "controls.h" -#import "vlc_osd.h" #import "misc.h" -#import +#import "sidebarview.h" + +#include #import +#import +#import + /***************************************************************************** * VLCPlaylistView implementation @@ -119,6 +122,11 @@ [o_outline_view setAllowsEmptySelection: NO]; [o_outline_view expandItem: [o_outline_view itemAtRow:0]]; + [o_outline_view_other setTarget: self]; + [o_outline_view_other setDelegate: self]; + [o_outline_view_other setDataSource: self]; + [o_outline_view_other setAllowsEmptySelection: NO]; + pl_Release( VLCIntf ); [self initStrings]; } @@ -128,6 +136,29 @@ [[o_tc_name headerCell] setStringValue:_NS("Name")]; [[o_tc_author headerCell] setStringValue:_NS("Author")]; [[o_tc_duration headerCell] setStringValue:_NS("Duration")]; + + [[o_tc_name_other headerCell] setStringValue:_NS("Name")]; + [[o_tc_author_other headerCell] setStringValue:_NS("Author")]; + [[o_tc_duration_other headerCell] setStringValue:_NS("Duration")]; +} + +- (void)swapPlaylists:(id)newList +{ + if(newList != o_outline_view) + { + id o_outline_view_temp = o_outline_view; + id o_tc_author_temp = o_tc_author; + id o_tc_duration_temp = o_tc_duration; + id o_tc_name_temp = o_tc_name; + o_outline_view = o_outline_view_other; + o_tc_author = o_tc_author_other; + o_tc_duration = o_tc_duration_other; + o_tc_name = o_tc_name_other; + o_outline_view_other = o_outline_view_temp; + o_tc_author_other = o_tc_author_temp; + o_tc_duration_other = o_tc_duration_temp; + o_tc_name_other = o_tc_name_temp; + } } - (NSOutlineView *)outlineView @@ -151,7 +182,7 @@ int i_return = 0; playlist_item_t *p_item = NULL; playlist_t * p_playlist = pl_Hold( VLCIntf ); - assert( outlineView == o_outline_view ); + //assert( outlineView == o_outline_view ); if( !item ) p_item = p_playlist->p_root_category; @@ -207,6 +238,7 @@ int i_return = 0; playlist_t *p_playlist = pl_Hold( VLCIntf ); + PL_LOCK; if( item == nil ) { /* root object */ @@ -221,6 +253,7 @@ if( p_item ) i_return = p_item->i_children; } + PL_UNLOCK; pl_Release( VLCIntf ); return (i_return >= 0); @@ -365,12 +398,18 @@ [super awakeFromNib]; [o_outline_view setDoubleAction: @selector(playItem:)]; + [o_outline_view_other setDoubleAction: @selector(playItem:)]; [o_outline_view registerForDraggedTypes: [NSArray arrayWithObjects: NSFilenamesPboardType, @"VLCPlaylistItemPboardType", nil]]; [o_outline_view setIntercellSpacing: NSMakeSize (0.0, 1.0)]; + [o_outline_view_other registerForDraggedTypes: + [NSArray arrayWithObjects: NSFilenamesPboardType, + @"VLCPlaylistItemPboardType", nil]]; + [o_outline_view_other setIntercellSpacing: NSMakeSize (0.0, 1.0)]; + /* This uses private Apple API which works fine until 10.5. * We need to keep checking in the future! * These methods are being added artificially to NSOutlineView's interface above */ @@ -448,8 +487,10 @@ [o_mi_services setTitle: _NS("Services discovery")]; [o_mm_mi_services setTitle: _NS("Services discovery")]; [o_status_field setStringValue: _NS("No items in the playlist")]; + [o_status_field_embed setStringValue: _NS("No items in the playlist")]; [o_search_field setToolTip: _NS("Search in Playlist")]; + [o_search_field_other setToolTip: _NS("Search in Playlist")]; [o_mi_addNode setTitle: _NS("Add Folder to Playlist")]; [o_save_accessory_text setStringValue: _NS("File Format:")]; @@ -458,6 +499,18 @@ [[o_save_accessory_popup itemAtIndex:2] setTitle: _NS("HTML Playlist")]; } +- (void)swapPlaylists:(id)newList +{ + if(newList != o_outline_view) + { + id o_search_field_temp = o_search_field; + o_search_field = o_search_field_other; + o_search_field_other = o_search_field_temp; + [super swapPlaylists:newList]; + [self playlistUpdated]; + } +} + - (void)playlistUpdated { /* Clear indications of any existing column sorting */ @@ -472,6 +525,7 @@ // TODO Find a way to keep the dict size to a minimum //[o_outline_dict removeAllObjects]; [o_outline_view reloadData]; + [o_sidebar updateSidebar:[self playingItem]]; [[[[VLCMain sharedInstance] wizard] playlistWizard] reloadOutlineView]; [[[[VLCMain sharedInstance] bookmarks] dataTable] reloadData]; @@ -483,13 +537,22 @@ [o_status_field setStringValue: [NSString stringWithFormat: _NS("%i items"), playlist_CurrentSize( p_playlist )]]; + [o_status_field_embed setStringValue: [NSString stringWithFormat: + _NS("%i items"), + playlist_CurrentSize( p_playlist )]]; } else { if( playlist_IsEmpty( p_playlist ) ) + { [o_status_field setStringValue: _NS("No items in the playlist")]; + [o_status_field_embed setStringValue: _NS("No items in the playlist")]; + } else + { [o_status_field setStringValue: _NS("1 item")]; + [o_status_field_embed setStringValue: _NS("1 item")]; + } } PL_UNLOCK; pl_Release( VLCIntf ); @@ -525,6 +588,9 @@ /* update the state of our Reveal-in-Finder menu items */ NSMutableString *o_mrl; char *psz_uri = input_item_GetURI( p_item->p_input ); + + [o_mi_revealInFinder setEnabled: NO]; + [o_mm_mi_revealInFinder setEnabled: NO]; if( psz_uri ) { o_mrl = [NSMutableString stringWithUTF8String: psz_uri]; @@ -538,11 +604,9 @@ { [o_mi_revealInFinder setEnabled: YES]; [o_mm_mi_revealInFinder setEnabled: YES]; - return; } + free( psz_uri ); } - [o_mi_revealInFinder setEnabled: NO]; - [o_mm_mi_revealInFinder setEnabled: NO]; if( [[VLCMain sharedInstance] isPlaylistCollapsed] == NO ) { @@ -582,6 +646,7 @@ [o_array insertObject: [NSValue valueWithPointer: p_temp_item] atIndex: 0]; p_temp_item = p_temp_item->p_parent; } + PL_UNLOCK; for( j = 0; j < [o_array count] - 1; j++ ) { @@ -592,10 +657,8 @@ { [o_outline_view expandItem: o_item]; } - } - PL_UNLOCK; pl_Release( VLCIntf ); } @@ -789,12 +852,47 @@ p_item = [[o_outline_view itemAtRow:[o_outline_view selectedRow]] pointerValue]; + PL_LOCK; if( p_item ) { if( p_item->i_children == -1 ) { 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_item = NULL; + } + } + playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, pl_Locked, p_node, p_item ); + } + PL_UNLOCK; + pl_Release( p_intf ); +} +- (void)playSidebarItem:(id)item +{ + intf_thread_t * p_intf = VLCIntf; + playlist_t * p_playlist = pl_Hold( p_intf ); + + playlist_item_t *p_item; + playlist_item_t *p_node = NULL; + + p_item = [item pointerValue]; + + if( p_item ) + { + if( p_item->i_children == -1 ) + { + p_node = p_item->p_parent; + } else { @@ -941,19 +1039,20 @@ p_playlist = pl_Hold( p_intf ); - PL_LOCK; for( int i = 0; i < i_count; i++ ) { o_number = [o_to_delete lastObject]; i_row = [o_number intValue]; id o_item = [o_outline_view itemAtRow: i_row]; + [o_outline_view deselectRow: i_row]; + + PL_LOCK; playlist_item_t *p_item = [o_item pointerValue]; #ifndef NDEBUG msg_Dbg( p_intf, "deleting item %i (of %i) with id \"%i\", pointerValue \"%p\" and %i children", i+1, i_count, p_item->p_input->i_id, [o_item pointerValue], p_item->i_children +1 ); #endif [o_to_delete removeObject: o_number]; - [o_outline_view deselectRow: i_row]; if( p_item->i_children != -1 ) //is a node and not an item @@ -969,8 +1068,12 @@ } else playlist_DeleteFromInput( p_playlist, p_item->p_input, pl_Locked ); + + PL_UNLOCK; + [o_outline_dict removeObjectForKey:[NSString stringWithFormat:@"%p", + [o_item pointerValue]]]; + [o_item release]; } - PL_UNLOCK; [self playlistUpdated]; pl_Release( p_intf ); @@ -1001,19 +1104,17 @@ p_item = p_playlist->p_root_category; } + PL_LOCK; if( p_item->i_children > -1 ) // the item is a node { - PL_LOCK; playlist_RecursiveNodeSort( p_playlist, p_item, i_mode, ORDER_NORMAL ); - PL_UNLOCK; } else { - PL_LOCK; playlist_RecursiveNodeSort( p_playlist, p_item->p_parent, i_mode, ORDER_NORMAL ); - PL_UNLOCK; } + PL_UNLOCK; pl_Release( VLCIntf ); [self playlistUpdated]; } @@ -1058,8 +1159,6 @@ } } } - /* If no name, then make a guess */ - if( !o_name) o_name = [[NSFileManager defaultManager] displayNameAtPath: o_uri]; if( [[NSFileManager defaultManager] fileExistsAtPath:o_uri isDirectory:&b_dir] && b_dir && [[NSWorkspace sharedWorkspace] getFileSystemInfoForPath: o_uri isRemovable: &b_rem @@ -1081,7 +1180,7 @@ o_uri = o_temp; } - p_input = input_item_New( p_playlist, [o_uri fileSystemRepresentation], [o_name UTF8String] ); + p_input = input_item_New( p_playlist, [o_uri fileSystemRepresentation], o_name ? [o_name UTF8String] : NULL ); if( !p_input ) { pl_Release( p_intf ); @@ -1092,7 +1191,7 @@ { for( i = 0; i < (int)[o_options count]; i++ ) { - input_item_AddOption( p_input, strdup( [[o_options objectAtIndex:i] UTF8String] ), + input_item_AddOption( p_input, [[o_options objectAtIndex:i] UTF8String], VLC_INPUT_OPTION_TRUSTED ); } } @@ -1309,7 +1408,7 @@ } if( i_row > -1 ) { - [o_outline_view selectRow:i_row byExtendingSelection: NO]; + [o_outline_view selectRowIndexes:[NSIndexSet indexSetWithIndex:i_row] byExtendingSelection:NO]; [o_outline_view scrollRowToVisible: i_row]; } pl_Release( VLCIntf ); @@ -1453,6 +1552,22 @@ pl_Release( VLCIntf ); } +- (id)playingItem +{ + playlist_t *p_playlist = pl_Hold( VLCIntf ); + + id o_playing_item; + + PL_LOCK; + o_playing_item = [o_outline_dict objectForKey: + [NSString stringWithFormat:@"%p", playlist_CurrentPlayingItem( p_playlist )]]; + PL_UNLOCK; + + pl_Release( VLCIntf ); + + return o_playing_item; +} + - (IBAction)addNode:(id)sender { playlist_t * p_playlist = pl_Hold( VLCIntf ); @@ -1482,16 +1597,21 @@ [o_status_field setStringValue: [NSString stringWithFormat: _NS("%i items"), playlist_CurrentSize( p_playlist )]]; + [o_status_field_embed setStringValue: [NSString stringWithFormat: + _NS("%i items"), + playlist_CurrentSize( p_playlist )]]; } else { if( playlist_IsEmpty( p_playlist ) ) { [o_status_field setStringValue: _NS("No items in the playlist")]; + [o_status_field_embed setStringValue: _NS("No items in the playlist")]; } else { [o_status_field setStringValue: _NS("1 item")]; + [o_status_field_embed setStringValue: _NS("1 item")]; } } PL_UNLOCK; @@ -1706,7 +1826,7 @@ } [o_outline_view deselectAll: self]; - [o_outline_view selectRow: i_row byExtendingSelection: NO]; + [o_outline_view selectRowIndexes:[NSIndexSet indexSetWithIndex:i_row] byExtendingSelection:NO]; [o_outline_view scrollRowToVisible: i_row]; pl_Release( VLCIntf );