]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/playlist.m
* First set config variable, then add the files (and therefore potentially
[vlc] / modules / gui / macosx / playlist.m
index 4af3cf5ecce30672d2e3be612d13c4bca3496553..071990eefb3f113fcac8d4d2feaac4e8f684b622 100644 (file)
@@ -1,10 +1,11 @@
 /*****************************************************************************
  * 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] );
@@ -65,7 +75,7 @@
     {
         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