@interface VLCMediaListAspect (Private)
/* Initializers */
- (void)initInternalMediaListView;
+
+- (void)mediaListViewItemAdded:(NSDictionary *)args;
+- (void)mediaListViewItemRemoved:(NSNumber *)index;
+@end
+
+@implementation VLCMediaListAspectNode
+@synthesize media;
+@synthesize children;
+
+- (BOOL)isLeaf
+{
+ return self.children == NULL;
+}
+
+-(void)dealloc
+{
+ [self.children release];
+ [super dealloc];
+}
@end
@implementation VLCMediaListAspect (KeyValueCodingCompliance)
-/* For the @"Media" key */
+/* For the @"media" key */
- (int) countOfMedia
{
- return [self count];
+ return [cachedNode count];
}
- (id) objectInMediaAtIndex:(int)i
{
- return [self mediaAtIndex:i];
+ return [[cachedNode objectAtIndex:i] media];
+}
+/* For the @"node" key */
+- (int) countOfNode
+{
+ return [cachedNode count];
+}
+- (id) objectInNodeAtIndex:(int)i
+{
+ return [cachedNode objectAtIndex:i];
}
@end
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
id self = user_data;
- int index = event->u.media_list_view_item_added.index;
- [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"Media"];
+ [[VLCEventManager sharedManager] callOnMainThreadObject:self
+ withMethod:@selector(mediaListViewItemAdded:)
+ withArgumentAsObject:[NSDictionary dictionaryWithObjectsAndKeys:
+ [VLCMedia mediaWithLibVLCMediaDescriptor:event->u.media_list_item_added.item], @"media",
+ [NSNumber numberWithInt:event->u.media_list_item_added.index], @"index",
+ nil]];
[pool release];
}
+
static void HandleMediaListViewItemDeleted( const libvlc_event_t * event, void * user_data)
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
id self = user_data;
- int index = event->u.media_list_view_item_deleted.index;
- [self didChange:NSKeyValueChangeRemoval valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"Media"];
+ [[VLCEventManager sharedManager] callOnMainThreadObject:self
+ withMethod:@selector(mediaListViewItemRemoved:)
+ withArgumentAsObject:[NSNumber numberWithInt:event->u.media_list_item_deleted.index]];
[pool release];
}
{
// Release allocated memory
libvlc_media_list_view_release(p_mlv);
- [cachedMedia release];
+ [cachedNode release];
+ [parentMediaList release];
[super dealloc];
}
- (VLCMedia *)mediaAtIndex:(int)index
return [VLCMedia mediaWithLibVLCMediaDescriptor:p_md];
}
+- (VLCMediaListAspect *)childrenAtIndex:(int)index
+{
+ libvlc_exception_t p_e;
+ libvlc_exception_init( &p_e );
+ libvlc_media_list_view_t *p_sub_mlv = libvlc_media_list_view_children_at_index( p_mlv, index, &p_e );
+ quit_on_exception( &p_e );
+
+ if( !p_sub_mlv )
+ return nil;
+
+ // Returns local object for media descriptor, searchs for user data first. If not found it creates a
+ // new cocoa object representation of the media descriptor.
+ return [VLCMediaListAspect mediaListAspectWithLibVLCMediaListView:p_sub_mlv];
+}
+
+- (VLCMediaListAspectNode *)nodeAtIndex:(int)index
+{
+ VLCMediaListAspectNode * node = [[[VLCMediaListAspectNode alloc] init] autorelease];
+ [node setMedia:[self mediaAtIndex: index]];
+ return node;
+}
+
- (int)count
{
libvlc_exception_t p_e;
return result;
}
+
+- (VLCMediaList *)parentMediaList
+{
+ return [[parentMediaList retain] autorelease];
+}
@end
@implementation VLCMediaListAspect (LibVLCBridging)
{
p_mlv = p_new_mlv;
libvlc_media_list_view_retain(p_mlv);
- //libvlc_media_list_lock(p_mlist);
- cachedMedia = [[NSMutableArray alloc] initWithCapacity:libvlc_media_list_view_count(p_mlv, NULL)];
+ libvlc_media_list_t * p_mlist = libvlc_media_list_view_parent_media_list(p_mlv, NULL);
+ parentMediaList = [[VLCMediaList mediaListWithLibVLCMediaList: p_mlist] retain];
+ libvlc_media_list_release( p_mlist );
+
+ //libvlc_media_list_lock(p_mlv->p_mlist);
+ cachedNode = [[NSMutableArray alloc] initWithCapacity:libvlc_media_list_view_count(p_mlv, NULL)];
int i, count = libvlc_media_list_view_count(p_mlv, NULL);
for( i = 0; i < count; i++ )
{
libvlc_media_descriptor_t * p_md = libvlc_media_list_view_item_at_index(p_mlv, i, NULL);
- [cachedMedia addObject:[VLCMedia mediaWithLibVLCMediaDescriptor: p_md]];
+ libvlc_media_list_view_t * p_sub_mlv = libvlc_media_list_view_children_at_index(p_mlv, i, NULL);
+ VLCMediaListAspectNode * node = [[[VLCMediaListAspectNode alloc] init] autorelease];
+ [node setMedia:[VLCMedia mediaWithLibVLCMediaDescriptor: p_md]];
+ [node setChildren: p_sub_mlv ? [VLCMediaListAspect mediaListAspectWithLibVLCMediaListView: p_sub_mlv] : nil];
+ [cachedNode addObject:node];
libvlc_media_descriptor_release(p_md);
+ if( p_sub_mlv ) libvlc_media_list_view_release(p_sub_mlv);
}
[self initInternalMediaListView];
- //libvlc_media_list_unlock(p_mlist);
+ //libvlc_media_list_unlock(p_mlv->p_mlist);
}
return self;
}
libvlc_event_attach( p_em, libvlc_MediaListViewItemDeleted, HandleMediaListViewItemDeleted, self, &e );
quit_on_exception( &e );
}
-@end
+- (void)mediaListViewItemAdded:(NSDictionary *)args
+{
+ int index = [[args objectForKey:@"index"] intValue];
+ VLCMedia * media = [args objectForKey:@"media"];
+
+ VLCMediaListAspectNode * node = [[[VLCMediaListAspectNode alloc] init] autorelease];
+ [node setMedia:media];
+ [node setChildren:[self childrenAtIndex:index]];
+
+ [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"media"];
+ [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"node"];
+ [cachedNode insertObject:node atIndex:index];
+ [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"node"];
+ [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:index] forKey:@"media"];
+}
+
+- (void)mediaListViewItemRemoved:(NSNumber *)index
+{
+ [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:[index intValue]] forKey:@"media"];
+ [self willChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:[index intValue]] forKey:@"node"];
+ [cachedNode removeObjectAtIndex:[index intValue]];
+ [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:[index intValue]] forKey:@"node"];
+ [self didChange:NSKeyValueChangeInsertion valuesAtIndexes:[NSIndexSet indexSetWithIndex:[index intValue]] forKey:@"media"];
+}
+@end