📄 playlistview.cpp
字号:
m_itemsAddedBeforeWeWereCreated = 0;
}
ResizeColumns();
}
//
// The purpose of this function is to insert a new column
// into the playlist view - making sure that the column information
// that we maintain is updated at the same time.
//
void MusicBrowserUI::InsertColumn( const char *title, int position )
{
//
// I've totally fudged the column width issue here, as the
// original implementation was breaking, and the new columns
// were being inserted off-screen. Steve
//
LV_COLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_TEXT;
lvc.fmt = LVCFMT_LEFT; // left align column
lvc.pszText = (char *)title;
lvc.cchTextMax = strlen(lvc.pszText);
lvc.iSubItem = position;
// First column is special.
if (0 == position)
{
lvc.cx = INDEX_COLUMN_WIDTH;
lvc.mask |= LVCF_WIDTH;
}
// Add to our list.
m_columnInfo.AddColumn( (char *)title, position );
// Actually perform the insertion.
ListView_InsertColumn(m_hPlaylistView, position, &lvc);
}
//
// Resizes the widths of the columns to appropratie sizes.
//
void MusicBrowserUI::ResizeColumns()
{
//
// Disable repaints.
//
SendMessage(m_hPlaylistView, WM_SETREDRAW, FALSE, 0);
ShowWindow(m_hPlaylistView, SW_HIDE);
HWND hwndList = GetDlgItem(m_hWnd, IDC_PLAYLISTBOX);
HWND header = ListView_GetHeader(hwndList);
int nCols = Header_GetItemCount(header);
for (int col = 1; col < nCols ; col++)
{
ResizeHeader(hwndList, col);
}
// Enable repaints.
//
ShowWindow( m_hPlaylistView, SW_SHOW);
SendMessage(m_hPlaylistView, WM_SETREDRAW, TRUE, 0);
}
void MusicBrowserUI::RemoveAllColumns( )
{
HWND hwndList = GetDlgItem(m_hWnd, IDC_PLAYLISTBOX);
for( int i = 0; i < m_columnInfo.GetNColumns(); i++ )
{
ListView_DeleteColumn( hwndList, 0);
}
m_columnInfo.Erase();
ListView_SetColumnWidth( hwndList, 0 , 0 );
}
void MusicBrowserUI::PlaylistListItemMoved(const PlaylistItem* item,
uint32 oldIndex,
uint32 newIndex)
{
HWND hwnd = GetDlgItem(m_hWnd, IDC_PLAYLISTBOX);
uint32 index = m_plm->IndexOf(item);
if(index != kInvalidIndex)
{
m_bListChanged = true;
UpdateButtonStates();
//char buf[256];
//sprintf(buf, "oldIndex: %d\tnewIndex: %d\r\n", oldIndex, newIndex);
//OutputDebugString(buf);
//LV_ITEM lv_item;
uint32 state = ListView_GetItemState(m_hPlaylistView,
oldIndex,
LVIS_SELECTED|LVIS_FOCUSED);
/*lv_item.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
lv_item.iSubItem = 0;
lv_item.iItem = index;
lv_item.lParam = (LPARAM)item;
lv_item.iImage = 0;
lv_item.stateMask = LVIS_FOCUSED|LVIS_SELECTED;
lv_item.state = state;*/
ListView_SetItemState(m_hPlaylistView,
oldIndex,
0,
LVIS_SELECTED|LVIS_FOCUSED);
ListView_SetItemState(m_hPlaylistView,
newIndex,
state,
LVIS_SELECTED|LVIS_FOCUSED);
int lowerBound = min(oldIndex, newIndex);
int upperBound = max(oldIndex, newIndex);
for (int i = lowerBound; i <= upperBound; i++)
ListView_RedrawItems(m_hPlaylistView, i, i);
//HMENU menu = GetSubMenu(GetMenu(m_hWnd), 1);
//EnableMenuItem(menu, ID_EDIT_UNDO_ACTION, (m_plm->CanUndo() ? MF_ENABLED : MF_GRAYED));
//EnableMenuItem(menu, ID_EDIT_REDO_ACTION, (m_plm->CanRedo() ? MF_ENABLED : MF_GRAYED));
}
}
void MusicBrowserUI::PlaylistListItemRemoved(const vector<PlaylistItem*>* itemList,
const vector<uint32>* oldIndexList)
{
// item has already been deleted when we get this
// msg so don't access it. only use it for comparison
vector<uint32>::const_iterator i = oldIndexList->begin();
for(;i != oldIndexList->end(); i++)
{
uint32 oldIndex = *i;
if(oldIndex != kInvalidIndex)
{
LV_ITEM lv_item;
lv_item.mask = LVIF_PARAM|LVIF_STATE;
lv_item.iItem = oldIndex;
lv_item.iSubItem = 0;
lv_item.lParam = 0;
lv_item.stateMask = LVIS_SELECTED|LVIS_FOCUSED;
ListView_GetItem(m_hPlaylistView, &lv_item);
ListView_DeleteItem(m_hPlaylistView, oldIndex);
if(oldIndex >= ListView_GetItemCount(m_hPlaylistView))
oldIndex = ListView_GetItemCount(m_hPlaylistView) - 1;
ListView_SetItemState(m_hPlaylistView, oldIndex, lv_item.state, LVIS_SELECTED|LVIS_FOCUSED);
/*if(lv_item.state & LVIS_SELECTED)
{
ListView_SetItemState(m_hPlaylistView, oldIndex, LVIS_SELECTED, LVIS_SELECTED);
}
if(lv_item.state & LVIS_FOCUSED)
{
ListView_SetItemState(m_hPlaylistView, oldIndex, LVIS_FOCUSED, LVIS_FOCUSED);
}*/
m_bListChanged = true;
}
}
SetFocus(m_hPlaylistView);
UpdateTotalTime();
//UpdateButtonStates();
//HMENU menu = GetSubMenu(GetMenu(m_hWnd), 1);
//EnableMenuItem(menu, ID_EDIT_UNDO_ACTION, (m_plm->CanUndo() ? MF_ENABLED : MF_GRAYED));
//EnableMenuItem(menu, ID_EDIT_REDO_ACTION, (m_plm->CanRedo() ? MF_ENABLED : MF_GRAYED));
ListView_RedrawItems(m_hPlaylistView, ListView_GetTopIndex(m_hPlaylistView), ListView_GetItemCount(m_hPlaylistView) - 1);
}
void MusicBrowserUI::PlaylistListSorted(void)
{
ListView_RedrawItems(m_hPlaylistView, 0, ListView_GetItemCount(m_hPlaylistView) - 1);
m_bListChanged = true;
UpdateButtonStates();
//HMENU menu = GetSubMenu(GetMenu(m_hWnd), 1);
//EnableMenuItem(menu, ID_EDIT_UNDO_ACTION, (m_plm->CanUndo() ? MF_ENABLED : MF_GRAYED));
//EnableMenuItem(menu, ID_EDIT_REDO_ACTION, (m_plm->CanRedo() ? MF_ENABLED : MF_GRAYED));
}
void MusicBrowserUI::PlaylistListItemsUpdated(const vector<PlaylistItem*>* items)
{
HWND hwnd = GetDlgItem(m_hWnd, IDC_PLAYLISTBOX);
vector<PlaylistItem*>::const_iterator i = items->begin();
for(; i != items->end(); i++)
{
uint32 index = m_plm->IndexOf(*i);
if(index != kInvalidIndex)
{
ListView_RedrawItems(hwnd, index, index);
//HMENU menu = GetSubMenu(GetMenu(m_hWnd), 1);
//EnableMenuItem(menu, ID_EDIT_UNDO_ACTION, (m_plm->CanUndo() ? MF_ENABLED : MF_GRAYED));
//EnableMenuItem(menu, ID_EDIT_REDO_ACTION, (m_plm->CanRedo() ? MF_ENABLED : MF_GRAYED));
}
else
{
vector<PlaylistItem*>::iterator cd;
cd = find(m_cdTracks->begin(), m_cdTracks->end(), *i);
if(cd != m_cdTracks->end())
{
if((*cd)->URL() == (*i)->URL())
{
MetaData metadata = (*i)->GetMetaData();
(*cd)->SetMetaData(&metadata);
TV_ITEM tv_item;
BOOL success;
tv_item.hItem = TreeView_GetChild(m_hMusicView, m_hCDItem);
tv_item.mask = TVIF_PARAM;
do
{
success = TreeView_GetItem(m_hMusicView, &tv_item);
if(success)
{
TreeData* treedata = (TreeData*)tv_item.lParam;
if(treedata && (*i)->URL() == treedata->m_pTrack->URL())
{
if(metadata.Title().size())
{
tv_item.mask = TVIF_TEXT;
tv_item.pszText = (char*)(metadata.Title().c_str());
tv_item.cchTextMax = strlen(tv_item.pszText);
TreeView_SetItem(m_hMusicView, &tv_item);
}
break;
}
}
}while(success &&
(tv_item.hItem = TreeView_GetNextSibling(m_hMusicView,
tv_item.hItem)));
string CD;
CD = (metadata.Album().size() ? metadata.Album() : "Unknown Album");
CD += " by ";
CD += (metadata.Artist().size() ? metadata.Artist() : "Unknown Artist");
tv_item.hItem = m_hCDItem;
tv_item.pszText = (char*)(CD.c_str());
tv_item.cchTextMax = strlen(tv_item.pszText);
TreeView_SetItem(m_hMusicView, &tv_item);
}
}
}
}
UpdateTotalTime();
}
void MusicBrowserUI::PlaylistListItemAdded(const PlaylistItem* item)
{
LV_ITEM lv_item;
uint32 index = m_plm->IndexOf(item);
if(index != kInvalidIndex)
{
if(m_hPlaylistView)
{
lv_item.mask = 0;
lv_item.iSubItem = 0;
lv_item.iItem = 0;
if(!ListView_GetItemCount(m_hPlaylistView) &&
!m_pParent &&
!m_autoPlayHack)
m_context->target->AcceptEvent(new Event(CMD_Play));
ListView_InsertItem(m_hPlaylistView, &lv_item);
// this skips change notification
// for initial loading of list for
// editing. a hack pretty much but
// i can't think of a better way
if(m_initialCount)
m_initialCount--;
else
{
m_bListChanged = true;
UpdateButtonStates();
}
UpdateTotalTime();
}
else
{
m_itemsAddedBeforeWeWereCreated++;
}
//HMENU menu = GetSubMenu(GetMenu(m_hWnd), 1);
//EnableMenuItem(menu, ID_EDIT_UNDO_ACTION, (m_plm->CanUndo() ? MF_ENABLED : MF_GRAYED));
//EnableMenuItem(menu, ID_EDIT_REDO_ACTION, (m_plm->CanRedo() ? MF_ENABLED : MF_GRAYED));
}
}
void MusicBrowserUI::PlaylistListItemsAdded(const vector<PlaylistItem*>* items)
{
uint32 count = ListView_GetItemCount(m_hPlaylistView);
if(m_plm->CountItems() != count)
{
uint32 newSize = count + items->size();
ListView_SetItemCount(m_hPlaylistView, newSize);
}
if(m_hPlaylistView)
{
LV_ITEM lv_item;
lv_item.mask = 0;
lv_item.iSubItem = 0;
lv_item.iItem = 0;
if(!count &&
!m_pParent &&
!m_autoPlayHack)
m_context->target->AcceptEvent(new Event(CMD_Play));
// this speed up adding a lot of files by preventing
// the list from updating
SendMessage(m_hPlaylistView, WM_SETREDRAW, FALSE, 0);
uint32 itemcount = items->size();
for(uint32 i = 0; i < itemcount; i++)
ListView_InsertItem(m_hPlaylistView, &lv_item);
SendMessage(m_hPlaylistView, WM_SETREDRAW, TRUE, 0);
ListView_RedrawItems(m_hPlaylistView, count, count + itemcount);
// this skips change notification
// for initial loading of list for
// editing. a hack pretty much but
// i can't think of a better way
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -