#import "bookmarks.h"
#include "playlist.h"
#include "controls.h"
-#include "osd.h"
+#include "vlc_osd.h"
#include "misc.h"
/*****************************************************************************
[o_outline_view setDoubleAction: @selector(playItem:)];
[o_outline_view registerForDraggedTypes:
- [NSArray arrayWithObjects: NSFilenamesPboardType, nil]];
+ [NSArray arrayWithObjects: NSFilenamesPboardType,
+ @"VLCPlaylistItemPboardType", nil]];
[o_outline_view setIntercellSpacing: NSMakeSize (0.0, 1.0)];
/* We need to check whether _defaultTableHeaderSortImage exists, since it
- (void)updateRowSelection
{
-// int i;
int i_row;
unsigned int j;
{
playlist_item_t *p_item;
playlist_item_t *p_node = NULL;
-// int i;
p_item = [[o_outline_view itemAtRow:[o_outline_view selectedRow]] pointerValue];
[self removeItemsFrom: o_nodes_array ifChildrenOf: o_nodes_array];
[self removeItemsFrom: o_items_array ifChildrenOf: o_nodes_array];
-#if 0
- unsigned int j;
-
- for( i = 0 ; i < [o_nodes_array count] ; i++ )
- {
- for ( j = 0 ; j < [o_nodes_array count] ; j++ )
- {
- if( j == i ) continue;
- if( [self isItem: [[o_nodes_array objectAtIndex:i] pointerValue]
- inNode: [[o_nodes_array objectAtIndex:j] pointerValue]] )
- {
- [o_nodes_array removeObjectAtIndex:i];
- /* We need to execute the next iteration with the same index
- since the current item has been deleted */
- i--;
- break;
- }
- }
- }
-
- for( i = 0 ; i < [o_items_array count] ; i++ )
- {
- for ( j = 0 ; j < [o_nodes_array count] ; j++ )
- {
- if( [self isItem: [[o_items_array objectAtIndex:i] pointerValue]
- inNode: [[o_nodes_array objectAtIndex:j] pointerValue]] )
- {
- [o_items_array removeObjectAtIndex:i];
- i--;
- break;
- }
- }
- }
-#endif
/* We add the "VLCPlaylistItemPboardType" type to be able to recognize
- a Drop operation comçing from the playlist.
- We need to add NSFilenamesPboardType otherwise the outlineview refuses
- to the drop. */
+ a Drop operation coming from the playlist. */
[pboard declareTypes: [NSArray arrayWithObjects:
- @"VLCPlaylistItemPboardType",NSFilenamesPboardType, nil] owner: self];
+ @"VLCPlaylistItemPboardType", nil] owner: self];
[pboard setData:[NSData data] forType:@"VLCPlaylistItemPboardType"];
- [pboard setPropertyList:[NSArray array]
- forType:NSFilenamesPboardType];
vlc_object_release(p_playlist);
return YES;
NSPasteboard *o_pasteboard = [info draggingPasteboard];
if( !p_playlist ) return NSDragOperationNone;
-
- /* Dropping ON items is not allowed */
- if( index == NSOutlineViewDropOnItemIndex )
+
+ /* Dropping ON items is not allowed if item is not a node */
+ if( item )
{
- vlc_object_release( p_playlist );
- return NSDragOperationNone;
+ if( index == NSOutlineViewDropOnItemIndex &&
+ ((playlist_item_t *)[item pointerValue])->i_children == -1 )
+ {
+ vlc_object_release( p_playlist );
+ return NSDragOperationNone;
+ }
}
/* We refuse to drop an item in anything else than a child of the General
/* Drag & Drop inside the playlist */
if( [[o_pasteboard types] containsObject: @"VLCPlaylistItemPboardType"] )
{
- int i_row;
+ int i_row, i_removed_from_node = 0;
unsigned int i;
playlist_item_t *p_new_parent, *p_item = NULL;
NSArray *o_all_items = [o_nodes_array arrayByAddingObjectsFromArray:
else
p_new_parent = [item pointerValue];
- /* If the proposed parent is not a node, then use the parent node of
- this item. */
- if( p_new_parent->i_children <= 0 )
+ /* Make sure the proposed parent is a node.
+ (This should never be true) */
+ if( p_new_parent->i_children < 0 )
{
- int j;
- playlist_item_t *p_temp_item = p_new_parent;
- p_new_parent = [self parentOfItem: p_new_parent];
- if( !p_new_parent )
- {
- vlc_object_release(p_playlist);
- return NO;
- }
- /* Calculate the position of the dropped item in this new parent:
- following the first proposed parent. */
- for( j = 0; j < p_new_parent->i_children; j++ )
- {
- if( p_new_parent->pp_children[j] == p_temp_item )
- {
- index = j;
- break;
- }
- else if( j == p_new_parent->i_children - 1 )
- index = -1;
- }
+ vlc_object_release( p_playlist );
+ return NO;
}
for( i = 0; i < [o_all_items count]; i++ )
}
}
-
- /* If we move the playing item in a different node or we move the
- node containing the playing item in a different node, then stop
- playback, or the playlist refuses to detach the item. */
-/* if( p_playlist->status.i_status != PLAYLIST_STOPPED &&
- (( p_item == p_playlist->status.p_item &&
- p_new_parent != p_old_parent) ||
- ( p_item->i_children > 0 &&
- [self isItem: p_playlist->status.p_item inNode:p_item] == YES))
- {
- playlist_Stop( p_playlist );
- }*/
vlc_mutex_lock( &p_playlist->object_lock );
// Acually detach the item from the old position
if( playlist_NodeRemoveItem( p_playlist, p_item, p_old_parent ) ==
i_new_index = -1;
/* If we move the item in the same node, we need to take into
account that one item will be deleted */
- else if((p_new_parent == p_old_parent &&
- i_old_index < index + (int)i)
- || p_new_parent == p_playlist->p_general || index == 0 )
- i_new_index = index + i;
else
- i_new_index = index + i + 1;
+ {
+ if ((p_new_parent == p_old_parent &&
+ i_old_index < index + (int)i)
+ || p_new_parent == p_playlist->p_general )
+ {
+ i_removed_from_node++;
+ }
+ i_new_index = index + i - i_removed_from_node;
+ }
// Reattach the item to the new position
playlist_NodeInsert( p_playlist, i_current_view, p_item,
p_new_parent, i_new_index );
{
[self appendArray: o_array atPos: index enqueue: YES];
}
+ /* This should never occur */
else if( p_node->i_children == -1 )
{
- int i_counter;
- playlist_item_t *p_real_node = NULL;
-
- for( i_counter = 0 ; i_counter < p_node->i_parents ; i_counter++ )
- {
- if( p_node->pp_parents[i_counter]->i_view == i_current_view )
- {
- p_real_node = p_node->pp_parents[i_counter]->p_parent;
- break;
- }
- if( i_counter == p_node->i_parents )
- {
- vlc_object_release(p_playlist);
- return NO;
- }
- }
- [self appendNodeArray: o_array inNode: p_real_node
- atPos: index inView: i_current_view enqueue: YES];
+ vlc_object_release( p_playlist );
+ return NO;
}
else
{