| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 | #include "main.h"#include "PlaylistView.h"#include "Playlist.h"#include "CurrentPlaylist.h"#include "api__ml_playlists.h"#include "../ml_local/api_mldb.h"#include "../ml_pmp/pmp.h"#include <strsafe.h>extern Playlist currentPlaylist;static BOOL playlist_GetDisplayInfo( NMLVDISPINFO *lpdi ){	size_t item = lpdi->item.iItem;	if ( item < 0 || item >= currentPlaylist.GetNumItems() )		return 0;	if ( lpdi->item.mask & LVIF_TEXT )	{		switch ( lpdi->item.iSubItem )		{			case 0:			{				if ( !currentPlaylist.IsCached( item ) )				{					wchar_t title[ FILETITLE_SIZE ] = { 0 };					int length = -1;					mediaLibrary.GetFileInfo( currentPlaylist.ItemName( item ), title, FILETITLE_SIZE, &length );					currentPlaylist.SetItemLengthMilliseconds( item, length * 1000 );					currentPlaylist.SetItemTitle( item, title );				}				// CUT: currentPlaylist.GetItemTitle(item, lpdi->item.pszText, lpdi->item.cchTextMax);				const wchar_t *title = currentPlaylist.ItemTitle( item );				if ( !title )					title = currentPlaylist.ItemName( item );				// TODO - just using for debugging to check values#ifdef DEBUG				wchar_t info[ 128 ] = { 0 };				if ( currentPlaylist.GetItemExtendedInfo( item, L"cloud", info, 128 ) )				{					StringCchPrintf( lpdi->item.pszText, lpdi->item.cchTextMax, L"[%s] %d. %s", info, item + 1, title );				}				else				{#endif					StringCchPrintf( lpdi->item.pszText, lpdi->item.cchTextMax, L"%d. %s", item + 1, title );#ifdef DEBUG				}#endif			}			break;			case 1:			{				wchar_t info[ 16 ] = { 0 };				if ( currentPlaylist.GetItemExtendedInfo( item, L"cloud_status", info, 16 ) )				{					StringCchPrintf( lpdi->item.pszText, lpdi->item.cchTextMax, L"%s", info );				}				else					StringCchPrintf( lpdi->item.pszText, lpdi->item.cchTextMax, L"%d", 4 );			}			break;			case 2:			{				if ( currentPlaylist.GetItemLengthMilliseconds( item ) == 0 ) // if the length is 0, then we'll re-read it				{					wchar_t title[ FILETITLE_SIZE ] = { 0 };					int length = 0;					mediaLibrary.GetFileInfo( currentPlaylist.ItemName( item ), title, FILETITLE_SIZE, &length );					if ( length == 0 )						currentPlaylist.SetItemLengthMilliseconds( item, -1000 );					else					{						currentPlaylist.SetItemLengthMilliseconds( item, length * 1000 );					}				}				int length = currentPlaylist.GetItemLengthMilliseconds( item ) / 1000;				if ( length <= 0 )					lpdi->item.pszText[ 0 ] = 0;				else					StringCchPrintf( lpdi->item.pszText, lpdi->item.cchTextMax, L"%d:%02d", length / 60, length % 60 );			}			break;		}	}	return 0;}BOOL playlist_OnCustomDraw( HWND hwndDlg, NMLVCUSTOMDRAW *plvcd, LRESULT *pResult ){	static BOOL bDrawFocus;	static RECT rcView;	static CLOUDCOLUMNPAINT cloudColumnPaint;	*pResult = CDRF_DODEFAULT;	switch ( plvcd->nmcd.dwDrawStage )	{		case CDDS_PREPAINT:			*pResult |= CDRF_NOTIFYITEMDRAW;			CopyRect( &rcView, &plvcd->nmcd.rc );			cloudColumnPaint.hwndList = plvcd->nmcd.hdr.hwndFrom;			cloudColumnPaint.hdc      = plvcd->nmcd.hdc;			cloudColumnPaint.prcView  = &rcView;			return TRUE;		case CDDS_ITEMPREPAINT:			*pResult |= CDRF_NOTIFYSUBITEMDRAW;			bDrawFocus = ( CDIS_FOCUS & plvcd->nmcd.uItemState );			if ( bDrawFocus )			{				plvcd->nmcd.uItemState &= ~CDIS_FOCUS;				*pResult |= CDRF_NOTIFYPOSTPAINT;			}			return TRUE;		case CDDS_ITEMPOSTPAINT:			if ( bDrawFocus )			{				RECT rc;				rc.left = LVIR_BOUNDS;				SendMessageW( plvcd->nmcd.hdr.hwndFrom, LVM_GETITEMRECT, plvcd->nmcd.dwItemSpec, (LPARAM)&rc );				rc.left += 3;				DrawFocusRect( plvcd->nmcd.hdc, &rc );				plvcd->nmcd.uItemState |= CDIS_FOCUS;				bDrawFocus = FALSE;			}			*pResult = CDRF_SKIPDEFAULT;			return TRUE;		case( CDDS_SUBITEM | CDDS_ITEMPREPAINT ):			// TODO need to have a map between column ids so we do this correctly			if ( plvcd->iSubItem == 1 )			{				if ( 0 == plvcd->iSubItem && 0 == plvcd->nmcd.rc.right )					break;				cloudColumnPaint.iItem    = plvcd->nmcd.dwItemSpec;				cloudColumnPaint.iSubItem = plvcd->iSubItem;				int cloud_icon = 4;				size_t item = plvcd->nmcd.dwItemSpec;				wchar_t info[ 16 ] = { 0 };				if ( currentPlaylist.GetItemExtendedInfo( item, L"cloud_status", info, 16 ) )					cloud_icon = _wtoi( info );				// TODO have this show an appropriate cloud icon for the playlist				//		currently all we have is cloud or nothing as we'll only				//		have files locally for this for the moment (need todo!!!)				cloudColumnPaint.value   = cloud_icon;				cloudColumnPaint.prcItem = &plvcd->nmcd.rc;				cloudColumnPaint.rgbBk   = plvcd->clrTextBk;				cloudColumnPaint.rgbFg   = plvcd->clrText;				if ( MLCloudColumn_Paint( plugin.hwndLibraryParent, &cloudColumnPaint ) )				{					*pResult = CDRF_SKIPDEFAULT;					return TRUE;				}			}			break;	}	return FALSE;}BOOL playlist_Notify( HWND hwndDlg, WPARAM wParam, LPARAM lParam ){	LPNMHDR l = (LPNMHDR)lParam;	if ( l->idFrom == IDC_PLAYLIST_EDITOR )	{		switch ( l->code )		{			case NM_DBLCLK:				PlaySelection( g_config->ReadInt( L"enqueuedef", 0 ) == 1, g_config->ReadInt( L"plplaymode", 1 ) );				break;			case LVN_GETDISPINFO:				return playlist_GetDisplayInfo( (NMLVDISPINFO *)lParam );			case LVN_BEGINDRAG:				we_are_drag_and_dropping = 1;				SetCapture( hwndDlg );				break;			case LVN_ITEMCHANGED:			case LVN_ODSTATECHANGED:				UpdatePlaylistTime( hwndDlg );				break;			case NM_CUSTOMDRAW:			{				LRESULT result = 0;				if ( cloud_avail && playlist_OnCustomDraw( hwndDlg, (NMLVCUSTOMDRAW *)lParam, &result ) )				{					SetWindowLongPtrW( hwndDlg, DWLP_MSGRESULT, (LONG_PTR)result );					return 1;				}				break;			}			case NM_CLICK:			{				LPNMITEMACTIVATE pnmitem = (LPNMITEMACTIVATE)lParam;				if ( cloud_avail && pnmitem->iItem != -1 && pnmitem->iSubItem == 1 )				{					RECT itemRect = { 0 };					if ( pnmitem->iSubItem )						ListView_GetSubItemRect( pnmitem->hdr.hwndFrom, pnmitem->iItem, pnmitem->iSubItem, LVIR_BOUNDS, &itemRect );					else					{						ListView_GetItemRect( pnmitem->hdr.hwndFrom, pnmitem->iItem, &itemRect, LVIR_BOUNDS );						itemRect.right = itemRect.left + ListView_GetColumnWidth( pnmitem->hdr.hwndFrom, pnmitem->iSubItem );					}					MapWindowPoints( l->hwndFrom, HWND_DESKTOP, (POINT *)&itemRect, 2 );					//int cloud_devices = 0;					HMENU cloud_hmenu = 0;					int mark = playlist_list.GetSelectionMark();					if ( mark != -1 )					{						wchar_t filename[ MAX_PATH ] = { 0 };						currentPlaylist.entries[ mark ]->GetFilename( filename, MAX_PATH );						cloud_hmenu = CreatePopupMenu();						WASABI_API_SYSCB->syscb_issueCallback( api_mldb::SYSCALLBACK, api_mldb::MLDB_FILE_GET_CLOUD_STATUS, (intptr_t)&filename, (intptr_t)&cloud_hmenu );						if ( cloud_hmenu )						{							int r = Menu_TrackPopup( plugin.hwndLibraryParent, cloud_hmenu, TPM_RETURNCMD | TPM_RIGHTBUTTON | TPM_LEFTBUTTON | TPM_NONOTIFY, itemRect.right, itemRect.top, hwndDlg, NULL );							if ( r >= CLOUD_SOURCE_MENUS && r < CLOUD_SOURCE_MENUS_UPPER )							{   // deals with cloud specific menus								// 0 = no change								// 1 = adding to cloud								// 2 = added locally								// 4 = removed								int mode = 0;	// deals with cloud specific menus								WASABI_API_SYSCB->syscb_issueCallback( api_mldb::SYSCALLBACK, api_mldb::MLDB_FILE_PROCESS_CLOUD_STATUS, (intptr_t)r, (intptr_t)&mode );								// TODO								/*switch (mode)								{									case 1:										setCloudValue(&itemCache.Items[pnmitem->iItem], L"5");									break;									case 2:										setCloudValue(&itemCache.Items[pnmitem->iItem], L"4");									break;									case 4:										setCloudValue(&itemCache.Items[pnmitem->iItem], L"4");									break;								}								InvalidateRect(resultlist.getwnd(), NULL, TRUE);*/							}							DestroyMenu( cloud_hmenu );						}					}				}			}			break;		}	}	switch ( l->code )	{		case HDN_ITEMCHANGING:		{			LPNMHEADERW phdr = (LPNMHEADERW)lParam;			if ( phdr->pitem && ( HDI_WIDTH & phdr->pitem->mask ) && phdr->iItem == 1 )			{				if ( !cloud_avail )					phdr->pitem->cxy = 0;				else				{					INT width = phdr->pitem->cxy;					if ( MLCloudColumn_GetWidth( plugin.hwndLibraryParent, &width ) )						phdr->pitem->cxy = width;				}			}			break;		}	}	return 0;}
 |