playlist.m
来自「VLC媒体播放程序」· M 代码 · 共 729 行 · 第 1/2 页
M
729 行
int i_current = -1; NSString *o_current_name; NSString *o_current_author; intf_thread_t * p_intf = [NSApp getIntf]; playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist == NULL ) { return; } if( [o_table_view numberOfRows] < 1 ) { return; } if( [o_table_view selectedRow] == [o_table_view numberOfRows]-1 ) { i_current = -1; } else { i_current = [o_table_view selectedRow]; } do { i_current++; vlc_mutex_lock( &p_playlist->object_lock ); o_current_name = [NSString stringWithUTF8String: p_playlist->pp_items[i_current]->psz_name]; o_current_author = [NSString stringWithUTF8String: playlist_GetInfo(p_playlist, i_current ,_("General"),_("Author") )]; vlc_mutex_unlock( &p_playlist->object_lock ); if( [o_current_name rangeOfString:[o_search_keyword stringValue] options:NSCaseInsensitiveSearch ].length || [o_current_author rangeOfString:[o_search_keyword stringValue] options:NSCaseInsensitiveSearch ].length ) { [o_table_view selectRow: i_current byExtendingSelection: NO]; [o_table_view scrollRowToVisible: i_current]; break; } if( i_current == [o_table_view numberOfRows] - 1 ) { i_current = -1; } } while (i_current != [o_table_view selectedRow]); vlc_object_release( p_playlist );}- (void)appendArray:(NSArray*)o_array atPos:(int)i_position enqueue:(BOOL)b_enqueue{ int i_item; intf_thread_t * p_intf = [NSApp getIntf]; playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist == NULL ) { return; } for ( i_item = 0; i_item < (int)[o_array count]; i_item++ ) { /* One item */ NSDictionary *o_one_item; int j, i_total_options = 0, i_new_id = -1; int i_mode = PLAYLIST_INSERT; BOOL b_rem = FALSE, b_dir = FALSE; NSString *o_uri, *o_name; NSArray *o_options; NSURL *o_true_file; char **ppsz_options = NULL; /* Get the item */ o_one_item = [o_array objectAtIndex: i_item]; o_uri = (NSString *)[o_one_item objectForKey: @"ITEM_URL"]; o_name = (NSString *)[o_one_item objectForKey: @"ITEM_NAME"]; o_options = (NSArray *)[o_one_item objectForKey: @"ITEM_OPTIONS"]; /* 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 isWritable:NULL isUnmountable:NULL description:NULL type:NULL] && b_rem ) { /* All of this is to make sure CD's play when you D&D them on VLC */ /* Converts mountpoint to a /dev file */ struct statfs *buf; char *psz_dev; buf = (struct statfs *) malloc (sizeof(struct statfs)); statfs( [o_uri fileSystemRepresentation], buf ); psz_dev = strdup(buf->f_mntfromname); o_uri = [NSString stringWithCString: psz_dev ]; } if( o_options && [o_options count] > 0 ) { /* Count the input options */ i_total_options = [o_options count]; /* Allocate ppsz_options */ for( j = 0; j < i_total_options; j++ ) { if( !ppsz_options ) ppsz_options = (char **)malloc( sizeof(char *) * i_total_options ); ppsz_options[j] = strdup([[o_options objectAtIndex:j] UTF8String]); } } /* Add the item */ i_new_id = playlist_AddExt( p_playlist, [o_uri fileSystemRepresentation], [o_name UTF8String], i_mode, i_position == -1 ? PLAYLIST_END : i_position + i_item, 0, (ppsz_options != NULL ) ? (const char **)ppsz_options : 0, i_total_options ); /* clean up for( j = 0; j < i_total_options; j++ ) free( ppsz_options[j] ); if( ppsz_options ) free( ppsz_options ); */ /* Recent documents menu */ o_true_file = [NSURL fileURLWithPath: o_uri]; if( o_true_file != nil ) { [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL: o_true_file]; } if( i_item == 0 && !b_enqueue ) { playlist_Goto( p_playlist, playlist_GetPositionById( p_playlist, i_new_id ) ); playlist_Play( p_playlist ); } } vlc_object_release( p_playlist );}- (void)playlistUpdated{ vlc_value_t val; intf_thread_t * p_intf = [NSApp getIntf]; playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist != NULL ) { var_Get( p_playlist, "random", &val ); [o_random_ckb setState: val.b_bool]; var_Get( p_playlist, "loop", &val ); [o_loop_ckb setState: val.b_bool]; var_Get( p_playlist, "repeat", &val ); [o_repeat_ckb setState: val.b_bool]; vlc_object_release( p_playlist ); } [o_table_view reloadData];}- (void)updateRowSelection{ int i_row; intf_thread_t * p_intf = [NSApp getIntf]; playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist == NULL ) { return; } i_row = p_playlist->i_index; vlc_object_release( p_playlist ); [o_table_view selectRow: i_row byExtendingSelection: NO]; [o_table_view scrollRowToVisible: i_row];}@end@implementation VLCPlaylist (NSTableDataSource)- (int)numberOfRowsInTableView:(NSTableView *)o_tv{ int i_count = 0; intf_thread_t * p_intf = [NSApp getIntf]; playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist != NULL ) { vlc_mutex_lock( &p_playlist->object_lock ); i_count = p_playlist->i_size; vlc_mutex_unlock( &p_playlist->object_lock ); vlc_object_release( p_playlist ); } [o_status_field setStringValue: [NSString stringWithFormat:_NS("%i items in playlist"), i_count]]; return( i_count );}- (id)tableView:(NSTableView *)o_tv objectValueForTableColumn:(NSTableColumn *)o_tc row:(int)i_row{ id o_value = nil; intf_thread_t * p_intf = [NSApp getIntf]; playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist == NULL ) { return( nil ); } if( [[o_tc identifier] isEqualToString:@"0"] ) { o_value = [NSString stringWithFormat:@"%i", i_row + 1]; } else if( [[o_tc identifier] isEqualToString:@"1"] ) { vlc_mutex_lock( &p_playlist->object_lock ); o_value = [NSString stringWithUTF8String: p_playlist->pp_items[i_row]->psz_name]; vlc_mutex_unlock( &p_playlist->object_lock ); } else if( [[o_tc identifier] isEqualToString:@"2"] ) { vlc_mutex_lock( &p_playlist->object_lock ); o_value = [NSString stringWithUTF8String: playlist_GetInfo(p_playlist, i_row ,_("General"),_("Author") )]; vlc_mutex_unlock( &p_playlist->object_lock ); } else if( [[o_tc identifier] isEqualToString:@"3"] ) { char psz_duration[MSTRTIME_MAX_SIZE]; mtime_t dur = p_playlist->pp_items[i_row]->i_duration; if( dur != -1 ) { secstotimestr( psz_duration, dur/1000000 ); o_value = [NSString stringWithUTF8String: psz_duration]; } else { o_value = @"-:--:--"; } } vlc_object_release( p_playlist ); return( o_value );}- (BOOL)tableView:(NSTableView *)o_tv writeRows:(NSArray*)o_rows toPasteboard:(NSPasteboard*)o_pasteboard { int i_rows = [o_rows count]; NSArray *o_filenames = [NSArray array]; [o_pasteboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:self]; [o_pasteboard setPropertyList:o_filenames forType:NSFilenamesPboardType]; if ( i_rows == 1 ) { i_moveRow = [[o_rows objectAtIndex:0]intValue]; return YES; } return NO;}- (NSDragOperation)tableView:(NSTableView*)o_tv validateDrop:(id <NSDraggingInfo>)o_info proposedRow:(int)i_row proposedDropOperation:(NSTableViewDropOperation)o_operation { if ( o_operation == NSTableViewDropAbove ) { if ( i_moveRow >= 0 ) { if ( i_row != i_moveRow ) { return NSDragOperationMove; } /* what if in the previous run, the row wasn't actually moved? then we can't drop new files on this location */ return NSDragOperationNone; } return NSDragOperationGeneric; } return NSDragOperationNone;}- (BOOL)tableView:(NSTableView*)o_tv acceptDrop:(id <NSDraggingInfo>)o_info row:(int)i_proposed_row dropOperation:(NSTableViewDropOperation)o_operation { if ( i_moveRow >= 0 ) { if (i_moveRow != -1 && i_proposed_row != -1) { intf_thread_t * p_intf = [NSApp getIntf]; playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist == NULL ) { i_moveRow = -1; return NO; } playlist_Move( p_playlist, i_moveRow, i_proposed_row ); vlc_object_release( p_playlist ); } [self playlistUpdated]; i_moveRow = -1; return YES; } else { NSPasteboard * o_pasteboard; o_pasteboard = [o_info draggingPasteboard]; if( [[o_pasteboard types] containsObject: NSFilenamesPboardType] ) { int i; NSArray *o_array = [NSArray array]; NSArray *o_values = [[o_pasteboard propertyListForType: NSFilenamesPboardType] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; for( i = 0; i < (int)[o_values count]; i++) { NSDictionary *o_dic; o_dic = [NSDictionary dictionaryWithObject:[o_values objectAtIndex:i] forKey:@"ITEM_URL"]; o_array = [o_array arrayByAddingObject: o_dic]; } [self appendArray: o_array atPos: i_proposed_row enqueue:YES]; return YES; } return NO; } [self updateRowSelection];}/* Delegate method of NSWindow */- (void)windowWillClose:(NSNotification *)aNotification{ [o_btn_playlist setState: NSOffState];}@end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?