X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fplaylist.m;h=9f800961a19b265a5c4d33beefe86a49787ec010;hb=6ee1e193fd896ab9a4729fde14f009d9ce629815;hp=0d0b5450d61b51ad0ab2025893f813f089f89509;hpb=f0dc54ba5d8a5219692b5fac17fe26a4eb11eadd;p=vlc diff --git a/modules/gui/macosx/playlist.m b/modules/gui/macosx/playlist.m index 0d0b5450d6..9f800961a1 100644 --- a/modules/gui/macosx/playlist.m +++ b/modules/gui/macosx/playlist.m @@ -53,7 +53,7 @@ #import /***************************************************************************** - * VLCPlaylistView implementation + * VLCPlaylistView implementation *****************************************************************************/ @implementation VLCPlaylistView @@ -190,11 +190,11 @@ } else { - p_item = (playlist_item_t *)[item pointerValue]; + 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]]; @@ -252,7 +252,7 @@ } return @"error" ; } - + p_item = (playlist_item_t *)[item pointerValue]; if( !p_item || !p_item->p_input ) { @@ -265,43 +265,56 @@ } return @"error"; } - + attempted_reload = NO; if( [[o_tc identifier] isEqualToString:@"1"] ) { /* sanity check to prevent the NSString class from crashing */ - if( p_item->p_input->psz_name != NULL ) + char *psz_title = input_item_GetTitle( p_item->p_input ); + if( !EMPTY_STR( psz_title ) ) { - o_value = [NSString stringWithUTF8String: - p_item->p_input->psz_name]; + o_value = [NSString stringWithUTF8String: psz_title]; if( o_value == NULL ) - o_value = [NSString stringWithCString: - p_item->p_input->psz_name]; + o_value = [NSString stringWithCString: psz_title]; } + else + { + char *psz_name = input_item_GetName( p_item->p_input ); + if( psz_name != NULL ) + { + o_value = [NSString stringWithUTF8String: psz_name]; + if( o_value == NULL ) + o_value = [NSString stringWithCString: psz_name]; + } + free( psz_name ); + } + free( psz_title ); } - else if( [[o_tc identifier] isEqualToString:@"2"] && p_item->p_input->p_meta && - p_item->p_input->p_meta->psz_artist && *p_item->p_input->p_meta->psz_artist ) - { - o_value = [NSString stringWithUTF8String: - p_item->p_input->p_meta->psz_artist]; - if( o_value == NULL ) - o_value = [NSString stringWithCString: - p_item->p_input->p_meta->psz_artist]; - } - 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 ); } return( o_value ); @@ -372,7 +385,7 @@ @"VLCPlaylistItemPboardType", nil]]; [o_outline_view setIntercellSpacing: NSMakeSize (0.0, 1.0)]; - /* this uses private Apple API which works fine until 10.4, + /* 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]; @@ -396,7 +409,7 @@ /* 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: @@ -408,7 +421,7 @@ [o_lmi setTarget: self]; [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: @@ -486,7 +499,7 @@ { [o_status_field setStringValue: [NSString stringWithFormat: _NS("%i items in the playlist"), - playlist_CurrentSize( p_playlist )]]; + playlist_CurrentSize( p_playlist )]]; } else { @@ -703,8 +716,8 @@ { 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 @@ -723,7 +736,7 @@ { o_real_filename = o_filename; } - playlist_Export( p_playlist, + playlist_Export( p_playlist, [o_real_filename fileSystemRepresentation], p_playlist->p_local_category, "export-m3u" ); } @@ -773,7 +786,7 @@ NSMutableArray *o_to_preparse; intf_thread_t * p_intf = VLCIntf; playlist_t * p_playlist = pl_Yield( p_intf ); - + o_to_preparse = [NSMutableArray arrayWithArray:[[o_outline_view selectedRowEnumerator] allObjects]]; i_count = [o_to_preparse count]; @@ -810,13 +823,13 @@ NSMenuItem *o_mi = (NSMenuItem *)sender; NSString *o_string = [o_mi representedObject]; playlist_t * p_playlist = pl_Yield( VLCIntf ); - if( !playlist_IsServicesDiscoveryLoaded( p_playlist, [o_string cString] ) ) - playlist_ServicesDiscoveryAdd( p_playlist, [o_string cString] ); + 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]; @@ -1027,19 +1040,19 @@ /* Add the item */ playlist_AddInput( p_playlist, p_input, PLAYLIST_INSERT, i_position == -1 ? PLAYLIST_END : i_position + i_item, VLC_TRUE, - VLC_FALSE ); + VLC_FALSE ); if( i_item == 0 && !b_enqueue ) { playlist_item_t *p_item; p_item = playlist_ItemGetByInput( p_playlist, p_input, VLC_TRUE ); - playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, VLC_TRUE, NULL, p_item ); + playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, VLC_TRUE, p_item ); } else { playlist_item_t *p_item; p_item = playlist_ItemGetByInput( p_playlist, p_input, VLC_TRUE ); - playlist_Control( p_playlist, PLAYLIST_PREPARSE, VLC_TRUE, p_item ); + playlist_Control( p_playlist, PLAYLIST_SKIP, VLC_TRUE, p_item ); } } [self playlistUpdated]; @@ -1075,13 +1088,13 @@ { playlist_item_t *p_item; p_item = playlist_ItemGetByInput( p_playlist, p_input, VLC_TRUE ); - playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, VLC_TRUE, NULL, p_item ); + playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, VLC_TRUE, p_item ); } else { playlist_item_t *p_item; p_item = playlist_ItemGetByInput( p_playlist, p_input, VLC_TRUE ); - playlist_Control( p_playlist, PLAYLIST_PREPARSE, VLC_TRUE, p_item ); + playlist_Control( p_playlist, PLAYLIST_SKIP, VLC_TRUE, p_item ); } } [self playlistUpdated]; @@ -1339,7 +1352,7 @@ /* 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) + [NSThread detachNewThreadSelector: @selector(addNodeThreadedly) toTarget: self withObject:nil]; [self playlistUpdated]; } @@ -1355,16 +1368,16 @@ int ret_v; char *psz_name = NULL; playlist_item_t * p_item; - ret_v = intf_UserStringInput( p_playlist, _("New Node"), + 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_item = playlist_NodeCreate( p_playlist, psz_name, p_playlist->p_local_category, 0 ); else if(! config_GetInt( p_playlist, "interact" ) ) { /* in case that the interaction is disabled, just give it a bogus name */ - p_item = playlist_NodeCreate( p_playlist, _("Empty Folder"), + p_item = playlist_NodeCreate( p_playlist, _("Empty Folder"), p_playlist->p_local_category, 0 ); } @@ -1388,7 +1401,7 @@ { [o_status_field setStringValue: [NSString stringWithFormat: _NS("%i items in the playlist"), - playlist_CurrentSize( p_playlist )]]; + playlist_CurrentSize( p_playlist )]]; } else { @@ -1474,6 +1487,13 @@ } } + /* 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. */