X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=modules%2Fgui%2Fwxwidgets%2Fdialogs%2Fplaylist.cpp;h=8802d70b320a6bdeb6cc9800c3bedc3916cde76e;hb=ed0b72e3714ad87cb4e10b9a7239e19b9ef0724e;hp=1a47f082517cfb00d193cd4813bdac41fbc38df1;hpb=4d43a6db38957765be23a9eba323c087cdcaae73;p=vlc diff --git a/modules/gui/wxwidgets/dialogs/playlist.cpp b/modules/gui/wxwidgets/dialogs/playlist.cpp index 1a47f08251..8802d70b32 100644 --- a/modules/gui/wxwidgets/dialogs/playlist.cpp +++ b/modules/gui/wxwidgets/dialogs/playlist.cpp @@ -102,6 +102,7 @@ enum Search_Event, /* controls */ + Source_Event, TreeCtrl_Event, Browse_Event, /* For export playlist */ @@ -114,6 +115,7 @@ enum MenuDummy_Event = wxID_HIGHEST + 999, FirstView_Event = wxID_HIGHEST + 1000, + CategoryView_Event, OneLevelView_Event, LastView_Event = wxID_HIGHEST + 1100, FirstSD_Event = wxID_HIGHEST + 2000, @@ -156,6 +158,8 @@ BEGIN_EVENT_TABLE(Playlist, wxFrame) EVT_MENU( PopupInfo_Event, Playlist::OnPopupInfo) EVT_MENU( PopupAddNode_Event, Playlist::OnPopupAddNode) + /* Source selector */ + EVT_LIST_ITEM_SELECTED( Source_Event, Playlist::OnSourceSelected ) /* Tree control events */ EVT_TREE_ITEM_ACTIVATED( TreeCtrl_Event, Playlist::OnActivateItem ) EVT_TREE_KEY_DOWN( -1, Playlist::OnKeyDown ) @@ -187,9 +191,11 @@ class PlaylistItem : public wxTreeItemData public: PlaylistItem( playlist_item_t *p_item ) : wxTreeItemData() { - i_id = p_item->input.i_id; + i_id = p_item->i_id; + i_input_id = p_item->p_input->i_id; } protected: + int i_input_id; int i_id; friend class Playlist; friend class PlaylistFileDropTarget; @@ -220,8 +226,9 @@ Playlist::Playlist( intf_thread_t *_p_intf, wxWindow *p_parent ): p_view_menu = NULL; p_sd_menu = SDMenu(); - i_current_view = VIEW_CATEGORY; - b_changed_view = VLC_FALSE; +// i_current_view = VIEW_ONELEVEL; + p_current_viewroot = p_playlist->p_root_onelevel; + p_current_treeroot = p_playlist->p_local_onelevel; i_title_sorted = 0; i_group_sorted = 0; @@ -237,7 +244,7 @@ Playlist::Playlist( intf_thread_t *_p_intf, wxWindow *p_parent ): manage_menu->Append( AddDir_Event, wxU(_("Add &Directory...")) ); manage_menu->Append( AddMRL_Event, wxU(_("&Add URL...")) ); manage_menu->AppendSeparator(); - manage_menu->Append( MenuDummy_Event, wxU(_("Services discovery")), + manage_menu->Append( MenuDummy_Event, wxU(_("Services Discovery")), p_sd_menu ); manage_menu->AppendSeparator(); manage_menu->Append( Open_Event, wxU(_("&Open Playlist...")) ); @@ -247,8 +254,8 @@ Playlist::Playlist( intf_thread_t *_p_intf, wxWindow *p_parent ): /* Create our "Sort" menu */ wxMenu *sort_menu = new wxMenu; - sort_menu->Append( SortTitle_Event, wxU(_("Sort by &title")) ); - sort_menu->Append( RSortTitle_Event, wxU(_("&Reverse sort by title")) ); + sort_menu->Append( SortTitle_Event, wxU(_("Sort by &Title")) ); + sort_menu->Append( RSortTitle_Event, wxU(_("&Reverse Sort by Title")) ); sort_menu->AppendSeparator(); sort_menu->Append( Randomize_Event, wxU(_("&Shuffle")) ); @@ -272,12 +279,12 @@ Playlist::Playlist( intf_thread_t *_p_intf, wxWindow *p_parent ): /* Create the popup menu */ node_popup = new wxMenu; node_popup->Append( PopupPlay_Event, wxU(_("Play")) ); - node_popup->Append( PopupPlayThis_Event, wxU(_("Play this branch")) ); + node_popup->Append( PopupPlayThis_Event, wxU(_("Play this Branch")) ); node_popup->Append( PopupPreparse_Event, wxU(_("Preparse")) ); - node_popup->Append( PopupSort_Event, wxU(_("Sort this branch")) ); + node_popup->Append( PopupSort_Event, wxU(_("Sort this Branch")) ); node_popup->Append( PopupDel_Event, wxU(_("Delete")) ); node_popup->Append( PopupInfo_Event, wxU(_("Info")) ); - node_popup->Append( PopupAddNode_Event, wxU(_("Add node")) ); + node_popup->Append( PopupAddNode_Event, wxU(_("Add Node")) ); item_popup = new wxMenu; item_popup->Append( PopupPlay_Event, wxU(_("Play")) ); @@ -331,6 +338,11 @@ Playlist::Playlist( intf_thread_t *_p_intf, wxWindow *p_parent ): search_button->SetDefault(); toolbar->Realize(); + /* Create teh source selector */ + source_sel = new wxListCtrl( playlist_panel, Source_Event, + wxDefaultPosition, wxDefaultSize, + wxLC_AUTOARRANGE|wxLC_SINGLE_SEL ); + /* Create the tree */ treectrl = new wxTreeCtrl( playlist_panel, TreeCtrl_Event, wxDefaultPosition, wxDefaultSize, @@ -362,7 +374,8 @@ Playlist::Playlist( intf_thread_t *_p_intf, wxWindow *p_parent ): font.SetPointSize(9); treectrl->SetFont( font ); - wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer *panel_sizer = new wxBoxSizer( wxHORIZONTAL ); + panel_sizer->Add( source_sel, 0, wxALL | wxEXPAND, 5 ); panel_sizer->Add( treectrl, 1, wxEXPAND | wxALL, 5 ); panel_sizer->Layout(); @@ -380,9 +393,7 @@ Playlist::Playlist( intf_thread_t *_p_intf, wxWindow *p_parent ): #endif i_saved_id = -1; - - - /* We want to be noticed of playlist changes */ + i_saved_input_id = -1; /* Some global changes happened -> Rebuild all */ var_AddCallback( p_playlist, "intf-change", PlaylistChanged, this ); @@ -443,7 +454,7 @@ void Playlist::UpdateNode( playlist_item_t *p_node, wxTreeItemId node ) child = treectrl->GetNextChild( node, cookie ); } } - treectrl->SetItemImage( node, p_node->input.i_type ); + treectrl->SetItemImage( node, p_node->p_input->i_type ); } @@ -451,9 +462,9 @@ void Playlist::UpdateNode( playlist_item_t *p_node, wxTreeItemId node ) void Playlist::CreateNode( playlist_item_t *p_node, wxTreeItemId parent ) { wxTreeItemId node = - treectrl->AppendItem( parent, wxL2U( p_node->input.psz_name ), + treectrl->AppendItem( parent, wxL2U( p_node->p_input->psz_name ), -1,-1, new PlaylistItem( p_node ) ); - treectrl->SetItemImage( node, p_node->input.i_type ); + treectrl->SetItemImage( node, p_node->p_input->i_type ); UpdateNodeChildren( p_node, node ); } @@ -462,18 +473,20 @@ void Playlist::CreateNode( playlist_item_t *p_node, wxTreeItemId parent ) void Playlist::UpdateNodeChildren( playlist_item_t *p_node, wxTreeItemId node ) { - for( int i = 0; i< p_node->i_children ; i++ ) { /* Append the item */ if( p_node->pp_children[i]->i_children == -1 ) { - wxTreeItemId item = - treectrl->AppendItem( node, - wxL2U( p_node->pp_children[i]->input.psz_name ), -1,-1, + if( !(p_node->pp_children[i]->i_flags & PLAYLIST_DBL_FLAG) ) + { + wxTreeItemId item = + treectrl->AppendItem( node, + wxL2U( p_node->pp_children[i]->p_input->psz_name ), -1,-1, new PlaylistItem( p_node->pp_children[i]) ); - UpdateTreeItem( item ); + UpdateTreeItem( item ); + } } else { @@ -485,12 +498,12 @@ void Playlist::UpdateNodeChildren( playlist_item_t *p_node, /* Update an item in the tree */ void Playlist::UpdateTreeItem( wxTreeItemId item ) { + LockPlaylist( p_intf->p_sys, p_playlist ); if( ! item.IsOk() ) return; wxTreeItemData *p_data = treectrl->GetItemData( item ); if( !p_data ) return; - LockPlaylist( p_intf->p_sys, p_playlist ); playlist_item_t *p_item = playlist_ItemGetById( p_playlist, ((PlaylistItem *)p_data)->i_id ); if( !p_item ) @@ -501,16 +514,19 @@ void Playlist::UpdateTreeItem( wxTreeItemId item ) wxString msg; wxString duration = wxU( "" ); - char *psz_author = vlc_input_item_GetInfo( &p_item->input, - _(VLC_META_INFO_CAT), _(VLC_META_ARTIST) ); - if( !psz_author ) + + char *psz_author; + if( p_item->p_input->p_meta ) { - UnlockPlaylist( p_intf->p_sys, p_playlist ); - return; + psz_author= p_item->p_input->p_meta->psz_artist ? + strdup( p_item->p_input->p_meta->psz_artist ) : + strdup(""); } + else + psz_author = strdup( "" ); char psz_duration[MSTRTIME_MAX_SIZE]; - mtime_t dur = p_item->input.i_duration; + mtime_t dur = p_item->p_input->i_duration; if( dur != -1 ) { @@ -519,18 +535,18 @@ void Playlist::UpdateTreeItem( wxTreeItemId item ) wxU( " )" ) ); } - if( !strcmp( psz_author, "" ) || p_item->input.b_fixed_name == VLC_TRUE ) + if( !strcmp( psz_author, "" ) || p_item->p_input->b_fixed_name == VLC_TRUE ) { - msg = wxString( wxU( p_item->input.psz_name ) ) + duration; + msg = wxString( wxU( p_item->p_input->psz_name ) ) + duration; } else { msg = wxString(wxU( psz_author )) + wxT(" - ") + - wxString(wxU(p_item->input.psz_name)) + duration; + wxString(wxU(p_item->p_input->psz_name)) + duration; } free( psz_author ); treectrl->SetItemText( item , msg ); - treectrl->SetItemImage( item, p_item->input.i_type ); + treectrl->SetItemImage( item, p_item->p_input->i_type ); if( p_playlist->status.p_item == p_item ) { @@ -562,21 +578,20 @@ void Playlist::AppendItem( wxCommandEvent& event ) /* No need to do anything if the playlist is going to be rebuilt */ if( b_need_update ) return; - if( p_add->i_view != i_current_view ) goto update; - node = FindItem( treectrl->GetRootItem(), p_add->i_node ); if( !node.IsOk() ) goto update; p_item = playlist_ItemGetById( p_playlist, p_add->i_item ); if( !p_item ) goto update; + if( (p_item->i_flags & PLAYLIST_DBL_FLAG ) ) goto update; item = FindItem( treectrl->GetRootItem(), p_add->i_item ); if( item.IsOk() ) goto update; item = treectrl->AppendItem( node, - wxL2U( p_item->input.psz_name ), -1,-1, + wxL2U( p_item->p_input->psz_name ), -1,-1, new PlaylistItem( p_item ) ); - treectrl->SetItemImage( item, p_item->input.i_type ); + treectrl->SetItemImage( item, p_item->p_input->i_type ); if( item.IsOk() && p_item->i_children == -1 ) { @@ -585,26 +600,8 @@ void Playlist::AppendItem( wxCommandEvent& event ) update: int i_count = CountItems( treectrl->GetRootItem()); - if( i_count != p_playlist->i_size ) - { - statusbar->SetStatusText( wxString::Format( wxU(_( - "%i items in playlist (%i not shown)")), - p_playlist->i_size, - p_playlist->i_size - i_count ) ); - if( !b_changed_view ) - { - i_current_view = VIEW_CATEGORY; - b_changed_view = VLC_TRUE; - b_need_update = VLC_TRUE; - } - } - else - { - statusbar->SetStatusText( wxString::Format( wxU(_( - "%i items in playlist")), - p_playlist->i_size ), 0 ); - } - + statusbar->SetStatusText( wxString::Format( wxU(_( + "%i items in playlist" ) ), i_count ) ); return; } @@ -612,9 +609,7 @@ update: void Playlist::UpdateItem( int i ) { if( i < 0 ) return; /* Sanity check */ - - wxTreeItemId item = FindItem( treectrl->GetRootItem(), i ); - + wxTreeItemId item = FindItemByInput( treectrl->GetRootItem(), i ); if( item.IsOk() ) { UpdateTreeItem( item ); @@ -626,6 +621,11 @@ void Playlist::RemoveItem( int i ) if( i <= 0 ) return; /* Sanity check */ if( i == i_saved_id ) i_saved_id = -1; + /* Hack: always invalidate input item cache */ + i_saved_input_id = -1; + + /// \todo Check if it is in the source selector */ + wxTreeItemId item = FindItem( treectrl->GetRootItem(), i ); if( item.IsOk() ) @@ -641,6 +641,16 @@ void Playlist::RemoveItem( int i ) /* Find a wxItem from a playlist id */ wxTreeItemId Playlist::FindItem( wxTreeItemId root, int i_id ) +{ + return FindItemInner( root, i_id, false ); +} + +wxTreeItemId Playlist::FindItemByInput( wxTreeItemId root, int i_input_id ) +{ + return FindItemInner( root, i_input_id, true ); +} + +wxTreeItemId Playlist::FindItemInner( wxTreeItemId root, int i_id, bool b_byinput ) { wxTreeItemIdValue cookie; PlaylistItem *p_wxcurrent; @@ -652,51 +662,70 @@ wxTreeItemId Playlist::FindItem( wxTreeItemId root, int i_id ) if( i_id < 0 ) { - wxTreeItemId dummy; - return dummy; + wxTreeItemId dummy; dummy.Unset(); return dummy; } - if( i_saved_id == i_id ) - { + if( b_byinput && i_saved_input_id == i_id ) + return saved_input_tree_item; + if( !b_byinput && i_saved_id == i_id) return saved_tree_item; - } if( !p_wxcurrent ) { - wxTreeItemId dummy; - return dummy; + wxTreeItemId dummy; dummy.Unset(); return dummy; } - if( p_wxcurrent->i_id == i_id ) + if( !b_byinput && p_wxcurrent->i_id == i_id ) { i_saved_id = i_id; saved_tree_item = root; return root; } + if( b_byinput && p_wxcurrent->i_input_id == i_id ) + { + i_saved_input_id = i_id; + saved_input_tree_item = root; + return root; + } while( item.IsOk() ) { p_wxcurrent = (PlaylistItem *)treectrl->GetItemData( item ); - if( p_wxcurrent->i_id == i_id ) + if( !b_byinput && p_wxcurrent->i_id == i_id ) { i_saved_id = i_id; saved_tree_item = item; return item; } + else if( b_byinput && p_wxcurrent->i_input_id == i_id ) + { + i_saved_input_id = i_id; + saved_input_tree_item = item; + return item; + } if( treectrl->ItemHasChildren( item ) ) { - wxTreeItemId search = FindItem( item, i_id ); + wxTreeItemId search = FindItemInner( item, i_id, b_byinput ); if( search.IsOk() ) { - i_saved_id = i_id; - saved_tree_item = search; - return search; + if( !b_byinput ) + { + i_saved_id = i_id; + saved_tree_item = search; + return search; + } + else + { + i_saved_input_id = i_id; + saved_input_tree_item = search; + return search; + + } } } item = treectrl->GetNextChild( root, cookie ); } /* Not found */ - wxTreeItemId dummy; - return dummy; + wxTreeItemId dummy; dummy.Unset(); return dummy; } int Playlist::CountItems( wxTreeItemId root ) @@ -759,7 +788,7 @@ wxTreeItemId Playlist::FindItemByName( wxTreeItemId root, wxString search_string item = treectrl->GetNextChild( root, cookie); } /* Not found */ - wxTreeItemId dummy; + wxTreeItemId dummy; dummy.Unset(); return dummy; } @@ -768,8 +797,6 @@ wxTreeItemId Playlist::FindItemByName( wxTreeItemId root, wxString search_string **********************************************************************/ void Playlist::Rebuild( vlc_bool_t b_root ) { - playlist_view_t *p_view; - i_items_to_append = 0; /* We can remove the callbacks before locking, anyway, we won't @@ -785,39 +812,36 @@ void Playlist::Rebuild( vlc_bool_t b_root ) /* ...and rebuild it */ LockPlaylist( p_intf->p_sys, p_playlist ); } + /* Invalidate cache */ i_saved_id = -1; + i_saved_input_id = -1; - p_view = playlist_ViewFind( p_playlist, i_current_view ); /* FIXME */ + /* Rebuild the list */ + source_sel->ClearAll(); + for( int i = 0 ; i< p_current_viewroot->i_children ; i++ ) + { + source_sel->InsertItem( i, + wxL2U( p_current_viewroot->pp_children[i]->p_input->psz_name) ); + source_sel->SetItemData( i, + p_current_viewroot->pp_children[i]->i_id ); + if( p_current_viewroot->pp_children[i] == p_current_treeroot ) + source_sel->Select( i ); + } /* HACK we should really get new*/ treectrl->DeleteAllItems(); treectrl->AddRoot( wxU(_("root" )), -1, -1, - new PlaylistItem( p_view->p_root) ); + new PlaylistItem( p_current_treeroot ) ); wxTreeItemId root = treectrl->GetRootItem(); - UpdateNode( p_view->p_root, root ); + //UpdateNode( p_current_treeroot, root ); + //CreateNode( p_current_treeroot, root ); + UpdateNodeChildren( p_current_treeroot, root ); int i_count = CountItems( treectrl->GetRootItem() ); - if( i_count < p_playlist->i_size && !b_changed_view ) - { - i_current_view = VIEW_CATEGORY; - b_changed_view = VLC_TRUE; - Rebuild( VLC_FALSE ); - } - else if( i_count != p_playlist->i_size ) - { - statusbar->SetStatusText( wxString::Format( wxU(_( - "%i items in playlist (%i not shown)")), - p_playlist->i_size, - p_playlist->i_size - i_count ) ); - } - else - { - statusbar->SetStatusText( wxString::Format( wxU(_( - "%i items in playlist")), - p_playlist->i_size ), 0 ); - } + statusbar->SetStatusText( wxString::Format( wxU(_( + "%i items in playlist")), i_count ), 0 ); if( b_root ) { @@ -832,8 +856,6 @@ void Playlist::Rebuild( vlc_bool_t b_root ) } } - - void Playlist::ShowPlaylist( bool show ) { if( show ) Rebuild( VLC_TRUE ); @@ -876,16 +898,16 @@ void Playlist::DeleteTreeItem( wxTreeItemId item ) return; } - if( p_item->i_children == -1 ) DeleteItem( p_item->input.i_id ); + if( p_item->i_children == -1 ) DeleteItem( p_item->i_id ); else DeleteNode( p_item ); - RemoveItem( p_item->input.i_id ); + RemoveItem( p_item->i_id ); UnlockPlaylist( p_intf->p_sys, p_playlist ); } void Playlist::DeleteItem( int item_id ) { - playlist_Delete( p_playlist, item_id ); + playlist_DeleteFromItemId( p_playlist, item_id ); } void Playlist::DeleteNode( playlist_item_t *p_item ) @@ -937,8 +959,10 @@ void Playlist::OnSave( wxCommandEvent& WXUNUSED(event) ) { if( dialog.GetPath().mb_str() ) { - playlist_Export( p_playlist, dialog.GetPath().mb_str(), - formats[dialog.GetFilterIndex()].psz_module ); + abort(); +// playlist_Export( p_playlist, dialog.GetPath().mb_str(), +// /* ROOT */ +// formats[dialog.GetFilterIndex()].psz_module ); } } @@ -1010,28 +1034,16 @@ void Playlist::OnSort( wxCommandEvent& event ) void Playlist::OnSearch( wxCommandEvent& WXUNUSED(event) ) { wxString search_string = search_text->GetValue(); + PlaylistItem *p_wxroot; + p_wxroot = (PlaylistItem *)treectrl->GetItemData( treectrl->GetRootItem() ); + playlist_item_t *p_root = playlist_ItemGetById( p_playlist, p_wxroot->i_id ); - vlc_bool_t pb_found = VLC_FALSE; - - wxTreeItemId found = - FindItemByName( treectrl->GetRootItem(), search_string, - search_current, &pb_found ); - - if( !found.IsOk() ) - { - wxTreeItemId dummy; - search_current = dummy; - found = FindItemByName( treectrl->GetRootItem(), search_string, - search_current, &pb_found ); - } + if( !p_root ) abort(); + char *psz_name = wxFromLocale( search_string ); + playlist_LiveSearchUpdate( p_playlist, p_root, psz_name ); + Rebuild( VLC_TRUE ); - if( found.IsOk() ) - { - search_current = found; - treectrl->EnsureVisible( found ); - treectrl->UnselectAll(); - treectrl->SelectItem( found, true ); - } + wxLocaleFree( psz_name ); } /********************************************************************** @@ -1088,46 +1100,33 @@ void Playlist::OnRepeat( wxCommandEvent& event ) ********************************************************************/ void Playlist::OnActivateItem( wxTreeEvent& event ) { - playlist_item_t *p_item,*p_node,*p_item2,*p_node2; + playlist_item_t *p_item, *p_parent; PlaylistItem *p_wxitem = (PlaylistItem *)treectrl->GetItemData( event.GetItem() ); - wxTreeItemId parent = treectrl->GetItemParent( event.GetItem() ); - - PlaylistItem *p_wxparent = (PlaylistItem *)treectrl->GetItemData( parent ); LockPlaylist( p_intf->p_sys, p_playlist ); - if( !( p_wxitem && p_wxparent ) ) + if( !( p_wxitem ) ) { UnlockPlaylist( p_intf->p_sys, p_playlist ); return; } + p_item = playlist_ItemGetById( p_playlist, p_wxitem->i_id ); - p_item2 = playlist_ItemGetById(p_playlist, p_wxitem->i_id); - p_node2 = playlist_ItemGetById(p_playlist, p_wxparent->i_id); - if( p_item2 && p_item2->i_children == -1 ) + p_parent = p_item; + while( p_parent ) { - p_node = p_node2; - p_item = p_item2; + if( p_parent == p_current_treeroot ) + break; + p_parent = p_parent->p_parent; } - else + + if( p_parent ) { - p_node = p_item2; - p_item = NULL; -/* if( p_node && p_node->i_children > 0 && - p_node->pp_children[0]->i_children == -1) - { - p_item = p_node->pp_children[0]; - } - else - { - p_item = NULL; - }*/ + playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, 1242, + p_parent, p_item ); } - - playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, i_current_view, - p_node, p_item ); UnlockPlaylist( p_intf->p_sys, p_playlist ); } @@ -1157,11 +1156,6 @@ void Playlist::OnKeyDown( wxTreeEvent& event ) } } -void Playlist::OnEnDis( wxCommandEvent& event ) -{ - msg_Warn( p_intf, "not implemented" ); -} - void Playlist::OnDragItemBegin( wxTreeEvent& event ) { event.Allow(); @@ -1227,14 +1221,12 @@ void Playlist::OnDragItemEnd( wxTreeEvent& event ) { if( p_destitem2->pp_children[i] == p_destitem ) break; } - playlist_TreeMove( p_playlist, p_drageditem, p_destitem2, - i, i_current_view ); + playlist_TreeMove( p_playlist, p_drageditem, p_destitem2, i ); } else /* this is a node */ { - playlist_TreeMove( p_playlist, p_drageditem, p_destitem, - 0, i_current_view ); + playlist_TreeMove( p_playlist, p_drageditem, p_destitem, 0 ); } UnlockPlaylist( p_intf->p_sys, p_playlist ); @@ -1265,7 +1257,8 @@ bool PlaylistFileDropTarget::OnDropFiles( wxCoord x, wxCoord y, { /* We were droped below the last item so we append to the * general node */ - p_dest = p->p_playlist->p_general; + msg_Err( p->p_playlist, "USE OF P_GENERAL" ); + p_dest = p->p_playlist->p_local_category; i_pos = PLAYLIST_END; } else @@ -1308,10 +1301,10 @@ bool PlaylistFileDropTarget::OnDropFiles( wxCoord x, wxCoord y, for( size_t i = 0; i < filenames.GetCount(); i++ ) { const char *psz_utf8 = wxDnDFromLocale( filenames[i] ); - playlist_item_t *p_item = - playlist_ItemNew( p->p_playlist, psz_utf8, psz_utf8 ); - playlist_NodeAddItem( p->p_playlist, p_item, p->i_current_view, - p_dest, PLAYLIST_PREPARSE, i_pos ); + input_item_t *p_input = input_ItemNew( p->p_playlist, + psz_utf8, psz_utf8 ); + playlist_NodeAddInput( p->p_playlist, p_input, + p_dest, PLAYLIST_PREPARSE, i_pos ); wxDnDLocaleFree( psz_utf8 ); } @@ -1350,30 +1343,37 @@ void Playlist::OnMenuEvent( wxCommandEvent& event ) } else if( event.GetId() < LastView_Event ) { - - int i_new_view = event.GetId() - FirstView_Event; - - playlist_view_t *p_view = playlist_ViewFind( p_playlist, i_new_view ); - - if( p_view != NULL ) + if( event.GetId() == CategoryView_Event ) { - b_changed_view = VLC_TRUE; - i_current_view = i_new_view; - playlist_ViewUpdate( p_playlist, i_new_view ); - Rebuild( VLC_TRUE ); - return; + p_current_viewroot = p_playlist->p_root_category; + if( p_current_treeroot == p_playlist->p_local_category || + p_current_treeroot == p_playlist->p_local_onelevel ) + { + p_current_treeroot = p_playlist->p_local_category; + } + else if( p_current_treeroot == p_playlist->p_ml_category || + p_current_treeroot == p_playlist->p_ml_onelevel ) + { + p_current_treeroot = p_playlist->p_ml_category; + } } - else if( i_new_view >= VIEW_FIRST_SORTED && - i_new_view <= VIEW_LAST_SORTED ) + else if( event.GetId() == OneLevelView_Event ) { - b_changed_view = VLC_TRUE; - playlist_ViewInsert( p_playlist, i_new_view, "View" ); - playlist_ViewUpdate( p_playlist, i_new_view ); - - i_current_view = i_new_view; - - Rebuild( VLC_TRUE ); + p_current_viewroot = p_playlist->p_root_onelevel; + if( p_current_treeroot == p_playlist->p_local_category || + p_current_treeroot == p_playlist->p_local_onelevel ) + { + p_current_treeroot = p_playlist->p_local_onelevel; + } + else if( p_current_treeroot == p_playlist->p_ml_category || + p_current_treeroot == p_playlist->p_ml_onelevel ) + { + p_current_treeroot = p_playlist->p_ml_onelevel; + } } + wxCommandEvent event; + OnSearch( event ); + return; } else if( event.GetId() >= FirstSD_Event && event.GetId() < LastSD_Event ) { @@ -1410,14 +1410,8 @@ wxMenu * Playlist::ViewMenu() } } - /* FIXME : have a list of "should have" views */ - p_view_menu->Append( FirstView_Event + VIEW_CATEGORY, - wxU(_("Normal") ) ); - p_view_menu->Append( FirstView_Event + VIEW_S_AUTHOR, - wxU(_("Sorted by artist") ) ); - p_view_menu->Append( FirstView_Event + VIEW_S_ALBUM, - wxU(_("Sorted by Album") ) ); - + p_view_menu->Append( CategoryView_Event, wxU(_("Normal") ) ); + p_view_menu->Append( OneLevelView_Event, wxU(_("One level") ) ); return p_view_menu; } @@ -1450,13 +1444,19 @@ wxMenu *Playlist::SDMenu() (p_parser->psz_shortname ? p_parser->psz_shortname : p_parser->psz_object_name) ) ); + /* hack to handle submodules properly */ + int i = -1; + while( p_parser->pp_shortcuts[++i] != NULL ); + i--; if( playlist_IsServicesDiscoveryLoaded( p_playlist, - p_parser->psz_object_name ) ) + i>=0?p_parser->pp_shortcuts[i] + :p_parser->psz_object_name ) ) { p_sd_menu->Check( FirstSD_Event + i_number, TRUE ); } - pp_sds[i_number++] = p_parser->psz_object_name; + pp_sds[i_number++] = i>=0?p_parser->pp_shortcuts[i] + :p_parser->psz_object_name; } } vlc_list_release( p_list ); @@ -1509,6 +1509,12 @@ void Playlist::OnPopup( wxContextMenuEvent& event ) void Playlist::OnPopupPlay( wxCommandEvent& event ) { playlist_item_t *p_popup_item, *p_popup_parent; + + + + abort(); + + LockPlaylist( p_intf->p_sys, p_playlist ); p_popup_item = playlist_ItemGetById( p_playlist, i_popup_item ); p_popup_parent = playlist_ItemGetById( p_playlist, i_popup_parent ); @@ -1520,13 +1526,13 @@ void Playlist::OnPopupPlay( wxCommandEvent& event ) p_popup_item->i_children > 0 ) { playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, - i_current_view, p_popup_item, + 1242, p_popup_item, p_popup_item->pp_children[0] ); } else { - playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, - i_current_view, p_popup_item, NULL ); + playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, 1242, + p_popup_item, NULL ); } } else @@ -1534,8 +1540,7 @@ void Playlist::OnPopupPlay( wxCommandEvent& event ) if( event.GetId() == PopupPlay_Event ) { playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, - i_current_view, p_popup_parent, - p_popup_item ); + 1242, p_popup_parent, p_popup_item ); } } } @@ -1557,7 +1562,7 @@ void Playlist::Preparse() { if( p_popup_item->i_children == -1 ) { - playlist_PreparseEnqueue( p_playlist, &p_popup_item->input ); + playlist_PreparseEnqueue( p_playlist, p_popup_item->p_input ); } else { @@ -1567,8 +1572,8 @@ void Playlist::Preparse() { wxMenuEvent dummy; i_wx_popup_item = FindItem( treectrl->GetRootItem(), - p_parent->pp_children[i]->input.i_id ); - i_popup_item = p_parent->pp_children[i]->input.i_id; + p_parent->pp_children[i]->i_id ); + i_popup_item = p_parent->pp_children[i]->i_id; Preparse(); } } @@ -1596,7 +1601,7 @@ void Playlist::OnPopupSort( wxCommandEvent& event ) SORT_TITLE_NODES_FIRST, ORDER_NORMAL ); treectrl->DeleteChildren( i_wx_popup_item ); - i_saved_id = -1; + i_saved_id = -1; i_saved_input_id = -1; UpdateNodeChildren( p_item, i_wx_popup_item ); } @@ -1636,7 +1641,7 @@ void Playlist::OnPopupAddNode( wxCommandEvent& event ) p_item = playlist_ItemGetById( p_playlist, p_wxitem->i_id ); - playlist_NodeCreate( p_playlist, i_current_view, psz_name, p_item ); + playlist_NodeCreate( p_playlist, psz_name, p_item ); UnlockPlaylist( p_intf->p_sys, p_playlist ); Rebuild( VLC_TRUE ); @@ -1644,6 +1649,17 @@ void Playlist::OnPopupAddNode( wxCommandEvent& event ) wxLocaleFree( psz_name ); } +void Playlist::OnSourceSelected( wxListEvent &event ) +{ + int i_id = event.GetData(); + + if( p_current_treeroot && i_id != p_current_treeroot->i_id ) + { + playlist_item_t *p_item = playlist_ItemGetById( p_playlist, i_id ); + if( p_item ) p_current_treeroot = p_item; + Rebuild( VLC_TRUE ); + } +} /***************************************************************************** * Custom events management @@ -1653,12 +1669,16 @@ void Playlist::OnPlaylistEvent( wxCommandEvent& event ) switch( event.GetId() ) { case UpdateItem_Event: + fprintf( stderr,"Update input item id %i\n", event.GetInt() ); UpdateItem( event.GetInt() ); break; case AppendItem_Event: + fprintf( stderr,"Append item id %i\n", + ((playlist_add_t*)event.GetClientData())->i_item ); AppendItem( event ); break; case RemoveItem_Event: + fprintf( stderr,"Remove item id %i\n", event.GetInt() ); RemoveItem( event.GetInt() ); break; }