X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fplaylist.m;h=21cd0d943f0ee43e57e7b7e1b968376306d8f52c;hb=5caa41762b984f27a1f1af0bcea9bdcfd812a25b;hp=61e55f291590437d43553a27024bcd5ebdf040e8;hpb=21c4f10c6e9615cdd597b0639102d6ecf7be088d;p=vlc diff --git a/modules/gui/macosx/playlist.m b/modules/gui/macosx/playlist.m index 61e55f2915..21cd0d943f 100644 --- a/modules/gui/macosx/playlist.m +++ b/modules/gui/macosx/playlist.m @@ -1,11 +1,11 @@ /***************************************************************************** * playlist.m: MacOS X interface plugin ***************************************************************************** - * Copyright (C) 2002-2003 VideoLAN - * $Id: playlist.m,v 1.33 2003/09/22 03:40:05 hartman Exp $ + * Copyright (C) 2002-2004 VideoLAN + * $Id: playlist.m,v 1.51 2004/01/09 22:11:04 hartman Exp $ * * Authors: Jon Lech Johansen - * Derk-Jan Hartman + * Derk-Jan Hartman * * 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 @@ -29,27 +29,18 @@ #include /* for MAXPATHLEN */ #include #include +#include +#include #include "intf.h" #include "playlist.h" #include "controls.h" -int MacVersion102 = -1; - /***************************************************************************** * VLCPlaylistView implementation *****************************************************************************/ @implementation VLCPlaylistView -- (void)dealloc -{ - if( o_striped_row_color != nil ) - { - [o_striped_row_color release]; - } - [super dealloc]; -} - - (NSMenu *)menuForEvent:(NSEvent *)o_event { return( [[self delegate] menuForEvent: o_event] ); @@ -80,10 +71,6 @@ int MacVersion102 = -1; switch( key ) { - case ' ': - [(VLCControls *)[[NSApp delegate] getControls] play: nil]; - break; - case NSDeleteCharacter: case NSDeleteFunctionKey: case NSDeleteCharFunctionKey: @@ -117,48 +104,6 @@ int MacVersion102 = -1; } } -- (void)highlightSelectionInClipRect:(NSRect)o_rect { - NSRect o_new_rect; - float f_height = [self rowHeight] + [self intercellSpacing].height; - float f_origin_y = NSMaxY( o_rect ); - int i_row = o_rect.origin.y / f_height; - - if ( i_row % 2 == 0 ) - { - i_row++; - } - - o_new_rect.size.width = o_rect.size.width; - o_new_rect.size.height = f_height; - o_new_rect.origin.x = o_rect.origin.x; - o_new_rect.origin.y = i_row * f_height; - - if( ( MacVersion102 < 0 ) && ( floor( NSAppKitVersionNumber ) > NSAppKitVersionNumber10_1 ) ) - { - MacVersion102 = 102; - } - - if ( MacVersion102 == 102 && o_striped_row_color == nil ) - { - o_striped_row_color = [[[NSColor alternateSelectedControlColor] - highlightWithLevel: 0.90] retain]; - - } - else if ( o_striped_row_color == nil ) - { - /* OSX 10.1 and before ain't that smart ;) */ - o_striped_row_color = [[NSColor whiteColor] retain]; - } - - [o_striped_row_color set]; - - while ( o_new_rect.origin.y < f_origin_y ) { - NSRectFill( o_new_rect ); - o_new_rect.origin.y += f_height * 2.0; - } - [super highlightSelectionInClipRect:o_rect]; -} - @end /***************************************************************************** @@ -187,13 +132,25 @@ int MacVersion102 = -1; [o_table_view registerForDraggedTypes: [NSArray arrayWithObjects: NSFilenamesPboardType, nil]]; + [o_window setExcludedFromWindowsMenu: TRUE]; + [self initStrings]; +} + +- (void)initStrings +{ + [o_window setTitle: _NS("Playlist")]; [o_mi_save_playlist setTitle: _NS("Save Playlist...")]; [o_mi_play setTitle: _NS("Play")]; [o_mi_delete setTitle: _NS("Delete")]; [o_mi_selectall setTitle: _NS("Select All")]; - - [o_btn_add setToolTip: _NS("Add")]; - [o_btn_remove setToolTip: _NS("Delete")]; + [[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("Shuffle")]; + [o_loop_ckb setTitle: _NS("Repeat Playlist")]; + [o_repeat_ckb setTitle: _NS("Repeat Item")]; + [o_search_button setTitle: _NS("Search")]; + [o_btn_playlist setToolTip: _NS("Playlist")]; } - (BOOL)tableView:(NSTableView *)o_tv @@ -222,6 +179,20 @@ int MacVersion102 = -1; return( o_ctx_menu ); } +- (IBAction)toggleWindow:(id)sender +{ + if( [o_window isVisible] ) + { + [o_window orderOut:sender]; + [o_btn_playlist setState:NSOffState]; + } + else + { + [o_window makeKeyAndOrderFront:sender]; + [o_btn_playlist setState:NSOnState]; + } +} + - (IBAction)savePlaylist:(id)sender { intf_thread_t * p_intf = [NSApp getIntf]; @@ -299,6 +270,63 @@ int MacVersion102 = -1; [o_table_view selectAll: nil]; } + +- (IBAction)searchItem:(id)sender +{ + 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; @@ -315,53 +343,63 @@ int MacVersion102 = -1; { /* One item */ NSDictionary *o_one_item; - NSString *o_url; - NSString *o_name; - NSArray *o_options; - int j, i_total_options = 0; - char **ppsz_options = NULL; + int j, i_new_position = -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; + /* 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( !o_name) o_name = o_url; - + /* 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, *temp; + buf = (struct statfs *) malloc (sizeof(struct statfs)); + 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_uri = [NSString stringWithCString: psz_dev ]; + } + if (i_item == 0 && !b_enqueue) i_mode |= PLAYLIST_GO; - - if( o_options && [o_options count] > 0 ) + + /* Add the item */ + i_new_position = playlist_Add( p_playlist, [o_uri fileSystemRepresentation], + [o_name UTF8String], i_mode, + i_position == -1 ? PLAYLIST_END : i_position + i_item); + + /* Add the options, when there are any */ + if( o_options ) { - /* Count the input options */ - i_total_options = [o_options count]; - - /* Allocate ppsz_options */ - for( j = 0; j < i_total_options; j++ ) + for( j = 0; j < [o_options count]; j++ ) { - if( !ppsz_options ) - ppsz_options = (char **)malloc( sizeof(char *) * i_total_options ); - - ppsz_options[j] = strdup([[o_options objectAtIndex:j] UTF8String]); + playlist_AddOption( p_playlist, i_new_position, + strdup( [[o_options objectAtIndex:j] UTF8String] ) ); } } - - playlist_AddExt( p_playlist, [o_name UTF8String], [o_url fileSystemRepresentation], -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 */ - for( j = 0; j < i_total_options; j++ ) - free( ppsz_options[j] ); - if( ppsz_options ) free( ppsz_options ); - - NSURL *o_true_url = [NSURL fileURLWithPath: o_url]; - if( o_true_url != nil ) + + /* Recent documents menu */ + o_true_file = [NSURL fileURLWithPath: o_uri]; + if( o_true_file != nil ) { [[NSDocumentController sharedDocumentController] - noteNewRecentDocumentURL: o_true_url]; + noteNewRecentDocumentURL: o_true_file]; } } @@ -370,6 +408,23 @@ int MacVersion102 = -1; - (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]; } @@ -386,14 +441,13 @@ int MacVersion102 = -1; return; } - vlc_mutex_lock( &p_playlist->object_lock ); i_row = p_playlist->i_index; - vlc_mutex_unlock( &p_playlist->object_lock ); vlc_object_release( p_playlist ); [o_table_view selectRow: i_row byExtendingSelection: NO]; [o_table_view scrollRowToVisible: i_row]; } + @end @@ -413,7 +467,7 @@ int MacVersion102 = -1; 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 ); } @@ -431,10 +485,38 @@ int MacVersion102 = -1; return( nil ); } - vlc_mutex_lock( &p_playlist->object_lock ); - o_value = [[NSString stringWithUTF8String: - p_playlist->pp_items[i_row]->psz_name] lastPathComponent]; - vlc_mutex_unlock( &p_playlist->object_lock ); + 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] lastPathComponent]; + 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 ); @@ -526,14 +608,18 @@ int MacVersion102 = -1; o_array = [o_array arrayByAddingObject: o_dic]; } [self appendArray: o_array atPos: i_proposed_row enqueue:YES]; - - return( YES ); + return YES; } - - return( NO ); + return NO; } [self updateRowSelection]; } +/* Delegate method of NSWindow */ +- (void)windowWillClose:(NSNotification *)aNotification +{ + [o_btn_playlist setState: NSOffState]; +} + @end