X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcontrol%2Fhierarchical_media_list_view.c;h=d3a4eda0cc57bf73fd898f8ae19c5840d0138dd9;hb=dbfffa2a25fa5fbcbe5346599facb23eaa337972;hp=4dfbd93163fc59251f63c41ac4d512d101bc3b75;hpb=bcc7f49d69083d5ca4c47aeda13813ac429e84aa;p=vlc diff --git a/src/control/hierarchical_media_list_view.c b/src/control/hierarchical_media_list_view.c index 4dfbd93163..d3a4eda0cc 100644 --- a/src/control/hierarchical_media_list_view.c +++ b/src/control/hierarchical_media_list_view.c @@ -2,7 +2,7 @@ * hierarchical_media_list_view.c: libvlc hierarchical media list view functs. ***************************************************************************** * Copyright (C) 2007 the VideoLAN team - * $Id: flat_media_list.c 21287 2007-08-20 01:28:12Z pdherbemont $ + * $Id$ * * Authors: Pierre d'Herbemont * @@ -58,7 +58,7 @@ hierarch_media_list_view_count( libvlc_media_list_view_t * p_mlv, * flat_media_list_view_item_at_index (private) * (called by flat_media_list_view_item_at_index) **************************************************************************/ -static libvlc_media_descriptor_t * +static libvlc_media_t * hierarch_media_list_view_item_at_index( libvlc_media_list_view_t * p_mlv, int index, libvlc_exception_t * p_e ) @@ -75,28 +75,86 @@ hierarch_media_list_view_children_at_index( libvlc_media_list_view_t * p_mlv, int index, libvlc_exception_t * p_e ) { - libvlc_media_descriptor_t * p_md; + libvlc_media_t * p_md; libvlc_media_list_t * p_submlist; + libvlc_media_list_view_t * p_ret; p_md = libvlc_media_list_item_at_index( p_mlv->p_mlist, index, p_e ); if( !p_md ) return NULL; - p_submlist = libvlc_media_descriptor_subitems( p_md, p_e ); + p_submlist = libvlc_media_subitems( p_md, p_e ); + libvlc_media_release( p_md ); if( !p_submlist ) return NULL; - return libvlc_media_list_hierarchical_view( p_submlist, p_e ); + p_ret = libvlc_media_list_hierarchical_view( p_submlist, p_e ); + libvlc_media_list_release( p_submlist ); + + return p_ret; } /************************************************************************** - * flat_media_list_view_release (private) - * (called by media_list_view_release) + * media_list_(item|will)_* (private) (Event callback) **************************************************************************/ static void -hierarch_media_list_view_release( libvlc_media_list_view_t * p_mlv ) +media_list_item_added( const libvlc_event_t * p_event, void * user_data ) +{ + libvlc_media_t * p_md; + libvlc_media_list_view_t * p_mlv = user_data; + int index = p_event->u.media_list_item_added.index; + p_md = p_event->u.media_list_item_added.item; + libvlc_media_list_view_item_added( p_mlv, p_md, index ); +} +static void +media_list_will_add_item( const libvlc_event_t * p_event, void * user_data ) +{ + libvlc_media_t * p_md; + libvlc_media_list_view_t * p_mlv = user_data; + int index = p_event->u.media_list_will_add_item.index; + p_md = p_event->u.media_list_will_add_item.item; + libvlc_media_list_view_will_add_item( p_mlv, p_md, index ); +} +static void +media_list_item_deleted( const libvlc_event_t * p_event, void * user_data ) +{ + libvlc_media_t * p_md; + libvlc_media_list_view_t * p_mlv = user_data; + int index = p_event->u.media_list_item_deleted.index; + p_md = p_event->u.media_list_item_deleted.item; + libvlc_media_list_view_item_deleted( p_mlv, p_md, index ); +} +static void +media_list_will_delete_item( const libvlc_event_t * p_event, void * user_data ) { + libvlc_media_t * p_md; + libvlc_media_list_view_t * p_mlv = user_data; + int index = p_event->u.media_list_will_delete_item.index; + p_md = p_event->u.media_list_will_delete_item.item; + libvlc_media_list_view_will_delete_item( p_mlv, p_md, index ); } /* * Public libvlc functions */ + +/************************************************************************** + * flat_media_list_view_release (private) + * (called by media_list_view_release) + **************************************************************************/ +static void +hierarch_media_list_view_release( libvlc_media_list_view_t * p_mlv ) +{ + libvlc_event_detach( p_mlv->p_mlist->p_event_manager, + libvlc_MediaListItemAdded, + media_list_item_added, p_mlv, NULL ); + libvlc_event_detach( p_mlv->p_mlist->p_event_manager, + libvlc_MediaListWillAddItem, + media_list_will_add_item, p_mlv, NULL ); + libvlc_event_detach( p_mlv->p_mlist->p_event_manager, + libvlc_MediaListItemDeleted, + media_list_item_deleted, p_mlv, NULL ); + libvlc_event_detach( p_mlv->p_mlist->p_event_manager, + libvlc_MediaListWillDeleteItem, + media_list_will_delete_item, p_mlv, NULL ); +} + /************************************************************************** * libvlc_media_list_flat_view (Public) **************************************************************************/ @@ -106,14 +164,27 @@ libvlc_media_list_hierarchical_view( libvlc_media_list_t * p_mlist, { trace("\n"); libvlc_media_list_view_t * p_mlv; - libvlc_media_list_lock( p_mlist ); p_mlv = libvlc_media_list_view_new( p_mlist, hierarch_media_list_view_count, hierarch_media_list_view_item_at_index, hierarch_media_list_view_children_at_index, + libvlc_media_list_hierarchical_view, hierarch_media_list_view_release, NULL, p_e ); + libvlc_media_list_lock( p_mlist ); + libvlc_event_attach( p_mlv->p_mlist->p_event_manager, + libvlc_MediaListItemAdded, + media_list_item_added, p_mlv, NULL ); + libvlc_event_attach( p_mlv->p_mlist->p_event_manager, + libvlc_MediaListWillAddItem, + media_list_will_add_item, p_mlv, NULL ); + libvlc_event_attach( p_mlv->p_mlist->p_event_manager, + libvlc_MediaListItemDeleted, + media_list_item_deleted, p_mlv, NULL ); + libvlc_event_attach( p_mlv->p_mlist->p_event_manager, + libvlc_MediaListWillDeleteItem, + media_list_will_delete_item, p_mlv, NULL ); libvlc_media_list_unlock( p_mlist ); return p_mlv; }