X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fplaylist.m;h=3799073f2bc539ece850cc7909ea3eca17c4b280;hb=3ccd14956774596a4e7ccaacd97f93fbd96a5031;hp=4a42d9ec9209b088d4e5bd91eba5f55ea40c68be;hpb=fe969c9f2fab3602715613d92796e31f44a1b696;p=vlc diff --git a/modules/gui/macosx/playlist.m b/modules/gui/macosx/playlist.m index 4a42d9ec92..3799073f2b 100644 --- a/modules/gui/macosx/playlist.m +++ b/modules/gui/macosx/playlist.m @@ -2,10 +2,11 @@ * playlist.m: MacOS X interface module ***************************************************************************** * Copyright (C) 2002-2004 VideoLAN - * $Id: playlist.m,v 1.57 2004/02/08 20:08:28 hartman Exp $ + * $Id$ * * Authors: Jon Lech Johansen * Derk-Jan Hartman + * Benjamin Pracht * * 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 @@ -35,6 +36,7 @@ #include "intf.h" #include "playlist.h" #include "controls.h" +#include /***************************************************************************** * VLCPlaylistView implementation @@ -52,7 +54,7 @@ int i, c, i_row; NSMutableArray *o_to_delete; NSNumber *o_number; - + playlist_t * p_playlist; intf_thread_t * p_intf = [NSApp getIntf]; @@ -63,12 +65,12 @@ p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); - + if ( p_playlist == NULL ) { return; } - + switch( key ) { case NSDeleteCharacter: @@ -77,11 +79,11 @@ case NSBackspaceCharacter: o_to_delete = [NSMutableArray arrayWithArray:[[self selectedRowEnumerator] allObjects]]; c = [o_to_delete count]; - + for( i = 0; i < c; i++ ) { o_number = [o_to_delete lastObject]; i_row = [o_number intValue]; - + if( p_playlist->i_index == i_row && p_playlist->i_status ) { playlist_Stop( p_playlist ); @@ -92,7 +94,7 @@ } [self reloadData]; break; - + default: [super keyDown: o_event]; break; @@ -132,9 +134,12 @@ [o_table_view registerForDraggedTypes: [NSArray arrayWithObjects: NSFilenamesPboardType, nil]]; - + [o_table_view setIntercellSpacing: NSMakeSize (0.0, 1.0)]; [o_window setExcludedFromWindowsMenu: TRUE]; + +// [o_tbv_info setDataSource: [VLCInfoDataSource init]]; + /* We need to check whether _defaultTableHeaderSortImage exists, since it belongs to an Apple hidden private API, and then can "disapear" at any time*/ @@ -157,6 +162,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ } [self initStrings]; + [self playlistUpdated]; } - (void)initStrings @@ -166,14 +172,20 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ [o_mi_play setTitle: _NS("Play")]; [o_mi_delete setTitle: _NS("Delete")]; [o_mi_selectall setTitle: _NS("Select All")]; + [o_mi_toggleItemsEnabled setTitle: _NS("Item Enabled")]; + [o_mi_enableGroup setTitle: _NS("Enable all group items")]; + [o_mi_disableGroup setTitle: _NS("Disable all group items")]; + [o_mi_info setTitle: _NS("Properties")]; + [[o_tc_name headerCell] setStringValue:_NS("Name")]; [[o_tc_author headerCell] setStringValue:_NS("Author")]; [[o_tc_duration headerCell] setStringValue:_NS("Duration")]; [o_random_ckb setTitle: _NS("Random")]; - [o_loop_ckb setTitle: _NS("Repeat All")]; - [o_repeat_ckb setTitle: _NS("Repeat One")]; [o_search_button setTitle: _NS("Search")]; [o_btn_playlist setToolTip: _NS("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")]; } - (void) tableView:(NSTableView*)o_tv @@ -193,7 +205,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ } if( o_tc_sortColumn == o_tc ) - { + { b_isSortDescending = !b_isSortDescending; } else if( o_tc == o_tc_name || o_tc == o_tc_author || @@ -209,14 +221,14 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ } if( o_tc_id == o_tc && !b_isSortDescending ) - { + { playlist_SortID( p_playlist , ORDER_NORMAL ); - [o_table_view setIndicatorImage:o_ascendingSortingImage inTableColumn:o_tc]; + [o_table_view setIndicatorImage:o_ascendingSortingImage inTableColumn:o_tc]; } else if( o_tc_name == o_tc && !b_isSortDescending ) - { + { playlist_SortTitle( p_playlist , ORDER_NORMAL ); - [o_table_view setIndicatorImage:o_ascendingSortingImage inTableColumn:o_tc]; + [o_table_view setIndicatorImage:o_ascendingSortingImage inTableColumn:o_tc]; } else if( o_tc_author == o_tc && !b_isSortDescending ) { @@ -224,12 +236,12 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ [o_table_view setIndicatorImage:o_ascendingSortingImage inTableColumn:o_tc]; } else if( o_tc_id == o_tc && b_isSortDescending ) - { + { playlist_SortID( p_playlist , ORDER_REVERSE ); - [o_table_view setIndicatorImage:o_ascendingSortingImage inTableColumn:o_tc]; + [o_table_view setIndicatorImage:o_ascendingSortingImage inTableColumn:o_tc]; } else if( o_tc_name == o_tc && b_isSortDescending ) - { + { playlist_SortTitle( p_playlist , ORDER_REVERSE ); [o_table_view setIndicatorImage:o_descendingSortingImage inTableColumn:o_tc]; } @@ -237,13 +249,13 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ { playlist_SortAuthor( p_playlist , ORDER_REVERSE ); [o_table_view setIndicatorImage:o_descendingSortingImage inTableColumn:o_tc]; - } + } vlc_object_release( p_playlist ); [self playlistUpdated]; } -- (BOOL)tableView:(NSTableView *)o_tv +- (BOOL)tableView:(NSTableView *)o_tv shouldEditTableColumn:(NSTableColumn *)o_tc row:(int)i_row { @@ -252,11 +264,17 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ - (NSMenu *)menuForEvent:(NSEvent *)o_event { + intf_thread_t * p_intf = [NSApp getIntf]; + playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + + bool b_itemstate = FALSE; + NSPoint pt; vlc_bool_t b_rows; vlc_bool_t b_item_sel; - pt = [o_table_view convertPoint: [o_event locationInWindow] + pt = [o_table_view convertPoint: [o_event locationInWindow] fromView: nil]; b_item_sel = ( [o_table_view rowAtPoint: pt] != -1 && [o_table_view selectedRow] != -1 ); @@ -265,6 +283,19 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ [o_mi_play setEnabled: b_item_sel]; [o_mi_delete setEnabled: b_item_sel]; [o_mi_selectall setEnabled: b_rows]; + [o_mi_info setEnabled: b_item_sel]; + [o_mi_toggleItemsEnabled setEnabled: b_item_sel]; + [o_mi_enableGroup setEnabled: b_item_sel]; + [o_mi_disableGroup setEnabled: b_item_sel]; + + if (p_playlist) + { + b_itemstate = ([o_table_view selectedRow] > -1) ? + p_playlist->pp_items[[o_table_view selectedRow]]->b_enabled : FALSE; + vlc_object_release(p_playlist); + } + + [o_mi_toggleItemsEnabled setState: b_itemstate]; return( o_ctx_menu ); } @@ -288,7 +319,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ intf_thread_t * p_intf = [NSApp getIntf]; playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); - + NSSavePanel *o_save_panel = [NSSavePanel savePanel]; NSString * o_name = [NSString stringWithFormat: @"%@.m3u", _NS("Untitled")]; [o_save_panel setTitle: _NS("Save Playlist")]; @@ -297,7 +328,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ if( [o_save_panel runModalForDirectory: nil file: o_name] == NSOKButton ) { - playlist_Export( p_playlist, [[o_save_panel filename] fileSystemRepresentation], "m3u" ); + playlist_Export( p_playlist, [[o_save_panel filename] fileSystemRepresentation], "export-m3u" ); } } @@ -329,14 +360,14 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ { return; } - + o_to_delete = [NSMutableArray arrayWithArray:[[o_table_view selectedRowEnumerator] allObjects]]; c = (int)[o_to_delete count]; - + for( i = 0; i < c; i++ ) { o_number = [o_to_delete lastObject]; i_row = [o_number intValue]; - + if( p_playlist->i_index == i_row && p_playlist->i_status ) { playlist_Stop( p_playlist ); @@ -349,12 +380,86 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ vlc_object_release( p_playlist ); /* this is actually duplicity, because the intf.m manage also updates the view - * when the playlist changes. we do this on purpose, because else there is a + * when the playlist changes. we do this on purpose, because else there is a * delay of .5 sec or so when we delete an item */ [self playlistUpdated]; [self updateRowSelection]; } +- (IBAction)toggleItemsEnabled:(id)sender +{ + int i, c, i_row; + NSMutableArray *o_selected; + NSNumber *o_number; + + 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; + } + + o_selected = [NSMutableArray arrayWithArray:[[o_table_view selectedRowEnumerator] allObjects]]; + c = (int)[o_selected count]; + + if (p_playlist->pp_items[[o_table_view selectedRow]]->b_enabled) + { + for( i = 0; i < c; i++ ) + { + o_number = [o_selected lastObject]; + i_row = [o_number intValue]; + if( p_playlist->i_index == i_row && p_playlist->i_status ) + { + playlist_Stop( p_playlist ); + } + [o_selected removeObject: o_number]; + playlist_Disable( p_playlist, i_row ); + } + } + else + { + for( i = 0; i < c; i++ ) + { + o_number = [o_selected lastObject]; + i_row = [o_number intValue]; + [o_selected removeObject: o_number]; + playlist_Enable( p_playlist, i_row ); + } + } + vlc_object_release( p_playlist ); + [self playlistUpdated]; +} + +- (IBAction)enableGroup:(id)sender +{ + intf_thread_t * p_intf = [NSApp getIntf]; + playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + + if (p_playlist) + { + playlist_EnableGroup(p_playlist, + p_playlist->pp_items[[o_table_view selectedRow]]->i_group); + vlc_object_release(p_playlist); + } +} + +- (IBAction)disableGroup:(id)sender +{ + intf_thread_t * p_intf = [NSApp getIntf]; + playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + + if (p_playlist) + { + playlist_DisableGroup(p_playlist, + p_playlist->pp_items[[o_table_view selectedRow]]->i_group); + vlc_object_release(p_playlist); + } +} + - (IBAction)selectAll:(id)sender { [o_table_view selectAll: nil]; @@ -370,7 +475,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ 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; @@ -386,18 +491,20 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ } else { - i_current = [o_table_view selectedRow]; + i_current = [o_table_view selectedRow]; } do { + char *psz_temp; 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") )]; + o_current_name = [NSString stringWithUTF8String: + p_playlist->pp_items[i_current]->input.psz_name]; + psz_temp = playlist_GetInfo(p_playlist, i_current ,_("General"),_("Author") ); + o_current_author = [NSString stringWithUTF8String: psz_temp]; + free( psz_temp); vlc_mutex_unlock( &p_playlist->object_lock ); @@ -418,6 +525,54 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ } +- (IBAction)handlePopUp:(id)sender + +{ + intf_thread_t * p_intf = [NSApp getIntf]; + 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, _( "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, _( "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, _( "Repeat Off" ) ); + } + break; + } + vlc_object_release( p_playlist ); + [self playlistUpdated]; +} + + - (void)appendArray:(NSArray*)o_array atPos:(int)i_position enqueue:(BOOL)b_enqueue { int i_item; @@ -441,16 +596,16 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ 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 ) @@ -469,24 +624,24 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ { /* 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_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 + /* clean up for( j = 0; j < i_total_options; j++ ) free( ppsz_options[j] ); if( ppsz_options ) free( ppsz_options ); */ @@ -494,11 +649,11 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ /* Recent documents menu */ o_true_file = [NSURL fileURLWithPath: o_uri]; if( o_true_file != nil ) - { + { [[NSDocumentController sharedDocumentController] - noteNewRecentDocumentURL: o_true_file]; + noteNewRecentDocumentURL: o_true_file]; } - + if( i_item == 0 && !b_enqueue ) { playlist_Goto( p_playlist, playlist_GetPositionById( p_playlist, i_new_id ) ); @@ -511,21 +666,29 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ - (void)playlistUpdated { - vlc_value_t val; + vlc_value_t val1, val2; 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]; + var_Get( p_playlist, "random", &val1 ); + [o_random_ckb setState: val1.b_bool]; + var_Get( p_playlist, "repeat", &val1 ); + var_Get( p_playlist, "loop", &val2 ); + if(val1.b_bool) + { + [o_loop_popup selectItemAtIndex:1]; + } + else if(val2.b_bool) + { + [o_loop_popup selectItemAtIndex:2]; + } + else + { + [o_loop_popup selectItemAtIndex:0]; + } vlc_object_release( p_playlist ); } [o_table_view reloadData]; @@ -551,6 +714,117 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ [o_table_view scrollRowToVisible: i_row]; } +- (int)selectedPlaylistItem +{ + return [o_table_view selectedRow]; +} + +- (NSMutableArray *)selectedPlaylistItemsList +{ + return [NSMutableArray arrayWithArray:[[o_table_view + selectedRowEnumerator] allObjects]]; + +} + +- (void)deleteGroup:(int)i_id +{ + intf_thread_t * p_intf = [NSApp getIntf]; + playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + int i; + int i_newgroup = 0; + + if (p_playlist) + { + + /*first, change the group of all the items that belong to the group to + delete. Change it to the group with the smallest id.*/ + + /*search for the group with the smallest id*/ + + if(p_playlist->i_groups == 1) + { + msg_Warn(p_playlist,"Trying to delete last group, cancelling"); + vlc_object_release(p_playlist); + return; + } + + for (i = 0 ; ii_groups ; i++) + { + if((i_newgroup == 0 || i_newgroup > p_playlist->pp_groups[i]->i_id) + && p_playlist->pp_groups[i]->i_id != i_id) + { + i_newgroup = p_playlist->pp_groups[i]->i_id; + } + } + + vlc_mutex_lock( &p_playlist->object_lock ); + + for (i = 0; i < p_playlist->i_size;i++) + { + if (p_playlist->pp_items[i]->i_group == i_id) + { + vlc_mutex_lock(&p_playlist->pp_items[i]->input.lock); + p_playlist->pp_items[i]->i_group = i_newgroup; + vlc_mutex_unlock(&p_playlist->pp_items[i]->input.lock); + } + } + vlc_mutex_unlock( &p_playlist->object_lock ); + + playlist_DeleteGroup( p_playlist, i_id ); + + vlc_object_release(p_playlist); + [self playlistUpdated]; + } +} + +- (NSColor *)getColor:(int)i_group +{ + NSColor * o_color = nil; + switch ( i_group % 8 ) + { + case 1: + /*white*/ + o_color = [NSColor colorWithDeviceRed:1.0 green:1.0 blue:1.0 alpha:1.0]; + break; + + case 2: + /*red*/ + o_color = [NSColor colorWithDeviceRed:1.0 green:0.76471 blue:0.76471 alpha:1.0]; + break; + + case 3: + /*dark blue*/ + o_color = [NSColor colorWithDeviceRed:0.76471 green:0.76471 blue:1.0 alpha:1.0]; + break; + + case 4: + /*orange*/ + o_color = [NSColor colorWithDeviceRed:1.0 green:0.89804 blue:0.76471 alpha:1.0]; + break; + + case 5: + /*purple*/ + o_color = [NSColor colorWithDeviceRed:1.0 green:0.76471 blue:1.0 alpha:1.0]; + break; + + case 6: + /*green*/ + o_color = [NSColor colorWithDeviceRed:0.76471 green:1.0 blue:0.76471 alpha:1.0]; + break; + + case 7: + /*light blue*/ + o_color = [NSColor colorWithDeviceRed:0.76471 green:1.0 blue:1.0 alpha:1.0]; + break; + + case 0: + /*yellow*/ + o_color = [NSColor colorWithDeviceRed:1.0 green:1.0 blue:0.76471 alpha:1.0]; + break; + } + return o_color; +} @end @@ -574,8 +848,8 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ return( i_count ); } -- (id)tableView:(NSTableView *)o_tv - objectValueForTableColumn:(NSTableColumn *)o_tc +- (id)tableView:(NSTableView *)o_tv + objectValueForTableColumn:(NSTableColumn *)o_tc row:(int)i_row { id o_value = nil; @@ -595,21 +869,38 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ 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]; + o_value = [NSString stringWithUTF8String: + p_playlist->pp_items[i_row]->input.psz_name]; + if( o_value == NULL ) + o_value = [NSString stringWithCString: + p_playlist->pp_items[i_row]->input.psz_name]; vlc_mutex_unlock( &p_playlist->object_lock ); } else if( [[o_tc identifier] isEqualToString:@"2"] ) { + char *psz_temp; vlc_mutex_lock( &p_playlist->object_lock ); - o_value = [NSString stringWithUTF8String: - playlist_GetInfo(p_playlist, i_row ,_("General"),_("Author") )]; + psz_temp = playlist_GetInfo( p_playlist, i_row ,_("General"),_("Author") ); vlc_mutex_unlock( &p_playlist->object_lock ); + + if( psz_temp == NULL ) + { + o_value = @""; + } + else + { + o_value = [NSString stringWithUTF8String: psz_temp]; + if( o_value == NULL ) + { + o_value = [NSString stringWithCString: psz_temp]; + } + free( psz_temp ); + } } else if( [[o_tc identifier] isEqualToString:@"3"] ) { char psz_duration[MSTRTIME_MAX_SIZE]; - mtime_t dur = p_playlist->pp_items[i_row]->i_duration; + mtime_t dur = p_playlist->pp_items[i_row]->input.i_duration; if( dur != -1 ) { secstotimestr( psz_duration, dur/1000000 ); @@ -626,13 +917,46 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ return( o_value ); } +- (void)tableView:(NSTableView *)o_tv + willDisplayCell:(id)o_cell + forTableColumn:(NSTableColumn *)o_tc + row:(int)i_rows +{ + intf_thread_t * p_intf = [NSApp getIntf]; + playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + if (p_playlist) + { + if ((p_playlist->i_groups) > 1 ) + { + [o_cell setDrawsBackground: VLC_TRUE]; + [o_cell setBackgroundColor: + [self getColor:p_playlist->pp_items[i_rows]->i_group]]; + } + else + { + [o_cell setDrawsBackground: VLC_FALSE]; + } + + if (!p_playlist->pp_items[i_rows]->b_enabled) + { + [o_cell setTextColor: [NSColor colorWithDeviceRed:0.3686 green:0.3686 blue:0.3686 alpha:1.0]]; + } + else + { + [o_cell setTextColor:[NSColor colorWithDeviceRed:0.0 green:0.0 blue:0.0 alpha:1.0]]; + } + vlc_object_release( p_playlist ); + } +} + - (BOOL)tableView:(NSTableView *)o_tv writeRows:(NSArray*)o_rows - toPasteboard:(NSPasteboard*)o_pasteboard + 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 ) @@ -646,7 +970,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ - (NSDragOperation)tableView:(NSTableView*)o_tv validateDrop:(id )o_info proposedRow:(int)i_row - proposedDropOperation:(NSTableViewDropOperation)o_operation + proposedDropOperation:(NSTableViewDropOperation)o_operation { if ( o_operation == NSTableViewDropAbove ) { @@ -656,7 +980,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ { return NSDragOperationMove; } - /* what if in the previous run, the row wasn't actually moved? + /* what if in the previous run, the row wasn't actually moved? then we can't drop new files on this location */ return NSDragOperationNone; } @@ -668,7 +992,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ - (BOOL)tableView:(NSTableView*)o_tv acceptDrop:(id )o_info row:(int)i_proposed_row - dropOperation:(NSTableViewDropOperation)o_operation + dropOperation:(NSTableViewDropOperation)o_operation { if ( i_moveRow >= 0 ) { @@ -677,15 +1001,15 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ 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 ); - + + playlist_Move( p_playlist, i_moveRow, i_proposed_row ); + vlc_object_release( p_playlist ); } [self playlistUpdated]; @@ -696,7 +1020,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ { NSPasteboard * o_pasteboard; o_pasteboard = [o_info draggingPasteboard]; - + if( [[o_pasteboard types] containsObject: NSFilenamesPboardType] ) { int i; @@ -726,3 +1050,4 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ @end +