X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fplaylist.m;h=31dfb8aa2f673bf72d2c291df25ad3ccce99e39f;hb=eb22c2983bf039a74f9f6143a640438c8a16819d;hp=0801d4f8eee4079ef4e025df55c03936daf9380d;hpb=f5b39d26ab37e3ebefcdcca30335c60e99f546d8;p=vlc diff --git a/modules/gui/macosx/playlist.m b/modules/gui/macosx/playlist.m index 0801d4f8ee..31dfb8aa2f 100644 --- a/modules/gui/macosx/playlist.m +++ b/modules/gui/macosx/playlist.m @@ -1,11 +1,12 @@ /***************************************************************************** - * playlist.m: MacOS X interface plugin + * playlist.m: MacOS X interface module ***************************************************************************** - * Copyright (C) 2002-2003 VideoLAN - * $Id: playlist.m,v 1.48 2003/12/11 19:34:46 hartman Exp $ + * Copyright (C) 2002-2004 VideoLAN + * $Id$ * * Authors: Jon Lech Johansen - * Derk-Jan Hartman + * 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 @@ -104,6 +106,7 @@ } } + @end /***************************************************************************** @@ -131,9 +134,34 @@ [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*/ + + if( [[NSTableView class] respondsToSelector:@selector(_defaultTableHeaderSortImage)] ) + { + o_ascendingSortingImage = [[NSTableView class] _defaultTableHeaderSortImage]; + } + else + { + o_ascendingSortingImage = nil; + } + + if( [[NSTableView class] respondsToSelector:@selector(_defaultTableHeaderReverseSortImage)] ) + { + o_descendingSortingImage = [[NSTableView class] _defaultTableHeaderReverseSortImage]; + } + else + { + o_descendingSortingImage = nil; + } + [self initStrings]; + [self playlistUpdated]; } - (void)initStrings @@ -143,15 +171,86 @@ [o_mi_play setTitle: _NS("Play")]; [o_mi_delete setTitle: _NS("Delete")]; [o_mi_selectall setTitle: _NS("Select All")]; + [o_mi_info setTitle: _NS("Properties")]; + [[o_tc_name headerCell] setStringValue:_NS("Name")]; [[o_tc_author headerCell] setStringValue:_NS("Author")]; - [o_random_ckb setTitle: _NS("Shuffle")]; - [o_loop_ckb setTitle: _NS("Repeat Playlist")]; - [o_repeat_ckb setTitle: _NS("Repeat Item")]; + [[o_tc_duration headerCell] setStringValue:_NS("Duration")]; + [o_random_ckb setTitle: _NS("Random")]; [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 + didClickTableColumn:(NSTableColumn *)o_tc +{ + intf_thread_t * p_intf = [NSApp getIntf]; + playlist_t *p_playlist = + (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + + int max = [[o_table_view tableColumns] count]; + int i; + + if( p_playlist == NULL ) + { + return; + } + + if( o_tc_sortColumn == o_tc ) + { + b_isSortDescending = !b_isSortDescending; + } + else if( o_tc == o_tc_name || o_tc == o_tc_author || + o_tc == o_tc_id ) + { + b_isSortDescending = VLC_FALSE; + [o_table_view setHighlightedTableColumn:o_tc]; + o_tc_sortColumn = o_tc; + for( i=0 ; iobject_lock ); o_current_name = [NSString stringWithUTF8String: - p_playlist->pp_items[i_current]->psz_name]; + p_playlist->pp_items[i_current]->input.psz_name]; o_current_author = [NSString stringWithUTF8String: - p_playlist->pp_items[i_current]->psz_author]; + playlist_GetInfo(p_playlist, i_current ,_("General"),_("Author") )]; vlc_mutex_unlock( &p_playlist->object_lock ); @@ -313,7 +417,7 @@ [o_table_view scrollRowToVisible: i_current]; break; } - if ( i_current == [o_table_view numberOfRows] - 1 ) + if( i_current == [o_table_view numberOfRows] - 1 ) { i_current = -1; } @@ -322,6 +426,55 @@ vlc_object_release( p_playlist ); } + +- (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; @@ -338,43 +491,37 @@ { /* One item */ NSDictionary *o_one_item; - int j; - int i_total_options = 0; + int j, i_total_options = 0, i_new_id = -1; int i_mode = PLAYLIST_INSERT; BOOL b_rem = FALSE, b_dir = FALSE; - NSString *o_url, *o_name; + 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_url = (NSString *)[o_one_item objectForKey: @"ITEM_URL"]; + 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_url]; + if( !o_name) o_name = [[NSFileManager defaultManager] displayNameAtPath: o_uri]; - if( [[NSFileManager defaultManager] fileExistsAtPath:o_url isDirectory:&b_dir] && b_dir && - [[NSWorkspace sharedWorkspace] getFileSystemInfoForPath: o_url isRemovable: &b_rem + 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, *temp; + char *psz_dev; buf = (struct statfs *) malloc (sizeof(struct statfs)); - statfs( [o_url fileSystemRepresentation], buf ); + statfs( [o_uri fileSystemRepresentation], buf ); psz_dev = strdup(buf->f_mntfromname); - free( buf ); - temp = strrchr( psz_dev , 's' ); - psz_dev[temp - psz_dev] = '\0'; - o_url = [NSString stringWithCString: psz_dev ]; + o_uri = [NSString stringWithCString: psz_dev ]; } - - if (i_item == 0 && !b_enqueue) - i_mode |= PLAYLIST_GO; - + if( o_options && [o_options count] > 0 ) { /* Count the input options */ @@ -389,22 +536,30 @@ ppsz_options[j] = strdup([[o_options objectAtIndex:j] UTF8String]); } } - - playlist_AddExt( p_playlist, [o_url fileSystemRepresentation], [o_name UTF8String], -1, - (ppsz_options != NULL ) ? (const char **)ppsz_options : 0, i_total_options, - i_mode, i_position == -1 ? PLAYLIST_END : i_position + i_item); - - /* clean up */ + + /* 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 ); - + if( ppsz_options ) free( ppsz_options ); */ + /* Recent documents menu */ - NSURL *o_true_url = [NSURL fileURLWithPath: o_url]; - if( o_true_url != nil ) + o_true_file = [NSURL fileURLWithPath: o_uri]; + if( o_true_file != nil ) { [[NSDocumentController sharedDocumentController] - noteNewRecentDocumentURL: o_true_url]; + 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 ); } } @@ -413,21 +568,29 @@ - (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]; @@ -452,7 +615,11 @@ [o_table_view selectRow: i_row byExtendingSelection: NO]; [o_table_view scrollRowToVisible: i_row]; } - + +- (int)selectedPlaylistItem +{ + return [o_table_view selectedRow]; +} @end @@ -497,23 +664,101 @@ 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] lastPathComponent]; + 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"] ) { vlc_mutex_lock( &p_playlist->object_lock ); o_value = [NSString stringWithUTF8String: - p_playlist->pp_items[i_row]->psz_author]; + playlist_GetInfo(p_playlist, i_row ,_("General"),_("Author") )]; + if( o_value == NULL ) + o_value = [NSString stringWithCString: + 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 ); } +- (void)tableView:(NSTableView *)o_tv + willDisplayCell:(id)o_cell + forTableColumn:(NSTableColumn *)o_tc + row:(int)o_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->i_groups) > 1 ) + { + [o_cell setDrawsBackground: VLC_TRUE]; + switch ( p_playlist->pp_items[o_rows]->i_group % 8 ) + { + case 1: + /*white*/ + [o_cell setBackgroundColor: [NSColor colorWithDeviceRed:1.0 green:1.0 blue:1.0 alpha:1.0]]; + break; + + case 2: + /*red*/ + [o_cell setBackgroundColor: [NSColor colorWithDeviceRed:1.0 green:0.76471 blue:0.76471 alpha:1.0]]; + break; + + case 3: + /*dark blue*/ + [o_cell setBackgroundColor: [NSColor colorWithDeviceRed:0.76471 green:0.76471 blue:1.0 alpha:1.0]]; + break; + + case 4: + /*orange*/ + [o_cell setBackgroundColor: [NSColor colorWithDeviceRed:1.0 green:0.89804 blue:0.76471 alpha:1.0]]; + break; + + case 5: + /*purple*/ + [o_cell setBackgroundColor: [NSColor colorWithDeviceRed:1.0 green:0.76471 blue:1.0 alpha:1.0]]; + break; + + case 6: + /*green*/ + [o_cell setBackgroundColor: [NSColor colorWithDeviceRed:0.76471 green:1.0 blue:0.76471 alpha:1.0]]; + break; + + case 7: + /*light blue*/ + [o_cell setBackgroundColor: [NSColor colorWithDeviceRed:0.76471 green:1.0 blue:1.0 alpha:1.0]]; + break; + + case 0: + /*yellow*/ + [o_cell setBackgroundColor: [NSColor colorWithDeviceRed:1.0 green:1.0 blue:0.76471 alpha:1.0]]; + break; + } + + } +vlc_object_release( p_playlist ); +} + - (BOOL)tableView:(NSTableView *)o_tv writeRows:(NSArray*)o_rows toPasteboard:(NSPasteboard*)o_pasteboard @@ -614,3 +859,4 @@ @end +