⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playlistview.cpp

📁 FreeAMP(MP3播放)程序源代码-用来研究MP3解码
💻 CPP
📖 第 1 页 / 共 4 页
字号:

        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 + -