📄 playlistview.cpp
字号:
if(m_initialCount)
m_initialCount--;
else
{
m_bListChanged = true;
UpdateButtonStates();
}
UpdateTotalTime();
}
else
{
m_itemsAddedBeforeWeWereCreated += items->size();
}
if(count > 999)
{
//ListView_SetColumnWidth(m_hPlaylistView, 0, INDEX_COLUMN_WIDTH + 6);
//ListView_SetColumnWidth(m_hPlaylistView, 1, ListView_GetColumnWidth(m_hPlaylistView, 1) - 2);
//ListView_SetColumnWidth(m_hPlaylistView, 2, ListView_GetColumnWidth(m_hPlaylistView, 2) - 2);
//ListView_SetColumnWidth(m_hPlaylistView, 3, ListView_GetColumnWidth(m_hPlaylistView, 3) - 2);
}
}
void MusicBrowserUI::DisplayCurrentItem()
{
ListView_EnsureVisible(m_hPlaylistView,
m_plm->GetCurrentIndex(),
FALSE);
}
void MusicBrowserUI::GetSelectedPlaylistItems(vector<PlaylistItem*>* items)
{
uint32 selected = ListView_GetSelectedCount(m_hPlaylistView);
uint32 count = ListView_GetItemCount(m_hPlaylistView);
uint32 index = 0;
uint32 found = 0;
for(index = 0, found = 0; found < selected && index < count; index++)
{
uint32 state = ListView_GetItemState(m_hPlaylistView,
index,
LVIS_SELECTED);
if(state & LVIS_SELECTED)
{
PlaylistItem* item = m_plm->ItemAt(index);
items->push_back(item);
found++;
}
}
}
void MusicBrowserUI::LVBeginDrag(HWND hwnd, NM_LISTVIEW* nmlv)
{
vector<string>* urls = new vector<string>;
vector<PlaylistItem*> items;
m_playlistDropTarget->TargetIsSource(true);
GetSelectedPlaylistItems(&items);
vector<PlaylistItem*>::iterator i;
for(i = items.begin(); i != items.end(); i++)
{
urls->push_back((*i)->URL().c_str());
}
HIMAGELIST himl;
RECT rcItem;
POINT hotspot;
himl = ListView_CreateDragImage(hwnd, nmlv->iItem, &hotspot);
ListView_GetItemRect(hwnd, nmlv->iItem, &rcItem, LVIR_ICON);
hotspot.x = 0;
hotspot.y = (rcItem.bottom - rcItem.top)/2;
DataObject* data = new DataObject(CFSTR_FREEAMP_PLAYLISTITEM, urls);
DropSource* src = new DropSource(hwnd, himl, hotspot, nmlv->ptAction);
DWORD dwEffect = 0;
DoDragDrop(data,
src,
DROPEFFECT_COPY|DROPEFFECT_SCROLL|DROPEFFECT_MOVE,
&dwEffect);
if(dwEffect == DROPEFFECT_MOVE)
{
vector<PlaylistItem*>::iterator i;
for(i = items.begin(); i != items.end(); i++)
{
m_plm->RemoveItem(*i);
}
}
/*if(dwEffect != DROPEFFECT_NONE)
{
for(index = 0, found = 0; found < selected && index < count; index++)
{
uint32 state = ListView_GetItemState(hwnd,
index,
LVIS_SELECTED);
if(state & LVIS_SELECTED)
{
ListView_SetItemState(hwnd, index, 0, LVIS_SELECTED);
found++;
}
}
}
if(dwEffect == DROPEFFECT_MOVE)
{
vector<PlaylistItem*>::iterator i;
for(i = list.begin(); i != list.end(); i++)
{
m_plm->RemoveItem(*i);
}
}*/
data->Release();
src->Release();
m_playlistDropTarget->TargetIsSource(false);
}
void MusicBrowserUI::UpdateTotalTime()
{
uint32 count = ListView_GetItemCount(m_hPlaylistView);
uint32 index = 0;
uint32 total = 0;
bool approximate = false;
/*
for(index = 0; index < count; index++)
{
PlaylistItem* item = m_plm->ItemAt(index);
if(item)
{
uint32 time = item->GetMetaData().Time();
if(!time)
approximate = true;
total += time;
}
}
*/
total = m_plm->Time();
char buf[32] = "~";
char* time = buf;
// this will place a twiddle in front of the time
// if any of the times are zero and thus assumed
// to be unknown...
if(approximate)
time=buf + 1;
uint32 hours = total / 3600;
uint32 minutes = total / 60 - hours * 60;
uint32 seconds = total - minutes * 60 - hours * 3600;
if(hours)
sprintf(time, "%d:%02d:%02d", hours, minutes, seconds);
else
sprintf(time, "%d:%02d", minutes, seconds);
SendMessage(m_hStatus, SB_SETTEXT, 1, (LPARAM) time);
}
LRESULT WINAPI
ListViewWndProc(HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
MusicBrowserUI* ui = (MusicBrowserUI*)GetProp(hwnd, "this" );
return ui->ListViewWndProc(hwnd, msg, wParam, lParam);
}
void MusicBrowserUI::ResizeHeader(HWND hwnd, uint32 column)
{
// if(ListView_GetItemCount(hwnd))
// {
PlaylistItem* item = NULL;
uint32 textLength = 0;
int32 columnWidth = ListView_GetColumnWidth(hwnd,column);
uint32 i = 0;
string text;
HDC hdc = GetDC(hwnd);
while(item = m_plm->ItemAt(i++))
{
MetaData metadata = item->GetMetaData();
const char *columnText = GetColumnText(column);
if ( stricmp( columnText, ARTIST_COLUMN ) == 0 )
{
text = metadata.Artist();
}
else if ( stricmp( columnText, TITLE_COLUMN ) == 0 )
{
text = metadata.Title();
}
else if ( stricmp( columnText, ALBUM_COLUMN ) == 0 )
{
text = metadata.Album();
}
else if ( stricmp( columnText, LOCATION_COLUMN ) == 0 )
{
char path[_MAX_PATH];
uint32 length = sizeof(path);
URLToFilePath(item->URL().c_str(), path, &length);
text = path;
}
else if ( stricmp( columnText, TIME_COLUMN ) == 0 )
{
char buf[16];
if(metadata.Time() != 0)
{
int32 seconds = metadata.Time();
int32 hours = seconds / 3600;
int32 minutes = seconds / 60 - hours * 60;
seconds = seconds - minutes * 60 - hours * 3600;
if(hours)
sprintf(buf, "%d:%02d:%02d", hours, minutes, seconds);
else
sprintf(buf, "%d:%02d", minutes, seconds);
text = buf;
}
}
else if ( stricmp( columnText, GENRE_COLUMN ) == 0 )
{
text = metadata.Genre();
}
else if ( stricmp( columnText, COMMENT_COLUMN ) == 0 )
{
text = metadata.Comment();
}
else if ( stricmp( columnText, YEAR_COLUMN ) == 0 )
{
char buf[16];
int32 year = metadata.Year();
if(year)
sprintf(buf, "%d", year );
else
sprintf(buf, "Unknown");
text = buf;
}
else if ( stricmp( columnText, TRACK_COLUMN) == 0 )
{
char buf[16];
int32 track = metadata.Track();
if (track)
sprintf(buf, "%d", track );
else
sprintf(buf, "Unknown");
text = buf;
}
else
{
text = "Unknown";
}
if (strlen(text.c_str()) < strlen(columnText))
text = columnText;
SIZE size;
GetTextExtentPoint32(hdc, text.c_str(), text.size(), &size);
if(size.cx > textLength)
textLength = size.cx;
}
if (textLength <= 2)
{
text = GetColumnText(column);
SIZE size;
GetTextExtentPoint32(hdc, text.c_str(), text.size(), &size);
textLength = size.cx;
}
ReleaseDC(hwnd, hdc);
textLength += 5;
if(column < m_columnInfo.GetNColumns())
{
int32 nextColumnWidth = ListView_GetColumnWidth(hwnd,column + 1);
ListView_SetColumnWidth(hwnd,column, textLength);
int32 delta = columnWidth - textLength;
nextColumnWidth += delta;
ListView_SetColumnWidth(hwnd,column + 1, nextColumnWidth);
}
else
{
int32 nextColumnWidth = ListView_GetColumnWidth(hwnd,column - 1);
ListView_SetColumnWidth(hwnd,column, textLength);
int32 delta = columnWidth - textLength;
nextColumnWidth += delta;
ListView_SetColumnWidth(hwnd,column - 1, nextColumnWidth);
}
// }
}
LRESULT MusicBrowserUI::ListViewWndProc(HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
WNDPROC lpOldProc = (WNDPROC)GetProp( hwnd, "oldproc" );
bool filesAreURLs = false;
switch(msg)
{
case WM_DESTROY:
{
// Put back old window proc and
SetWindowLong( hwnd, GWL_WNDPROC, (DWORD)lpOldProc );
// remove window property
RemoveProp( hwnd, "oldproc" );
RemoveProp( hwnd, "this" );
break;
}
case WM_SETFOCUS:
case WM_KILLFOCUS:
UpdateButtonStates();
break;
case UWM_MOVEITEMS:
{
LV_HITTESTINFO hti;
RECT itemRect;
hti.pt = *((POINT*)lParam);
int32 insertIndex = ListView_HitTest(hwnd, &hti);
if(insertIndex < 0)
{
insertIndex = ListView_GetItemCount(hwnd) - 1;
if (insertIndex > 0)
insertIndex++;
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -