📄 playlist.cpp
字号:
p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_FILE, 0, 0 ); b_need_update = VLC_TRUE; break; case ID_SEL_DELETE: OnDeleteSelection(); b_need_update = VLC_TRUE; break; case Infos_Event: OnPopupInfo( hwnd ); b_need_update = VLC_TRUE; break; case Up_Event: OnUp(); b_need_update = VLC_TRUE; break; case Down_Event: OnDown(); b_need_update = VLC_TRUE; break; case Random_Event: OnRandom(); break; case Loop_Event: OnLoop(); break; case Repeat_Event: OnRepeat(); break; case ID_SORT_TITLE: OnSort( ID_SORT_TITLE ); break; case ID_SORT_RTITLE: OnSort( ID_SORT_RTITLE ); break; case ID_SORT_AUTHOR: OnSort( ID_SORT_AUTHOR ); break; case ID_SORT_RAUTHOR: OnSort( ID_SORT_RAUTHOR ); break; case ID_SORT_SHUFFLE: OnSort( ID_SORT_SHUFFLE ); break; case ID_SEL_ENABLE: OnEnableSelection(); break; case ID_SEL_DISABLE: OnDisableSelection(); break; case ID_SEL_INVERT: OnInvertSelection(); break; case ID_SEL_SELECTALL: OnSelectAll(); break; case PopupPlay_Event: OnPopupPlay(); b_need_update = VLC_TRUE; break; case PopupDel_Event: OnPopupDel(); b_need_update = VLC_TRUE; break; case PopupEna_Event: OnPopupEna(); b_need_update = VLC_TRUE; break; case PopupInfo_Event: OnPopupInfo( hwnd ); b_need_update = VLC_TRUE; break; default: break; } break; case WM_NOTIFY: if( ( ((LPNMHDR)lp)->hwndFrom == hListView ) && ( ((LPNMHDR)lp)->code == NM_CUSTOMDRAW ) ) { SetWindowLong( hwnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lp) ); } else if( ( ((LPNMHDR)lp)->hwndFrom == hListView ) && ( ((LPNMHDR)lp)->code == GN_CONTEXTMENU ) ) { HandlePopupMenu( hwnd, ((PNMRGINFO)lp)->ptAction ); } else if( ( ((LPNMHDR)lp)->hwndFrom == hListView ) && ( ((LPNMHDR)lp)->code == LVN_COLUMNCLICK ) ) { OnColSelect( ((LPNMLISTVIEW)lp)->iSubItem ); } else if( ( ((LPNMHDR)lp)->hwndFrom == hListView ) && ( ((LPNMHDR)lp)->code == LVN_ITEMACTIVATE ) ) { OnActivateItem( ((LPNMLISTVIEW)lp)->iSubItem ); } break; default: // the message was not processed // indicate if the base class handled it break; } return FALSE;}LRESULT Playlist::ProcessCustomDraw( LPARAM lParam ){ LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; switch( lplvcd->nmcd.dwDrawStage ) { case CDDS_PREPAINT : //Before the paint cycle begins //request notifications for individual listview items return CDRF_NOTIFYITEMDRAW; case CDDS_ITEMPREPAINT: //Before an item is drawn playlist_t *p_playlist = (playlist_t *) vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist == NULL ) return CDRF_DODEFAULT; if( (int)lplvcd->nmcd.dwItemSpec == p_playlist->i_index ) { lplvcd->clrText = RGB(255,0,0); vlc_object_release(p_playlist); return CDRF_NEWFONT; } playlist_item_t *p_item = playlist_ItemGetByPos( p_playlist, (int)lplvcd->nmcd.dwItemSpec ); if( !p_item ) { vlc_object_release(p_playlist); return CDRF_DODEFAULT; } if( p_item->b_enabled == VLC_FALSE ) { lplvcd->clrText = RGB(192,192,192); vlc_object_release(p_playlist); return CDRF_NEWFONT; } } return CDRF_DODEFAULT;}/********************************************************************** * Handles the display of the "floating" popup **********************************************************************/void Playlist::HandlePopupMenu( HWND hwnd, POINT point ){ HMENU hMenuTrackPopup; // Create the popup menu. hMenuTrackPopup = CreatePopupMenu(); // Append some items. AppendMenu( hMenuTrackPopup, MF_STRING, PopupPlay_Event, _T("Play") ); AppendMenu( hMenuTrackPopup, MF_STRING, PopupDel_Event, _T("Delete") ); AppendMenu( hMenuTrackPopup, MF_STRING, PopupEna_Event, _T("Toggle enabled") ); AppendMenu( hMenuTrackPopup, MF_STRING, PopupInfo_Event, _T("Info") ); /* Draw and track the "floating" popup */ TrackPopupMenu( hMenuTrackPopup, 0, point.x, point.y, 0, hwnd, NULL ); /* Destroy the menu since were are done with it. */ DestroyMenu( hMenuTrackPopup );}/********************************************************************** * Show the playlist **********************************************************************/void Playlist::ShowPlaylist( bool b_show ){ if( b_show ) Rebuild(); Show( b_show );}/********************************************************************** * Update the playlist **********************************************************************/void Playlist::UpdatePlaylist(){ if( b_need_update ) { Rebuild(); b_need_update = VLC_FALSE; } playlist_t *p_playlist = (playlist_t *) vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist == NULL ) return; /* Update the colour of items */ vlc_mutex_lock( &p_playlist->object_lock ); if( p_intf->p_sys->i_playing != p_playlist->i_index ) { // p_playlist->i_index in RED Rebuild(); // if exists, p_intf->p_sys->i_playing in BLACK p_intf->p_sys->i_playing = p_playlist->i_index; } vlc_mutex_unlock( &p_playlist->object_lock ); vlc_object_release( p_playlist );}/********************************************************************** * Rebuild the playlist **********************************************************************/void Playlist::Rebuild(){ playlist_t *p_playlist = (playlist_t *) vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist == NULL ) return; int i_focused = ListView_GetNextItem( hListView, -1, LVIS_SELECTED | LVNI_ALL ); /* Clear the list... */ ListView_DeleteAllItems( hListView ); /* ...and rebuild it */ vlc_mutex_lock( &p_playlist->object_lock ); for( int i = 0; i < p_playlist->i_size; i++ ) { LVITEM lv; lv.mask = LVIF_TEXT; lv.pszText = _T(""); lv.cchTextMax = 1; lv.iSubItem = 0; lv.iItem = i; ListView_InsertItem( hListView, &lv ); ListView_SetItemText( hListView, lv.iItem, 0, _FROMMB(p_playlist->pp_items[i]->input.psz_name) ); UpdateItem( i ); } vlc_mutex_unlock( &p_playlist->object_lock ); if ( i_focused ) ListView_SetItemState( hListView, i_focused, LVIS_FOCUSED | LVIS_SELECTED, LVIS_STATEIMAGEMASK ) else ListView_SetItemState( hListView, i_focused, LVIS_FOCUSED, LVIS_STATEIMAGEMASK ); vlc_object_release( p_playlist );}/********************************************************************** * Update one playlist item **********************************************************************/void Playlist::UpdateItem( int i ){ playlist_t *p_playlist = (playlist_t *) vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist == NULL ) return; playlist_item_t *p_item = playlist_ItemGetByPos( p_playlist, i ); if( !p_item ) { vlc_object_release(p_playlist); return; } ListView_SetItemText( hListView, i, 0, _FROMMB(p_item->input.psz_name) ); ListView_SetItemText( hListView, i, 1, _FROMMB( vlc_input_item_GetInfo( &p_item->input, _("General") , _("Author") ) ) ); char psz_duration[MSTRTIME_MAX_SIZE]; mtime_t dur = p_item->input.i_duration; if( dur != -1 ) secstotimestr( psz_duration, dur/1000000 ); else memcpy( psz_duration , "-:--:--", sizeof("-:--:--") ); ListView_SetItemText( hListView, i, 3, _FROMMB(psz_duration) ); vlc_object_release(p_playlist);}/********************************************************************** * Private functions **********************************************************************/void Playlist::DeleteItem( int item ){ playlist_t *p_playlist = (playlist_t *) vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist == NULL ) return; playlist_Delete( p_playlist, item ); ListView_DeleteItem( hListView, item ); vlc_object_release( p_playlist );}/********************************************************************** * I/O functions **********************************************************************/static void OnOpenCB( intf_dialog_args_t *p_arg ){ intf_thread_t *p_intf = (intf_thread_t *)p_arg->p_arg; if( p_arg->i_results && p_arg->psz_results[0] ) { playlist_t * p_playlist = (playlist_t *) vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { playlist_Import( p_playlist, p_arg->psz_results[0] ); } if( p_playlist ) vlc_object_release( p_playlist ); }}void Playlist::OnOpen(){ char *psz_filters ="All playlists|*.pls;*.m3u;*.asx;*.b4s|M3U files|*.m3u"; intf_dialog_args_t *p_arg = (intf_dialog_args_t *)malloc( sizeof(intf_dialog_args_t) ); memset( p_arg, 0, sizeof(intf_dialog_args_t) ); p_arg->psz_title = strdup( "Open playlist" ); p_arg->psz_extensions = strdup( psz_filters ); p_arg->p_arg = p_intf; p_arg->pf_callback = OnOpenCB; p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_FILE_GENERIC, 0, p_arg);}static void OnSaveCB( intf_dialog_args_t *p_arg ){ intf_thread_t *p_intf = (intf_thread_t *)p_arg->p_arg; if( p_arg->i_results && p_arg->psz_results[0] ) { playlist_t * p_playlist = (playlist_t *) vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { char *psz_export; char *psz_ext = strrchr( p_arg->psz_results[0], '.' ); if( psz_ext && !strcmp( psz_ext, ".pls") ) psz_export = "export-pls"; else psz_export = "export-m3u";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -