/*****************************************************************************
* playlist.m: MacOS X interface plugin
*****************************************************************************
- * Copyright (C) 2002 VideoLAN
- * $Id: playlist.m,v 1.11 2003/02/13 14:16:41 hartman Exp $
+ * Copyright (C) 2002-2003 VideoLAN
+ * $Id: playlist.m,v 1.22 2003/05/12 01:17:10 hartman Exp $
*
* Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
+ * Derk-Jan Hartman <thedj@users.sourceforge.net>
*
* 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
*****************************************************************************/
@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] );
{
case ' ':
vlc_mutex_lock( &p_playlist->object_lock );
- if( p_playlist != NULL && p_playlist->p_input != NULL )
+ if( p_playlist->p_input != NULL )
{
input_SetStatus( p_playlist->p_input, INPUT_STATUS_PAUSE );
}
}
}
+- (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 ( o_striped_row_color == nil )
+ {
+ o_striped_row_color = [[[NSColor alternateSelectedControlColor]
+ highlightWithLevel: 0.90] 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
/*****************************************************************************
*****************************************************************************/
@implementation VLCPlaylist
+- (id)init
+{
+ self = [super init];
+ if ( self !=nil )
+ {
+ i_moveRow = -1;
+ }
+ return self;
+}
+
- (void)awakeFromNib
{
[o_table_view setTarget: self];
[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")];
}
- (BOOL)tableView:(NSTableView *)o_tv
return( NO );
}
-- (NSDragOperation)tableView:(NSTableView*)o_tv
- validateDrop:(id <NSDraggingInfo>)info
- proposedRow:(int)i_row
- proposedDropOperation:(NSTableViewDropOperation)operation
-{
- return( NSDragOperationPrivate );
-}
-
-- (BOOL)tableView:(NSTableView*)o_tv
- acceptDrop:(id <NSDraggingInfo>)info
- row:(int)i_row
- dropOperation:(NSTableViewDropOperation)operation
-{
- NSArray * o_values;
- NSPasteboard * o_pasteboard;
-
- o_pasteboard = [info draggingPasteboard];
-
- if( [[o_pasteboard types] containsObject: NSFilenamesPboardType] )
- {
- o_values = [o_pasteboard propertyListForType: NSFilenamesPboardType];
-
- [self appendArray: o_values atPos: i_row enqueue:YES];
-
- return( YES );
- }
-
- return( NO );
-}
-
-- (void)tableView:(NSTableView *)o_tv willDisplayCell:(id)o_cell
- forTableColumn:(NSTableColumn *)o_tc row:(int)i_row
-{
- NSColor * o_color;
-
- [o_cell setDrawsBackground: YES];
-
- if( i_row % 2 )
- {
- o_color = [[NSColor alternateSelectedControlColor]
- highlightWithLevel: 0.90];
- }
- else
- {
- o_color = [o_tv backgroundColor];
- }
-
- [o_cell setBackgroundColor: o_color];
-}
-
- (NSMenu *)menuForEvent:(NSEvent *)o_event
{
NSPoint pt;
* 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)selectAll:(id)sender
[o_table_view reloadData];
}
-- (void)updateState
+- (void)updateRowSelection
{
int i_row;
{
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];
-
- vout_thread_t * p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT,
- FIND_ANYWHERE );
-
- if ( p_vout == NULL )
- {
- [[NSApp keyWindow] makeFirstResponder:o_table_view];
- return;
- }
- else if ( !p_vout->b_fullscreen )
- {
- [[NSApp keyWindow] makeFirstResponder:o_table_view];
- }
- vlc_object_release( (vlc_object_t *)p_vout );
}
@end
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 );
+ 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 );
}
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
+ {
+ NSArray * o_values;
+ NSPasteboard * o_pasteboard;
+
+ intf_thread_t * p_intf = [NSApp getIntf];
+ o_pasteboard = [o_info draggingPasteboard];
+
+ if( [[o_pasteboard types] containsObject: NSFilenamesPboardType] )
+ {
+ o_values = [[o_pasteboard propertyListForType: NSFilenamesPboardType]
+ sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
+
+ config_PutPsz( p_intf, "sub-file", "" );
+ config_PutInt( p_intf, "sub-delay", 0 );
+ config_PutFloat( p_intf, "sub-fps", 0.0 );
+ config_PutPsz( p_intf, "sout", "" );
+
+ [self appendArray: o_values atPos: i_proposed_row enqueue:YES];
+
+ return( YES );
+ }
+
+ return( NO );
+ }
+ [self updateRowSelection];
+}
+
@end